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