OSDN Git Service

OpenGL ES environment texture partial implementation
authorMaxime Gregoire <mgregoire@google.com>
Tue, 27 Jan 2015 18:34:25 +0000 (13:34 -0500)
committerMaxime Grégoire <mgregoire@google.com>
Mon, 9 Feb 2015 15:13:23 +0000 (15:13 +0000)
Change-Id: I0dcce9f2659cfdde8cc4d5a0a541bea7728b3f97
Reviewed-on: https://swiftshader-review.googlesource.com/1850
Tested-by: Maxime Grégoire <mgregoire@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGLES_CM/Context.cpp
src/OpenGL/libGLES_CM/Context.h
src/OpenGL/libGLES_CM/libGLES_CM.cpp
src/OpenGL/libGLES_CM/utilities.cpp
src/OpenGL/libGLES_CM/utilities.h

index 653933e..ba0025a 100644 (file)
@@ -103,6 +103,8 @@ Context::Context(const egl::Config *config, const Context *shareContext)
     mState.colorMaskAlpha = true;\r
     mState.depthMask = true;\r
 \r
+       mState.textureEnvMode = GL_MODULATE;\r
+\r
     if(shareContext != NULL)\r
     {\r
         mResourceManager = shareContext->mResourceManager;\r
@@ -1757,7 +1759,9 @@ GLenum Context::applyIndexBuffer(const void *indices, GLsizei count, GLenum mode
 \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
@@ -1784,29 +1788,57 @@ void Context::applyTextures()
 \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
@@ -2633,6 +2665,11 @@ unsigned int Context::getActiveTexture() const
        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
index 58af663..cdffd6f 100644 (file)
@@ -252,6 +252,8 @@ struct State
 \r
     GLint unpackAlignment;\r
     GLint packAlignment;\r
+\r
+       GLenum textureEnvMode;\r
 };\r
 \r
 class Context : public egl::Context\r
@@ -326,6 +328,9 @@ public:
        GLenum getClientActiveTexture() const;\r
        unsigned int getActiveTexture() const;\r
 \r
+       void setTextureEnvMode(GLenum texEnvMode);\r
+       GLenum getTextureEnvMode();\r
+\r
     void setLineWidth(GLfloat width);\r
 \r
     void setGenerateMipmapHint(GLenum hint);\r
index c4a9283..3cac667 100644 (file)
@@ -3269,7 +3269,85 @@ void GL_APIENTRY glTexCoordPointer(GLint size, GLenum type, GLsizei stride, cons
 \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
@@ -3279,7 +3357,7 @@ void GL_APIENTRY glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
 \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
index c275089..d91d5ca 100644 (file)
@@ -467,6 +467,59 @@ namespace es2sw
                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
index 4f6421f..c64d600 100644 (file)
@@ -61,6 +61,7 @@ namespace es2sw
        void ConvertMinFilter(GLenum texFilter, sw::FilterType *minFilter, sw::MipmapType *mipFilter, float maxAnisotropy);\r
        bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount,  es1::PrimitiveType &swPrimitiveType, int &primitiveCount);\r
        sw::Format ConvertRenderbufferFormat(GLenum format);\r
+       void ConvertTextureOperations(GLenum texOperation, GLenum texFormat, sw::TextureStage::StageOperation *rgbOperation, sw::TextureStage::StageOperation *alphaOperation);\r
 }\r
 \r
 namespace sw2es\r