summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2017-08-24 07:20:26 +0200
committerPaul Lemire <paul.lemire@kdab.com>2019-12-19 07:31:15 +0100
commit082ded6a34b88c2d0b6c2a30e0d2ee9a5cee9a4d (patch)
tree2bd3d7d329c964d4087c381e50ff5edc473307a0 /src
parentd3042802000902add8662b2fb66e76cc9abb6b5c (diff)
QShaderProgram: add a format property
Can be either GLSL (default) or SPIRV at the moment. This variable will be used by the rendering backend to know what type of shader code was provided (e.g with Vulkan, the GLSL could be internally converted to SPIRV) Change-Id: I1f9b734a675c581ef0721edc4464e466a18afbb0
Diffstat (limited to 'src')
-rw-r--r--src/render/materialsystem/qshaderprogram.cpp42
-rw-r--r--src/render/materialsystem/qshaderprogram.h11
-rw-r--r--src/render/materialsystem/qshaderprogram_p.h2
-rw-r--r--src/render/materialsystem/shader.cpp13
-rw-r--r--src/render/materialsystem/shader_p.h4
5 files changed, 71 insertions, 1 deletions
diff --git a/src/render/materialsystem/qshaderprogram.cpp b/src/render/materialsystem/qshaderprogram.cpp
index c4e14ea2c..6f59e6be0 100644
--- a/src/render/materialsystem/qshaderprogram.cpp
+++ b/src/render/materialsystem/qshaderprogram.cpp
@@ -332,6 +332,15 @@
\value Error An error occurred while compiling the shader
*/
+/*!
+ \enum QShaderProgram::Format
+
+ This enum identifies the format of the shader code used.
+
+ \value GLSL OpenGL
+ \value SPIRV Vulkan, OpenGL 5
+*/
+
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
@@ -339,6 +348,7 @@ namespace Qt3DRender {
QShaderProgramPrivate::QShaderProgramPrivate()
: QNodePrivate()
, m_status(QShaderProgram::NotReady)
+ , m_format(QShaderProgram::GLSL)
{
}
@@ -617,7 +627,7 @@ QString QShaderProgram::log() const
}
/*!
- \qmlproperty string ShaderProgram::status
+ \qmlproperty enumeration ShaderProgram::status
Holds the status of the current shader program.
*/
@@ -635,6 +645,35 @@ QShaderProgram::Status QShaderProgram::status() const
return d->m_status;
}
+void QShaderProgram::setFormat(QShaderProgram::Format format)
+{
+ Q_D(QShaderProgram);
+ if (format != d->m_format) {
+ d->m_format = format;
+ emit formatChanged(format);
+ }
+}
+
+/*!
+ \qmlproperty enumeration ShaderProgram::format
+ \since 6.0
+
+ Holds the format of the code provided on the ShaderProgram.
+ The default is ShaderProgram.GLSL
+*/
+/*!
+ \property QShaderProgram::format
+ \since 6.0
+
+ Holds the format of the code provided on the ShaderProgram.
+ The default is ShaderProgram.GLSL
+*/
+QShaderProgram::Format QShaderProgram::format() const
+{
+ Q_D(const QShaderProgram);
+ return d->m_format;
+}
+
QByteArray QShaderProgramPrivate::deincludify(const QString &filePath)
{
QFile f(filePath);
@@ -699,6 +738,7 @@ Qt3DCore::QNodeCreatedChangeBasePtr QShaderProgram::createNodeCreationChange() c
data.geometryShaderCode = d->m_geometryShaderCode;
data.fragmentShaderCode = d->m_fragmentShaderCode;
data.computeShaderCode = d->m_computeShaderCode;
+ data.format = d->m_format;
return creationChange;
}
diff --git a/src/render/materialsystem/qshaderprogram.h b/src/render/materialsystem/qshaderprogram.h
index 49c1076e5..ba51cec2f 100644
--- a/src/render/materialsystem/qshaderprogram.h
+++ b/src/render/materialsystem/qshaderprogram.h
@@ -60,6 +60,7 @@ class Q_3DRENDERSHARED_EXPORT QShaderProgram : public Qt3DCore::QNode
Q_PROPERTY(QByteArray computeShaderCode READ computeShaderCode WRITE setComputeShaderCode NOTIFY computeShaderCodeChanged)
Q_PROPERTY(QString log READ log NOTIFY logChanged REVISION 9)
Q_PROPERTY(Status status READ status NOTIFY statusChanged REVISION 9)
+ Q_PROPERTY(Format format READ format WRITE setFormat NOTIFY formatChanged)
public:
explicit QShaderProgram(Qt3DCore::QNode *parent = nullptr);
@@ -82,6 +83,12 @@ public:
};
Q_ENUM(Status) // LCOV_EXCL_LINE
+ enum Format {
+ GLSL = 0,
+ SPIRV
+ };
+ Q_ENUM(Format) // LCOV_EXCL_LINE
+
// Source code in-line
QByteArray vertexShaderCode() const;
QByteArray tessellationControlShaderCode() const;
@@ -96,6 +103,9 @@ public:
QString log() const;
Status status() const;
+ void setFormat(Format format);
+ Format format() const;
+
Q_INVOKABLE static QByteArray loadSource(const QUrl &sourceUrl);
public Q_SLOTS:
@@ -115,6 +125,7 @@ Q_SIGNALS:
void computeShaderCodeChanged(const QByteArray &computeShaderCode);
void logChanged(const QString &log);
void statusChanged(Status status);
+ void formatChanged(Format format);
protected:
explicit QShaderProgram(QShaderProgramPrivate &dd, Qt3DCore::QNode *parent = nullptr);
diff --git a/src/render/materialsystem/qshaderprogram_p.h b/src/render/materialsystem/qshaderprogram_p.h
index 20883f03a..8a14255a8 100644
--- a/src/render/materialsystem/qshaderprogram_p.h
+++ b/src/render/materialsystem/qshaderprogram_p.h
@@ -73,6 +73,7 @@ public:
QByteArray m_computeShaderCode;
QString m_log;
QShaderProgram::Status m_status;
+ QShaderProgram::Format m_format;
void setLog(const QString &log);
void setStatus(QShaderProgram::Status status);
@@ -89,6 +90,7 @@ struct QShaderProgramData
QByteArray geometryShaderCode;
QByteArray fragmentShaderCode;
QByteArray computeShaderCode;
+ QShaderProgram::Format format;
};
} // namespace Qt3DRender
diff --git a/src/render/materialsystem/shader.cpp b/src/render/materialsystem/shader.cpp
index afa70ed41..f3570f78d 100644
--- a/src/render/materialsystem/shader.cpp
+++ b/src/render/materialsystem/shader.cpp
@@ -85,6 +85,7 @@ Shader::Shader()
: BackendNode(ReadWrite)
, m_requiresFrontendSync(false)
, m_status(QShaderProgram::NotReady)
+ , m_format(QShaderProgram::GLSL)
, m_dirty(false)
{
m_shaderCode.resize(static_cast<int>(QShaderProgram::Compute) + 1);
@@ -98,6 +99,7 @@ void Shader::cleanup()
{
QBackendNode::setEnabled(false);
m_status = QShaderProgram::NotReady;
+ m_format = QShaderProgram::GLSL;
m_log.clear();
m_dirty = false;
}
@@ -120,6 +122,7 @@ void Shader::syncFromFrontEnd(const QNode *frontEnd, bool firstTime)
if (code != m_shaderCode.value(shaderType))
setShaderCode(shaderType, code);
}
+ setFormat(node->format());
}
void Shader::setShaderCode(QShaderProgram::ShaderType type, const QByteArray &code)
@@ -134,6 +137,16 @@ void Shader::setShaderCode(QShaderProgram::ShaderType type, const QByteArray &co
markDirty(AbstractRenderer::ShadersDirty);
}
+void Shader::setFormat(QShaderProgram::Format format)
+{
+ if (format == m_format)
+ return;
+ m_format = format;
+ m_dirty = true;
+ setStatus(QShaderProgram::NotReady);
+ markDirty(AbstractRenderer::ShadersDirty);
+}
+
QVector<QByteArray> Shader::shaderCode() const
{
return m_shaderCode;
diff --git a/src/render/materialsystem/shader_p.h b/src/render/materialsystem/shader_p.h
index 6f5383e88..9065a6524 100644
--- a/src/render/materialsystem/shader_p.h
+++ b/src/render/materialsystem/shader_p.h
@@ -106,6 +106,9 @@ public:
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; }
@@ -118,6 +121,7 @@ private:
QString m_log;
QShaderProgram::Status m_status;
bool m_requiresFrontendSync;
+ QShaderProgram::Format m_format;
bool m_dirty;
QVector<Qt3DCore::QPropertyUpdatedChangePtr> m_pendingNotifications;