Bug 1478704 - Compute shader adjustments for mask separately r=jrmuizel,mstange

When masking as a secondary effect to RENDER_TARGET, mFBOTextureTarget
will have a target of GL_TEXTURE_2D, leading us to not use sampler2DRect
and friends for the mask. This fixes that, and also assures our coord
adjustments are based on the mask texture's dimensions.

MozReview-Commit-ID: JSDfDJuLNSa
This commit is contained in:
Doug Thayer
2018-07-27 09:56:34 -07:00
parent f962ba53fa
commit d94393fbef
4 changed files with 48 additions and 9 deletions

View File

@@ -51,6 +51,7 @@ AddUniforms(ProgramProfileOGL& aProfile)
"uRenderColor",
"uTexCoordMultiplier",
"uCbCrTexCoordMultiplier",
"uMaskCoordMultiplier",
"uTexturePass2",
"uColorMatrix",
"uColorMatrixVector",
@@ -91,6 +92,17 @@ ShaderConfigOGL::SetTextureTarget(GLenum aTarget)
}
}
void
ShaderConfigOGL::SetMaskTextureTarget(GLenum aTarget)
{
if (aTarget == LOCAL_GL_TEXTURE_RECTANGLE_ARB) {
SetFeature(ENABLE_MASK_TEXTURE_RECT, true);
} else {
MOZ_ASSERT(aTarget == LOCAL_GL_TEXTURE_2D);
SetFeature(ENABLE_MASK_TEXTURE_RECT, false);
}
}
void
ShaderConfigOGL::SetRBSwap(bool aEnabled)
{
@@ -384,6 +396,16 @@ ProgramProfileOGL::GetProfileFor(ShaderConfigOGL aConfig)
texture2D = "texture2DRect";
}
const char *maskSampler2D = "sampler2D";
const char *maskTexture2D = "texture2D";
if (aConfig.mFeatures & ENABLE_MASK &&
aConfig.mFeatures & ENABLE_MASK_TEXTURE_RECT) {
fs << "uniform vec2 uMaskCoordMultiplier;" << endl;
maskSampler2D = "sampler2DRect";
maskTexture2D = "texture2DRect";
}
if (aConfig.mFeatures & ENABLE_TEXTURE_EXTERNAL) {
sampler2D = "samplerExternalOES";
}
@@ -413,7 +435,7 @@ ProgramProfileOGL::GetProfileFor(ShaderConfigOGL aConfig)
if (aConfig.mFeatures & ENABLE_MASK) {
fs << "varying vec3 vMaskCoord;" << endl;
fs << "uniform " << sampler2D << " uMaskTexture;" << endl;
fs << "uniform " << maskSampler2D << " uMaskTexture;" << endl;
}
if (aConfig.mFeatures & ENABLE_DEAA) {
@@ -543,10 +565,10 @@ ProgramProfileOGL::GetProfileFor(ShaderConfigOGL aConfig)
}
if (aConfig.mFeatures & ENABLE_MASK) {
fs << " vec2 maskCoords = vMaskCoord.xy / vMaskCoord.z;" << endl;
if (aConfig.mFeatures & ENABLE_TEXTURE_RECT) {
fs << " COLOR_PRECISION float mask = " << texture2D << "(uMaskTexture, maskCoords * uTexCoordMultiplier).r;" << endl;
if (aConfig.mFeatures & ENABLE_MASK_TEXTURE_RECT) {
fs << " COLOR_PRECISION float mask = " << maskTexture2D << "(uMaskTexture, maskCoords * uMaskCoordMultiplier).r;" << endl;
} else {
fs << " COLOR_PRECISION float mask = " << texture2D << "(uMaskTexture, maskCoords).r;" << endl;
fs << " COLOR_PRECISION float mask = " << maskTexture2D << "(uMaskTexture, maskCoords).r;" << endl;
}
fs << " color *= mask;" << endl;
} else {