summaryrefslogtreecommitdiffstats
path: root/src/render/materialsystem/shader_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/materialsystem/shader_p.h')
-rw-r--r--src/render/materialsystem/shader_p.h136
1 files changed, 55 insertions, 81 deletions
diff --git a/src/render/materialsystem/shader_p.h b/src/render/materialsystem/shader_p.h
index 1c9731e50..5eccc7510 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,117 +66,95 @@ namespace Render {
class ShaderManager;
class AttachmentPack;
-typedef uint ProgramDNA;
-
-class Q_AUTOTEST_EXPORT Shader : public BackendNode
+class Q_3DRENDERSHARED_PRIVATE_EXPORT Shader : public BackendNode
{
public:
+ static const int modelMatrixNameId;
+ static const int viewMatrixNameId;
+ static const int projectionMatrixNameId;
+ static const int modelViewMatrixNameId;
+ static const int viewProjectionMatrixNameId;
+ static const int modelViewProjectionNameId;
+ static const int mvpNameId;
+ static const int inverseModelMatrixNameId;
+ static const int inverseViewMatrixNameId;
+ static const int inverseProjectionMatrixNameId;
+ static const int inverseModelViewNameId;
+ static const int inverseViewProjectionMatrixNameId;
+ static const int inverseModelViewProjectionNameId;
+ static const int modelNormalMatrixNameId;
+ static const int modelViewNormalNameId;
+ static const int viewportMatrixNameId;
+ static const int inverseViewportMatrixNameId;
+ static const int aspectRatioNameId;
+ static const int exposureNameId;
+ static const int gammaNameId;
+ static const int timeNameId;
+ static const int eyePositionNameId;
+ static const int skinningPaletteNameId;
+
Shader();
~Shader();
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> 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; }
+ void setFormat(QShaderProgram::Format format);
+ QShaderProgram::Format format() const { return m_format; }
+ 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<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;
+ // Set by Renderer plugin
+ void setLog(const QString &log);
+ void setStatus(QShaderProgram::Status status);
+ void initializeFromReference(const Shader &other);
- QHash<QString, int> m_fragOutputs;
+ void requestCacheRebuild();
+private:
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;
+ QShaderProgram::Status m_status;
+ QShaderProgram::Format m_format;
+ bool m_dirty;
- 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);
-
- void initializeFromReference(const Shader &other);
- void setLog(const QString &log);
- void setStatus(QShaderProgram::Status status);
-
- friend class GraphicsContext;
};
#ifndef QT_NO_DEBUG_STREAM
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