Commit af496913 by Jamie Madill Committed by Shannon Woods

Add a method to round GLfloat parameters to the nearest integral value, for use…

Add a method to round GLfloat parameters to the nearest integral value, for use in state-setting API methods. TRAC #23545 Signed-off-by: Shannon Woods Signed-off-by: Nicolas Capens Authored-by: Jamie Madill
parent c82fc413
...@@ -44,6 +44,12 @@ bool IsInternalTextureTarget(GLenum target); ...@@ -44,6 +44,12 @@ bool IsInternalTextureTarget(GLenum target);
bool IsTriangleMode(GLenum drawMode); bool IsTriangleMode(GLenum drawMode);
// [OpenGL ES 3.0.2] Section 2.3.1 page 14
// Data Conversion For State-Setting Commands
// Floating-point values are rounded to the nearest integer, instead of truncated, as done by static_cast.
template <typename outT> outT iround(GLfloat value) { return static_cast<outT>(value > 0.0f ? floor(value + 0.5f) : ceil(value - 0.5f)); }
template <typename outT> outT uiround(GLfloat value) { return static_cast<outT>(value + 0.5f); }
} }
std::string getTempPath(); std::string getTempPath();
......
...@@ -4982,7 +4982,7 @@ void __stdcall glGetIntegerv(GLenum pname, GLint* params) ...@@ -4982,7 +4982,7 @@ void __stdcall glGetIntegerv(GLenum pname, GLint* params)
params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f); params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
} }
else else
params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5)); params[i] = gl::iround<GLint>(floatParams[i]);
} }
delete [] floatParams; delete [] floatParams;
...@@ -5938,7 +5938,7 @@ void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) ...@@ -5938,7 +5938,7 @@ void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
float currentValue = currentValueData.FloatValues[i]; float currentValue = currentValueData.FloatValues[i];
params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f)); params[i] = gl::iround<GLint>(currentValue);
} }
} }
else else
...@@ -7002,37 +7002,37 @@ void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param) ...@@ -7002,37 +7002,37 @@ void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
switch (pname) switch (pname)
{ {
case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_S:
if (!texture->setWrapS((GLenum)param)) if (!texture->setWrapS(gl::uiround<GLenum>(param)))
{ {
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
break; break;
case GL_TEXTURE_WRAP_T: case GL_TEXTURE_WRAP_T:
if (!texture->setWrapT((GLenum)param)) if (!texture->setWrapT(gl::uiround<GLenum>(param)))
{ {
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
break; break;
case GL_TEXTURE_WRAP_R: case GL_TEXTURE_WRAP_R:
if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param)) if (context->getClientVersion() < 3 || !texture->setWrapR(gl::uiround<GLenum>(param)))
{ {
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
break; break;
case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_MIN_FILTER:
if (!texture->setMinFilter((GLenum)param)) if (!texture->setMinFilter(gl::uiround<GLenum>(param)))
{ {
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
break; break;
case GL_TEXTURE_MAG_FILTER: case GL_TEXTURE_MAG_FILTER:
if (!texture->setMagFilter((GLenum)param)) if (!texture->setMagFilter(gl::uiround<GLenum>(param)))
{ {
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
break; break;
case GL_TEXTURE_USAGE_ANGLE: case GL_TEXTURE_USAGE_ANGLE:
if (!texture->setUsage((GLenum)param)) if (!texture->setUsage(gl::uiround<GLenum>(param)))
{ {
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment