OSDN Git Service

Implement several fixed-point entry functions.
authorNicolas Capens <capn@google.com>
Tue, 4 Aug 2015 14:51:10 +0000 (10:51 -0400)
committerNicolas Capens <capn@google.com>
Thu, 6 Aug 2015 04:18:17 +0000 (04:18 +0000)
Change-Id: I7a156a33a6021bc871a902a2b9d050eeaf166fe9
Reviewed-on: https://swiftshader-review.googlesource.com/3801
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGLES_CM/libGLES_CM.cpp

index 2ee447a..ce13d28 100644 (file)
@@ -596,7 +596,15 @@ void ClipPlanef(GLenum plane, const GLfloat *equation)
 \r
 void ClipPlanex(GLenum plane, const GLfixed *equation)\r
 {\r
-       UNIMPLEMENTED();\r
+       GLfloat equationf[4] =\r
+       {\r
+               (float)equation[0] / 0x10000,\r
+               (float)equation[1] / 0x10000,\r
+               (float)equation[2] / 0x10000,\r
+               (float)equation[3] / 0x10000,\r
+       };\r
+       \r
+       ClipPlanef(plane, equationf);\r
 }\r
 \r
 void Color4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)\r
@@ -1642,7 +1650,45 @@ void Fogfv(GLenum pname, const GLfloat *params)
 \r
 void Fogx(GLenum pname, GLfixed param)\r
 {\r
-       UNIMPLEMENTED();\r
+       TRACE("(GLenum pname = 0x%X, GLfixed param = %d)", pname, param);\r
+\r
+       es1::Context *context = es1::getContext();\r
+\r
+       if(context)\r
+       {\r
+               switch(pname)\r
+               {\r
+               case GL_FOG_MODE:\r
+                       switch((GLenum)param)\r
+                       {\r
+                       case GL_LINEAR:\r
+                       case GL_EXP:\r
+                       case GL_EXP2:\r
+                               context->setFogMode((GLenum)param);\r
+                               break;\r
+                       default:\r
+                               return error(GL_INVALID_ENUM);\r
+                       }\r
+                       break;\r
+               case GL_FOG_DENSITY:\r
+                       if(param < 0)\r
+                       {\r
+                               return error(GL_INVALID_VALUE);\r
+                       }\r
+                       context->setFogDensity((float)param / 0x10000);\r
+                       break;\r
+               case GL_FOG_START:\r
+                       context->setFogStart((float)param / 0x10000);\r
+                       break;\r
+               case GL_FOG_END:\r
+                       context->setFogEnd((float)param / 0x10000);\r
+                       break;\r
+               case GL_FOG_COLOR:\r
+                       return error(GL_INVALID_ENUM);   // Need four values, should call glFogxv() instead\r
+               default:\r
+                       return error(GL_INVALID_ENUM);\r
+               }\r
+       }\r
 }\r
 \r
 void Fogxv(GLenum pname, const GLfixed *params)\r
@@ -2588,12 +2634,45 @@ void LightModelfv(GLenum pname, const GLfloat *params)
 \r
 void LightModelx(GLenum pname, GLfixed param)\r
 {\r
-       UNIMPLEMENTED();\r
+       TRACE("(GLenum pname = 0x%X, GLfixed param = %d)", pname, param);\r
+\r
+       es1::Context *context = es1::getContext();\r
+\r
+       if(context)\r
+       {\r
+               switch(pname)\r
+               {\r
+               case GL_LIGHT_MODEL_TWO_SIDE:\r
+                       context->setLightModelTwoSide(param != 0);\r
+                       break;\r
+               case GL_LIGHT_MODEL_AMBIENT:\r
+                       return error(GL_INVALID_ENUM);   // Need four values, should call glLightModelxv() instead\r
+               default:\r
+                       return error(GL_INVALID_ENUM);\r
+               }\r
+       }\r
 }\r
 \r
 void LightModelxv(GLenum pname, const GLfixed *params)\r
 {\r
-       UNIMPLEMENTED();\r
+       TRACE("(GLenum pname = 0x%X, const GLfixed *params)", pname);\r
+\r
+       es1::Context *context = es1::getContext();\r
+\r
+       if(context)\r
+       {\r
+               switch(pname)\r
+               {\r
+               case GL_LIGHT_MODEL_AMBIENT:\r
+                       context->setGlobalAmbient((float)params[0] / 0x10000, (float)params[1] / 0x10000, (float)params[2] / 0x10000, (float)params[3] / 0x10000);\r
+                       break;\r
+               case GL_LIGHT_MODEL_TWO_SIDE:\r
+                       context->setLightModelTwoSide(params[0] != 0);\r
+                       break;\r
+               default:\r
+                       return error(GL_INVALID_ENUM);\r
+               }\r
+       }\r
 }\r
 \r
 void Lightf(GLenum light, GLenum pname, GLfloat param)\r
