Commit aad776e4 by Nicolas Capens

Fix support for colorbuffer formats in the texture env.

Bug 21766174 Change-Id: Id53882a7738fab8669d355fd2f32e420a93cbae6 Reviewed-on: https://swiftshader-review.googlesource.com/3500Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 6ea7187c
...@@ -1846,8 +1846,6 @@ void Context::applyTextures() ...@@ -1846,8 +1846,6 @@ void Context::applyTextures()
if(mState.textureUnit[unit].environmentMode != GL_COMBINE) if(mState.textureUnit[unit].environmentMode != GL_COMBINE)
{ {
GLenum texFormat = texture->getFormat(GL_TEXTURE_2D, 0);
device->setFirstArgument(unit, sw::TextureStage::SOURCE_TEXTURE); // Cs device->setFirstArgument(unit, sw::TextureStage::SOURCE_TEXTURE); // Cs
device->setFirstModifier(unit, sw::TextureStage::MODIFIER_COLOR); device->setFirstModifier(unit, sw::TextureStage::MODIFIER_COLOR);
device->setSecondArgument(unit, sw::TextureStage::SOURCE_CURRENT); // Cp device->setSecondArgument(unit, sw::TextureStage::SOURCE_CURRENT); // Cp
...@@ -1862,127 +1860,116 @@ void Context::applyTextures() ...@@ -1862,127 +1860,116 @@ void Context::applyTextures()
device->setThirdArgumentAlpha(unit, sw::TextureStage::SOURCE_CONSTANT); // Ac device->setThirdArgumentAlpha(unit, sw::TextureStage::SOURCE_CONSTANT); // Ac
device->setThirdModifierAlpha(unit, sw::TextureStage::MODIFIER_ALPHA); device->setThirdModifierAlpha(unit, sw::TextureStage::MODIFIER_ALPHA);
GLenum texFormat = texture->getFormat(GL_TEXTURE_2D, 0);
switch(mState.textureUnit[unit].environmentMode) switch(mState.textureUnit[unit].environmentMode)
{ {
case GL_REPLACE: case GL_REPLACE:
switch(texFormat) if(IsAlpha(texFormat)) // GL_ALPHA
{ {
case GL_ALPHA:
// Cv = Cp, Av = As // Cv = Cp, Av = As
device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG1); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG1);
break; }
case GL_LUMINANCE: else if(IsRGB(texFormat)) // GL_LUMINANCE (or 1) / GL_RGB (or 3)
case GL_RGB: {
// Cv = Cs, Av = Ap // Cv = Cs, Av = Ap
device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1); device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2);
break; }
case GL_LUMINANCE_ALPHA: else if(IsRGBA(texFormat)) // GL_LUMINANCE_ALPHA (or 2) / GL_RGBA (or 4)
case GL_RGBA: {
case GL_BGRA_EXT:
// Cv = Cs, Av = As // Cv = Cs, Av = As
device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1); device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG1); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG1);
break;
default: UNREACHABLE(texFormat);
} }
else UNREACHABLE(texFormat);
break; break;
case GL_MODULATE: case GL_MODULATE:
switch(texFormat) if(IsAlpha(texFormat)) // GL_ALPHA
{ {
case GL_ALPHA:
// Cv = Cp, Av = ApAs // Cv = Cp, Av = ApAs
device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE);
break; }
case GL_LUMINANCE: else if(IsRGB(texFormat)) // GL_LUMINANCE (or 1) / GL_RGB (or 3)
case GL_RGB: {
// Cv = CpCs, Av = Ap // Cv = CpCs, Av = Ap
device->setStageOperation(unit, sw::TextureStage::STAGE_MODULATE); device->setStageOperation(unit, sw::TextureStage::STAGE_MODULATE);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2);
break; }
case GL_LUMINANCE_ALPHA: else if(IsRGBA(texFormat)) // GL_LUMINANCE_ALPHA (or 2) / GL_RGBA (or 4)
case GL_RGBA: {
case GL_BGRA_EXT:
// Cv = CpCs, Av = ApAs // Cv = CpCs, Av = ApAs
device->setStageOperation(unit, sw::TextureStage::STAGE_MODULATE); device->setStageOperation(unit, sw::TextureStage::STAGE_MODULATE);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE);
break;
default: UNREACHABLE(texFormat);
} }
else UNREACHABLE(texFormat);
break; break;
case GL_DECAL: case GL_DECAL:
switch(texFormat) if(texFormat == GL_ALPHA ||
texFormat == GL_LUMINANCE ||
texFormat == GL_LUMINANCE_ALPHA)
{ {
case GL_ALPHA: // undefined // FIXME: Log
case GL_LUMINANCE:
case GL_LUMINANCE_ALPHA:
// undefined
device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2);
break; }
case GL_RGB: else if(IsRGB(texFormat)) // GL_LUMINANCE (or 1) / GL_RGB (or 3)
{
// Cv = Cs, Av = Ap // Cv = Cs, Av = Ap
device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1); device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2);
break; }
case GL_RGBA: else if(IsRGBA(texFormat)) // GL_LUMINANCE_ALPHA (or 2) / GL_RGBA (or 4)
case GL_BGRA_EXT: {
// Cv = Cp(1 ? As) + CsAs, Av = Ap // Cv = Cp(1 - As) + CsAs, Av = Ap
device->setStageOperation(unit, sw::TextureStage::STAGE_BLENDTEXTUREALPHA); // Alpha * (Arg1 - Arg2) + Arg2 device->setStageOperation(unit, sw::TextureStage::STAGE_BLENDTEXTUREALPHA); // Alpha * (Arg1 - Arg2) + Arg2
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2);
break;
default: UNREACHABLE(texFormat);
} }
else UNREACHABLE(texFormat);
break; break;
case GL_BLEND: case GL_BLEND:
switch(texFormat) if(IsAlpha(texFormat)) // GL_ALPHA
{ {
case GL_ALPHA:
// Cv = Cp, Av = ApAs // Cv = Cp, Av = ApAs
device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE);
break; }
case GL_LUMINANCE: else if(IsRGB(texFormat)) // GL_LUMINANCE (or 1) / GL_RGB (or 3)
case GL_RGB: {
// Cv = Cp(1 ? Cs) + CcCs, Av = Ap // Cv = Cp(1 - Cs) + CcCs, Av = Ap
device->setStageOperation(unit, sw::TextureStage::STAGE_LERP); // Arg3 * (Arg1 - Arg2) + Arg2 device->setStageOperation(unit, sw::TextureStage::STAGE_LERP); // Arg3 * (Arg1 - Arg2) + Arg2
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2);
break; }
case GL_LUMINANCE_ALPHA: else if(IsRGBA(texFormat)) // GL_LUMINANCE_ALPHA (or 2) / GL_RGBA (or 4)
case GL_RGBA: {
case GL_BGRA_EXT: // Cv = Cp(1 - Cs) + CcCs, Av = ApAs
// Cv = Cp(1 ? Cs) + CcCs, Av = ApAs
device->setStageOperation(unit, sw::TextureStage::STAGE_LERP); // Arg3 * (Arg1 - Arg2) + Arg2 device->setStageOperation(unit, sw::TextureStage::STAGE_LERP); // Arg3 * (Arg1 - Arg2) + Arg2
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE);
break;
default: UNREACHABLE(texFormat);
} }
else UNREACHABLE(texFormat);
break; break;
case GL_ADD: case GL_ADD:
switch(texFormat) if(IsAlpha(texFormat)) // GL_ALPHA
{ {
case GL_ALPHA:
// Cv = Cp, Av = ApAs // Cv = Cp, Av = ApAs
device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE);
break; }
case GL_LUMINANCE: else if(IsRGB(texFormat)) // GL_LUMINANCE (or 1) / GL_RGB (or 3)
case GL_RGB: {
// Cv = Cp + Cs, Av = Ap // Cv = Cp + Cs, Av = Ap
device->setStageOperation(unit, sw::TextureStage::STAGE_ADD); device->setStageOperation(unit, sw::TextureStage::STAGE_ADD);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2);
break; }
case GL_LUMINANCE_ALPHA: else if(IsRGBA(texFormat)) // GL_LUMINANCE_ALPHA (or 2) / GL_RGBA (or 4)
case GL_RGBA: {
case GL_BGRA_EXT:
// Cv = Cp + Cs, Av = ApAs // Cv = Cp + Cs, Av = ApAs
device->setStageOperation(unit, sw::TextureStage::STAGE_ADD); device->setStageOperation(unit, sw::TextureStage::STAGE_ADD);
device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE);
break;
default: UNREACHABLE(texFormat);
} }
else UNREACHABLE(texFormat);
break; break;
default: default:
UNREACHABLE(mState.textureUnit[unit].environmentMode); UNREACHABLE(mState.textureUnit[unit].environmentMode);
......
...@@ -157,6 +157,47 @@ namespace es1 ...@@ -157,6 +157,47 @@ namespace es1
return false; return false;
} }
bool IsAlpha(GLenum texFormat)
{
switch(texFormat)
{
case GL_ALPHA:
return true;
default:
return false;
}
}
bool IsRGB(GLenum texFormat)
{
switch(texFormat)
{
case GL_LUMINANCE:
case GL_RGB:
case GL_RGB565_OES: // GL_OES_framebuffer_object
case GL_RGB8_OES: // GL_OES_rgb8_rgba8
return true;
default:
return false;
}
}
bool IsRGBA(GLenum texFormat)
{
switch(texFormat)
{
case GL_LUMINANCE_ALPHA:
case GL_RGBA:
case GL_BGRA_EXT: // GL_EXT_texture_format_BGRA8888
case GL_RGBA4_OES: // GL_OES_framebuffer_object
case GL_RGB5_A1_OES: // GL_OES_framebuffer_object
case GL_RGBA8_OES: // GL_OES_rgb8_rgba8
return true;
default:
return false;
}
}
} }
namespace es2sw namespace es2sw
......
...@@ -38,6 +38,10 @@ namespace es1 ...@@ -38,6 +38,10 @@ namespace es1
bool IsColorRenderable(GLenum internalformat); bool IsColorRenderable(GLenum internalformat);
bool IsDepthRenderable(GLenum internalformat); bool IsDepthRenderable(GLenum internalformat);
bool IsStencilRenderable(GLenum internalformat); bool IsStencilRenderable(GLenum internalformat);
bool IsAlpha(GLenum texFormat);
bool IsRGB(GLenum texFormat);
bool IsRGBA(GLenum texFormat);
} }
namespace es2sw namespace es2sw
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment