Loading services/surfaceflinger/RenderEngine/Description.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,10 @@ void Description::setProjectionMatrix(const mat4& mtx) { mProjectionMatrix = mtx; } void Description::setSaturationMatrix(const mat4& mtx) { mSaturationMatrix = mtx; } void Description::setColorMatrix(const mat4& mtx) { mColorMatrix = mtx; } Loading Loading @@ -78,6 +82,11 @@ bool Description::hasColorMatrix() const { return mColorMatrix != identity; } bool Description::hasSaturationMatrix() const { const mat4 identity; return mSaturationMatrix != identity; } const mat4& Description::getColorMatrix() const { return mColorMatrix; } Loading services/surfaceflinger/RenderEngine/Description.h +3 −0 Original line number Diff line number Diff line Loading @@ -42,12 +42,14 @@ public: void disableTexture(); void setColor(const half4& color); void setProjectionMatrix(const mat4& mtx); void setSaturationMatrix(const mat4& mtx); void setColorMatrix(const mat4& mtx); void setInputTransformMatrix(const mat3& matrix); void setOutputTransformMatrix(const mat4& matrix); bool hasInputTransformMatrix() const; bool hasOutputTransformMatrix() const; bool hasColorMatrix() const; bool hasSaturationMatrix() const; const mat4& getColorMatrix() const; void setY410BT2020(bool enable); Loading Loading @@ -90,6 +92,7 @@ private: // projection matrix mat4 mProjectionMatrix; mat4 mColorMatrix; mat4 mSaturationMatrix; mat3 mInputTransformMatrix; mat4 mOutputTransformMatrix; }; Loading services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -263,6 +263,10 @@ void GLES20RenderEngine::setupColorTransform(const mat4& colorTransform) { mState.setColorMatrix(colorTransform); } void GLES20RenderEngine::setSaturationMatrix(const mat4& saturationMatrix) { mState.setSaturationMatrix(saturationMatrix); } void GLES20RenderEngine::disableTexturing() { mState.disableTexture(); } Loading Loading @@ -372,10 +376,11 @@ void GLES20RenderEngine::drawMesh(const Mesh& mesh) { // we need to convert the RGB value to linear space and convert it back when: // - there is a color matrix that is not an identity matrix, or // - there is a saturation matrix that is not an identity matrix, or // - there is an output transform matrix that is not an identity matrix, or // - the input transfer function doesn't match the output transfer function. if (wideColorState.hasColorMatrix() || wideColorState.hasOutputTransformMatrix() || inputTransfer != outputTransfer) { if (wideColorState.hasColorMatrix() || wideColorState.hasSaturationMatrix() || wideColorState.hasOutputTransformMatrix() || inputTransfer != outputTransfer) { switch (inputTransfer) { case Dataspace::TRANSFER_ST2084: wideColorState.setInputTransferFunction(Description::TransferFunction::ST2084); Loading services/surfaceflinger/RenderEngine/GLES20RenderEngine.h +1 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,7 @@ protected: virtual void setupLayerBlackedOut(); virtual void setupFillWithColor(float r, float g, float b, float a); virtual void setupColorTransform(const mat4& colorTransform); virtual void setSaturationMatrix(const mat4& saturationMatrix); virtual void disableTexturing(); virtual void disableBlending(); Loading services/surfaceflinger/RenderEngine/Program.cpp +11 −2 Original line number Diff line number Diff line Loading @@ -135,13 +135,22 @@ void Program::setUniforms(const Description& desc) { glUniform4fv(mColorLoc, 1, color); } if (mInputTransformMatrixLoc >= 0) { glUniformMatrix3fv(mInputTransformMatrixLoc, 1, GL_FALSE, desc.mInputTransformMatrix.asArray()); // If the input transform matrix is not identity matrix, we want to merge // the saturation matrix with input transform matrix so that the saturation // matrix is applied at the correct stage. mat4 inputTransformMatrix = mat4(desc.mInputTransformMatrix) * desc.mSaturationMatrix; glUniformMatrix4fv(mInputTransformMatrixLoc, 1, GL_FALSE, inputTransformMatrix.asArray()); } if (mOutputTransformMatrixLoc >= 0) { // The output transform matrix and color matrix can be combined as one matrix // that is applied right before applying OETF. mat4 outputTransformMatrix = desc.mColorMatrix * desc.mOutputTransformMatrix; // If there is no input transform matrix, we want to merge the saturation // matrix with output transform matrix to avoid extra matrix multiplication // in shader. if (mInputTransformMatrixLoc < 0) { outputTransformMatrix *= desc.mSaturationMatrix; } glUniformMatrix4fv(mOutputTransformMatrixLoc, 1, GL_FALSE, outputTransformMatrix.asArray()); } Loading Loading
services/surfaceflinger/RenderEngine/Description.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,10 @@ void Description::setProjectionMatrix(const mat4& mtx) { mProjectionMatrix = mtx; } void Description::setSaturationMatrix(const mat4& mtx) { mSaturationMatrix = mtx; } void Description::setColorMatrix(const mat4& mtx) { mColorMatrix = mtx; } Loading Loading @@ -78,6 +82,11 @@ bool Description::hasColorMatrix() const { return mColorMatrix != identity; } bool Description::hasSaturationMatrix() const { const mat4 identity; return mSaturationMatrix != identity; } const mat4& Description::getColorMatrix() const { return mColorMatrix; } Loading
services/surfaceflinger/RenderEngine/Description.h +3 −0 Original line number Diff line number Diff line Loading @@ -42,12 +42,14 @@ public: void disableTexture(); void setColor(const half4& color); void setProjectionMatrix(const mat4& mtx); void setSaturationMatrix(const mat4& mtx); void setColorMatrix(const mat4& mtx); void setInputTransformMatrix(const mat3& matrix); void setOutputTransformMatrix(const mat4& matrix); bool hasInputTransformMatrix() const; bool hasOutputTransformMatrix() const; bool hasColorMatrix() const; bool hasSaturationMatrix() const; const mat4& getColorMatrix() const; void setY410BT2020(bool enable); Loading Loading @@ -90,6 +92,7 @@ private: // projection matrix mat4 mProjectionMatrix; mat4 mColorMatrix; mat4 mSaturationMatrix; mat3 mInputTransformMatrix; mat4 mOutputTransformMatrix; }; Loading
services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -263,6 +263,10 @@ void GLES20RenderEngine::setupColorTransform(const mat4& colorTransform) { mState.setColorMatrix(colorTransform); } void GLES20RenderEngine::setSaturationMatrix(const mat4& saturationMatrix) { mState.setSaturationMatrix(saturationMatrix); } void GLES20RenderEngine::disableTexturing() { mState.disableTexture(); } Loading Loading @@ -372,10 +376,11 @@ void GLES20RenderEngine::drawMesh(const Mesh& mesh) { // we need to convert the RGB value to linear space and convert it back when: // - there is a color matrix that is not an identity matrix, or // - there is a saturation matrix that is not an identity matrix, or // - there is an output transform matrix that is not an identity matrix, or // - the input transfer function doesn't match the output transfer function. if (wideColorState.hasColorMatrix() || wideColorState.hasOutputTransformMatrix() || inputTransfer != outputTransfer) { if (wideColorState.hasColorMatrix() || wideColorState.hasSaturationMatrix() || wideColorState.hasOutputTransformMatrix() || inputTransfer != outputTransfer) { switch (inputTransfer) { case Dataspace::TRANSFER_ST2084: wideColorState.setInputTransferFunction(Description::TransferFunction::ST2084); Loading
services/surfaceflinger/RenderEngine/GLES20RenderEngine.h +1 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,7 @@ protected: virtual void setupLayerBlackedOut(); virtual void setupFillWithColor(float r, float g, float b, float a); virtual void setupColorTransform(const mat4& colorTransform); virtual void setSaturationMatrix(const mat4& saturationMatrix); virtual void disableTexturing(); virtual void disableBlending(); Loading
services/surfaceflinger/RenderEngine/Program.cpp +11 −2 Original line number Diff line number Diff line Loading @@ -135,13 +135,22 @@ void Program::setUniforms(const Description& desc) { glUniform4fv(mColorLoc, 1, color); } if (mInputTransformMatrixLoc >= 0) { glUniformMatrix3fv(mInputTransformMatrixLoc, 1, GL_FALSE, desc.mInputTransformMatrix.asArray()); // If the input transform matrix is not identity matrix, we want to merge // the saturation matrix with input transform matrix so that the saturation // matrix is applied at the correct stage. mat4 inputTransformMatrix = mat4(desc.mInputTransformMatrix) * desc.mSaturationMatrix; glUniformMatrix4fv(mInputTransformMatrixLoc, 1, GL_FALSE, inputTransformMatrix.asArray()); } if (mOutputTransformMatrixLoc >= 0) { // The output transform matrix and color matrix can be combined as one matrix // that is applied right before applying OETF. mat4 outputTransformMatrix = desc.mColorMatrix * desc.mOutputTransformMatrix; // If there is no input transform matrix, we want to merge the saturation // matrix with output transform matrix to avoid extra matrix multiplication // in shader. if (mInputTransformMatrixLoc < 0) { outputTransformMatrix *= desc.mSaturationMatrix; } glUniformMatrix4fv(mOutputTransformMatrixLoc, 1, GL_FALSE, outputTransformMatrix.asArray()); } Loading