Commit 0ef53dbf by Alexis Hetu Committed by Alexis Hétu

CreateSampler should create a Sampler object by default

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