diff options
Diffstat (limited to 'src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h')
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h | 109 |
1 files changed, 57 insertions, 52 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h b/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h index 297df2232a..878b63fc8c 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h @@ -626,27 +626,65 @@ private: QMatrix4x4 m_identityMatrix; }; +struct GraphicsState +{ + bool depthTest = false; + bool depthWrite = false; + QRhiGraphicsPipeline::CompareOp depthFunc = QRhiGraphicsPipeline::Less; + bool blending = false; + QRhiGraphicsPipeline::BlendFactor srcColor = QRhiGraphicsPipeline::One; + QRhiGraphicsPipeline::BlendFactor dstColor = QRhiGraphicsPipeline::OneMinusSrcAlpha; + QRhiGraphicsPipeline::ColorMask colorWrite = QRhiGraphicsPipeline::ColorMask(0xF); + QRhiGraphicsPipeline::CullMode cullMode = QRhiGraphicsPipeline::None; + bool usesScissor = false; + bool stencilTest = false; + int sampleCount = 1; + QSGGeometry::DrawingMode drawMode = QSGGeometry::DrawTriangles; + float lineWidth = 1.0f; +}; + +bool operator==(const GraphicsState &a, const GraphicsState &b) Q_DECL_NOTHROW; +bool operator!=(const GraphicsState &a, const GraphicsState &b) Q_DECL_NOTHROW; +uint qHash(const GraphicsState &s, uint seed = 0) Q_DECL_NOTHROW; + +struct ShaderManagerShader; + +struct GraphicsPipelineStateKey +{ + GraphicsState state; + const ShaderManagerShader *sms; + const QRhiRenderPassDescriptor *compatibleRenderPassDescriptor; + const QRhiShaderResourceBindings *layoutCompatibleSrb; +}; + +bool operator==(const GraphicsPipelineStateKey &a, const GraphicsPipelineStateKey &b) Q_DECL_NOTHROW; +bool operator!=(const GraphicsPipelineStateKey &a, const GraphicsPipelineStateKey &b) Q_DECL_NOTHROW; +uint qHash(const GraphicsPipelineStateKey &k, uint seed = 0) Q_DECL_NOTHROW; + +struct ShaderManagerShader +{ + ~ShaderManagerShader() { + delete programRhi.program; + delete programGL.program; + } + struct { + QSGMaterialShader *program = nullptr; + int pos_order; + } programGL; + struct { + QSGMaterialRhiShader *program = nullptr; + QRhiVertexInputLayout inputLayout; + QVarLengthArray<QRhiGraphicsShaderStage, 2> shaderStages; + } programRhi; + + float lastOpacity; +}; + class ShaderManager : public QObject { Q_OBJECT public: - struct Shader { - ~Shader() { - delete programRhi.program; - delete programGL.program; - } - struct { - QSGMaterialShader *program = nullptr; - int pos_order; - } programGL; - struct { - QSGMaterialRhiShader *program = nullptr; - QRhiVertexInputLayout inputLayout; - QVarLengthArray<QRhiGraphicsShaderStage, 2> shaderStages; - } programRhi; - - float lastOpacity; - }; + using Shader = ShaderManagerShader; ShaderManager(QSGDefaultRenderContext *ctx) : blitProgram(nullptr), context(ctx) { } ~ShaderManager() { @@ -657,9 +695,10 @@ public: void clearCachedRendererData(); using ShaderResourceBindingList = QVarLengthArray<QRhiShaderResourceBinding, 8>; - QRhiShaderResourceBindings *srb(const ShaderResourceBindingList &bindings); + QHash<GraphicsPipelineStateKey, QRhiGraphicsPipeline *> pipelineCache; + public Q_SLOTS: void invalidated(); @@ -677,39 +716,6 @@ private: QHash<ShaderResourceBindingList, QRhiShaderResourceBindings *> srbCache; }; -struct GraphicsState -{ - bool depthTest = false; - bool depthWrite = false; - QRhiGraphicsPipeline::CompareOp depthFunc = QRhiGraphicsPipeline::Less; - bool blending = false; - QRhiGraphicsPipeline::BlendFactor srcColor = QRhiGraphicsPipeline::One; - QRhiGraphicsPipeline::BlendFactor dstColor = QRhiGraphicsPipeline::OneMinusSrcAlpha; - QRhiGraphicsPipeline::ColorMask colorWrite = QRhiGraphicsPipeline::ColorMask(0xF); - QRhiGraphicsPipeline::CullMode cullMode = QRhiGraphicsPipeline::None; - bool usesScissor = false; - bool stencilTest = false; - int sampleCount = 1; - QSGGeometry::DrawingMode drawMode = QSGGeometry::DrawTriangles; - float lineWidth = 1.0f; -}; - -bool operator==(const GraphicsState &a, const GraphicsState &b) Q_DECL_NOTHROW; -bool operator!=(const GraphicsState &a, const GraphicsState &b) Q_DECL_NOTHROW; -uint qHash(const GraphicsState &s, uint seed = 0) Q_DECL_NOTHROW; - -struct GraphicsPipelineStateKey -{ - GraphicsState state; - const ShaderManager::Shader *sms; - const QRhiRenderPassDescriptor *rpDesc; - const QRhiShaderResourceBindings *layoutCompatibleSrb; -}; - -bool operator==(const GraphicsPipelineStateKey &a, const GraphicsPipelineStateKey &b) Q_DECL_NOTHROW; -bool operator!=(const GraphicsPipelineStateKey &a, const GraphicsPipelineStateKey &b) Q_DECL_NOTHROW; -uint qHash(const GraphicsPipelineStateKey &k, uint seed = 0) Q_DECL_NOTHROW; - struct RenderPassState { QRhiViewport viewport; @@ -903,7 +909,6 @@ private: GraphicsState m_gstate; RenderPassState m_pstate; QStack<GraphicsState> m_gstateStack; - QHash<GraphicsPipelineStateKey, QRhiGraphicsPipeline *> m_pipelines; QHash<QSGSamplerDescription, QRhiSampler *> m_samplers; QRhiTexture *m_dummyTexture = nullptr; |