diff --git a/app/node/filter/blur/blur.cpp b/app/node/filter/blur/blur.cpp index 91d5791d9..7950f77e9 100644 --- a/app/node/filter/blur/blur.cpp +++ b/app/node/filter/blur/blur.cpp @@ -80,7 +80,7 @@ void BlurFilterNode::Retranslate() repeat_edge_pixels_input_->set_name(tr("Repeat Edge Pixels")); } -ShaderCode BlurFilterNode::GetShaderCode(const QByteArray &shader_id) const +ShaderCode BlurFilterNode::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) return ShaderCode(ReadFileAsString(":/shaders/blur.frag"), QString()); diff --git a/app/node/filter/blur/blur.h b/app/node/filter/blur/blur.h index d03c3732c..6f9100605 100644 --- a/app/node/filter/blur/blur.h +++ b/app/node/filter/blur/blur.h @@ -39,7 +39,7 @@ public: virtual void Retranslate() override; - virtual ShaderCode GetShaderCode(const QByteArray &shader_id) const override; + virtual ShaderCode GetShaderCode(const QString &shader_id) const override; virtual NodeValueTable Value(NodeValueDatabase &value) const override; private: diff --git a/app/node/filter/stroke/stroke.cpp b/app/node/filter/stroke/stroke.cpp index 629b985b5..d62c99b37 100644 --- a/app/node/filter/stroke/stroke.cpp +++ b/app/node/filter/stroke/stroke.cpp @@ -106,7 +106,7 @@ NodeValueTable StrokeFilterNode::Value(NodeValueDatabase &value) const return table; } -ShaderCode StrokeFilterNode::GetShaderCode(const QByteArray &shader_id) const +ShaderCode StrokeFilterNode::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) diff --git a/app/node/filter/stroke/stroke.h b/app/node/filter/stroke/stroke.h index 7a9d0977a..b9d1ac993 100644 --- a/app/node/filter/stroke/stroke.h +++ b/app/node/filter/stroke/stroke.h @@ -40,7 +40,7 @@ public: virtual void Retranslate() override; virtual NodeValueTable Value(NodeValueDatabase &value) const override; - virtual ShaderCode GetShaderCode(const QByteArray &shader_id) const override; + virtual ShaderCode GetShaderCode(const QString &shader_id) const override; private: NodeInput* tex_input_; diff --git a/app/node/generator/polygon/polygon.cpp b/app/node/generator/polygon/polygon.cpp index e8265df15..870488cc0 100644 --- a/app/node/generator/polygon/polygon.cpp +++ b/app/node/generator/polygon/polygon.cpp @@ -85,7 +85,7 @@ void PolygonGenerator::Retranslate() color_input_->set_name(tr("Color")); } -ShaderCode PolygonGenerator::GetShaderCode(const QByteArray &shader_id) const +ShaderCode PolygonGenerator::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) diff --git a/app/node/generator/polygon/polygon.h b/app/node/generator/polygon/polygon.h index 9e0b33c1e..296177dea 100644 --- a/app/node/generator/polygon/polygon.h +++ b/app/node/generator/polygon/polygon.h @@ -40,7 +40,7 @@ public: virtual void Retranslate() override; - virtual ShaderCode GetShaderCode(const QByteArray& shader_id) const override; + virtual ShaderCode GetShaderCode(const QString& shader_id) const override; virtual NodeValueTable Value(NodeValueDatabase &value) const override; virtual bool HasGizmos() const override; diff --git a/app/node/generator/solid/solid.cpp b/app/node/generator/solid/solid.cpp index f5a640d64..abcf6491f 100644 --- a/app/node/generator/solid/solid.cpp +++ b/app/node/generator/solid/solid.cpp @@ -73,7 +73,7 @@ NodeValueTable SolidGenerator::Value(NodeValueDatabase &value) const return table; } -ShaderCode SolidGenerator::GetShaderCode(const QByteArray &shader_id) const +ShaderCode SolidGenerator::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) diff --git a/app/node/generator/solid/solid.h b/app/node/generator/solid/solid.h index 9b9b81a27..aa6fb5f79 100644 --- a/app/node/generator/solid/solid.h +++ b/app/node/generator/solid/solid.h @@ -40,7 +40,7 @@ public: virtual void Retranslate() override; virtual NodeValueTable Value(NodeValueDatabase &value) const override; - virtual ShaderCode GetShaderCode(const QByteArray &shader_id) const override; + virtual ShaderCode GetShaderCode(const QString &shader_id) const override; private: NodeInput* color_input_; diff --git a/app/node/math/math/math.cpp b/app/node/math/math/math.cpp index ab5867f5c..c68879a7d 100644 --- a/app/node/math/math/math.cpp +++ b/app/node/math/math/math.cpp @@ -89,21 +89,18 @@ void MathNode::Retranslate() method_in_->set_combobox_strings(operations); } -ShaderCode MathNode::GetShaderCode(const QByteArray &shader_id) const +ShaderCode MathNode::GetShaderCode(const QString &shader_id) const { - QDataStream data(shader_id); + QStringList code_id = shader_id.split('.'); - Pairing pairing; - NodeParam::DataType type_a; - NodeParam::DataType type_b; - - data >> pairing; - data >> type_a; - data >> type_b; + Operation op = static_cast(code_id.at(0).toInt()); + Pairing pairing = static_cast(code_id.at(1).toInt()); + NodeParam::DataType type_a = static_cast(code_id.at(2).toInt()); + NodeParam::DataType type_b = static_cast(code_id.at(3).toInt()); QString operation, frag, vert; - if (pairing == kPairTextureMatrix && GetOperation() == kOpMultiply) { + if (pairing == kPairTextureMatrix && op == kOpMultiply) { // Override the operation for this operation since we multiply texture COORDS by the matrix rather than NodeParam* tex_in = (type_a == NodeParam::kTexture) ? param_a_in_ : param_b_in_; @@ -117,7 +114,7 @@ ShaderCode MathNode::GetShaderCode(const QByteArray &shader_id) const vert = ReadFileAsString(":/shaders/matrix.vert").arg(mat_in->id(), tex_in->id()); } else { - switch (GetOperation()) { + switch (op) { case kOpAdd: operation = QStringLiteral("%1 + %2"); break; @@ -294,14 +291,10 @@ NodeValueTable MathNode::Value(NodeValueDatabase &value) const case kPairTextureMatrix: { ShaderJob job; - - QByteArray shader_id; - QDataStream shader_id_stream(&shader_id, QIODevice::WriteOnly); - shader_id_stream << calc.GetMostLikelyPairing(); - shader_id_stream << val_a.type(); - shader_id_stream << val_b.type(); - - job.SetShaderID(shader_id); + job.SetShaderID(QStringLiteral("%1.%2.%3.%4").arg(QString::number(GetOperation()), + QString::number(calc.GetMostLikelyPairing()), + QString::number(val_a.type()), + QString::number(val_b.type()))); job.InsertValue(param_a_in_, val_a); job.InsertValue(param_b_in_, val_b); diff --git a/app/node/math/math/math.h b/app/node/math/math/math.h index 41934cf31..b99442dc2 100644 --- a/app/node/math/math/math.h +++ b/app/node/math/math/math.h @@ -39,7 +39,7 @@ public: virtual void Retranslate() override; - virtual ShaderCode GetShaderCode(const QByteArray &shader_id) const override; + virtual ShaderCode GetShaderCode(const QString &shader_id) const override; virtual NodeValueTable Value(NodeValueDatabase &value) const override; virtual void ProcessSamples(NodeValueDatabase &values, const SampleBufferPtr input, SampleBufferPtr output, int index) const override; diff --git a/app/node/math/merge/merge.cpp b/app/node/math/merge/merge.cpp index 80aa9af6f..092b69455 100644 --- a/app/node/math/merge/merge.cpp +++ b/app/node/math/merge/merge.cpp @@ -62,7 +62,7 @@ void MergeNode::Retranslate() blend_in_->set_name(tr("Blend")); } -ShaderCode MergeNode::GetShaderCode(const QByteArray &shader_id) const +ShaderCode MergeNode::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) diff --git a/app/node/math/merge/merge.h b/app/node/math/merge/merge.h index 954c30c85..70f79369b 100644 --- a/app/node/math/merge/merge.h +++ b/app/node/math/merge/merge.h @@ -39,7 +39,7 @@ public: virtual void Retranslate() override; - virtual ShaderCode GetShaderCode(const QByteArray &shader_id) const override; + virtual ShaderCode GetShaderCode(const QString &shader_id) const override; virtual NodeValueTable Value(NodeValueDatabase &value) const override; NodeInput* base_in() const; diff --git a/app/node/node.cpp b/app/node/node.cpp index bedbe81fc..e4927119f 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -457,7 +457,7 @@ QList Node::GetImmediateDependencies() const return GetDependenciesInternal(false, false); } -ShaderCode Node::GetShaderCode(const QByteArray &shader_id) const +ShaderCode Node::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) diff --git a/app/node/node.h b/app/node/node.h index 54cb0194a..addfd631b 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -174,7 +174,7 @@ public: /** * @brief Generate hardware accelerated code for this Node */ - virtual ShaderCode GetShaderCode(const QByteArray& shader_id) const; + virtual ShaderCode GetShaderCode(const QString& shader_id) const; /** * @brief If ProcessesSamples() is true, this is the function that will process them. diff --git a/app/project/item/sequence/sequence.cpp b/app/project/item/sequence/sequence.cpp index 19effbcbb..b2c5a0c22 100644 --- a/app/project/item/sequence/sequence.cpp +++ b/app/project/item/sequence/sequence.cpp @@ -64,7 +64,7 @@ void Sequence::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const } if (reader->name() == QStringLiteral("video")) { - int video_width = 0, video_height = 0, preview_div = 0; + int video_width = 0, video_height = 0, preview_div = 1; rational video_timebase; PixelFormat::Format preview_format = PixelFormat::PIX_FMT_INVALID; diff --git a/app/render/backend/opengl/openglproxy.cpp b/app/render/backend/opengl/openglproxy.cpp index df5af00cb..9d25d895a 100644 --- a/app/render/backend/opengl/openglproxy.cpp +++ b/app/render/backend/opengl/openglproxy.cpp @@ -182,12 +182,11 @@ QVariant OpenGLProxy::PreCachedFrameToValue(FramePtr frame) return QVariant::fromValue(texture_cache_.Get(ctx_, frame)); } -OpenGLShaderPtr OpenGLProxy::ResolveShaderFromCache(const Node *node, const QByteArray &shader_id) +OpenGLShaderPtr OpenGLProxy::ResolveShaderFromCache(const Node *node, const QString &shader_id) { // Make a composite of the node ID and the shader ID (if applicable) - QByteArray id = node->id().toUtf8(); - id.append(shader_id); - OpenGLShaderPtr shader = shader_cache_.value(id); + QString full_shader_id = QStringLiteral("%1:%2").arg(node->id(), shader_id); + OpenGLShaderPtr shader = shader_cache_.value(full_shader_id); if (!shader) { // Since we have shader code, compile it now @@ -213,7 +212,7 @@ OpenGLShaderPtr OpenGLProxy::ResolveShaderFromCache(const Node *node, const QByt && shader->addShaderFromSourceCode(QOpenGLShader::Fragment, frag_code) && shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vert_code) && shader->link()) { - shader_cache_.insert(shader_id, shader); + shader_cache_.insert(full_shader_id, shader); } else { qWarning() << "Failed to compile shader for" << node->id(); shader = nullptr; diff --git a/app/render/backend/opengl/openglproxy.h b/app/render/backend/opengl/openglproxy.h index 9604c4ebd..7c6878626 100644 --- a/app/render/backend/opengl/openglproxy.h +++ b/app/render/backend/opengl/openglproxy.h @@ -84,7 +84,7 @@ public slots: QVariant PreCachedFrameToValue(OLIVE_NAMESPACE::FramePtr frame); private: - OpenGLShaderPtr ResolveShaderFromCache(const Node* node, const QByteArray& shader_id); + OpenGLShaderPtr ResolveShaderFromCache(const Node* node, const QString &shader_id); QOpenGLContext* ctx_; QOffscreenSurface surface_; @@ -97,7 +97,7 @@ private: OpenGLShaderPtr copy_pipeline_; - QHash shader_cache_; + QHash shader_cache_; OpenGLTextureCache texture_cache_; diff --git a/app/render/shaderinfo.h b/app/render/shaderinfo.h index d9138da60..da0c1d2ab 100644 --- a/app/render/shaderinfo.h +++ b/app/render/shaderinfo.h @@ -93,12 +93,12 @@ public: alpha_channel_required_ = false; } - const QByteArray& GetShaderID() const + const QString& GetShaderID() const { return id_; } - void SetShaderID(const QByteArray& id) + void SetShaderID(const QString& id) { id_ = id; } @@ -130,7 +130,7 @@ public: } private: - QByteArray id_; + QString id_; int iterations_;