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:
Amr Essam
2023-10-10 14:02:01 +03:00
committed by Amr Elsayed
parent c63caa5a39
commit 5cfc9734d6
2 changed files with 13 additions and 54 deletions

View File

@@ -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
} }

View File

@@ -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