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