\r
bool Context::bindSampler(GLuint unit, GLuint sampler)\r
{\r
+ mResourceManager->checkSamplerAllocation(sampler);\r
+\r
Sampler* samplerObject = getSampler(sampler);\r
\r
if(sampler)\r
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
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
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
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
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
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
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