X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fsamplerobj.c;h=fe1c0125341b804e5217928eee83c47f3c6b3bc7;hb=b85775900d084e3d27f269c3bd336b9aa356b98d;hp=62078f8ad053091f7ff48c2a96c096dc2358006c;hpb=4cf5c85ec70abb736e9c135e77c221b177d85d12;p=mesa.git diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c index 62078f8ad05..fe1c0125341 100644 --- a/src/mesa/main/samplerobj.c +++ b/src/mesa/main/samplerobj.c @@ -32,12 +32,13 @@ #include "main/glheader.h" #include "main/context.h" -#include "main/dispatch.h" #include "main/enums.h" #include "main/hash.h" #include "main/macros.h" #include "main/mtypes.h" #include "main/samplerobj.h" +#include "main/texturebindless.h" +#include "util/u_memory.h" struct gl_sampler_object * @@ -50,21 +51,6 @@ _mesa_lookup_samplerobj(struct gl_context *ctx, GLuint name) _mesa_HashLookup(ctx->Shared->SamplerObjects, name); } - -static inline void -begin_samplerobj_lookups(struct gl_context *ctx) -{ - _mesa_HashLockMutex(ctx->Shared->SamplerObjects); -} - - -static inline void -end_samplerobj_lookups(struct gl_context *ctx) -{ - _mesa_HashUnlockMutex(ctx->Shared->SamplerObjects); -} - - static inline struct gl_sampler_object * lookup_samplerobj_locked(struct gl_context *ctx, GLuint name) { @@ -76,7 +62,8 @@ static void delete_sampler_object(struct gl_context *ctx, struct gl_sampler_object *sampObj) { - mtx_destroy(&sampObj->Mutex); + _mesa_delete_sampler_handles(ctx, sampObj); + simple_mtx_destroy(&sampObj->Mutex); free(sampObj->Label); free(sampObj); } @@ -96,11 +83,11 @@ _mesa_reference_sampler_object_(struct gl_context *ctx, GLboolean deleteFlag = GL_FALSE; struct gl_sampler_object *oldSamp = *ptr; - mtx_lock(&oldSamp->Mutex); + simple_mtx_lock(&oldSamp->Mutex); assert(oldSamp->RefCount > 0); oldSamp->RefCount--; deleteFlag = (oldSamp->RefCount == 0); - mtx_unlock(&oldSamp->Mutex); + simple_mtx_unlock(&oldSamp->Mutex); if (deleteFlag) delete_sampler_object(ctx, oldSamp); @@ -111,18 +98,12 @@ _mesa_reference_sampler_object_(struct gl_context *ctx, if (samp) { /* reference new sampler */ - mtx_lock(&samp->Mutex); - if (samp->RefCount == 0) { - /* this sampler's being deleted (look just above) */ - /* Not sure this can every really happen. Warn if it does. */ - _mesa_problem(NULL, "referencing deleted sampler object"); - *ptr = NULL; - } - else { - samp->RefCount++; - *ptr = samp; - } - mtx_unlock(&samp->Mutex); + simple_mtx_lock(&samp->Mutex); + assert(samp->RefCount > 0); + + samp->RefCount++; + *ptr = samp; + simple_mtx_unlock(&samp->Mutex); } } @@ -133,7 +114,7 @@ _mesa_reference_sampler_object_(struct gl_context *ctx, static void _mesa_init_sampler_object(struct gl_sampler_object *sampObj, GLuint name) { - mtx_init(&sampObj->Mutex, mtx_plain); + simple_mtx_init(&sampObj->Mutex, mtx_plain); sampObj->Name = name; sampObj->RefCount = 1; sampObj->WrapS = GL_REPEAT; @@ -153,6 +134,10 @@ _mesa_init_sampler_object(struct gl_sampler_object *sampObj, GLuint name) sampObj->CompareFunc = GL_LEQUAL; sampObj->sRGBDecode = GL_DECODE_EXT; sampObj->CubeMapSeamless = GL_FALSE; + sampObj->HandleAllocated = GL_FALSE; + + /* GL_ARB_bindless_texture */ + _mesa_init_sampler_handles(sampObj); } /** @@ -175,6 +160,37 @@ create_samplers(struct gl_context *ctx, GLsizei count, GLuint *samplers, GLuint first; GLint i; + if (!samplers) + return; + + _mesa_HashLockMutex(ctx->Shared->SamplerObjects); + + first = _mesa_HashFindFreeKeyBlock(ctx->Shared->SamplerObjects, count); + + /* Insert the ID and pointer to new sampler object into hash table */ + for (i = 0; i < count; i++) { + struct gl_sampler_object *sampObj; + GLuint name = first + i; + + sampObj = ctx->Driver.NewSamplerObject(ctx, name); + if (!sampObj) { + _mesa_HashUnlockMutex(ctx->Shared->SamplerObjects); + _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller); + return; + } + + _mesa_HashInsertLocked(ctx->Shared->SamplerObjects, name, sampObj); + samplers[i] = name; + } + + _mesa_HashUnlockMutex(ctx->Shared->SamplerObjects); +} + +static void +create_samplers_err(struct gl_context *ctx, GLsizei count, GLuint *samplers, + const char *caller) +{ + if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "%s(%d)\n", caller, count); @@ -183,150 +199,166 @@ create_samplers(struct gl_context *ctx, GLsizei count, GLuint *samplers, return; } - if (!samplers) - return; - - first = _mesa_HashFindFreeKeyBlock(ctx->Shared->SamplerObjects, count); + create_samplers(ctx, count, samplers, caller); +} - /* Insert the ID and pointer to new sampler object into hash table */ - for (i = 0; i < count; i++) { - struct gl_sampler_object *sampObj = - ctx->Driver.NewSamplerObject(ctx, first + i); - _mesa_HashInsert(ctx->Shared->SamplerObjects, first + i, sampObj); - samplers[i] = first + i; - } +void GLAPIENTRY +_mesa_GenSamplers_no_error(GLsizei count, GLuint *samplers) +{ + GET_CURRENT_CONTEXT(ctx); + create_samplers(ctx, count, samplers, "glGenSamplers"); } void GLAPIENTRY _mesa_GenSamplers(GLsizei count, GLuint *samplers) { GET_CURRENT_CONTEXT(ctx); - create_samplers(ctx, count, samplers, "glGenSamplers"); + create_samplers_err(ctx, count, samplers, "glGenSamplers"); } void GLAPIENTRY -_mesa_CreateSamplers(GLsizei count, GLuint *samplers) +_mesa_CreateSamplers_no_error(GLsizei count, GLuint *samplers) { GET_CURRENT_CONTEXT(ctx); create_samplers(ctx, count, samplers, "glCreateSamplers"); } - void GLAPIENTRY -_mesa_DeleteSamplers(GLsizei count, const GLuint *samplers) +_mesa_CreateSamplers(GLsizei count, GLuint *samplers) { GET_CURRENT_CONTEXT(ctx); - GLsizei i; + create_samplers_err(ctx, count, samplers, "glCreateSamplers"); +} - FLUSH_VERTICES(ctx, 0); - if (count < 0) { - _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteSamplers(count)"); - return; - } +static void +delete_samplers(struct gl_context *ctx, GLsizei count, const GLuint *samplers) +{ + FLUSH_VERTICES(ctx, 0); - mtx_lock(&ctx->Shared->Mutex); + _mesa_HashLockMutex(ctx->Shared->SamplerObjects); - for (i = 0; i < count; i++) { + for (GLsizei i = 0; i < count; i++) { if (samplers[i]) { GLuint j; struct gl_sampler_object *sampObj = - _mesa_lookup_samplerobj(ctx, samplers[i]); - + lookup_samplerobj_locked(ctx, samplers[i]); + if (sampObj) { /* If the sampler is currently bound, unbind it. */ for (j = 0; j < ctx->Const.MaxCombinedTextureImageUnits; j++) { if (ctx->Texture.Unit[j].Sampler == sampObj) { - FLUSH_VERTICES(ctx, _NEW_TEXTURE); + FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT); _mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[j].Sampler, NULL); } } /* The ID is immediately freed for re-use */ - _mesa_HashRemove(ctx->Shared->SamplerObjects, samplers[i]); + _mesa_HashRemoveLocked(ctx->Shared->SamplerObjects, samplers[i]); /* But the object exists until its reference count goes to zero */ _mesa_reference_sampler_object(ctx, &sampObj, NULL); } } } - mtx_unlock(&ctx->Shared->Mutex); + _mesa_HashUnlockMutex(ctx->Shared->SamplerObjects); } -GLboolean GLAPIENTRY -_mesa_IsSampler(GLuint sampler) +void GLAPIENTRY +_mesa_DeleteSamplers_no_error(GLsizei count, const GLuint *samplers) { - struct gl_sampler_object *sampObj; GET_CURRENT_CONTEXT(ctx); + delete_samplers(ctx, count, samplers); +} - ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); - if (sampler == 0) - return GL_FALSE; +void GLAPIENTRY +_mesa_DeleteSamplers(GLsizei count, const GLuint *samplers) +{ + GET_CURRENT_CONTEXT(ctx); - sampObj = _mesa_lookup_samplerobj(ctx, sampler); + if (count < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteSamplers(count)"); + return; + } - return sampObj != NULL; + delete_samplers(ctx, count, samplers); } -void GLAPIENTRY -_mesa_BindSampler(GLuint unit, GLuint sampler) +GLboolean GLAPIENTRY +_mesa_IsSampler(GLuint sampler) { - struct gl_sampler_object *sampObj; GET_CURRENT_CONTEXT(ctx); - if (unit >= ctx->Const.MaxCombinedTextureImageUnits) { - _mesa_error(ctx, GL_INVALID_VALUE, "glBindSampler(unit %u)", unit); - return; + ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); + + return _mesa_lookup_samplerobj(ctx, sampler) != NULL; +} + +void +_mesa_bind_sampler(struct gl_context *ctx, GLuint unit, + struct gl_sampler_object *sampObj) +{ + if (ctx->Texture.Unit[unit].Sampler != sampObj) { + FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT); } + _mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[unit].Sampler, + sampObj); +} + +static ALWAYS_INLINE void +bind_sampler(struct gl_context *ctx, GLuint unit, GLuint sampler, bool no_error) +{ + struct gl_sampler_object *sampObj; + if (sampler == 0) { /* Use the default sampler object, the one contained in the texture * object. */ sampObj = NULL; - } - else { + } else { /* user-defined sampler object */ sampObj = _mesa_lookup_samplerobj(ctx, sampler); - if (!sampObj) { + if (!no_error && !sampObj) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBindSampler(sampler)"); return; } } - - if (ctx->Texture.Unit[unit].Sampler != sampObj) { - FLUSH_VERTICES(ctx, _NEW_TEXTURE); - } /* bind new sampler */ - _mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[unit].Sampler, - sampObj); + _mesa_bind_sampler(ctx, unit, sampObj); } +void GLAPIENTRY +_mesa_BindSampler_no_error(GLuint unit, GLuint sampler) +{ + GET_CURRENT_CONTEXT(ctx); + bind_sampler(ctx, unit, sampler, true); +} void GLAPIENTRY -_mesa_BindSamplers(GLuint first, GLsizei count, const GLuint *samplers) +_mesa_BindSampler(GLuint unit, GLuint sampler) { GET_CURRENT_CONTEXT(ctx); - GLint i; - /* The ARB_multi_bind spec says: - * - * "An INVALID_OPERATION error is generated if + is - * greater than the number of texture image units supported by - * the implementation." - */ - if (first + count > ctx->Const.MaxCombinedTextureImageUnits) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glBindSamplers(first=%u + count=%d > the value of " - "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS=%u)", - first, count, ctx->Const.MaxCombinedTextureImageUnits); + if (unit >= ctx->Const.MaxCombinedTextureImageUnits) { + _mesa_error(ctx, GL_INVALID_VALUE, "glBindSampler(unit %u)", unit); return; } + bind_sampler(ctx, unit, sampler, false); +} + + +static ALWAYS_INLINE void +bind_samplers(struct gl_context *ctx, GLuint first, GLsizei count, + const GLuint *samplers, bool no_error) +{ + GLsizei i; + FLUSH_VERTICES(ctx, 0); if (samplers) { @@ -349,7 +381,7 @@ _mesa_BindSamplers(GLuint first, GLsizei count, const GLuint *samplers) * their parameters are valid and no other error occurs." */ - begin_samplerobj_lookups(ctx); + _mesa_HashLockMutex(ctx->Shared->SamplerObjects); for (i = 0; i < count; i++) { const GLuint unit = first + i; @@ -369,7 +401,7 @@ _mesa_BindSamplers(GLuint first, GLsizei count, const GLuint *samplers) * in is not zero or the name of an existing * sampler object (per binding)." */ - if (!sampObj) { + if (!no_error && !sampObj) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBindSamplers(samplers[%d]=%u is not zero or " "the name of an existing sampler object)", @@ -385,11 +417,11 @@ _mesa_BindSamplers(GLuint first, GLsizei count, const GLuint *samplers) _mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[unit].Sampler, sampObj); - ctx->NewState |= _NEW_TEXTURE; + ctx->NewState |= _NEW_TEXTURE_OBJECT; } } - end_samplerobj_lookups(ctx); + _mesa_HashUnlockMutex(ctx->Shared->SamplerObjects); } else { /* Unbind all samplers in the range through +-1 */ for (i = 0; i < count; i++) { @@ -399,18 +431,49 @@ _mesa_BindSamplers(GLuint first, GLsizei count, const GLuint *samplers) _mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[unit].Sampler, NULL); - ctx->NewState |= _NEW_TEXTURE; + ctx->NewState |= _NEW_TEXTURE_OBJECT; } } } } +void GLAPIENTRY +_mesa_BindSamplers_no_error(GLuint first, GLsizei count, const GLuint *samplers) +{ + GET_CURRENT_CONTEXT(ctx); + bind_samplers(ctx, first, count, samplers, true); +} + + +void GLAPIENTRY +_mesa_BindSamplers(GLuint first, GLsizei count, const GLuint *samplers) +{ + GET_CURRENT_CONTEXT(ctx); + + /* The ARB_multi_bind spec says: + * + * "An INVALID_OPERATION error is generated if + is + * greater than the number of texture image units supported by + * the implementation." + */ + if (first + count > ctx->Const.MaxCombinedTextureImageUnits) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glBindSamplers(first=%u + count=%d > the value of " + "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS=%u)", + first, count, ctx->Const.MaxCombinedTextureImageUnits); + return; + } + + bind_samplers(ctx, first, count, samplers, false); +} + + /** * Check if a coordinate wrap mode is legal. * \return GL_TRUE if legal, GL_FALSE otherwise */ -static GLboolean +static GLboolean validate_texture_wrap_mode(struct gl_context *ctx, GLenum wrap) { const struct gl_extensions * const e = &ctx->Extensions; @@ -441,7 +504,7 @@ validate_texture_wrap_mode(struct gl_context *ctx, GLenum wrap) static inline void flush(struct gl_context *ctx) { - FLUSH_VERTICES(ctx, _NEW_TEXTURE); + FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT); } void @@ -770,36 +833,70 @@ set_sampler_srgb_decode(struct gl_context *ctx, if (samp->sRGBDecode == param) return GL_FALSE; + /* The EXT_texture_sRGB_decode spec says: + * + * "INVALID_ENUM is generated if the parameter of + * TexParameter[i,f,Ii,Iui][v][EXT], + * MultiTexParameter[i,f,Ii,Iui][v]EXT, + * TextureParameter[i,f,Ii,Iui][v]EXT, SamplerParameter[i,f,Ii,Iui][v] + * is TEXTURE_SRGB_DECODE_EXT when the parameter is not one of + * DECODE_EXT or SKIP_DECODE_EXT. + * + * Returning INVALID_PARAM makes that happen. + */ if (param != GL_DECODE_EXT && param != GL_SKIP_DECODE_EXT) - return INVALID_VALUE; + return INVALID_PARAM; flush(ctx); samp->sRGBDecode = param; return GL_TRUE; } -void GLAPIENTRY -_mesa_SamplerParameteri(GLuint sampler, GLenum pname, GLint param) +static struct gl_sampler_object * +sampler_parameter_error_check(struct gl_context *ctx, GLuint sampler, + bool get, const char *name) { struct gl_sampler_object *sampObj; - GLuint res; - GET_CURRENT_CONTEXT(ctx); sampObj = _mesa_lookup_samplerobj(ctx, sampler); if (!sampObj) { - /* '3.8.2 Sampler Objects' section of the GL-ES 3.0 specification states: + /* OpenGL 4.5 spec, section "8.2 Sampler Objects", page 176 of the PDF + * states: * - * "An INVALID_OPERATION error is generated if sampler is not the name - * of a sampler object previously returned from a call to GenSamplers." + * "An INVALID_OPERATION error is generated if sampler is not the name + * of a sampler object previously returned from a call to + * GenSamplers." + */ + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(invalid sampler)", name); + return NULL; + } + + if (!get && sampObj->HandleAllocated) { + /* The ARB_bindless_texture spec says: * - * In desktop GL, an GL_INVALID_VALUE is returned instead. + * "The error INVALID_OPERATION is generated by SamplerParameter* if + * identifies a sampler object referenced by one or more + * texture handles." */ - _mesa_error(ctx, (_mesa_is_gles(ctx) ? - GL_INVALID_OPERATION : GL_INVALID_VALUE), - "glSamplerParameteri(sampler %u)", sampler); - return; + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(immutable sampler)", name); + return NULL; } + return sampObj; +} + +void GLAPIENTRY +_mesa_SamplerParameteri(GLuint sampler, GLenum pname, GLint param) +{ + struct gl_sampler_object *sampObj; + GLuint res; + GET_CURRENT_CONTEXT(ctx); + + sampObj = sampler_parameter_error_check(ctx, sampler, false, + "glSamplerParameteri"); + if (!sampObj) + return; + switch (pname) { case GL_TEXTURE_WRAP_S: res = set_sampler_wrap_s(ctx, sampObj, param); @@ -878,20 +975,10 @@ _mesa_SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) GLuint res; GET_CURRENT_CONTEXT(ctx); - sampObj = _mesa_lookup_samplerobj(ctx, sampler); - if (!sampObj) { - /* '3.8.2 Sampler Objects' section of the GL-ES 3.0 specification states: - * - * "An INVALID_OPERATION error is generated if sampler is not the name - * of a sampler object previously returned from a call to GenSamplers." - * - * In desktop GL, an GL_INVALID_VALUE is returned instead. - */ - _mesa_error(ctx, (_mesa_is_gles(ctx) ? - GL_INVALID_OPERATION : GL_INVALID_VALUE), - "glSamplerParameterf(sampler %u)", sampler); + sampObj = sampler_parameter_error_check(ctx, sampler, false, + "glSamplerParameterf"); + if (!sampObj) return; - } switch (pname) { case GL_TEXTURE_WRAP_S: @@ -970,20 +1057,10 @@ _mesa_SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *params) GLuint res; GET_CURRENT_CONTEXT(ctx); - sampObj = _mesa_lookup_samplerobj(ctx, sampler); - if (!sampObj) { - /* '3.8.2 Sampler Objects' section of the GL-ES 3.0 specification states: - * - * "An INVALID_OPERATION error is generated if sampler is not the name - * of a sampler object previously returned from a call to GenSamplers." - * - * In desktop GL, an GL_INVALID_VALUE is returned instead. - */ - _mesa_error(ctx, (_mesa_is_gles(ctx) ? - GL_INVALID_OPERATION : GL_INVALID_VALUE), - "glSamplerParameteriv(sampler %u)", sampler); + sampObj = sampler_parameter_error_check(ctx, sampler, false, + "glSamplerParameteriv"); + if (!sampObj) return; - } switch (pname) { case GL_TEXTURE_WRAP_S: @@ -1070,20 +1147,10 @@ _mesa_SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *params) GLuint res; GET_CURRENT_CONTEXT(ctx); - sampObj = _mesa_lookup_samplerobj(ctx, sampler); - if (!sampObj) { - /* '3.8.2 Sampler Objects' section of the GL-ES 3.0 specification states: - * - * "An INVALID_OPERATION error is generated if sampler is not the name - * of a sampler object previously returned from a call to GenSamplers." - * - * In desktop GL, an GL_INVALID_VALUE is returned instead. - */ - _mesa_error(ctx, (_mesa_is_gles(ctx) ? - GL_INVALID_OPERATION : GL_INVALID_VALUE), - "glSamplerParameterfv(sampler %u)", sampler); + sampObj = sampler_parameter_error_check(ctx, sampler, false, + "glSamplerParameterfv"); + if (!sampObj) return; - } switch (pname) { case GL_TEXTURE_WRAP_S: @@ -1163,12 +1230,10 @@ _mesa_SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *params) GLuint res; GET_CURRENT_CONTEXT(ctx); - sampObj = _mesa_lookup_samplerobj(ctx, sampler); - if (!sampObj) { - _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterIiv(sampler %u)", - sampler); + sampObj = sampler_parameter_error_check(ctx, sampler, false, + "glSamplerParameterIiv"); + if (!sampObj) return; - } switch (pname) { case GL_TEXTURE_WRAP_S: @@ -1249,12 +1314,10 @@ _mesa_SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *params) GLuint res; GET_CURRENT_CONTEXT(ctx); - sampObj = _mesa_lookup_samplerobj(ctx, sampler); - if (!sampObj) { - _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterIuiv(sampler %u)", - sampler); + sampObj = sampler_parameter_error_check(ctx, sampler, false, + "glSamplerParameterIuiv"); + if (!sampObj) return; - } switch (pname) { case GL_TEXTURE_WRAP_S: @@ -1334,20 +1397,10 @@ _mesa_GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params) struct gl_sampler_object *sampObj; GET_CURRENT_CONTEXT(ctx); - sampObj = _mesa_lookup_samplerobj(ctx, sampler); - if (!sampObj) { - /* '3.8.2 Sampler Objects' section of the GL-ES 3.0 specification states: - * - * "An INVALID_OPERATION error is generated if sampler is not the name - * of a sampler object previously returned from a call to GenSamplers." - * - * In desktop GL, an GL_INVALID_VALUE is returned instead. - */ - _mesa_error(ctx, (_mesa_is_gles(ctx) ? - GL_INVALID_OPERATION : GL_INVALID_VALUE), - "glGetSamplerParameteriv(sampler %u)", sampler); + sampObj = sampler_parameter_error_check(ctx, sampler, true, + "glGetSamplerParameteriv"); + if (!sampObj) return; - } switch (pname) { case GL_TEXTURE_WRAP_S: @@ -1369,19 +1422,19 @@ _mesa_GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params) /* GL spec 'Data Conversions' section specifies that floating-point * value in integer Get function is rounded to nearest integer */ - *params = IROUND(sampObj->MinLod); + *params = lroundf(sampObj->MinLod); break; case GL_TEXTURE_MAX_LOD: /* GL spec 'Data Conversions' section specifies that floating-point * value in integer Get function is rounded to nearest integer */ - *params = IROUND(sampObj->MaxLod); + *params = lroundf(sampObj->MaxLod); break; case GL_TEXTURE_LOD_BIAS: /* GL spec 'Data Conversions' section specifies that floating-point * value in integer Get function is rounded to nearest integer */ - *params = IROUND(sampObj->LodBias); + *params = lroundf(sampObj->LodBias); break; case GL_TEXTURE_COMPARE_MODE: *params = sampObj->CompareMode; @@ -1393,7 +1446,7 @@ _mesa_GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params) /* GL spec 'Data Conversions' section specifies that floating-point * value in integer Get function is rounded to nearest integer */ - *params = IROUND(sampObj->MaxAnisotropy); + *params = lroundf(sampObj->MaxAnisotropy); break; case GL_TEXTURE_BORDER_COLOR: params[0] = FLOAT_TO_INT(sampObj->BorderColor.f[0]); @@ -1428,20 +1481,10 @@ _mesa_GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params) struct gl_sampler_object *sampObj; GET_CURRENT_CONTEXT(ctx); - sampObj = _mesa_lookup_samplerobj(ctx, sampler); - if (!sampObj) { - /* '3.8.2 Sampler Objects' section of the GL-ES 3.0 specification states: - * - * "An INVALID_OPERATION error is generated if sampler is not the name - * of a sampler object previously returned from a call to GenSamplers." - * - * In desktop GL, an GL_INVALID_VALUE is returned instead. - */ - _mesa_error(ctx, (_mesa_is_gles(ctx) ? - GL_INVALID_OPERATION : GL_INVALID_VALUE), - "glGetSamplerParameterfv(sampler %u)", sampler); + sampObj = sampler_parameter_error_check(ctx, sampler, true, + "glGetSamplerParameterfv"); + if (!sampObj) return; - } switch (pname) { case GL_TEXTURE_WRAP_S: @@ -1510,13 +1553,10 @@ _mesa_GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params) struct gl_sampler_object *sampObj; GET_CURRENT_CONTEXT(ctx); - sampObj = _mesa_lookup_samplerobj(ctx, sampler); - if (!sampObj) { - _mesa_error(ctx, GL_INVALID_VALUE, - "glGetSamplerParameterIiv(sampler %u)", - sampler); + sampObj = sampler_parameter_error_check(ctx, sampler, true, + "glGetSamplerParameterIiv"); + if (!sampObj) return; - } switch (pname) { case GL_TEXTURE_WRAP_S: @@ -1585,13 +1625,10 @@ _mesa_GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params) struct gl_sampler_object *sampObj; GET_CURRENT_CONTEXT(ctx); - sampObj = _mesa_lookup_samplerobj(ctx, sampler); - if (!sampObj) { - _mesa_error(ctx, GL_INVALID_VALUE, - "glGetSamplerParameterIuiv(sampler %u)", - sampler); + sampObj = sampler_parameter_error_check(ctx, sampler, true, + "glGetSamplerParameterIuiv"); + if (!sampObj) return; - } switch (pname) { case GL_TEXTURE_WRAP_S: