summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-12-04 14:49:45 +0100
committerPaul Lemire <paul.lemire@kdab.com>2016-01-13 14:02:46 +0000
commit84ca67b504b6d8a4825988681dd4d49031805c96 (patch)
treeb3cfb45cbf22dc86a85d388993c0071c42562b1c /src
parent8a8746f7011ce6a831df715120cbd54a3938e2a4 (diff)
RenderView Compute handling
Change-Id: Ifbe93173010bf058f198990c62d5e93fea967a74 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/render/backend/renderview.cpp4
-rw-r--r--src/render/backend/renderview_p.h37
-rw-r--r--src/render/framegraph/dispatchcompute_p.h3
-rw-r--r--src/render/jobs/renderviewjobutils.cpp10
4 files changed, 39 insertions, 15 deletions
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 7d9434a01..523cc9248 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -274,8 +274,12 @@ RenderView::RenderView()
, m_clearBuffer(QClearBuffer::None)
, m_stateSet(Q_NULLPTR)
, m_noDraw(false)
+ , m_compute(false)
, m_frustumCulling(false)
{
+ m_workGroups[0] = 1;
+ m_workGroups[1] = 1;
+ m_workGroups[2] = 1;
}
RenderView::~RenderView()
diff --git a/src/render/backend/renderview_p.h b/src/render/backend/renderview_p.h
index 9819b0b5e..59da14b60 100644
--- a/src/render/backend/renderview_p.h
+++ b/src/render/backend/renderview_p.h
@@ -115,9 +115,9 @@ public:
void sort();
void setRenderer(Renderer *renderer);
- inline void setSurfaceSize(const QSize &size) { m_surfaceSize = size; }
- inline Renderer *renderer() const { return m_renderer; }
- inline NodeManagers *nodeManagers() const { return m_manager; }
+ inline void setSurfaceSize(const QSize &size) Q_DECL_NOEXCEPT { m_surfaceSize = size; }
+ inline Renderer *renderer() const Q_DECL_NOEXCEPT { return m_renderer; }
+ inline NodeManagers *nodeManagers() const Q_DECL_NOEXCEPT { return m_manager; }
inline void setAllocator(Qt3DCore::QFrameAllocator *allocator)
{
@@ -155,14 +155,19 @@ public:
inline void setTechniqueFilter(const TechniqueFilter *filter) { m_data->m_techniqueFilter = filter; }
inline const TechniqueFilter *techniqueFilter() const { return m_data->m_techniqueFilter; }
- inline RenderStateSet *stateSet() const { return m_stateSet; }
- void setStateSet(RenderStateSet *stateSet) { m_stateSet = stateSet; }
+ inline RenderStateSet *stateSet() const Q_DECL_NOEXCEPT { return m_stateSet; }
+ void setStateSet(RenderStateSet *stateSet) Q_DECL_NOEXCEPT { m_stateSet = stateSet; }
- inline bool noDraw() const { return m_noDraw; }
- void setNoDraw(bool noDraw) { m_noDraw = noDraw; }
+ inline bool noDraw() const Q_DECL_NOEXCEPT { return m_noDraw; }
+ void setNoDraw(bool noDraw) Q_DECL_NOEXCEPT { m_noDraw = noDraw; }
- inline bool frustumCulling() const { return m_frustumCulling; }
- void setFrustumCulling(bool frustumCulling) { m_frustumCulling = frustumCulling; }
+ inline bool isCompute() const Q_DECL_NOEXCEPT { return m_compute; }
+ void setCompute(bool compute) Q_DECL_NOEXCEPT { m_compute = compute; }
+
+ void setComputeWorkgroups(int x, int y, int z) Q_DECL_NOEXCEPT { m_workGroups[0] = x; m_workGroups[1] = y; m_workGroups[2] = z; }
+
+ inline bool frustumCulling() const Q_DECL_NOEXCEPT { return m_frustumCulling; }
+ void setFrustumCulling(bool frustumCulling) Q_DECL_NOEXCEPT { m_frustumCulling = frustumCulling; }
// TODO: Get rid of this overly complex memory management by splitting out the
// InnerData as a RenderViewConfig struct. This can be created by setRenderViewConfigFromFrameGraphLeafNode
@@ -205,8 +210,8 @@ public:
return *m_clearColor;
}
- inline void setClearBuffer(QClearBuffer::BufferType clearBuffer) { m_clearBuffer = clearBuffer; }
- inline QClearBuffer::BufferType clearBuffer() const { return m_clearBuffer; }
+ inline void setClearBuffer(QClearBuffer::BufferType clearBuffer) Q_DECL_NOEXCEPT { m_clearBuffer = clearBuffer; }
+ inline QClearBuffer::BufferType clearBuffer() const Q_DECL_NOEXCEPT { return m_clearBuffer; }
void buildRenderCommands(Entity *preprocessedTreeRoot, const Plane *planes);
QVector<RenderCommand *> commands() const { return m_commands; }
@@ -216,8 +221,8 @@ public:
void setDrawBuffers(const QList<QRenderAttachment::RenderAttachmentType> &drawBuffers) { m_attachmentPack.setDrawBuffers(drawBuffers); }
const AttachmentPack &attachmentPack() const;
- void setRenderTargetHandle(HTarget renderTargetHandle) { m_renderTarget = renderTargetHandle; }
- HTarget renderTargetHandle() const { return m_renderTarget; }
+ void setRenderTargetHandle(HTarget renderTargetHandle) Q_DECL_NOEXCEPT { m_renderTarget = renderTargetHandle; }
+ HTarget renderTargetHandle() const Q_DECL_NOEXCEPT { return m_renderTarget; }
void addSortCriteria(const QList<Qt3DCore::QNodeId> &sortMethodUid) { m_data->m_sortingCriteria.append(sortMethodUid); }
@@ -268,8 +273,10 @@ private:
AttachmentPack m_attachmentPack;
QClearBuffer::BufferType m_clearBuffer;
RenderStateSet *m_stateSet;
- bool m_noDraw;
- bool m_frustumCulling;
+ bool m_noDraw:1;
+ bool m_compute:1;
+ bool m_frustumCulling:1;
+ int m_workGroups[3];
// 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
diff --git a/src/render/framegraph/dispatchcompute_p.h b/src/render/framegraph/dispatchcompute_p.h
index 7a90f980a..3e11e4e31 100644
--- a/src/render/framegraph/dispatchcompute_p.h
+++ b/src/render/framegraph/dispatchcompute_p.h
@@ -67,6 +67,9 @@ public:
void updateFromPeer(Qt3DCore::QNode *peer) Q_DECL_OVERRIDE;
void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
+ inline int x() const Q_DECL_NOEXCEPT { return m_workGroups[0]; }
+ inline int y() const Q_DECL_NOEXCEPT { return m_workGroups[1]; }
+ inline int z() const Q_DECL_NOEXCEPT { return m_workGroups[2]; }
private:
int m_workGroups[3];
diff --git a/src/render/jobs/renderviewjobutils.cpp b/src/render/jobs/renderviewjobutils.cpp
index 65728e649..e1c2c7469 100644
--- a/src/render/jobs/renderviewjobutils.cpp
+++ b/src/render/jobs/renderviewjobutils.cpp
@@ -57,6 +57,7 @@
#include <Qt3DRender/private/managers_p.h>
#include <Qt3DRender/private/shaderdata_p.h>
#include <Qt3DRender/private/statesetnode_p.h>
+#include <Qt3DRender/private/dispatchcompute_p.h>
QT_BEGIN_NAMESPACE
@@ -207,6 +208,15 @@ void setRenderViewConfigFromFrameGraphLeafNode(RenderView *rv, const FrameGraphN
break;
}
+ case FrameGraphNode::ComputeDispatch: {
+ const Render::DispatchCompute *dispatchCompute = static_cast<const Render::DispatchCompute *>(node);
+ rv->setCompute(true);
+ rv->setComputeWorkgroups(dispatchCompute->x(),
+ dispatchCompute->y(),
+ dispatchCompute->z());
+ break;
+ }
+
case FrameGraphNode::Lighting: {
// TODO
break;