Refactor data conversions for state commands

This mainly enforces the rules as descripted in ES 3.10, section
2.2.1 and 2.2.2, by enhancing the "queryconversions" to support
more rules, removing the scattered type convertors in "utilities"
, "mathutil" and "queryutils", and forcing to only use the
convertors in "queryconversions".

BUG=angleproject:2165

Change-Id: I73c1dc850e2b3b8a479ece1d9c5eb7ae4ce851fe
Reviewed-on: https://chromium-review.googlesource.com/680094
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/queryutils.cpp b/src/libANGLE/queryutils.cpp
index ce94323..e7d5944 100644
--- a/src/libANGLE/queryutils.cpp
+++ b/src/libANGLE/queryutils.cpp
@@ -23,12 +23,14 @@
 #include "libANGLE/Texture.h"
 #include "libANGLE/Uniform.h"
 #include "libANGLE/VertexAttribute.h"
+#include "libANGLE/queryconversions.h"
 
 namespace gl
 {
 
 namespace
 {
+
 template <typename ParamType>
 void QueryTexLevelParameterBase(const Texture *texture,
                                 GLenum target,
@@ -42,66 +44,68 @@
     switch (pname)
     {
         case GL_TEXTURE_RED_TYPE:
-            *params = ConvertFromGLenum<ParamType>(info->redBits ? info->componentType : GL_NONE);
+            *params = CastFromGLintStateValue<ParamType>(
+                pname, info->redBits ? info->componentType : GL_NONE);
             break;
         case GL_TEXTURE_GREEN_TYPE:
-            *params = ConvertFromGLenum<ParamType>(info->greenBits ? info->componentType : GL_NONE);
+            *params = CastFromGLintStateValue<ParamType>(
+                pname, info->greenBits ? info->componentType : GL_NONE);
             break;
         case GL_TEXTURE_BLUE_TYPE:
-            *params = ConvertFromGLenum<ParamType>(info->blueBits ? info->componentType : GL_NONE);
+            *params = CastFromGLintStateValue<ParamType>(
+                pname, info->blueBits ? info->componentType : GL_NONE);
             break;
         case GL_TEXTURE_ALPHA_TYPE:
-            *params = ConvertFromGLenum<ParamType>(info->alphaBits ? info->componentType : GL_NONE);
+            *params = CastFromGLintStateValue<ParamType>(
+                pname, info->alphaBits ? info->componentType : GL_NONE);
             break;
         case GL_TEXTURE_DEPTH_TYPE:
-            *params = ConvertFromGLenum<ParamType>(info->depthBits ? info->componentType : GL_NONE);
+            *params = CastFromGLintStateValue<ParamType>(
+                pname, info->depthBits ? info->componentType : GL_NONE);
             break;
         case GL_TEXTURE_RED_SIZE:
-            *params = ConvertFromGLuint<ParamType>(info->redBits);
+            *params = CastFromGLintStateValue<ParamType>(pname, info->redBits);
             break;
         case GL_TEXTURE_GREEN_SIZE:
-            *params = ConvertFromGLuint<ParamType>(info->greenBits);
+            *params = CastFromGLintStateValue<ParamType>(pname, info->greenBits);
             break;
         case GL_TEXTURE_BLUE_SIZE:
-            *params = ConvertFromGLuint<ParamType>(info->blueBits);
+            *params = CastFromGLintStateValue<ParamType>(pname, info->blueBits);
             break;
         case GL_TEXTURE_ALPHA_SIZE:
-            *params = ConvertFromGLuint<ParamType>(info->alphaBits);
+            *params = CastFromGLintStateValue<ParamType>(pname, info->alphaBits);
             break;
         case GL_TEXTURE_DEPTH_SIZE:
-            *params = ConvertFromGLuint<ParamType>(info->depthBits);
+            *params = CastFromGLintStateValue<ParamType>(pname, info->depthBits);
             break;
         case GL_TEXTURE_STENCIL_SIZE:
-            *params = ConvertFromGLuint<ParamType>(info->stencilBits);
+            *params = CastFromGLintStateValue<ParamType>(pname, info->stencilBits);
             break;
         case GL_TEXTURE_SHARED_SIZE:
-            *params = ConvertFromGLuint<ParamType>(info->sharedBits);
+            *params = CastFromGLintStateValue<ParamType>(pname, info->sharedBits);
             break;
         case GL_TEXTURE_INTERNAL_FORMAT:
-            *params =
-                ConvertFromGLenum<ParamType>(info->internalFormat ? info->internalFormat : GL_RGBA);
+            *params = CastFromGLintStateValue<ParamType>(
+                pname, info->internalFormat ? info->internalFormat : GL_RGBA);
             break;
         case GL_TEXTURE_WIDTH:
-            *params =
-                ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getWidth(target, level)));
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getWidth(target, level));
             break;
         case GL_TEXTURE_HEIGHT:
-            *params =
-                ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getHeight(target, level)));
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getHeight(target, level));
             break;
         case GL_TEXTURE_DEPTH:
-            *params =
-                ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getDepth(target, level)));
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getDepth(target, level));
             break;
         case GL_TEXTURE_SAMPLES:
-            *params = ConvertFromGLint<ParamType>(texture->getSamples(target, level));
+            *params = CastFromStateValue<ParamType>(pname, texture->getSamples(target, level));
             break;
         case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
-            *params =
-                ConvertFromGLboolean<ParamType>(texture->getFixedSampleLocations(target, level));
+            *params = CastFromStateValue<ParamType>(
+                pname, static_cast<GLint>(texture->getFixedSampleLocations(target, level)));
             break;
         case GL_TEXTURE_COMPRESSED:
-            *params = ConvertFromGLboolean<ParamType>(info->compressed);
+            *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(info->compressed));
             break;
         default:
             UNREACHABLE();
@@ -117,64 +121,64 @@
     switch (pname)
     {
         case GL_TEXTURE_MAG_FILTER:
-            *params = ConvertFromGLenum<ParamType>(texture->getMagFilter());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter());
             break;
         case GL_TEXTURE_MIN_FILTER:
-            *params = ConvertFromGLenum<ParamType>(texture->getMinFilter());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter());
             break;
         case GL_TEXTURE_WRAP_S:
-            *params = ConvertFromGLenum<ParamType>(texture->getWrapS());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS());
             break;
         case GL_TEXTURE_WRAP_T:
-            *params = ConvertFromGLenum<ParamType>(texture->getWrapT());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT());
             break;
         case GL_TEXTURE_WRAP_R:
-            *params = ConvertFromGLenum<ParamType>(texture->getWrapR());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR());
             break;
         case GL_TEXTURE_IMMUTABLE_FORMAT:
-            *params = ConvertFromGLboolean<ParamType>(texture->getImmutableFormat());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat());
             break;
         case GL_TEXTURE_IMMUTABLE_LEVELS:
-            *params = ConvertFromGLuint<ParamType>(texture->getImmutableLevels());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels());
             break;
         case GL_TEXTURE_USAGE_ANGLE:
-            *params = ConvertFromGLenum<ParamType>(texture->getUsage());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage());
             break;
         case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-            *params = ConvertFromGLfloat<ParamType>(texture->getMaxAnisotropy());
+            *params = CastFromStateValue<ParamType>(pname, texture->getMaxAnisotropy());
             break;
         case GL_TEXTURE_SWIZZLE_R:
-            *params = ConvertFromGLenum<ParamType>(texture->getSwizzleRed());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed());
             break;
         case GL_TEXTURE_SWIZZLE_G:
-            *params = ConvertFromGLenum<ParamType>(texture->getSwizzleGreen());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen());
             break;
         case GL_TEXTURE_SWIZZLE_B:
-            *params = ConvertFromGLenum<ParamType>(texture->getSwizzleBlue());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue());
             break;
         case GL_TEXTURE_SWIZZLE_A:
-            *params = ConvertFromGLenum<ParamType>(texture->getSwizzleAlpha());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha());
             break;
         case GL_TEXTURE_BASE_LEVEL:
-            *params = ConvertFromGLuint<ParamType>(texture->getBaseLevel());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel());
             break;
         case GL_TEXTURE_MAX_LEVEL:
-            *params = ConvertFromGLuint<ParamType>(texture->getMaxLevel());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel());
             break;
         case GL_TEXTURE_MIN_LOD:
-            *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().minLod);
+            *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().minLod);
             break;
         case GL_TEXTURE_MAX_LOD:
-            *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().maxLod);
+            *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().maxLod);
             break;
         case GL_TEXTURE_COMPARE_MODE:
-            *params = ConvertFromGLenum<ParamType>(texture->getCompareMode());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode());
             break;
         case GL_TEXTURE_COMPARE_FUNC:
-            *params = ConvertFromGLenum<ParamType>(texture->getCompareFunc());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc());
             break;
         case GL_TEXTURE_SRGB_DECODE_EXT:
-            *params = ConvertFromGLenum<ParamType>(texture->getSRGBDecode());
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode());
             break;
         default:
             UNREACHABLE();
@@ -190,63 +194,64 @@
     switch (pname)
     {
         case GL_TEXTURE_WRAP_S:
-            texture->setWrapS(ConvertToGLenum(params[0]));
+            texture->setWrapS(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_WRAP_T:
-            texture->setWrapT(ConvertToGLenum(params[0]));
+            texture->setWrapT(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_WRAP_R:
-            texture->setWrapR(ConvertToGLenum(params[0]));
+            texture->setWrapR(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_MIN_FILTER:
-            texture->setMinFilter(ConvertToGLenum(params[0]));
+            texture->setMinFilter(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_MAG_FILTER:
-            texture->setMagFilter(ConvertToGLenum(params[0]));
+            texture->setMagFilter(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_USAGE_ANGLE:
-            texture->setUsage(ConvertToGLenum(params[0]));
+            texture->setUsage(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-            texture->setMaxAnisotropy(ConvertToGLfloat(params[0]));
+            texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
             break;
         case GL_TEXTURE_COMPARE_MODE:
-            texture->setCompareMode(ConvertToGLenum(params[0]));
+            texture->setCompareMode(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_COMPARE_FUNC:
-            texture->setCompareFunc(ConvertToGLenum(params[0]));
+            texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_SWIZZLE_R:
-            texture->setSwizzleRed(ConvertToGLenum(params[0]));
+            texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_SWIZZLE_G:
-            texture->setSwizzleGreen(ConvertToGLenum(params[0]));
+            texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_SWIZZLE_B:
-            texture->setSwizzleBlue(ConvertToGLenum(params[0]));
+            texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_SWIZZLE_A:
-            texture->setSwizzleAlpha(ConvertToGLenum(params[0]));
+            texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_BASE_LEVEL:
         {
-            context->handleError(texture->setBaseLevel(context, ConvertToGLuint(params[0])));
+            context->handleError(texture->setBaseLevel(
+                context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
             break;
         }
         case GL_TEXTURE_MAX_LEVEL:
-            texture->setMaxLevel(ConvertToGLuint(params[0]));
+            texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
             break;
         case GL_TEXTURE_MIN_LOD:
-            texture->setMinLod(ConvertToGLfloat(params[0]));
+            texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
             break;
         case GL_TEXTURE_MAX_LOD:
-            texture->setMaxLod(ConvertToGLfloat(params[0]));
+            texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
             break;
         case GL_DEPTH_STENCIL_TEXTURE_MODE:
-            texture->setDepthStencilTextureMode(ConvertToGLenum(params[0]));
+            texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_SRGB_DECODE_EXT:
-            texture->setSRGBDecode(ConvertToGLenum(params[0]));
+            texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
             break;
         default:
             UNREACHABLE();
@@ -260,37 +265,37 @@
     switch (pname)
     {
         case GL_TEXTURE_MIN_FILTER:
-            *params = ConvertFromGLenum<ParamType>(sampler->getMinFilter());
+            *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
             break;
         case GL_TEXTURE_MAG_FILTER:
-            *params = ConvertFromGLenum<ParamType>(sampler->getMagFilter());
+            *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
             break;
         case GL_TEXTURE_WRAP_S:
-            *params = ConvertFromGLenum<ParamType>(sampler->getWrapS());
+            *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
             break;
         case GL_TEXTURE_WRAP_T:
-            *params = ConvertFromGLenum<ParamType>(sampler->getWrapT());
+            *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
             break;
         case GL_TEXTURE_WRAP_R:
-            *params = ConvertFromGLenum<ParamType>(sampler->getWrapR());
+            *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
             break;
         case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-            *params = ConvertFromGLfloat<ParamType>(sampler->getMaxAnisotropy());
+            *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
             break;
         case GL_TEXTURE_MIN_LOD:
-            *params = ConvertFromGLfloat<ParamType>(sampler->getMinLod());
+            *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
             break;
         case GL_TEXTURE_MAX_LOD:
-            *params = ConvertFromGLfloat<ParamType>(sampler->getMaxLod());
+            *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
             break;
         case GL_TEXTURE_COMPARE_MODE:
-            *params = ConvertFromGLenum<ParamType>(sampler->getCompareMode());
+            *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
             break;
         case GL_TEXTURE_COMPARE_FUNC:
-            *params = ConvertFromGLenum<ParamType>(sampler->getCompareFunc());
+            *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
             break;
         case GL_TEXTURE_SRGB_DECODE_EXT:
-            *params = ConvertFromGLenum<ParamType>(sampler->getSRGBDecode());
+            *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
             break;
         default:
             UNREACHABLE();
@@ -304,37 +309,37 @@
     switch (pname)
     {
         case GL_TEXTURE_WRAP_S:
-            sampler->setWrapS(ConvertToGLenum(params[0]));
+            sampler->setWrapS(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_WRAP_T:
-            sampler->setWrapT(ConvertToGLenum(params[0]));
+            sampler->setWrapT(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_WRAP_R:
-            sampler->setWrapR(ConvertToGLenum(params[0]));
+            sampler->setWrapR(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_MIN_FILTER:
-            sampler->setMinFilter(ConvertToGLenum(params[0]));
+            sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_MAG_FILTER:
-            sampler->setMagFilter(ConvertToGLenum(params[0]));
+            sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-            sampler->setMaxAnisotropy(ConvertToGLfloat(params[0]));
+            sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
             break;
         case GL_TEXTURE_COMPARE_MODE:
-            sampler->setCompareMode(ConvertToGLenum(params[0]));
+            sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_COMPARE_FUNC:
-            sampler->setCompareFunc(ConvertToGLenum(params[0]));
+            sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
             break;
         case GL_TEXTURE_MIN_LOD:
-            sampler->setMinLod(ConvertToGLfloat(params[0]));
+            sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
             break;
         case GL_TEXTURE_MAX_LOD:
-            sampler->setMaxLod(ConvertToGLfloat(params[0]));
+            sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
             break;
         case GL_TEXTURE_SRGB_DECODE_EXT:
-            sampler->setSRGBDecode(ConvertToGLenum(params[0]));
+            sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
             break;
         default:
             UNREACHABLE();
@@ -342,18 +347,6 @@
     }
 }
 
-template <typename ParamType, typename CurrentDataType>
-ParamType ConvertCurrentValue(CurrentDataType currentValue)
-{
-    return static_cast<ParamType>(currentValue);
-}
-
-template <>
-GLint ConvertCurrentValue(GLfloat currentValue)
-{
-    return iround<GLint>(currentValue);
-}
-
 // Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
 template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
 void QueryVertexAttribBase(const VertexAttribute &attrib,
@@ -367,38 +360,38 @@
         case GL_CURRENT_VERTEX_ATTRIB:
             for (size_t i = 0; i < CurrentValueCount; ++i)
             {
-                params[i] = ConvertCurrentValue<ParamType>(currentValueData[i]);
+                params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
             }
             break;
         case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
-            *params = ConvertFromGLboolean<ParamType>(attrib.enabled);
+            *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
             break;
         case GL_VERTEX_ATTRIB_ARRAY_SIZE:
-            *params = ConvertFromGLuint<ParamType>(attrib.size);
+            *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
             break;
         case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
-            *params = ConvertFromGLuint<ParamType>(attrib.vertexAttribArrayStride);
+            *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
             break;
         case GL_VERTEX_ATTRIB_ARRAY_TYPE:
-            *params = ConvertFromGLenum<ParamType>(attrib.type);
+            *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
             break;
         case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
-            *params = ConvertFromGLboolean<ParamType>(attrib.normalized);
+            *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
             break;
         case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
-            *params = ConvertFromGLuint<ParamType>(binding.getBuffer().id());
+            *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
             break;
         case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
-            *params = ConvertFromGLuint<ParamType>(binding.getDivisor());
+            *params = CastFromGLintStateValue<ParamType>(pname, binding.getDivisor());
             break;
         case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
-            *params = ConvertFromGLboolean<ParamType>(attrib.pureInteger);
+            *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
             break;
         case GL_VERTEX_ATTRIB_BINDING:
-            *params = ConvertFromGLuint<ParamType>(attrib.bindingIndex);
+            *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
             break;
         case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
-            *params = ConvertFromGLuint<ParamType>(attrib.relativeOffset);
+            *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
             break;
         default:
             UNREACHABLE();
@@ -414,25 +407,25 @@
     switch (pname)
     {
         case GL_BUFFER_USAGE:
-            *params = ConvertFromGLenum<ParamType>(buffer->getUsage());
+            *params = CastFromGLintStateValue<ParamType>(pname, buffer->getUsage());
             break;
         case GL_BUFFER_SIZE:
-            *params = ConvertFromGLint64<ParamType>(buffer->getSize());
+            *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
             break;
         case GL_BUFFER_ACCESS_FLAGS:
-            *params = ConvertFromGLuint<ParamType>(buffer->getAccessFlags());
+            *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
             break;
         case GL_BUFFER_ACCESS_OES:
-            *params = ConvertFromGLenum<ParamType>(buffer->getAccess());
+            *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
             break;
         case GL_BUFFER_MAPPED:
-            *params = ConvertFromGLboolean<ParamType>(buffer->isMapped());
+            *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
             break;
         case GL_BUFFER_MAP_OFFSET:
-            *params = ConvertFromGLint64<ParamType>(buffer->getMapOffset());
+            *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
             break;
         case GL_BUFFER_MAP_LENGTH:
-            *params = ConvertFromGLint64<ParamType>(buffer->getMapLength());
+            *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
             break;
         default:
             UNREACHABLE();
@@ -445,13 +438,13 @@
     switch (prop)
     {
         case GL_TYPE:
-            return ConvertToGLint(var.type);
+            return clampCast<GLint>(var.type);
 
         case GL_ARRAY_SIZE:
             // TODO(jie.a.chen@intel.com): check array of array.
             if (var.isArray() && !var.isStruct())
             {
-                return ConvertToGLint(var.elementCount());
+                return clampCast<GLint>(var.elementCount());
             }
             return 1;
 
@@ -465,7 +458,7 @@
             }
             // ES31 spec p84: This counts the terminating null char.
             ++length;
-            return ConvertToGLint(length);
+            return clampCast<GLint>(length);
         }
 
         case GL_LOCATION:
@@ -532,16 +525,16 @@
     switch (programInterface)
     {
         case GL_PROGRAM_INPUT:
-            return ConvertToGLint(program->getAttributes().size());
+            return clampCast<GLint>(program->getAttributes().size());
 
         case GL_PROGRAM_OUTPUT:
-            return ConvertToGLint(program->getState().getOutputVariables().size());
+            return clampCast<GLint>(program->getState().getOutputVariables().size());
 
         case GL_UNIFORM:
-            return ConvertToGLint(program->getState().getUniforms().size());
+            return clampCast<GLint>(program->getState().getUniforms().size());
 
         case GL_UNIFORM_BLOCK:
-            return ConvertToGLint(program->getState().getUniformBlocks().size());
+            return clampCast<GLint>(program->getState().getUniformBlocks().size());
 
         // TODO(jie.a.chen@intel.com): more interfaces.
         case GL_TRANSFORM_FEEDBACK_VARYING:
@@ -563,7 +556,7 @@
     GLint max = 0;
     for (const T &resource : resources)
     {
-        max = std::max(max, ConvertToGLint((resource.*member).size()));
+        max = std::max(max, clampCast<GLint>((resource.*member).size()));
     }
     return max;
 }
@@ -1014,30 +1007,30 @@
     switch (pname)
     {
         case GL_UNIFORM_BLOCK_BINDING:
-            *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
+            *params = clampCast<GLint>(program->getUniformBlockBinding(uniformBlockIndex));
             break;
         case GL_UNIFORM_BLOCK_DATA_SIZE:
-            *params = ConvertToGLint(uniformBlock.dataSize);
+            *params = clampCast<GLint>(uniformBlock.dataSize);
             break;
         case GL_UNIFORM_BLOCK_NAME_LENGTH:
-            *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
+            *params = clampCast<GLint>(uniformBlock.nameWithArrayIndex().size() + 1);
             break;
         case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
-            *params = ConvertToGLint(uniformBlock.memberIndexes.size());
+            *params = clampCast<GLint>(uniformBlock.memberIndexes.size());
             break;
         case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
             for (size_t blockMemberIndex = 0; blockMemberIndex < uniformBlock.memberIndexes.size();
                  blockMemberIndex++)
             {
                 params[blockMemberIndex] =
-                    ConvertToGLint(uniformBlock.memberIndexes[blockMemberIndex]);
+                    clampCast<GLint>(uniformBlock.memberIndexes[blockMemberIndex]);
             }
             break;
         case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
-            *params = ConvertToGLint(uniformBlock.vertexStaticUse);
+            *params = static_cast<GLint>(uniformBlock.vertexStaticUse);
             break;
         case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
-            *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
+            *params = static_cast<GLint>(uniformBlock.fragmentStaticUse);
             break;
         default:
             UNREACHABLE();
@@ -1052,7 +1045,7 @@
         case GL_NUM_SAMPLE_COUNTS:
             if (bufSize != 0)
             {
-                *params = static_cast<GLint>(format.sampleCounts.size());
+                *params = clampCast<GLint>(format.sampleCounts.size());
             }
             break;
 
@@ -1114,13 +1107,13 @@
     switch (pname)
     {
         case GL_OBJECT_TYPE:
-            *values = ConvertToGLint(GL_SYNC_FENCE);
+            *values = clampCast<GLint>(GL_SYNC_FENCE);
             break;
         case GL_SYNC_CONDITION:
-            *values = ConvertToGLint(sync->getCondition());
+            *values = clampCast<GLint>(sync->getCondition());
             break;
         case GL_SYNC_FLAGS:
-            *values = ConvertToGLint(sync->getFlags());
+            *values = clampCast<GLint>(sync->getFlags());
             break;
         case GL_SYNC_STATUS:
             ANGLE_TRY(sync->getStatus(values));
@@ -1195,7 +1188,7 @@
             framebuffer->setDefaultSamples(param);
             break;
         case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
-            framebuffer->setDefaultFixedSampleLocations(static_cast<GLboolean>(param));
+            framebuffer->setDefaultFixedSampleLocations(CastQueryValueTo<GLboolean>(pname, param));
             break;
         default:
             UNREACHABLE();