OSDN Git Service

CreateSampler should create a Sampler object by default
authorAlexis Hetu <sugoi@google.com>
Fri, 3 Jul 2015 19:43:53 +0000 (15:43 -0400)
committerAlexis Hétu <sugoi@google.com>
Wed, 8 Jul 2015 18:41:30 +0000 (18:41 +0000)
It should be possible to query the default parameters
of a Sampler created with glGenSamplers, so
checkSamplerAllocation() was added to make sure a
created sampler was associated to a Sampler object
where appropriate.

I also cleaned up the API a little to share validation
functions.

Change-Id: I55d95c6663d41e2566b24eb76a431dd4b4da61e3
Reviewed-on: https://swiftshader-review.googlesource.com/3637
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGLESv2/Context.cpp
src/OpenGL/libGLESv2/Context.h
src/OpenGL/libGLESv2/Sampler.h
src/OpenGL/libGLESv2/libGLESv3.cpp

index d1d4e0e..6f33d6c 100644 (file)
@@ -1326,6 +1326,8 @@ bool Context::bindTransformFeedback(GLuint id)
 \r
 bool Context::bindSampler(GLuint unit, GLuint sampler)\r
 {\r
+       mResourceManager->checkSamplerAllocation(sampler);\r
+\r
        Sampler* samplerObject = getSampler(sampler);\r
 \r
        if(sampler)\r
@@ -1570,6 +1572,11 @@ Sampler *Context::getSampler(GLuint sampler) const
        return mResourceManager->getSampler(sampler);\r
 }\r
 \r
+bool Context::isSampler(GLuint sampler) const\r
+{\r
+       return mResourceManager->isSampler(sampler);\r
+}\r
+\r
 Buffer *Context::getArrayBuffer() const\r
 {\r
     return mState.arrayBuffer;\r
@@ -1719,6 +1726,94 @@ Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) cons
     return mState.samplerTexture[type][sampler];\r
 }\r
 \r
+void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)\r
+{\r
+       mResourceManager->checkSamplerAllocation(sampler);\r
+\r
+       Sampler *samplerObject = getSampler(sampler);\r
+       ASSERT(samplerObject);\r
+\r
+       switch(pname)\r
+       {\r
+       case GL_TEXTURE_MIN_FILTER:    samplerObject->setMinFilter(static_cast<GLenum>(param));       break;\r
+       case GL_TEXTURE_MAG_FILTER:    samplerObject->setMagFilter(static_cast<GLenum>(param));       break;\r
+       case GL_TEXTURE_WRAP_S:        samplerObject->setWrapS(static_cast<GLenum>(param));           break;\r
+       case GL_TEXTURE_WRAP_T:        samplerObject->setWrapT(static_cast<GLenum>(param));           break;\r
+       case GL_TEXTURE_WRAP_R:        samplerObject->setWrapR(static_cast<GLenum>(param));           break;\r
+       case GL_TEXTURE_MIN_LOD:       samplerObject->setMinLod(static_cast<GLfloat>(param));         break;\r
+       case GL_TEXTURE_MAX_LOD:       samplerObject->setMaxLod(static_cast<GLfloat>(param));         break;\r
+       case GL_TEXTURE_COMPARE_MODE:  samplerObject->setComparisonMode(static_cast<GLenum>(param));  break;\r
+       case GL_TEXTURE_COMPARE_FUNC:  samplerObject->setComparisonFunc(static_cast<GLenum>(param));  break;\r
+       default:                       UNREACHABLE(pname); break;\r
+       }\r
+}\r
+\r
+void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)\r
+{\r
+       mResourceManager->checkSamplerAllocation(sampler);\r
+\r
+       Sampler *samplerObject = getSampler(sampler);\r
+       ASSERT(samplerObject);\r
+\r
+       switch(pname)\r
+       {\r
+       case GL_TEXTURE_MIN_FILTER:    samplerObject->setMinFilter(static_cast<GLenum>(roundf(param)));       break;\r
+       case GL_TEXTURE_MAG_FILTER:    samplerObject->setMagFilter(static_cast<GLenum>(roundf(param)));       break;\r
+       case GL_TEXTURE_WRAP_S:        samplerObject->setWrapS(static_cast<GLenum>(roundf(param)));           break;\r
+       case GL_TEXTURE_WRAP_T:        samplerObject->setWrapT(static_cast<GLenum>(roundf(param)));           break;\r
+       case GL_TEXTURE_WRAP_R:        samplerObject->setWrapR(static_cast<GLenum>(roundf(param)));           break;\r
+       case GL_TEXTURE_MIN_LOD:       samplerObject->setMinLod(param);                                       break;\r
+       case GL_TEXTURE_MAX_LOD:       samplerObject->setMaxLod(param);                                       break;\r
+       case GL_TEXTURE_COMPARE_MODE:  samplerObject->setComparisonMode(static_cast<GLenum>(roundf(param)));  break;\r
+       case GL_TEXTURE_COMPARE_FUNC:  samplerObject->setComparisonFunc(static_cast<GLenum>(roundf(param)));  break;\r
+       default:                       UNREACHABLE(pname); break;\r
+       }\r
+}\r
+\r
+GLint Context::getSamplerParameteri(GLuint sampler, GLenum pname)\r
+{\r
+       mResourceManager->checkSamplerAllocation(sampler);\r
+\r
+       Sampler *samplerObject = getSampler(sampler);\r
+       ASSERT(samplerObject);\r
+\r
+       switch(pname)\r
+       {\r
+       case GL_TEXTURE_MIN_FILTER:    return static_cast<GLint>(samplerObject->getMinFilter());\r
+       case GL_TEXTURE_MAG_FILTER:    return static_cast<GLint>(samplerObject->getMagFilter());\r
+       case GL_TEXTURE_WRAP_S:        return static_cast<GLint>(samplerObject->getWrapS());\r
+       case GL_TEXTURE_WRAP_T:        return static_cast<GLint>(samplerObject->getWrapT());\r
+       case GL_TEXTURE_WRAP_R:        return static_cast<GLint>(samplerObject->getWrapR());\r
+       case GL_TEXTURE_MIN_LOD:       return static_cast<GLint>(roundf(samplerObject->getMinLod()));\r
+       case GL_TEXTURE_MAX_LOD:       return static_cast<GLint>(roundf(samplerObject->getMaxLod()));\r
+       case GL_TEXTURE_COMPARE_MODE:  return static_cast<GLint>(samplerObject->getComparisonMode());\r
+       case GL_TEXTURE_COMPARE_FUNC:  return static_cast<GLint>(samplerObject->getComparisonFunc());\r
+       default:                       UNREACHABLE(pname); return 0;\r
+       }\r
+}\r
+\r
+GLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname)\r
+{\r
+       mResourceManager->checkSamplerAllocation(sampler);\r
+\r
+       Sampler *samplerObject = getSampler(sampler);\r
+       ASSERT(samplerObject);\r
+\r
+       switch(pname)\r
+       {\r
+       case GL_TEXTURE_MIN_FILTER:    return static_cast<GLfloat>(samplerObject->getMinFilter());\r
+       case GL_TEXTURE_MAG_FILTER:    return static_cast<GLfloat>(samplerObject->getMagFilter());\r
+       case GL_TEXTURE_WRAP_S:        return static_cast<GLfloat>(samplerObject->getWrapS());\r
+       case GL_TEXTURE_WRAP_T:        return static_cast<GLfloat>(samplerObject->getWrapT());\r
+       case GL_TEXTURE_WRAP_R:        return static_cast<GLfloat>(samplerObject->getWrapR());\r
+       case GL_TEXTURE_MIN_LOD:       return samplerObject->getMinLod();\r
+       case GL_TEXTURE_MAX_LOD:       return samplerObject->getMaxLod();\r
+       case GL_TEXTURE_COMPARE_MODE:  return static_cast<GLfloat>(samplerObject->getComparisonMode());\r
+       case GL_TEXTURE_COMPARE_FUNC:  return static_cast<GLfloat>(samplerObject->getComparisonFunc());\r
+       default:                       UNREACHABLE(pname); return 0;\r
+       }\r
+}\r
+\r
 bool Context::getBooleanv(GLenum pname, GLboolean *params) const\r
 {\r
     switch(pname)\r
index d2b761f..4a09bc3 100644 (file)
@@ -560,6 +560,7 @@ public:
        TransformFeedback *getTransformFeedback(GLuint transformFeedback) const;\r
        TransformFeedback *getTransformFeedback() const;\r
        Sampler *getSampler(GLuint sampler) const;\r
+       bool isSampler(GLuint sampler) const;\r
 \r
        Buffer *getArrayBuffer() const;\r
        Buffer *getElementArrayBuffer() const;\r
@@ -583,6 +584,10 @@ public:
        template<typename T> bool getIntegerv(GLenum pname, T *params) const;\r
        bool getBooleanv(GLenum pname, GLboolean *params) const;\r
        template<typename T> bool getTransformFeedbackiv(GLuint xfb, GLenum pname, T *param) const;\r
+       void samplerParameteri(GLuint sampler, GLenum pname, GLint param);\r
+       void samplerParameterf(GLuint sampler, GLenum pname, GLfloat param);\r
+       GLint getSamplerParameteri(GLuint sampler, GLenum pname);\r
+       GLfloat getSamplerParameterf(GLuint sampler, GLenum pname);\r
 \r
        bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams) const;\r
 \r
