Implement GL_COMBINE.
Bug 21278131
Change-Id: If0cf8aa09b582e0252c4cedd73426764fd4dff53
Reviewed-on: https://swiftshader-review.googlesource.com/3232
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index df0731e..764f7d4 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -1984,7 +1984,23 @@
}
else // GL_COMBINE
{
-
+ device->setFirstArgument(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src0RGB));
+ device->setFirstModifier(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand0RGB));
+ device->setSecondArgument(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src1RGB));
+ device->setSecondModifier(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand1RGB));
+ device->setThirdArgument(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src2RGB));
+ device->setThirdModifier(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand2RGB));
+
+ device->setStageOperation(unit, es2sw::ConvertCombineOperation(mState.textureUnit[unit].combineRGB));
+
+ device->setFirstArgumentAlpha(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src0Alpha));
+ device->setFirstModifierAlpha(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand0Alpha));
+ device->setSecondArgumentAlpha(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src1Alpha));
+ device->setSecondModifierAlpha(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand1Alpha));
+ device->setThirdArgumentAlpha(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src2Alpha));
+ device->setThirdModifierAlpha(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand2Alpha));
+
+ device->setStageOperationAlpha(unit, es2sw::ConvertCombineOperation(mState.textureUnit[unit].combineAlpha));
}
}
else
diff --git a/src/OpenGL/libGLES_CM/utilities.cpp b/src/OpenGL/libGLES_CM/utilities.cpp
index fb49505..0fb1e98 100644
--- a/src/OpenGL/libGLES_CM/utilities.cpp
+++ b/src/OpenGL/libGLES_CM/utilities.cpp
@@ -399,6 +399,46 @@
default: UNREACHABLE(); return sw::FORMAT_A8B8G8R8;
}
}
+
+ sw::TextureStage::StageOperation ConvertCombineOperation(GLenum operation)
+ {
+ switch(operation)
+ {
+ case GL_REPLACE: return sw::TextureStage::STAGE_SELECTARG1;
+ case GL_MODULATE: return sw::TextureStage::STAGE_MODULATE;
+ case GL_ADD: return sw::TextureStage::STAGE_ADD;
+ case GL_ADD_SIGNED: return sw::TextureStage::STAGE_ADDSIGNED;
+ case GL_INTERPOLATE: return sw::TextureStage::STAGE_LERP;
+ case GL_SUBTRACT: return sw::TextureStage::STAGE_SUBTRACT;
+ case GL_DOT3_RGB: return sw::TextureStage::STAGE_DOT3;
+ case GL_DOT3_RGBA: return sw::TextureStage::STAGE_DOT3;
+ default: UNREACHABLE(); return sw::TextureStage::STAGE_SELECTARG1;
+ }
+ }
+
+ sw::TextureStage::SourceArgument ConvertSourceArgument(GLenum argument)
+ {
+ switch(argument)
+ {
+ case GL_TEXTURE: return sw::TextureStage::SOURCE_TEXTURE;
+ case GL_CONSTANT: return sw::TextureStage::SOURCE_CONSTANT;
+ case GL_PRIMARY_COLOR: return sw::TextureStage::SOURCE_DIFFUSE;
+ case GL_PREVIOUS: return sw::TextureStage::SOURCE_CURRENT;
+ default: UNREACHABLE(); return sw::TextureStage::SOURCE_CURRENT;
+ }
+ }
+
+ sw::TextureStage::ArgumentModifier ConvertSourceOperand(GLenum operand)
+ {
+ switch(operand)
+ {
+ case GL_SRC_COLOR: return sw::TextureStage::MODIFIER_COLOR;
+ case GL_ONE_MINUS_SRC_COLOR: return sw::TextureStage::MODIFIER_INVCOLOR;
+ case GL_SRC_ALPHA: return sw::TextureStage::MODIFIER_ALPHA;
+ case GL_ONE_MINUS_SRC_ALPHA: return sw::TextureStage::MODIFIER_INVALPHA;
+ default: UNREACHABLE(); return sw::TextureStage::MODIFIER_COLOR;
+ }
+ }
}
namespace sw2es
diff --git a/src/OpenGL/libGLES_CM/utilities.h b/src/OpenGL/libGLES_CM/utilities.h
index 6d2151d..c2f7ea9 100644
--- a/src/OpenGL/libGLES_CM/utilities.h
+++ b/src/OpenGL/libGLES_CM/utilities.h
@@ -55,6 +55,9 @@
void ConvertMinFilter(GLenum texFilter, sw::FilterType *minFilter, sw::MipmapType *mipFilter, float maxAnisotropy);
bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, es1::PrimitiveType &swPrimitiveType, int &primitiveCount);
sw::Format ConvertRenderbufferFormat(GLenum format);
+ sw::TextureStage::StageOperation ConvertCombineOperation(GLenum operation);
+ sw::TextureStage::SourceArgument ConvertSourceArgument(GLenum argument);
+ sw::TextureStage::ArgumentModifier ConvertSourceOperand(GLenum operand);
}
namespace sw2es