@@ -3117,12 +3196,81 @@ void PointParameterfv(GLenum pname, const GLfloat *params)
 \r
 void PointParameterx(GLenum pname, GLfixed param)\r
 {\r
-       UNIMPLEMENTED();\r
+       TRACE("(GLenum pname = 0x%X, GLfixed param = %d)", pname, param);\r
+\r
+       es1::Context *context = es1::getContext();\r
+\r
+       if(context)\r
+       {\r
+               switch(pname)\r
+               {\r
+               case GL_POINT_SIZE_MIN:\r
+                       if(param < 0)\r
+                       {\r
+                               return error(GL_INVALID_VALUE);\r
+                       }\r
+                       context->setPointSizeMin((float)param / 0x10000);\r
+                       break;\r
+               case GL_POINT_SIZE_MAX:\r
+                       if(param < 0)\r
+                       {\r
+                               return error(GL_INVALID_VALUE);\r
+                       }\r
+                       context->setPointSizeMax((float)param / 0x10000);\r
+                       break;\r
+               case GL_POINT_FADE_THRESHOLD_SIZE:\r
+                       if(param < 0)\r
+                       {\r
+                               return error(GL_INVALID_VALUE);\r
+                       }\r
+                       context->setPointFadeThresholdSize((float)param / 0x10000);\r
+                       break;\r
+               case GL_POINT_DISTANCE_ATTENUATION:\r
+                       return error(GL_INVALID_ENUM);   // Needs three parameters, should call glPointParameterxv() instead\r
+               default:\r
+                       return error(GL_INVALID_ENUM);\r
+               }\r
+       }\r
 }\r
 \r
 void PointParameterxv(GLenum pname, const GLfixed *params)\r
 {\r
-       UNIMPLEMENTED();\r
+       TRACE("(GLenum pname = 0x%X, const GLfixed *params)", pname);\r
+\r
+       es1::Context *context = es1::getContext();\r
+\r
+       if(context)\r
+       {\r
+               switch(pname)\r
+               {\r
+               case GL_POINT_SIZE_MIN:\r
+                       if(params[0] < 0)\r
+                       {\r
+                               return error(GL_INVALID_VALUE);\r
+                       }\r
+                       context->setPointSizeMin((float)params[0] / 0x10000);\r
+                       break;\r
+               case GL_POINT_SIZE_MAX:\r
+                       if(params[0] < 0)\r
+                       {\r
+                               return error(GL_INVALID_VALUE);\r
+                       }\r
+                       context->setPointSizeMax((float)params[0] / 0x10000);\r
+                       break;\r
+               case GL_POINT_DISTANCE_ATTENUATION:\r
+                       context->setPointDistanceAttenuation((float)params[0] / 0x10000, (float)params[1] / 0x10000, (float)params[2] / 0x10000);\r
+                       break;\r
+               case GL_POINT_FADE_THRESHOLD_SIZE:\r
+                       if(params[0] < 0)\r
+                       {\r
+                               return error(GL_INVALID_VALUE);\r
+                       }\r
+                       context->setPointFadeThresholdSize((float)params[0] / 0x10000);\r
+                       break;\r
+               default:\r
+                       return error(GL_INVALID_ENUM);\r
+               }\r
+       }\r
 }\r
 \r
 void PointSize(GLfloat size)\r