mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1061525 - Part 3: Add shaders for NV12 to OGLShaderProgram. r=BenWa
This commit is contained in:
parent
a2e73f1554
commit
5ae98d2956
@ -47,6 +47,7 @@ AddUniforms(ProgramProfileOGL& aProfile)
|
||||
"uMaskTexture",
|
||||
"uRenderColor",
|
||||
"uTexCoordMultiplier",
|
||||
"uCbCrTexCoordMultiplier",
|
||||
"uTexturePass2",
|
||||
"uColorMatrix",
|
||||
"uColorMatrixVector",
|
||||
@ -108,6 +109,14 @@ void
|
||||
ShaderConfigOGL::SetYCbCr(bool aEnabled)
|
||||
{
|
||||
SetFeature(ENABLE_TEXTURE_YCBCR, aEnabled);
|
||||
MOZ_ASSERT(!(mFeatures & ENABLE_TEXTURE_NV12));
|
||||
}
|
||||
|
||||
void
|
||||
ShaderConfigOGL::SetNV12(bool aEnabled)
|
||||
{
|
||||
SetFeature(ENABLE_TEXTURE_NV12, aEnabled);
|
||||
MOZ_ASSERT(!(mFeatures & ENABLE_TEXTURE_YCBCR));
|
||||
}
|
||||
|
||||
void
|
||||
@ -301,6 +310,10 @@ ProgramProfileOGL::GetProfileFor(ShaderConfigOGL aConfig)
|
||||
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_RECT) {
|
||||
fs << "uniform vec2 uTexCoordMultiplier;" << endl;
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_YCBCR ||
|
||||
aConfig.mFeatures & ENABLE_TEXTURE_NV12) {
|
||||
fs << "uniform vec2 uCbCrTexCoordMultiplier;" << endl;
|
||||
}
|
||||
sampler2D = "sampler2DRect";
|
||||
texture2D = "texture2DRect";
|
||||
}
|
||||
@ -313,6 +326,9 @@ ProgramProfileOGL::GetProfileFor(ShaderConfigOGL aConfig)
|
||||
fs << "uniform sampler2D uYTexture;" << endl;
|
||||
fs << "uniform sampler2D uCbTexture;" << endl;
|
||||
fs << "uniform sampler2D uCrTexture;" << endl;
|
||||
} else if (aConfig.mFeatures & ENABLE_TEXTURE_NV12) {
|
||||
fs << "uniform " << sampler2D << " uYTexture;" << endl;
|
||||
fs << "uniform " << sampler2D << " uCbTexture;" << endl;
|
||||
} else if (aConfig.mFeatures & ENABLE_TEXTURE_COMPONENT_ALPHA) {
|
||||
fs << "uniform sampler2D uBlackTexture;" << endl;
|
||||
fs << "uniform sampler2D uWhiteTexture;" << endl;
|
||||
@ -334,10 +350,29 @@ ProgramProfileOGL::GetProfileFor(ShaderConfigOGL aConfig)
|
||||
if (!(aConfig.mFeatures & ENABLE_RENDER_COLOR)) {
|
||||
fs << "vec4 sample(vec2 coord) {" << endl;
|
||||
fs << " vec4 color;" << endl;
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_YCBCR) {
|
||||
fs << " COLOR_PRECISION float y = texture2D(uYTexture, coord).r;" << endl;
|
||||
fs << " COLOR_PRECISION float cb = texture2D(uCbTexture, coord).r;" << endl;
|
||||
fs << " COLOR_PRECISION float cr = texture2D(uCrTexture, coord).r;" << endl;
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_YCBCR ||
|
||||
aConfig.mFeatures & ENABLE_TEXTURE_NV12) {
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_YCBCR) {
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_RECT) {
|
||||
fs << " COLOR_PRECISION float y = texture2D(uYTexture, coord * uTexCoordMultiplier).r;" << endl;
|
||||
fs << " COLOR_PRECISION float cb = texture2D(uCbTexture, coord * uCbCrTexCoordMultiplier).r;" << endl;
|
||||
fs << " COLOR_PRECISION float cr = texture2D(uCrTexture, coord * uCbCrTexCoordMultiplier).r;" << endl;
|
||||
} else {
|
||||
fs << " COLOR_PRECISION float y = texture2D(uYTexture, coord).r;" << endl;
|
||||
fs << " COLOR_PRECISION float cb = texture2D(uCbTexture, coord).r;" << endl;
|
||||
fs << " COLOR_PRECISION float cr = texture2D(uCrTexture, coord).r;" << endl;
|
||||
}
|
||||
} else {
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_RECT) {
|
||||
fs << " COLOR_PRECISION float y = " << texture2D << "(uYTexture, coord * uTexCoordMultiplier).r;" << endl;
|
||||
fs << " COLOR_PRECISION float cb = " << texture2D << "(uCbTexture, coord * uCbCrTexCoordMultiplier).r;" << endl;
|
||||
fs << " COLOR_PRECISION float cr = " << texture2D << "(uCbTexture, coord * uCbCrTexCoordMultiplier).a;" << endl;
|
||||
} else {
|
||||
fs << " COLOR_PRECISION float y = " << texture2D << "(uYTexture, coord).r;" << endl;
|
||||
fs << " COLOR_PRECISION float cb = " << texture2D << "(uCbTexture, coord).r;" << endl;
|
||||
fs << " COLOR_PRECISION float cr = " << texture2D << "(uCbTexture, coord).a;" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
/* From Rec601:
|
||||
[R] [1.1643835616438356, 0.0, 1.5960267857142858] [ Y - 16]
|
||||
@ -365,7 +400,11 @@ For [0,1] instead of [0,255], and to 5 places:
|
||||
fs << " else" << endl;
|
||||
fs << " color = alphas;" << endl;
|
||||
} else {
|
||||
fs << " color = " << texture2D << "(uTexture, coord);" << endl;
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_RECT) {
|
||||
fs << " color = " << texture2D << "(uTexture, coord * uTexCoordMultiplier);" << endl;
|
||||
} else {
|
||||
fs << " color = " << texture2D << "(uTexture, coord);" << endl;
|
||||
}
|
||||
}
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_RB_SWAP) {
|
||||
fs << " color = color.bgra;" << endl;
|
||||
@ -404,11 +443,7 @@ For [0,1] instead of [0,255], and to 5 places:
|
||||
if (aConfig.mFeatures & ENABLE_RENDER_COLOR) {
|
||||
fs << " vec4 color = uRenderColor;" << endl;
|
||||
} else {
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_RECT) {
|
||||
fs << " vec4 color = sample(vTexCoord * uTexCoordMultiplier);" << endl;
|
||||
} else {
|
||||
fs << " vec4 color = sample(vTexCoord);" << endl;
|
||||
}
|
||||
fs << " vec4 color = sample(vTexCoord);" << endl;
|
||||
if (aConfig.mFeatures & ENABLE_BLUR) {
|
||||
fs << " color = blur(color, vTexCoord);" << endl;
|
||||
}
|
||||
@ -455,6 +490,8 @@ For [0,1] instead of [0,255], and to 5 places:
|
||||
} else {
|
||||
if (aConfig.mFeatures & ENABLE_TEXTURE_YCBCR) {
|
||||
result.mTextureCount = 3;
|
||||
} else if (aConfig.mFeatures & ENABLE_TEXTURE_NV12) {
|
||||
result.mTextureCount = 2;
|
||||
} else if (aConfig.mFeatures & ENABLE_TEXTURE_COMPONENT_ALPHA) {
|
||||
result.mTextureCount = 2;
|
||||
} else {
|
||||
|
@ -32,16 +32,17 @@ enum ShaderFeatures {
|
||||
ENABLE_TEXTURE_RECT=0x02,
|
||||
ENABLE_TEXTURE_EXTERNAL=0x04,
|
||||
ENABLE_TEXTURE_YCBCR=0x08,
|
||||
ENABLE_TEXTURE_COMPONENT_ALPHA=0x10,
|
||||
ENABLE_TEXTURE_NO_ALPHA=0x20,
|
||||
ENABLE_TEXTURE_RB_SWAP=0x40,
|
||||
ENABLE_OPACITY=0x80,
|
||||
ENABLE_BLUR=0x100,
|
||||
ENABLE_COLOR_MATRIX=0x200,
|
||||
ENABLE_MASK_2D=0x400,
|
||||
ENABLE_MASK_3D=0x800,
|
||||
ENABLE_PREMULTIPLY=0x1000,
|
||||
ENABLE_DEAA=0x2000
|
||||
ENABLE_TEXTURE_NV12=0x10,
|
||||
ENABLE_TEXTURE_COMPONENT_ALPHA=0x20,
|
||||
ENABLE_TEXTURE_NO_ALPHA=0x40,
|
||||
ENABLE_TEXTURE_RB_SWAP=0x80,
|
||||
ENABLE_OPACITY=0x100,
|
||||
ENABLE_BLUR=0x200,
|
||||
ENABLE_COLOR_MATRIX=0x400,
|
||||
ENABLE_MASK_2D=0x800,
|
||||
ENABLE_MASK_3D=0x1000,
|
||||
ENABLE_PREMULTIPLY=0x2000,
|
||||
ENABLE_DEAA=0x4000
|
||||
};
|
||||
|
||||
class KnownUniform {
|
||||
@ -68,6 +69,7 @@ public:
|
||||
MaskTexture,
|
||||
RenderColor,
|
||||
TexCoordMultiplier,
|
||||
CbCrTexCoordMultiplier,
|
||||
TexturePass2,
|
||||
ColorMatrix,
|
||||
ColorMatrixVector,
|
||||
@ -215,6 +217,7 @@ public:
|
||||
void SetNoAlpha(bool aEnabled);
|
||||
void SetOpacity(bool aEnabled);
|
||||
void SetYCbCr(bool aEnabled);
|
||||
void SetNV12(bool aEnabled);
|
||||
void SetComponentAlpha(bool aEnabled);
|
||||
void SetColorMatrix(bool aEnabled);
|
||||
void SetBlur(bool aEnabled);
|
||||
@ -415,6 +418,11 @@ public:
|
||||
SetUniform(KnownUniform::CrTexture, aCrUnit);
|
||||
}
|
||||
|
||||
void SetNV12TextureUnits(GLint aYUnit, GLint aCbCrUnit) {
|
||||
SetUniform(KnownUniform::YTexture, aYUnit);
|
||||
SetUniform(KnownUniform::CbTexture, aCbCrUnit);
|
||||
}
|
||||
|
||||
void SetBlackTextureUnit(GLint aUnit) {
|
||||
SetUniform(KnownUniform::BlackTexture, aUnit);
|
||||
}
|
||||
@ -446,6 +454,11 @@ public:
|
||||
SetUniform(KnownUniform::TexCoordMultiplier, 2, f);
|
||||
}
|
||||
|
||||
void SetCbCrTexCoordMultiplier(float aWidth, float aHeight) {
|
||||
float f[] = {aWidth, aHeight};
|
||||
SetUniform(KnownUniform::CbCrTexCoordMultiplier, 2, f);
|
||||
}
|
||||
|
||||
// Set whether we want the component alpha shader to return the color
|
||||
// vector (pass 1, false) or the alpha vector (pass2, true). With support
|
||||
// for multiple render targets we wouldn't need two passes here.
|
||||
|
Loading…
Reference in New Issue
Block a user