Commit 980dea9b authored by Paul Lemire's avatar Paul Lemire
Browse files

RenderView: store memoryBarrier flag


Change-Id: Icbf1a42e1efce8c33b02487fc3dfed7dc79ab876
Reviewed-by: default avatarKevin Ottens <kevin.ottens@kdab.com>
Showing with 90 additions and 5 deletions
......@@ -210,6 +210,7 @@ RenderView::RenderView()
, m_noDraw(false)
, m_compute(false)
, m_frustumCulling(false)
, m_memoryBarrier(QMemoryBarrier::None)
{
m_workGroups[0] = 1;
m_workGroups[1] = 1;
......
......@@ -61,6 +61,7 @@
#include <Qt3DRender/private/handle_types_p.h>
#include <Qt3DRender/private/qsortpolicy_p.h>
#include <Qt3DRender/private/lightsource_p.h>
#include <Qt3DRender/private/qmemorybarrier_p.h>
#include <Qt3DCore/private/qframeallocator_p.h>
......@@ -217,6 +218,9 @@ public:
inline void setRenderCaptureNodeId(const Qt3DCore::QNodeId nodeId) Q_DECL_NOTHROW { m_renderCaptureNodeId = nodeId; }
inline const Qt3DCore::QNodeId renderCaptureNodeId() const Q_DECL_NOTHROW { return m_renderCaptureNodeId; }
void setMemoryBarrier(QMemoryBarrier::BarrierTypes barrier) Q_DECL_NOTHROW { m_memoryBarrier = barrier; }
QMemoryBarrier::BarrierTypes memoryBarrier() const Q_DECL_NOTHROW { return m_memoryBarrier; }
// Helps making the size of RenderView smaller
// Contains all the data needed for the actual building of the RenderView
// But that aren't used later by the Renderer
......@@ -270,6 +274,7 @@ private:
bool m_compute:1;
bool m_frustumCulling:1;
int m_workGroups[3];
QMemoryBarrier::BarrierTypes m_memoryBarrier;
// We do not use pointers to RenderNodes or Drawable's here so that the
// render aspect is free to change the drawables on the next frame whilst
......
......@@ -65,6 +65,7 @@
#include <Qt3DRender/private/rendercapture_p.h>
#include <Qt3DRender/private/stringtoint_p.h>
#include <Qt3DRender/private/techniquemanager_p.h>
#include <Qt3DRender/private/memorybarrier_p.h>
QT_BEGIN_NAMESPACE
......@@ -235,6 +236,12 @@ void setRenderViewConfigFromFrameGraphLeafNode(RenderView *rv, const FrameGraphN
break;
}
case FrameGraphNode::MemoryBarrier: {
const Render::MemoryBarrier *barrier = static_cast<const Render::MemoryBarrier *>(node);
rv->setMemoryBarrier(barrier->barrierTypes()|rv->memoryBarrier());
break;
}
default:
// Should never get here
qCWarning(Backend) << "Unhandled FrameGraphNode type";
......
......@@ -7,3 +7,5 @@ QT += 3dcore 3dcore-private 3drender 3drender-private testlib
CONFIG += testcase
SOURCES += tst_renderviews.cpp
include(../../core/common/common.pri)
......@@ -27,11 +27,21 @@
****************************************************************************/
#include <QtTest/QTest>
#include <qbackendnodetester.h>
#include <private/renderview_p.h>
#include <private/qframeallocator_p.h>
#include <private/qframeallocator_p_p.h>
#include <private/memorybarrier_p.h>
#include <private/renderviewjobutils_p.h>
#include <testpostmanarbiter.h>
class tst_RenderViews : public QObject
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
namespace Render {
class tst_RenderViews : public Qt3DCore::QBackendNodeTester
{
Q_OBJECT
private Q_SLOTS:
......@@ -39,8 +49,8 @@ private Q_SLOTS:
void checkRenderViewSizeFitsWithAllocator()
{
QSKIP("Allocated Disabled");
QVERIFY(sizeof(Qt3DRender::Render::RenderView) <= 192);
QVERIFY(sizeof(Qt3DRender::Render::RenderView::InnerData) <= 192);
QVERIFY(sizeof(RenderView) <= 192);
QVERIFY(sizeof(RenderView::InnerData) <= 192);
}
void testSort()
......@@ -53,7 +63,7 @@ private Q_SLOTS:
QSKIP("Allocated Disabled");
// GIVEN
Qt3DCore::QFrameAllocator allocator(192, 16, 128);
Qt3DRender::Render::RenderView *rv = allocator.allocate<Qt3DRender::Render::RenderView>();
RenderView *rv = allocator.allocate<RenderView>();
// THEN
QVERIFY(!allocator.isEmpty());
......@@ -65,10 +75,70 @@ private Q_SLOTS:
QVERIFY(allocator.isEmpty());
}
void checkRenderViewInitialState()
{
// GIVEN
RenderView renderView;
// THEN
QCOMPARE(renderView.memoryBarrier(), QMemoryBarrier::None);
}
void checkMemoryBarrierInitialization()
{
// GIVEN
RenderView renderView;
// THEN
QCOMPARE(renderView.memoryBarrier(), QMemoryBarrier::None);
// WHEN
const QMemoryBarrier::BarrierTypes barriers(QMemoryBarrier::BufferUpdateBarrier|QMemoryBarrier::ShaderImageAccessBarrier);
renderView.setMemoryBarrier(barriers);
// THEN
QCOMPARE(renderView.memoryBarrier(), barriers);
}
void checkSetRenderViewConfig()
{
{
// GIVEN
const QMemoryBarrier::BarrierTypes barriers(QMemoryBarrier::AtomicCounterBarrier|QMemoryBarrier::ShaderStorageBarrier);
Qt3DRender::QMemoryBarrier frontendBarrier;
FrameGraphManager frameGraphManager;
MemoryBarrier backendBarrier;
RenderView renderView;
// setRenderViewConfigFromFrameGraphLeafNode assumes node has a manager
backendBarrier.setFrameGraphManager(&frameGraphManager);
// WHEN
frontendBarrier.setBarrierTypes(barriers);
simulateInitialization(&frontendBarrier, &backendBarrier);
// THEN
QCOMPARE(renderView.memoryBarrier(), QMemoryBarrier::None);
QCOMPARE(backendBarrier.barrierTypes(), barriers);
// WHEN
Qt3DRender::Render::setRenderViewConfigFromFrameGraphLeafNode(&renderView, &backendBarrier);
// THEN
QCOMPARE(backendBarrier.barrierTypes(), renderView.memoryBarrier());
}
// TO DO: Complete tests for other framegraph node types
}
private:
};
} // Render
} // Qt3DRender
QT_END_NAMESPACE
QTEST_APPLESS_MAIN(tst_RenderViews)
QTEST_APPLESS_MAIN(Qt3DRender::Render::tst_RenderViews)
#include "tst_renderviews.moc"
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment