mState.colorMaskAlpha = true;\r
mState.depthMask = true;\r
\r
+ mState.textureEnvMode = GL_MODULATE;\r
+\r
if(shareContext != NULL)\r
{\r
mResourceManager = shareContext->mResourceManager;\r
\r
void Context::applyTextures()\r
{\r
- for(int samplerIndex = 0; samplerIndex < MAX_TEXTURE_UNITS; samplerIndex++)\r
+ GLenum texEnvMode = getTextureEnvMode();\r
+\r
+ for(int samplerIndex = 0; samplerIndex < MAX_TEXTURE_UNITS; samplerIndex++)\r
{\r
Texture *texture = getSamplerTexture(samplerIndex, TEXTURE_2D);\r
\r
\r
applyTexture(samplerIndex, texture);\r
\r
- device->setStageOperation(samplerIndex, sw::TextureStage::STAGE_MODULATE);\r
- device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_TEXTURE);\r
- device->setSecondArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
+ GLenum texFormat = texture->getFormat(GL_TEXTURE_2D, 0);\r
+ sw::TextureStage::StageOperation rgbOperation, alphaOperation;\r
+ es2sw::ConvertTextureOperations(texEnvMode, texFormat, &rgbOperation, &alphaOperation);\r
\r
- device->setStageOperationAlpha(samplerIndex, sw::TextureStage::STAGE_MODULATE);\r
- device->setFirstArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_TEXTURE);\r
- device->setSecondArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
+ device->setStageOperation(samplerIndex, rgbOperation);\r
+ device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_TEXTURE);\r
+ device->setFirstModifier(samplerIndex, sw::TextureStage::MODIFIER_COLOR);\r
+ device->setSecondArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
+ device->setSecondModifier(samplerIndex, sw::TextureStage::MODIFIER_COLOR);\r
+\r
+ device->setStageOperationAlpha(samplerIndex, alphaOperation);\r
+ device->setFirstArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_TEXTURE);\r
+ device->setFirstModifierAlpha(samplerIndex, sw::TextureStage::MODIFIER_ALPHA);\r
+ device->setSecondArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
+ device->setSecondModifierAlpha(samplerIndex, sw::TextureStage::MODIFIER_ALPHA);\r
}\r
else\r
{\r
applyTexture(samplerIndex, 0);\r
\r
device->setStageOperation(samplerIndex, sw::TextureStage::STAGE_SELECTARG1);\r
- device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
- device->setSecondArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
+ device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
+ device->setFirstModifier(samplerIndex, sw::TextureStage::MODIFIER_COLOR);\r
+ device->setSecondArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
+ device->setSecondModifier(samplerIndex, sw::TextureStage::MODIFIER_COLOR);\r
\r
device->setStageOperationAlpha(samplerIndex, sw::TextureStage::STAGE_SELECTARG1);\r
- device->setFirstArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
- device->setSecondArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
+ device->setFirstArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
+ device->setFirstModifierAlpha(samplerIndex, sw::TextureStage::MODIFIER_ALPHA);\r
+ device->setSecondArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT);\r
+ device->setSecondModifierAlpha(samplerIndex, sw::TextureStage::MODIFIER_ALPHA);\r
}\r
}\r
}\r
\r
+void Context::setTextureEnvMode(GLenum texEnvMode)\r
+{\r
+ switch(texEnvMode)\r
+ {\r
+ case GL_MODULATE:\r
+ case GL_DECAL:\r
+ case GL_BLEND:\r
+ case GL_ADD:\r
+ case GL_REPLACE:\r
+ mState.textureEnvMode = texEnvMode;\r
+ break;\r
+ default:\r
+ UNREACHABLE();\r
+ }\r
+}\r
+\r
void Context::applyTexture(int index, Texture *baseTexture)\r
{\r
sw::Resource *resource = 0;\r
return mState.activeSampler;\r
}\r
\r
+GLenum Context::getTextureEnvMode()\r
+{\r
+ return mState.textureEnvMode;\r
+}\r
+\r
}\r
\r
// Exported functions for use by EGL\r
\r
void GL_APIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param)\r
{\r
- UNIMPLEMENTED();\r
+ es1::Context *context = es1::getContext();\r
+ if(context)\r
+ {\r
+ switch(target)\r
+ {\r
+ case GL_POINT_SPRITE_OES:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ case GL_TEXTURE_ENV:\r
+ switch(pname)\r
+ {\r
+ case GL_TEXTURE_ENV_MODE:\r
+ switch((GLenum)param)\r
+ {\r
+ case GL_REPLACE:\r
+ case GL_MODULATE:\r
+ case GL_DECAL:\r
+ case GL_BLEND:\r
+ case GL_ADD:\r
+ case GL_COMBINE:\r
+ break;\r
+ default:\r
+ error(GL_INVALID_ENUM);\r
+ }\r
+\r
+ context->setTextureEnvMode((GLenum)param);\r
+ break;\r
+ case GL_TEXTURE_ENV_COLOR:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ case GL_COMBINE_RGB:\r
+ switch((GLenum)param)\r
+ {\r
+ case GL_REPLACE:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ case GL_MODULATE:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ case GL_ADD:\r
+ context->setTextureEnvMode((GLenum)param); \r
+ break;\r
+ case GL_ADD_SIGNED:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ case GL_INTERPOLATE:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ case GL_SUBTRACT:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ case GL_DOT3_RGB:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ case GL_DOT3_RGBA:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ default:\r
+ error(GL_INVALID_ENUM);\r
+ }\r
+\r
+ break;\r
+ case GL_COMBINE_ALPHA:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ case GL_RGB_SCALE:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ case GL_ALPHA_SCALE:\r
+ UNIMPLEMENTED();\r
+ break;\r
+ default:\r
+ return error(GL_INVALID_ENUM);\r
+ }\r
+ break;\r
+ default:\r
+ return error(GL_INVALID_ENUM);\r
+ }\r
+ } \r
}\r
\r
void GL_APIENTRY glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)\r
\r
void GL_APIENTRY glTexEnvi(GLenum target, GLenum pname, GLint param)\r
{\r
- UNIMPLEMENTED();\r
+ glTexEnvf(target, pname, (float)param);\r
}\r
\r
void GL_APIENTRY glTexEnvx(GLenum target, GLenum pname, GLfixed param)\r
default: UNREACHABLE(); return sw::FORMAT_A8R8G8B8;\r
}\r
}\r
+\r
+ void ConvertTextureOperations(GLenum texEnvMode, GLenum texFormat, sw::TextureStage::StageOperation *rgbOperation, sw::TextureStage::StageOperation *alphaOperation)\r
+ {\r
+ switch(texEnvMode)\r
+ {\r
+ case GL_MODULATE:\r
+ switch(texFormat)\r
+ {\r
+ case GL_LUMINANCE_ALPHA:\r
+ *rgbOperation = sw::TextureStage::STAGE_MODULATE;\r
+ *alphaOperation = sw::TextureStage::STAGE_MODULATE;\r
+ break;\r
+ case GL_RGB:\r
+ *rgbOperation = sw::TextureStage::STAGE_MODULATE;\r
+ *alphaOperation = sw::TextureStage::STAGE_SELECTARG2;\r
+ break;\r
+ case GL_RGBA:\r
+ *rgbOperation = sw::TextureStage::STAGE_MODULATE;\r
+ *alphaOperation = sw::TextureStage::STAGE_MODULATE;\r
+ break;\r
+ case GL_ALPHA:\r
+ case GL_LUMINANCE:\r
+ UNIMPLEMENTED();\r
+ // Default operations for compatibility\r
+ *rgbOperation = sw::TextureStage::STAGE_MODULATE;\r
+ *alphaOperation = sw::TextureStage::STAGE_MODULATE;\r
+ break;\r
+ default: UNREACHABLE();\r
+ }\r
+ break;\r
+\r
+ case GL_REPLACE:\r
+ *rgbOperation = sw::TextureStage::STAGE_SELECTARG1;\r
+ *alphaOperation = sw::TextureStage::STAGE_SELECTARG1;\r
+ break;\r
+\r
+ case GL_ADD:\r
+ *rgbOperation = sw::TextureStage::STAGE_ADD;\r
+ *alphaOperation = sw::TextureStage::STAGE_SELECTARG1;\r
+ break; \r
+\r
+ case GL_DECAL:\r
+ case GL_BLEND:\r
+ // Default operations for compatibility\r
+ *rgbOperation = sw::TextureStage::STAGE_MODULATE;\r
+ *alphaOperation = sw::TextureStage::STAGE_MODULATE;\r
+ UNIMPLEMENTED();\r
+ break;\r
+\r
+ default:\r
+ UNREACHABLE();\r
+ }\r
+ }\r
}\r
\r
namespace sw2es\r