forked from qt-creator/qt-creator
QmlDesigner: Create temp files for generated shaders
Also some cleanups regarding usage of QShaderTools Task-number: QDS-10811 Change-Id: I655189e53a39e8342d849d3ffff0f89de9beb5e5 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
This commit is contained in:
@@ -44,17 +44,13 @@ static bool writeToFile(const QByteArray &buf, const QString &filename, FileType
|
|||||||
EffectMakerModel::EffectMakerModel(QObject *parent)
|
EffectMakerModel::EffectMakerModel(QObject *parent)
|
||||||
: QAbstractListModel{parent}
|
: QAbstractListModel{parent}
|
||||||
{
|
{
|
||||||
|
m_vertexSourceFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.vert");
|
||||||
|
m_fragmentSourceFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.frag");
|
||||||
m_vertexShaderFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.vert.qsb");
|
m_vertexShaderFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.vert.qsb");
|
||||||
m_fragmentShaderFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.frag.qsb");
|
m_fragmentShaderFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.frag.qsb");
|
||||||
// TODO: Will be revisted later when saving output files
|
if (!m_vertexSourceFile.open() || !m_fragmentSourceFile.open()
|
||||||
if (m_vertexShaderFile.open())
|
|| !m_vertexShaderFile.open() || !m_fragmentShaderFile.open())
|
||||||
qInfo() << "Using temporary vs file:" << m_vertexShaderFile.fileName();
|
qWarning() << "Unable to open temporary files";
|
||||||
if (m_fragmentShaderFile.open())
|
|
||||||
qInfo() << "Using temporary fs file:" << m_fragmentShaderFile.fileName();
|
|
||||||
|
|
||||||
// Prepare baker
|
|
||||||
m_baker.setGeneratedShaderVariants({ QShader::StandardShader });
|
|
||||||
updateBakedShaderVersions();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QHash<int, QByteArray> EffectMakerModel::roleNames() const
|
QHash<int, QByteArray> EffectMakerModel::roleNames() const
|
||||||
@@ -141,21 +137,6 @@ void EffectMakerModel::removeNode(int idx)
|
|||||||
bakeShaders();
|
bakeShaders();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EffectMakerModel::updateBakedShaderVersions()
|
|
||||||
{
|
|
||||||
QList<QShaderBaker::GeneratedShader> targets;
|
|
||||||
targets.append({ QShader::SpirvShader, QShaderVersion(100) }); // Vulkan 1.0
|
|
||||||
targets.append({ QShader::HlslShader, QShaderVersion(50) }); // Shader Model 5.0
|
|
||||||
targets.append({ QShader::MslShader, QShaderVersion(12) }); // Metal 1.2
|
|
||||||
targets.append({ QShader::GlslShader, QShaderVersion(300, QShaderVersion::GlslEs) }); // GLES 3.0+
|
|
||||||
targets.append({ QShader::GlslShader, QShaderVersion(410) }); // OpenGL 4.1+
|
|
||||||
targets.append({ QShader::GlslShader, QShaderVersion(330) }); // OpenGL 3.3
|
|
||||||
targets.append({ QShader::GlslShader, QShaderVersion(140) }); // OpenGL 3.1
|
|
||||||
//TODO: Do we need support for legacy shaders 100, 120?
|
|
||||||
|
|
||||||
m_baker.setGeneratedShaders(targets);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString EffectMakerModel::fragmentShader() const
|
QString EffectMakerModel::fragmentShader() const
|
||||||
{
|
{
|
||||||
return m_fragmentShader;
|
return m_fragmentShader;
|
||||||
@@ -813,37 +794,16 @@ void EffectMakerModel::bakeShaders()
|
|||||||
|
|
||||||
setVertexShader(generateVertexShader());
|
setVertexShader(generateVertexShader());
|
||||||
QString vs = m_vertexShader;
|
QString vs = m_vertexShader;
|
||||||
m_baker.setSourceString(vs.toUtf8(), QShader::VertexStage);
|
writeToFile(vs.toUtf8(), m_vertexSourceFile.fileName(), FileType::Text);
|
||||||
QShader vertShader = m_baker.bake();
|
|
||||||
|
|
||||||
if (!vertShader.isValid()) {
|
|
||||||
qWarning() << "Shader baking failed:" << qPrintable(m_baker.errorMessage());
|
|
||||||
setEffectError(m_baker.errorMessage().split('\n').first(), ErrorVert);
|
|
||||||
} else {
|
|
||||||
QString filename = m_vertexShaderFile.fileName();
|
|
||||||
writeToFile(vertShader.serialized(), filename, FileType::Binary);
|
|
||||||
resetEffectError(ErrorVert);
|
|
||||||
}
|
|
||||||
|
|
||||||
setFragmentShader(generateFragmentShader());
|
setFragmentShader(generateFragmentShader());
|
||||||
QString fs = m_fragmentShader;
|
QString fs = m_fragmentShader;
|
||||||
m_baker.setSourceString(fs.toUtf8(), QShader::FragmentStage);
|
writeToFile(fs.toUtf8(), m_fragmentSourceFile.fileName(), FileType::Text);
|
||||||
|
|
||||||
QShader fragShader = m_baker.bake();
|
//TODO: Compile shaders using external qsb tools
|
||||||
|
|
||||||
if (!fragShader.isValid()) {
|
Q_EMIT shadersBaked();
|
||||||
qWarning() << "Shader baking failed:" << qPrintable(m_baker.errorMessage());
|
setShadersUpToDate(true);
|
||||||
setEffectError(m_baker.errorMessage().split('\n').first(), ErrorFrag);
|
|
||||||
} else {
|
|
||||||
QString filename = m_fragmentShaderFile.fileName();
|
|
||||||
writeToFile(fragShader.serialized(), filename, FileType::Binary);
|
|
||||||
resetEffectError(ErrorFrag);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vertShader.isValid() && fragShader.isValid()) {
|
|
||||||
Q_EMIT shadersBaked();
|
|
||||||
setShadersUpToDate(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Mark shaders as baked, required by export later
|
// TODO: Mark shaders as baked, required by export later
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,8 +12,6 @@
|
|||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
#include <QTemporaryFile>
|
#include <QTemporaryFile>
|
||||||
|
|
||||||
#include <QtShaderTools/private/qshaderbaker_p.h>
|
|
||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
class Process;
|
class Process;
|
||||||
}
|
}
|
||||||
@@ -108,7 +106,6 @@ private:
|
|||||||
const QString getVSUniforms();
|
const QString getVSUniforms();
|
||||||
const QString getFSUniforms();
|
const QString getFSUniforms();
|
||||||
|
|
||||||
void updateBakedShaderVersions();
|
|
||||||
QString detectErrorMessage(const QString &errorMessage);
|
QString detectErrorMessage(const QString &errorMessage);
|
||||||
EffectError effectError() const;
|
EffectError effectError() const;
|
||||||
|
|
||||||
@@ -150,7 +147,9 @@ private:
|
|||||||
QString m_vertexShader;
|
QString m_vertexShader;
|
||||||
QStringList m_defaultRootVertexShader;
|
QStringList m_defaultRootVertexShader;
|
||||||
QStringList m_defaultRootFragmentShader;
|
QStringList m_defaultRootFragmentShader;
|
||||||
QShaderBaker m_baker; // TODO: Remove
|
// Temp files to store shaders sources and binary data
|
||||||
|
QTemporaryFile m_fragmentSourceFile;
|
||||||
|
QTemporaryFile m_vertexSourceFile;
|
||||||
QTemporaryFile m_fragmentShaderFile;
|
QTemporaryFile m_fragmentShaderFile;
|
||||||
QTemporaryFile m_vertexShaderFile;
|
QTemporaryFile m_vertexShaderFile;
|
||||||
// Used in exported QML, at root of the file
|
// Used in exported QML, at root of the file
|
||||||
|
|||||||
Reference in New Issue
Block a user