diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2017-06-07 10:49:04 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-02-03 12:32:10 +0100 |
commit | 9124a61eb1c10ed3bb7251baf2f42ac4a865e514 (patch) | |
tree | b95a20939a4d5199e8ce5ae41bcce23fd730c0ab /src/render/materialsystem/shader_p.h | |
parent | abf5d701ed90e3f1516821712a3018cbe7a2b7fe (diff) |
Introduce a GLShader class
GLShader is renderer specific shader implementation for OpenGL.
Shader now contains only backend information for a QShaderProgram frontend
node.
- Similar to the GLTexture handling, a generic adopt/abandon manager for
shaders was introduced (regardless of the actually GraphicsAPIShader class).
- The renderer and renderviews were adapted to the new changes.
This was the last major thing preventing the modularisation of the
QRenderAspect and renderers
Change-Id: If671d60928b433977e9d6e5c58199827f9408a3f
Task-number: QTBUG-61151
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/materialsystem/shader_p.h')
-rw-r--r-- | src/render/materialsystem/shader_p.h | 96 |
1 files changed, 19 insertions, 77 deletions
diff --git a/src/render/materialsystem/shader_p.h b/src/render/materialsystem/shader_p.h index 4c5bc5ea1..8b1941d2c 100644 --- a/src/render/materialsystem/shader_p.h +++ b/src/render/materialsystem/shader_p.h @@ -52,11 +52,7 @@ // #include <Qt3DRender/private/backendnode_p.h> -#include <Qt3DRender/private/shaderparameterpack_p.h> -#include <Qt3DRender/private/shadervariables_p.h> #include <Qt3DRender/qshaderprogram.h> -#include <Qt3DCore/qpropertyupdatedchange.h> -#include <QMutex> #include <QVector> QT_BEGIN_NAMESPACE @@ -70,8 +66,6 @@ namespace Render { class ShaderManager; class AttachmentPack; -typedef uint ProgramDNA; - class Q_AUTOTEST_EXPORT Shader : public BackendNode { public: @@ -104,92 +98,26 @@ public: void cleanup(); - void setGraphicsContext(GraphicsContext *context); - GraphicsContext *graphicsContext(); - - void prepareUniforms(ShaderParameterPack &pack); - void setFragOutputs(const QHash<QString, int> &fragOutputs); - const QHash<QString, int> fragOutputs() const; - - inline QVector<int> uniformsNamesIds() const { return m_uniformsNamesIds; } - inline QVector<int> standardUniformNameIds() const { return m_standardUniformNamesIds; } - inline QVector<int> uniformBlockNamesIds() const { return m_uniformBlockNamesIds; } - inline QVector<int> storageBlockNamesIds() const { return m_shaderStorageBlockNamesIds; } - inline QVector<int> attributeNamesIds() const { return m_attributeNamesIds; } - - QVector<QString> uniformsNames() const; - QVector<QString> attributesNames() const; - QVector<QString> uniformBlockNames() const; - QVector<QString> storageBlockNames() const; QVector<QByteArray> shaderCode() const; void setShaderCode(QShaderProgram::ShaderType type, const QByteArray &code); - void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; - bool isLoaded() const { QMutexLocker lock(&m_mutex); return m_isLoaded; } - void setLoaded(bool loaded) { QMutexLocker lock(&m_mutex); m_isLoaded = loaded; } - ProgramDNA dna() const Q_DECL_NOTHROW { return m_dna; } - - inline QVector<ShaderUniform> uniforms() const { return m_uniforms; } - inline QVector<ShaderAttribute> attributes() const { return m_attributes; } - inline QVector<ShaderUniformBlock> uniformBlocks() const { return m_uniformBlocks; } - inline QVector<ShaderStorageBlock> storageBlocks() const { return m_shaderStorageBlocks; } - - QHash<QString, ShaderUniform> activeUniformsForUniformBlock(int blockIndex) const; - - ShaderUniformBlock uniformBlockForBlockIndex(int blockNameId); - ShaderUniformBlock uniformBlockForBlockNameId(int blockIndex); - ShaderUniformBlock uniformBlockForBlockName(const QString &blockName); - - ShaderStorageBlock storageBlockForBlockIndex(int blockIndex); - ShaderStorageBlock storageBlockForBlockNameId(int blockNameId); - ShaderStorageBlock storageBlockForBlockName(const QString &blockName); + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime); inline QString log() const { return m_log; } inline QShaderProgram::Status status() const { return m_status; } + bool isDirty() const { return m_dirty; } + void unsetDirty() { m_dirty = false; } inline bool requiresFrontendSync() const { return m_requiresFrontendSync; } inline void unsetRequiresFrontendSync() { m_requiresFrontendSync = false; } private: - QVector<QString> m_uniformsNames; - QVector<int> m_uniformsNamesIds; - QVector<int> m_standardUniformNamesIds; - QVector<ShaderUniform> m_uniforms; - - QVector<QString> m_attributesNames; - QVector<int> m_attributeNamesIds; - QVector<ShaderAttribute> m_attributes; - - QVector<QString> m_uniformBlockNames; - QVector<int> m_uniformBlockNamesIds; - QVector<ShaderUniformBlock> m_uniformBlocks; - QHash<int, QHash<QString, ShaderUniform> > m_uniformBlockIndexToShaderUniforms; - - QVector<QString> m_shaderStorageBlockNames; - QVector<int> m_shaderStorageBlockNamesIds; - QVector<ShaderStorageBlock> m_shaderStorageBlocks; - - QHash<QString, int> m_fragOutputs; - QVector<QByteArray> m_shaderCode; - bool m_isLoaded; - ProgramDNA m_dna; - ProgramDNA m_oldDna; - mutable QMutex m_mutex; - GraphicsContext *m_graphicsContext; - QMetaObject::Connection m_contextConnection; QString m_log; QShaderProgram::Status m_status; bool m_requiresFrontendSync; - - void updateDNA(); - - // Private so that only GraphicContext can call it - void initializeUniforms(const QVector<ShaderUniform> &uniformsDescription); - void initializeAttributes(const QVector<ShaderAttribute> &attributesDescription); - void initializeUniformBlocks(const QVector<ShaderUniformBlock> &uniformBlockDescription); - void initializeShaderStorageBlocks(const QVector<ShaderStorageBlock> &shaderStorageBlockDescription); + bool m_dirty; void initializeFromReference(const Shader &other); void setLog(const QString &log); @@ -202,11 +130,25 @@ private: inline QDebug operator<<(QDebug dbg, const Shader &shader) { QDebugStateSaver saver(dbg); - dbg << "QNodeId =" << shader.peerId() << "dna =" << shader.dna() << Qt::endl; + dbg << "QNodeId =" << shader.peerId() << Qt::endl; return dbg; } #endif +class ShaderFunctor : public Qt3DCore::QBackendNodeMapper +{ +public: + explicit ShaderFunctor(AbstractRenderer *renderer, + ShaderManager *manager); + Qt3DCore::QBackendNode *create(const Qt3DCore::QNodeCreatedChangeBasePtr &change) const final; + Qt3DCore::QBackendNode *get(Qt3DCore::QNodeId id) const final; + void destroy(Qt3DCore::QNodeId id) const final; + +private: + AbstractRenderer *m_renderer; + ShaderManager *m_shaderManager; +}; + } // namespace Render } // namespace Qt3DRender |