index 59ec86c..ba8e528 100644 (file)
@@ -40,6 +40,27 @@ public:
                mCompareFunc = GL_LEQUAL;\r
        }\r
 \r
+       void setMinFilter(GLenum minFilter) { mMinFilter = minFilter; }\r
+       void setMagFilter(GLenum magFilter) { mMagFilter = magFilter; }\r
+       void setWrapS(GLenum wrapS) { mWrapModeS = wrapS; }\r
+       void setWrapT(GLenum wrapT) { mWrapModeT = wrapT; }\r
+       void setWrapR(GLenum wrapR) { mWrapModeR = wrapR; }\r
+       void setMinLod(GLfloat minLod) { mMinLod = minLod; }\r
+       void setMaxLod(GLfloat maxLod) { mMaxLod = maxLod; }\r
+       void setComparisonMode(GLenum comparisonMode) { mCompareMode = comparisonMode; }\r
+       void setComparisonFunc(GLenum comparisonFunc) { mCompareFunc = comparisonFunc; }\r
+\r
+       GLenum getMinFilter() const { return mMinFilter; }\r
+       GLenum getMagFilter() const { return mMagFilter; }\r
+       GLenum getWrapS() const { return mWrapModeS; }\r
+       GLenum getWrapT() const { return mWrapModeT; }\r
+       GLenum getWrapR() const { return mWrapModeR; }\r
+       GLfloat getMinLod() const { return mMinLod; }\r
+       GLfloat getMaxLod() const { return mMaxLod; }\r
+       GLenum getComparisonMode() const { return mCompareMode; }\r
+       GLenum getComparisonFunc() const { return mCompareFunc; }\r
+\r
+private:\r
        GLenum mMinFilter;\r
        GLenum mMagFilter;\r
 \r
index e784e50..4def2b2 100644 (file)
@@ -450,6 +450,153 @@ static bool ValidateBufferTarget(GLenum target)
        return true;\r
 }\r
 \r
+bool ValidateTexParamParameters(GLenum pname, GLint param)\r
+{\r
+       switch(pname)\r
+       {\r
+       case GL_TEXTURE_WRAP_S:\r
+       case GL_TEXTURE_WRAP_T:\r
+       case GL_TEXTURE_WRAP_R:\r
+               switch(param)\r
+               {\r
+               case GL_REPEAT:\r
+               case GL_CLAMP_TO_EDGE:\r
+               case GL_MIRRORED_REPEAT:\r
+                       return true;\r
+               default:\r
+                       return error(GL_INVALID_ENUM, false);\r
+               }\r
+\r
+       case GL_TEXTURE_MIN_FILTER:\r
+               switch(param)\r
+               {\r
+               case GL_NEAREST:\r
+               case GL_LINEAR:\r
+               case GL_NEAREST_MIPMAP_NEAREST:\r
+               case GL_LINEAR_MIPMAP_NEAREST:\r
+               case GL_NEAREST_MIPMAP_LINEAR:\r
+               case GL_LINEAR_MIPMAP_LINEAR:\r
+                       return true;\r
+               default:\r
+                       return error(GL_INVALID_ENUM, false);\r
+               }\r
+               break;\r
+\r
+       case GL_TEXTURE_MAG_FILTER:\r
+               switch(param)\r
+               {\r
+               case GL_NEAREST:\r
+               case GL_LINEAR:\r
+                       return true;\r
+               default:\r
+                       return error(GL_INVALID_ENUM, false);\r
+               }\r
+               break;\r
+\r
+       case GL_TEXTURE_USAGE_ANGLE:\r
+               switch(param)\r
+               {\r
+               case GL_NONE:\r
+               case GL_FRAMEBUFFER_ATTACHMENT_ANGLE:\r
+                       return true;\r
+               default:\r
+                       return error(GL_INVALID_ENUM, false);\r
+               }\r
+               break;\r
+\r
+       case GL_TEXTURE_MAX_ANISOTROPY_EXT:\r
+               // we assume the parameter passed to this validation method is truncated, not rounded\r
+               if(param < 1)\r
+               {\r
+                       return error(GL_INVALID_VALUE, false);\r
+               }\r
+               return true;\r
+\r
+       case GL_TEXTURE_MIN_LOD:\r
+       case GL_TEXTURE_MAX_LOD:\r
+               // any value is permissible\r
+               return true;\r
+\r
+       case GL_TEXTURE_COMPARE_MODE:\r
+               // Acceptable mode parameters from GLES 3.0.2 spec, table 3.17\r
+               switch(param)\r
+               {\r
+               case GL_NONE:\r
+               case GL_COMPARE_REF_TO_TEXTURE:\r
+                       return true;\r
+               default:\r
+                       return error(GL_INVALID_ENUM, false);\r
+               }\r
+               break;\r
+\r
+       case GL_TEXTURE_COMPARE_FUNC:\r
+               // Acceptable function parameters from GLES 3.0.2 spec, table 3.17\r
+               switch(param)\r
+               {\r
+               case GL_LEQUAL:\r
+               case GL_GEQUAL:\r
+               case GL_LESS:\r
+               case GL_GREATER:\r
+               case GL_EQUAL:\r
+               case GL_NOTEQUAL:\r
+               case GL_ALWAYS:\r
+               case GL_NEVER:\r
+                       return true;\r
+               default:\r
+                       return error(GL_INVALID_ENUM, false);\r
+               }\r
+               break;\r
+\r
+       case GL_TEXTURE_SWIZZLE_R:\r
+       case GL_TEXTURE_SWIZZLE_G:\r
+       case GL_TEXTURE_SWIZZLE_B:\r
+       case GL_TEXTURE_SWIZZLE_A:\r
+               switch(param)\r
+               {\r
+               case GL_RED:\r
+               case GL_GREEN:\r
+               case GL_BLUE:\r
+               case GL_ALPHA:\r
+               case GL_ZERO:\r
+               case GL_ONE:\r
+                       return true;\r
+               default:\r
+                       return error(GL_INVALID_ENUM, false);\r
+               }\r
+               break;\r
+\r
+       case GL_TEXTURE_BASE_LEVEL:\r
+       case GL_TEXTURE_MAX_LEVEL:\r
+               if(param < 0)\r
+               {\r
+                       return error(GL_INVALID_VALUE, false);\r
+               }\r
+               return true;\r
+\r
+       default:\r
+               return error(GL_INVALID_ENUM, false);\r
+       }\r
+}\r
+\r
+static bool ValidateSamplerObjectParameter(GLenum pname)\r
+{\r
+       switch(pname)\r
+       {\r
+       case GL_TEXTURE_MIN_FILTER:\r
+       case GL_TEXTURE_MAG_FILTER:\r
+       case GL_TEXTURE_WRAP_S:\r
+       case GL_TEXTURE_WRAP_T:\r
+       case GL_TEXTURE_WRAP_R:\r
+       case GL_TEXTURE_MIN_LOD:\r
+       case GL_TEXTURE_MAX_LOD:\r
+       case GL_TEXTURE_COMPARE_MODE:\r
+       case GL_TEXTURE_COMPARE_FUNC:\r
+               return true;\r
+       default:\r
+               return false;\r
+       }\r
+}\r
+\r
 extern "C"\r
 {\r
 \r
@@ -3352,118 +3499,26 @@ GL_APICALL void GL_APIENTRY glSamplerParameteriv(GLuint sampler, GLenum pname, c
        TRACE("(GLuint sampler = %d, GLenum pname = 0x%X, const GLint *param = %p)",\r
              sampler, pname, param);\r
 \r
+       if(!ValidateSamplerObjectParameter(pname))\r
+       {\r
+               return error(GL_INVALID_ENUM);\r
+       }\r
+\r
+       if(!ValidateTexParamParameters(pname, *param))\r
+       {\r
+               return;\r
+       }\r
+\r
        es2::Context *context = es2::getContext();\r
 \r
        if(context)\r
        {\r
-               es2::Sampler *samplerObject = (sampler != 0) ? context->getSampler(sampler) : nullptr;\r
-\r
-               if(!samplerObject)\r
+               if(!context->isSampler(sampler))\r
                {\r
-                       return error(GL_INVALID_VALUE);\r
+                       return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               switch(pname)\r
-               {\r
-               case GL_TEXTURE_WRAP_S:\r
-                       switch(*param)\r
-                       {\r
-                       case GL_CLAMP_TO_EDGE:\r
-                       case GL_MIRRORED_REPEAT:\r
-                       case GL_REPEAT:\r
-                               samplerObject->mWrapModeS = *param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_WRAP_T:\r
-                       switch(*param)\r
-                       {\r
-                       case GL_CLAMP_TO_EDGE:\r
-                       case GL_MIRRORED_REPEAT:\r
-                       case GL_REPEAT:\r
-                               samplerObject->mWrapModeT = *param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_WRAP_R:\r
-                       switch(*param)\r
-                       {\r
-                       case GL_CLAMP_TO_EDGE:\r
-                       case GL_MIRRORED_REPEAT:\r
-                       case GL_REPEAT:\r
-                               samplerObject->mWrapModeR = *param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_MIN_FILTER:\r
-                       switch(*param)\r
-                       {\r
-                       case GL_NEAREST:\r
-                       case GL_LINEAR:\r
-                       case GL_NEAREST_MIPMAP_NEAREST:\r
-                       case GL_LINEAR_MIPMAP_NEAREST:\r
-                       case GL_NEAREST_MIPMAP_LINEAR:\r
-                       case GL_LINEAR_MIPMAP_LINEAR:\r
-                               samplerObject->mMinFilter = *param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_MAG_FILTER:\r
-                       switch(*param)\r
-                       {\r
-                       case GL_NEAREST:\r
-                       case GL_LINEAR:\r
-                               samplerObject->mMagFilter = *param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_MIN_LOD:\r
-                       samplerObject->mMinLod = (GLfloat)*param;\r
-                       break;\r
-               case GL_TEXTURE_MAX_LOD:\r
-                       samplerObject->mMaxLod = (GLfloat)*param;\r
-                       break;\r
-               case GL_TEXTURE_COMPARE_MODE:\r
-                       switch(*param)\r
-                       {\r
-                       case GL_COMPARE_REF_TO_TEXTURE:\r
-                       case GL_NONE:\r
-                               samplerObject->mCompareMode = *param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_COMPARE_FUNC:\r
-                       switch(*param)\r
-                       {\r
-                       case GL_LEQUAL:\r
-                       case GL_GEQUAL:\r
-                       case GL_LESS:\r
-                       case GL_GREATER:\r
-                       case GL_EQUAL:\r
-                       case GL_NOTEQUAL:\r
-                       case GL_ALWAYS:\r
-                       case GL_NEVER:\r
-                               samplerObject->mCompareFunc = *param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               default:\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
+               context->samplerParameteri(sampler, pname, *param);\r
        }\r
 }\r
 \r
@@ -3480,118 +3535,26 @@ GL_APICALL void GL_APIENTRY glSamplerParameterfv(GLuint sampler, GLenum pname, c
        TRACE("(GLuint sampler = %d, GLenum pname = 0x%X, const GLfloat *param = %p)",\r
              sampler, pname, param);\r
 \r
+       if(!ValidateSamplerObjectParameter(pname))\r
+       {\r
+               return error(GL_INVALID_ENUM);\r
+       }\r
+\r
+       if(!ValidateTexParamParameters(pname, *param))\r
+       {\r
+               return;\r
+       }\r
+\r
        es2::Context *context = es2::getContext();\r
 \r
        if(context)\r
        {\r
-               es2::Sampler *samplerObject = (sampler != 0) ? context->getSampler(sampler) : nullptr;\r
-\r
-               if(!samplerObject)\r
+               if(!context->isSampler(sampler))\r
                {\r
-                       return error(GL_INVALID_VALUE);\r
+                       return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               switch(pname)\r
-               {\r
-               case GL_TEXTURE_WRAP_S:\r
-                       switch((GLenum)*param)\r
-                       {\r
-                       case GL_CLAMP_TO_EDGE:\r
-                       case GL_MIRRORED_REPEAT:\r
-                       case GL_REPEAT:\r
-                               samplerObject->mWrapModeS = (GLenum)*param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_WRAP_T:\r
-                       switch((GLenum)*param)\r
-                       {\r
-                       case GL_CLAMP_TO_EDGE:\r
-                       case GL_MIRRORED_REPEAT:\r
-                       case GL_REPEAT:\r
-                               samplerObject->mWrapModeT = (GLenum)*param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_WRAP_R:\r
-                       switch((GLenum)*param)\r
-                       {\r
-                       case GL_CLAMP_TO_EDGE:\r
-                       case GL_MIRRORED_REPEAT:\r
-                       case GL_REPEAT:\r
-                               samplerObject->mWrapModeR = (GLenum)*param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_MIN_FILTER:\r
-                       switch((GLenum)*param)\r
-                       {\r
-                       case GL_NEAREST:\r
-                       case GL_LINEAR:\r
-                       case GL_NEAREST_MIPMAP_NEAREST:\r
-                       case GL_LINEAR_MIPMAP_NEAREST:\r
-                       case GL_NEAREST_MIPMAP_LINEAR:\r
-                       case GL_LINEAR_MIPMAP_LINEAR:\r
-                               samplerObject->mMinFilter = (GLenum)*param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_MAG_FILTER:\r
-                       switch((GLenum)*param)\r
-                       {\r
-                       case GL_NEAREST:\r
-                       case GL_LINEAR:\r
-                               samplerObject->mMagFilter = (GLenum)*param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_MIN_LOD:\r
-                       samplerObject->mMinLod = *param;\r
-                       break;\r
-               case GL_TEXTURE_MAX_LOD:\r
-                       samplerObject->mMaxLod = *param;\r
-                       break;\r
-               case GL_TEXTURE_COMPARE_MODE:\r
-                       switch((GLenum)*param)\r
-                       {\r
-                       case GL_COMPARE_REF_TO_TEXTURE:\r
-                       case GL_NONE:\r
-                               samplerObject->mCompareMode = (GLenum)*param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               case GL_TEXTURE_COMPARE_FUNC:\r
-                       switch((GLenum)*param)\r
-                       {\r
-                       case GL_LEQUAL:\r
-                       case GL_GEQUAL:\r
-                       case GL_LESS:\r
-                       case GL_GREATER:\r
-                       case GL_EQUAL:\r
-                       case GL_NOTEQUAL:\r
-                       case GL_ALWAYS:\r
-                       case GL_NEVER:\r
-                               samplerObject->mCompareFunc = (GLenum)*param;\r
-                               break;\r
-                       default:\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
-                       break;\r
-               default:\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
+               context->samplerParameterf(sampler, pname, *param);\r
        }\r
 }\r
 \r
@@ -3600,49 +3563,21 @@ GL_APICALL void GL_APIENTRY glGetSamplerParameteriv(GLuint sampler, GLenum pname
        TRACE("(GLuint sampler = %d, GLenum pname = 0x%X, GLint *params = %p)",\r
              sampler, pname, params);\r
 \r
+       if(!ValidateSamplerObjectParameter(pname))\r
+       {\r
+               return error(GL_INVALID_ENUM);\r
+       }\r
+\r
        es2::Context *context = es2::getContext();\r
 \r
        if(context)\r
        {\r
-               es2::Sampler *samplerObject = (sampler != 0) ? context->getSampler(sampler) : nullptr;\r
-\r
-               if(!samplerObject)\r
+               if(!context->isSampler(sampler))\r
                {\r
                        return error(GL_INVALID_VALUE);\r
                }\r
 \r
-               switch(pname)\r
-               {\r
-               case GL_TEXTURE_WRAP_S:\r
-                       *params = samplerObject->mWrapModeS;\r
-                       break;\r
-               case GL_TEXTURE_WRAP_T:\r
-                       *params = samplerObject->mWrapModeT;\r
-                       break;\r
-               case GL_TEXTURE_WRAP_R:\r
-                       *params = samplerObject->mWrapModeR;\r
-                       break;\r
-               case GL_TEXTURE_MIN_FILTER:\r
-                       *params = samplerObject->mMinFilter;\r
-                       break;\r
-               case GL_TEXTURE_MAG_FILTER:\r
-                       *params = samplerObject->mMagFilter;\r
-                       break;\r
-               case GL_TEXTURE_MIN_LOD:\r
-                       *params = (GLint)samplerObject->mMinLod;\r
-                       break;\r
-               case GL_TEXTURE_MAX_LOD:\r
-                       *params = (GLint)samplerObject->mMaxLod;\r
-                       break;\r
-               case GL_TEXTURE_COMPARE_MODE:\r
-                       *params = samplerObject->mCompareMode;\r
-                       break;\r
-               case GL_TEXTURE_COMPARE_FUNC:\r
-                       *params = samplerObject->mCompareFunc;\r
-                       break;\r
-               default:\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
+               *params = context->getSamplerParameteri(sampler, pname);\r
        }\r
 }\r
 \r
@@ -3651,49 +3586,21 @@ GL_APICALL void GL_APIENTRY glGetSamplerParameterfv(GLuint sampler, GLenum pname
        TRACE("(GLuint sampler = %d, GLenum pname = 0x%X, GLfloat *params = %p)",\r
              sampler, pname, params);\r
 \r
+       if(!ValidateSamplerObjectParameter(pname))\r
+       {\r
+               return error(GL_INVALID_ENUM);\r
+       }\r
+\r
        es2::Context *context = es2::getContext();\r
 \r
        if(context)\r
        {\r
-               es2::Sampler *samplerObject = (sampler != 0) ? context->getSampler(sampler) : nullptr;\r
-\r
-               if(!samplerObject)\r
+               if(!context->isSampler(sampler))\r
                {\r
                        return error(GL_INVALID_VALUE);\r
                }\r
 \r
-               switch(pname)\r
-               {\r
-               case GL_TEXTURE_WRAP_S:\r
-                       *params = (GLfloat)samplerObject->mWrapModeS;\r
-                       break;\r
-               case GL_TEXTURE_WRAP_T:\r
-                       *params = (GLfloat)samplerObject->mWrapModeT;\r
-                       break;\r
-               case GL_TEXTURE_WRAP_R:\r
-                       *params = (GLfloat)samplerObject->mWrapModeR;\r
-                       break;\r
-               case GL_TEXTURE_MIN_FILTER:\r
-                       *params = (GLfloat)samplerObject->mMinFilter;\r
-                       break;\r
-               case GL_TEXTURE_MAG_FILTER:\r
-                       *params = (GLfloat)samplerObject->mMagFilter;\r
-                       break;\r
-               case GL_TEXTURE_MIN_LOD:\r
-                       *params = samplerObject->mMinLod;\r
-                       break;\r
-               case GL_TEXTURE_MAX_LOD:\r
-                       *params = samplerObject->mMaxLod;\r
-                       break;\r
-               case GL_TEXTURE_COMPARE_MODE:\r
-                       *params = (GLfloat)samplerObject->mCompareMode;\r
-                       break;\r
-               case GL_TEXTURE_COMPARE_FUNC:\r
-                       *params = (GLfloat)samplerObject->mCompareFunc;\r
-                       break;\r
-               default:\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
+               *params = context->getSamplerParameterf(sampler, pname);\r
        }\r
 }\r
 \r