diff options
Diffstat (limited to 'src/plugins/videonode/imx6/qsgvivantevideomaterialshader.cpp')
-rw-r--r-- | src/plugins/videonode/imx6/qsgvivantevideomaterialshader.cpp | 93 |
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"); -} |