OSDN Git Service

Implement alpha testing.
authorNicolas Capens <capn@google.com>
Fri, 3 Jul 2015 18:33:14 +0000 (14:33 -0400)
committerNicolas Capens <capn@google.com>
Fri, 3 Jul 2015 18:41:05 +0000 (18:41 +0000)
Change-Id: I0fe062ea826b73b2bdf28ad3ed6e72e51c576840
Reviewed-on: https://swiftshader-review.googlesource.com/3635
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/libEGL/libEGL.vcxproj
src/OpenGL/libEGL/libEGL.vcxproj.filters
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
src/Renderer/Renderer.hpp

index e0ab7a6..a01f28c 100644 (file)
@@ -307,6 +307,7 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Platfor
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="..\common\debug.h" />\r
+    <ClInclude Include="..\common\Image.hpp" />\r
     <ClInclude Include="..\common\Object.hpp" />\r
     <ClInclude Include="..\include\EGL\egl.h" />\r
     <ClInclude Include="..\include\EGL\eglext.h" />\r
@@ -314,7 +315,6 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Platfor
     <ClInclude Include="Config.h" />\r
     <ClInclude Include="Context.hpp" />\r
     <ClInclude Include="Display.h" />\r
-    <ClInclude Include="Image.hpp" />\r
     <ClInclude Include="libEGL.hpp" />\r
     <ClInclude Include="main.h" />\r
     <ClInclude Include="resource.h" />\r
index c41caac..6ec4c50 100644 (file)
@@ -64,9 +64,6 @@
     <ClInclude Include="Context.hpp">\r
       <Filter>Header Files</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="Image.hpp">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="Texture.hpp">\r
       <Filter>Header Files</Filter>\r
     </ClInclude>\r
@@ -76,6 +73,9 @@
     <ClInclude Include="libEGL.hpp">\r
       <Filter>Header Files</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\common\Image.hpp">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="libEGL.rc" />\r
index e47e7e2..5721117 100644 (file)
@@ -206,6 +206,10 @@ Context::Context(const egl::Config *config, const Context *shareContext)
 \r
        clipFlags = 0;\r
 \r
+       alphaTest = false;\r
+       alphaTestFunc = GL_ALWAYS;\r
+       alphaTestRef = 0;\r
+\r
     mHasBeenCurrent = false;\r
 \r
     markAllStateDirty();\r
@@ -374,6 +378,22 @@ void Context::setDepthRange(float zNear, float zFar)
     mState.zFar = zFar;\r
 }\r
 \r
+void Context::setAlphaTest(bool enabled)\r
+{\r
+       alphaTest = enabled;\r
+}\r
+\r
+bool Context::isAlphaTestEnabled() const\r
+{\r
+       return alphaTest;\r
+}\r
+\r
+void Context::setAlphaFunc(GLenum alphaFunc, GLclampf reference)\r
+{\r
+       alphaTestFunc = alphaFunc;\r
+       alphaTestRef = reference;\r
+}\r
+\r
 void Context::setBlend(bool enabled)\r
 {\r
     if(mState.blend != enabled)\r
@@ -1822,6 +1842,10 @@ void Context::applyState(GLenum drawMode)
        device->setTextureTransform(1, textureStack1.isIdentity() ? 0 : 4, false);\r
        device->setTexGen(0, sw::TEXGEN_NONE);\r
        device->setTexGen(1, sw::TEXGEN_NONE);\r
+\r
+       device->setAlphaTestEnable(alphaTest);\r
+       device->setAlphaCompare(es2sw::ConvertAlphaComparison(alphaTestFunc));\r
+       device->setAlphaReference(alphaTestRef * 0xFF);\r
 }\r
 \r
 GLenum Context::applyVertexBuffer(GLint base, GLint first, GLsizei count)\r
@@ -2995,6 +3019,11 @@ void Context::setClipPlaneEnable(int index, bool enable)
        device->setClipFlags(clipFlags);\r
 }\r
 \r
+bool Context::isClipPlaneEnabled(int index) const\r
+{\r
+       return (clipFlags & (1 << index)) != 0;\r
+}\r
+\r
 void Context::clientActiveTexture(GLenum texture)\r
 {\r
        clientTexture = texture;\r
index d5d4c8f..fde41ec 100644 (file)
@@ -300,6 +300,10 @@ public:
     void setDepthFunc(GLenum depthFunc);\r
     void setDepthRange(float zNear, float zFar);\r
 \r
+       void setAlphaTest(bool enabled);\r
+    bool isAlphaTestEnabled() const;\r
+    void setAlphaFunc(GLenum alphaFunc, GLclampf reference);\r
+\r
     void setBlend(bool enabled);\r
     bool isBlendEnabled() const;\r
     void setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha);\r
@@ -480,6 +484,7 @@ public:
 \r
        void setClipPlane(int index, const float plane[4]);\r
        void setClipPlaneEnable(int index, bool enable);\r
+       bool isClipPlaneEnabled(int index) const;\r
 \r
 private:\r
        virtual ~Context();\r
@@ -553,6 +558,10 @@ private:
 \r
        int clipFlags;\r
 \r
+       bool alphaTest;\r
+       GLenum alphaTestFunc;\r
+       float alphaTestRef;\r
+\r
        Device *device;\r
     ResourceManager *mResourceManager;\r
 };\r
