summaryrefslogtreecommitdiffstats
path: root/src/plugins/videonode/imx6/qsgvivantevideomaterialshader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/videonode/imx6/qsgvivantevideomaterialshader.cpp')
-rw-r--r--src/plugins/videonode/imx6/qsgvivantevideomaterialshader.cpp93
1 files changed, 39 insertions, 54 deletions
diff --git a/src/plugins/videonode/imx6/qsgvivantevideomaterialshader.cpp b/src/plugins/videonode/imx6/qsgvivantevideomaterialshader.cpp
index 0d5467c6f..9e529c3df 100644
--- a/src/plugins/videonode/imx6/qsgvivantevideomaterialshader.cpp
+++ b/src/plugins/videonode/imx6/qsgvivantevideomaterialshader.cpp
@@ -40,42 +40,63 @@
#include "qsgvivantevideomaterialshader.h"
#include "qsgvivantevideonode.h"
#include "qsgvivantevideomaterial.h"
+#include "private/qsgvideotexture_p.h"
QSGVivanteVideoMaterialShader::QSGVivanteVideoMaterialShader() :
mUScale(1),
mVScale(1),
mNewUVScale(true)
{
+ setShaderFileName(VertexStage, QStringLiteral(":/imx6/shaders/rgba.vert.qsb"));
+ setShaderFileName(FragmentStage, QStringLiteral(":/imx6/shaders/rgba.frag.qsb"));
}
-void QSGVivanteVideoMaterialShader::updateState(const RenderState &state,
- QSGMaterial *newMaterial,
- QSGMaterial *oldMaterial)
+bool QSGVivanteVideoMaterialShader::updateUniformData(RenderState &state, QSGMaterial *newMaterial,
+ QSGMaterial *oldMaterial)
{
Q_UNUSED(oldMaterial);
- QSGVivanteVideoMaterial *mat = static_cast<QSGVivanteVideoMaterial *>(newMaterial);
- program()->setUniformValue(mIdTexture, 0);
- mat->bind();
+ bool changed = false;
+ QByteArray *buf = state.uniformData();
+
+ if (state.isMatrixDirty()) {
+ memcpy(buf->data(), state.combinedMatrix().constData(), 64);
+ changed = true;
+ }
+
if (state.isOpacityDirty()) {
- mat->setOpacity(state.opacity());
- program()->setUniformValue(mIdOpacity, state.opacity());
+ auto m = static_cast<QSGVivanteVideoMaterial *>(newMaterial);
+ m->mOpacity = state.opacity();
+ memcpy(buf->data() + 64, &m->mOpacity, 4);
+ changed = true;
}
+
if (mNewUVScale) {
- program()->setUniformValue(mIdUVScale, mUScale, mVScale);
+ memcpy(buf->data() + 64 + 4, &mUScale, 4);
+ memcpy(buf->data() + 64 + 4 + 4, &mVScale, 4);
+ changed = true;
mNewUVScale = false;
}
- if (state.isMatrixDirty())
- program()->setUniformValue(mIdMatrix, state.combinedMatrix());
+
+ return changed;
}
-const char * const *QSGVivanteVideoMaterialShader::attributeNames() const {
- static const char *names[] = {
- "qt_VertexPosition",
- "qt_VertexTexCoord",
- 0
- };
- return names;
+void QSGVivanteVideoMaterialShader::updateSampledImage(RenderState &state, int binding, QSGTexture **texture,
+ QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
+{
+ Q_UNUSED(oldMaterial);
+
+ if (binding < 1)
+ return;
+
+ auto m = static_cast<QSGVivanteVideoMaterial *>(newMaterial);
+ if (!m->mTexture)
+ m->mTexture.reset(new QSGVideoTexture);
+
+ m->bind();
+ m->mTexture->setNativeObject(m->mCurrentTexture, m->mCurrentFrame.size());
+ m->mTexture->commitTextureOperations(state.rhi(), state.resourceUpdateBatch());
+ *texture = m->mTexture.data();
}
void QSGVivanteVideoMaterialShader::setUVScale(float uScale, float vScale)
@@ -84,39 +105,3 @@ void QSGVivanteVideoMaterialShader::setUVScale(float uScale, float vScale)
mVScale = vScale;
mNewUVScale = true;
}
-
-const char *QSGVivanteVideoMaterialShader::vertexShader() const {
- static const char *shader =
- "uniform highp mat4 qt_Matrix; \n"
- "attribute highp vec4 qt_VertexPosition; \n"
- "attribute highp vec2 qt_VertexTexCoord; \n"
- "varying highp vec2 qt_TexCoord; \n"
- "void main() { \n"
- " qt_TexCoord = qt_VertexTexCoord; \n"
- " gl_Position = qt_Matrix * qt_VertexPosition; \n"
- "}";
- return shader;
-}
-
-const char *QSGVivanteVideoMaterialShader::fragmentShader() const {
- static const char *shader =
- "uniform sampler2D texture;"
- "uniform lowp float opacity;"
- "uniform highp vec2 uvScale;"
- ""
- "varying highp vec2 qt_TexCoord;"
- ""
- "void main()"
- "{"
- " gl_FragColor = vec4(texture2D( texture, qt_TexCoord * uvScale ).rgb, 1.0) * opacity;\n"
- "}";
- return shader;
-}
-
-
-void QSGVivanteVideoMaterialShader::initialize() {
- mIdMatrix = program()->uniformLocation("qt_Matrix");
- mIdTexture = program()->uniformLocation("texture");
- mIdOpacity = program()->uniformLocation("opacity");
- mIdUVScale = program()->uniformLocation("uvScale");
-}