Commit c337e7ab by Geoff Lang

Convert floats to integers using doubles and 64-bit integers.

Avoids some edge cases that overflow or round incorrectly. Fixes: dEQP-GLES2.functional.state_query.floats.depth_range_getinteger dEQP-GLES2.functional.state_query.floats.color_clear_value_getinteger dEQP-GLES2.functional.state_query.floats.depth_clear_value_getinteger Change-Id: Ib2c7f422dac76094c7ff6c5f8aef3fd392f68e80 Reviewed-on: https://chromium-review.googlesource.com/268510Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent eac64633
...@@ -25,6 +25,19 @@ template <> GLenum CastStateValueEnum<GLboolean>::mEnumForType = GL_BOOL; ...@@ -25,6 +25,19 @@ template <> GLenum CastStateValueEnum<GLboolean>::mEnumForType = GL_BOOL;
template <> GLenum CastStateValueEnum<GLint64>::mEnumForType = GL_INT_64_ANGLEX; template <> GLenum CastStateValueEnum<GLint64>::mEnumForType = GL_INT_64_ANGLEX;
template <> GLenum CastStateValueEnum<GLfloat>::mEnumForType = GL_FLOAT; template <> GLenum CastStateValueEnum<GLfloat>::mEnumForType = GL_FLOAT;
static GLint64 ExpandFloatToInteger(GLfloat value)
{
return static_cast<GLint64>((static_cast<double>(0xFFFFFFFFULL) * value - 1.0) / 2.0);
}
template <typename QueryT>
static QueryT ClampToQueryRange(GLint64 value)
{
const GLint64 min = static_cast<GLint64>(std::numeric_limits<QueryT>::min());
const GLint64 max = static_cast<GLint64>(std::numeric_limits<QueryT>::max());
return static_cast<QueryT>(clamp(value, min, max));
}
template <typename QueryT, typename NativeT> template <typename QueryT, typename NativeT>
QueryT CastStateValueToInt(GLenum pname, NativeT value) QueryT CastStateValueToInt(GLenum pname, NativeT value)
{ {
...@@ -36,7 +49,7 @@ QueryT CastStateValueToInt(GLenum pname, NativeT value) ...@@ -36,7 +49,7 @@ QueryT CastStateValueToInt(GLenum pname, NativeT value)
// RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR) if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
{ {
return static_cast<QueryT>((static_cast<GLfloat>(0xFFFFFFFF) * value - 1.0f) / 2.0f); return ClampToQueryRange<QueryT>(ExpandFloatToInteger(static_cast<GLfloat>(value)));
} }
else else
{ {
......
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