index ca80a47..0ac15d8 100644 (file)
@@ -97,7 +97,29 @@ void ActiveTexture(GLenum texture)
 \r
 void AlphaFunc(GLenum func, GLclampf ref)\r
 {\r
-       UNIMPLEMENTED();\r
+       TRACE("(GLenum func = 0x%X, GLclampf ref = %f)", func, ref);\r
+\r
+       switch(func)\r
+       {\r
+       case GL_NEVER:\r
+       case GL_ALWAYS:\r
+       case GL_LESS:\r
+       case GL_LEQUAL:\r
+       case GL_EQUAL:\r
+       case GL_GEQUAL:\r
+       case GL_GREATER:\r
+       case GL_NOTEQUAL:\r
+               break;\r
+       default:\r
+               return error(GL_INVALID_ENUM);\r
+       }\r
+\r
+       es1::Context *context = es1::getContext();\r
+\r
+       if(context)\r
+       {\r
+               context->setAlphaFunc(func, clamp01(ref));\r
+       }\r
 }\r
 \r
 void AlphaFuncx(GLenum func, GLclampx ref)\r
@@ -1188,7 +1210,7 @@ void Disable(GLenum cap)
                case GL_FOG:                      context->setFog(false);                                       break;\r
                case GL_TEXTURE_2D:               context->setTexture2Denabled(false);      break;\r
                case GL_TEXTURE_EXTERNAL_OES:     context->setTextureExternalEnabled(false); break;\r
-               case GL_ALPHA_TEST:               UNIMPLEMENTED(); break;\r
+               case GL_ALPHA_TEST:               context->setAlphaTest(false);             break;\r
                case GL_COLOR_LOGIC_OP:           UNIMPLEMENTED(); break;\r
                case GL_POINT_SMOOTH:             UNIMPLEMENTED(); break;\r
                case GL_LINE_SMOOTH:              UNIMPLEMENTED(); break;\r
@@ -1310,7 +1332,7 @@ void Enable(GLenum cap)
                case GL_FOG:                      context->setFog(true);                                   break;\r
                case GL_TEXTURE_2D:               context->setTexture2Denabled(true);      break;\r
                case GL_TEXTURE_EXTERNAL_OES:     context->setTextureExternalEnabled(true); break;\r
-               case GL_ALPHA_TEST:               UNIMPLEMENTED(); break;\r
+               case GL_ALPHA_TEST:               context->setAlphaTest(true);             break;\r
                case GL_COLOR_LOGIC_OP:           UNIMPLEMENTED(); break;\r
                case GL_POINT_SMOOTH:             UNIMPLEMENTED(); break;\r
                case GL_LINE_SMOOTH:              UNIMPLEMENTED(); break;\r
@@ -2386,6 +2408,13 @@ GLboolean IsEnabled(GLenum cap)
                case GL_DEPTH_TEST:               return context->isDepthTestEnabled();\r
                case GL_BLEND:                    return context->isBlendEnabled();\r
                case GL_DITHER:                   return context->isDitherEnabled();\r
+               case GL_ALPHA_TEST:               return context->isAlphaTestEnabled();\r
+               case GL_CLIP_PLANE0:              return context->isClipPlaneEnabled(0);\r
+               case GL_CLIP_PLANE1:              return context->isClipPlaneEnabled(1);\r
+               case GL_CLIP_PLANE2:              return context->isClipPlaneEnabled(2);\r
+               case GL_CLIP_PLANE3:              return context->isClipPlaneEnabled(3);\r
+               case GL_CLIP_PLANE4:              return context->isClipPlaneEnabled(4);\r
+               case GL_CLIP_PLANE5:              return context->isClipPlaneEnabled(5);\r
                default:\r
                        return error(GL_INVALID_ENUM, GL_FALSE);\r
                }\r
index cc9eac3..42ee1af 100644 (file)
@@ -238,6 +238,24 @@ namespace es2sw
                return sw::STENCIL_ALWAYS;\r
        }\r
 \r
+       sw::AlphaCompareMode ConvertAlphaComparison(GLenum comparison)\r
+       {\r
+               switch(comparison)\r
+               {\r
+               case GL_NEVER:    return sw::ALPHA_NEVER;\r
+               case GL_ALWAYS:   return sw::ALPHA_ALWAYS;\r
+               case GL_LESS:     return sw::ALPHA_LESS;\r
+               case GL_LEQUAL:   return sw::ALPHA_LESSEQUAL;\r
+               case GL_EQUAL:    return sw::ALPHA_EQUAL;\r
+               case GL_GREATER:  return sw::ALPHA_GREATER;\r
+               case GL_GEQUAL:   return sw::ALPHA_GREATEREQUAL;\r
+               case GL_NOTEQUAL: return sw::ALPHA_NOTEQUAL;\r
+               default: UNREACHABLE(comparison);\r
+               }\r
+\r
+               return sw::ALPHA_ALWAYS;\r
+       }\r
+\r
        sw::Color<float> ConvertColor(es1::Color color)\r
        {\r
                return sw::Color<float>(color.red, color.green, color.blue, color.alpha);\r
index a5c776b..c467d3f 100644 (file)
@@ -48,6 +48,7 @@ namespace es2sw
 {\r
        sw::DepthCompareMode ConvertDepthComparison(GLenum comparison);\r
        sw::StencilCompareMode ConvertStencilComparison(GLenum comparison);\r
+       sw::AlphaCompareMode ConvertAlphaComparison(GLenum comparison);\r
        sw::Color<float> ConvertColor(es1::Color color);\r
        sw::BlendFactor ConvertBlendFunc(GLenum blend);\r
        sw::BlendOperation ConvertBlendOp(GLenum blendOp);\r
index cf3474d..e2008f3 100644 (file)
@@ -98,7 +98,7 @@ namespace sw
 
        struct DrawData
        {
-               const void *constants;
+               const Constants *constants;
 
                const void *input[VERTEX_ATTRIBUTES];
                unsigned int stride[VERTEX_ATTRIBUTES];