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; sampObj = _mesa_lookup_samplerobj(ctx, sampler); if (!sampObj) { /* 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." */ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(invalid sampler)", name); return NULL; } if (!get && sampObj->HandleAllocated) { /* The ARB_bindless_texture spec says: * * "The error INVALID_OPERATION is generated by SamplerParameter* if * <sampler> identifies a sampler object referenced by one or more * texture handles." */ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(immutable sampler)", name); return NULL; } return sampObj; }
void GLAPIENTRY _mesa_BindSampler(GLuint unit, 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; } if (sampler == 0) { /* Use the default sampler object, the one contained in the texture * object. */ sampObj = NULL; } else { /* user-defined sampler object */ sampObj = _mesa_lookup_samplerobj(ctx, sampler); if (!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); }
GLboolean GLAPIENTRY _mesa_IsSampler(GLuint sampler) { GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); return _mesa_lookup_samplerobj(ctx, sampler) != NULL; }
GLboolean GLAPIENTRY _mesa_IsSampler(GLuint sampler) { struct gl_sampler_object *sampObj; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); if (sampler == 0) return GL_FALSE; sampObj = _mesa_lookup_samplerobj(ctx, sampler); return sampObj != NULL; }
void GLAPIENTRY _mesa_DeleteSamplers(GLsizei count, const GLuint *samplers) { GET_CURRENT_CONTEXT(ctx); GLsizei i; FLUSH_VERTICES(ctx, 0); if (count < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteSamplers(count)"); return; } mtx_lock(&ctx->Shared->Mutex); for (i = 0; i < count; i++) { if (samplers[i]) { GLuint j; struct gl_sampler_object *sampObj = _mesa_lookup_samplerobj(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); _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]); /* But the object exists until its reference count goes to zero */ _mesa_reference_sampler_object(ctx, &sampObj, NULL); } } } mtx_unlock(&ctx->Shared->Mutex); }
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 { /* user-defined sampler object */ sampObj = _mesa_lookup_samplerobj(ctx, sampler); if (!no_error && !sampObj) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBindSampler(sampler)"); return; } } /* bind new sampler */ _mesa_bind_sampler(ctx, unit, sampObj); }
void GLAPIENTRY _mesa_SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *params) { 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: * * "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); return; } switch (pname) { case GL_TEXTURE_WRAP_S: res = set_sampler_wrap_s(ctx, sampObj, params[0]); break; case GL_TEXTURE_WRAP_T: res = set_sampler_wrap_t(ctx, sampObj, params[0]); break; case GL_TEXTURE_WRAP_R: res = set_sampler_wrap_r(ctx, sampObj, params[0]); break; case GL_TEXTURE_MIN_FILTER: res = set_sampler_min_filter(ctx, sampObj, params[0]); break; case GL_TEXTURE_MAG_FILTER: res = set_sampler_mag_filter(ctx, sampObj, params[0]); break; case GL_TEXTURE_MIN_LOD: res = set_sampler_min_lod(ctx, sampObj, (GLfloat) params[0]); break; case GL_TEXTURE_MAX_LOD: res = set_sampler_max_lod(ctx, sampObj, (GLfloat) params[0]); break; case GL_TEXTURE_LOD_BIAS: res = set_sampler_lod_bias(ctx, sampObj, (GLfloat) params[0]); break; case GL_TEXTURE_COMPARE_MODE: res = set_sampler_compare_mode(ctx, sampObj, params[0]); break; case GL_TEXTURE_COMPARE_FUNC: res = set_sampler_compare_func(ctx, sampObj, params[0]); break; case GL_TEXTURE_MAX_ANISOTROPY_EXT: res = set_sampler_max_anisotropy(ctx, sampObj, (GLfloat) params[0]); break; case GL_TEXTURE_CUBE_MAP_SEAMLESS: res = set_sampler_cube_map_seamless(ctx, sampObj, params[0]); break; case GL_TEXTURE_SRGB_DECODE_EXT: res = set_sampler_srgb_decode(ctx, sampObj, params[0]); break; case GL_TEXTURE_BORDER_COLOR: { GLfloat c[4]; c[0] = INT_TO_FLOAT(params[0]); c[1] = INT_TO_FLOAT(params[1]); c[2] = INT_TO_FLOAT(params[2]); c[3] = INT_TO_FLOAT(params[3]); res = set_sampler_border_colorf(ctx, sampObj, c); } break; default: res = INVALID_PNAME; } switch (res) { case GL_FALSE: /* no change */ break; case GL_TRUE: /* state change - we do nothing special at this time */ break; case INVALID_PNAME: _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameteriv(pname=%s)\n", _mesa_enum_to_string(pname)); break; case INVALID_PARAM: _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameteriv(param=%d)\n", params[0]); break; case INVALID_VALUE: _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameteriv(param=%d)\n", params[0]); break; default: ; } }
void GLAPIENTRY _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); return; } switch (pname) { case GL_TEXTURE_WRAP_S: *params = sampObj->WrapS; break; case GL_TEXTURE_WRAP_T: *params = sampObj->WrapT; break; case GL_TEXTURE_WRAP_R: *params = sampObj->WrapR; break; case GL_TEXTURE_MIN_FILTER: *params = sampObj->MinFilter; break; case GL_TEXTURE_MAG_FILTER: *params = sampObj->MagFilter; break; case GL_TEXTURE_MIN_LOD: *params = (GLuint) sampObj->MinLod; break; case GL_TEXTURE_MAX_LOD: *params = (GLuint) sampObj->MaxLod; break; case GL_TEXTURE_LOD_BIAS: *params = (GLuint) sampObj->LodBias; break; case GL_TEXTURE_COMPARE_MODE: if (!ctx->Extensions.ARB_shadow) goto invalid_pname; *params = sampObj->CompareMode; break; case GL_TEXTURE_COMPARE_FUNC: if (!ctx->Extensions.ARB_shadow) goto invalid_pname; *params = sampObj->CompareFunc; break; case GL_TEXTURE_MAX_ANISOTROPY_EXT: *params = (GLuint) sampObj->MaxAnisotropy; break; case GL_TEXTURE_BORDER_COLOR: params[0] = sampObj->BorderColor.ui[0]; params[1] = sampObj->BorderColor.ui[1]; params[2] = sampObj->BorderColor.ui[2]; params[3] = sampObj->BorderColor.ui[3]; break; case GL_TEXTURE_CUBE_MAP_SEAMLESS: if (!ctx->Extensions.AMD_seamless_cubemap_per_texture) goto invalid_pname; *params = sampObj->CubeMapSeamless; break; case GL_TEXTURE_SRGB_DECODE_EXT: if (!ctx->Extensions.EXT_texture_sRGB_decode) goto invalid_pname; *params = (GLenum) sampObj->sRGBDecode; break; default: goto invalid_pname; } return; invalid_pname: _mesa_error(ctx, GL_INVALID_ENUM, "glGetSamplerParameterIuiv(pname=%s)", _mesa_enum_to_string(pname)); }
void GLAPIENTRY _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); return; } switch (pname) { case GL_TEXTURE_WRAP_S: *params = (GLfloat) sampObj->WrapS; break; case GL_TEXTURE_WRAP_T: *params = (GLfloat) sampObj->WrapT; break; case GL_TEXTURE_WRAP_R: *params = (GLfloat) sampObj->WrapR; break; case GL_TEXTURE_MIN_FILTER: *params = (GLfloat) sampObj->MinFilter; break; case GL_TEXTURE_MAG_FILTER: *params = (GLfloat) sampObj->MagFilter; break; case GL_TEXTURE_MIN_LOD: *params = sampObj->MinLod; break; case GL_TEXTURE_MAX_LOD: *params = sampObj->MaxLod; break; case GL_TEXTURE_LOD_BIAS: *params = sampObj->LodBias; break; case GL_TEXTURE_COMPARE_MODE: if (!ctx->Extensions.ARB_shadow) goto invalid_pname; *params = (GLfloat) sampObj->CompareMode; break; case GL_TEXTURE_COMPARE_FUNC: if (!ctx->Extensions.ARB_shadow) goto invalid_pname; *params = (GLfloat) sampObj->CompareFunc; break; case GL_TEXTURE_MAX_ANISOTROPY_EXT: *params = sampObj->MaxAnisotropy; break; case GL_TEXTURE_BORDER_COLOR: params[0] = sampObj->BorderColor.f[0]; params[1] = sampObj->BorderColor.f[1]; params[2] = sampObj->BorderColor.f[2]; params[3] = sampObj->BorderColor.f[3]; break; case GL_TEXTURE_CUBE_MAP_SEAMLESS: if (!ctx->Extensions.AMD_seamless_cubemap_per_texture) goto invalid_pname; *params = (GLfloat) sampObj->CubeMapSeamless; break; case GL_TEXTURE_SRGB_DECODE_EXT: if (!ctx->Extensions.EXT_texture_sRGB_decode) goto invalid_pname; *params = (GLfloat) sampObj->sRGBDecode; break; default: goto invalid_pname; } return; invalid_pname: _mesa_error(ctx, GL_INVALID_ENUM, "glGetSamplerParameterfv(pname=%s)", _mesa_enum_to_string(pname)); }
void GLAPIENTRY _mesa_SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *params) { struct gl_sampler_object *sampObj; GLuint res; GET_CURRENT_CONTEXT(ctx); sampObj = _mesa_lookup_samplerobj(ctx, sampler); if (!sampObj) { _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterIuiv(sampler %u)", sampler); return; } switch (pname) { case GL_TEXTURE_WRAP_S: res = set_sampler_wrap_s(ctx, sampObj, params[0]); break; case GL_TEXTURE_WRAP_T: res = set_sampler_wrap_t(ctx, sampObj, params[0]); break; case GL_TEXTURE_WRAP_R: res = set_sampler_wrap_r(ctx, sampObj, params[0]); break; case GL_TEXTURE_MIN_FILTER: res = set_sampler_min_filter(ctx, sampObj, params[0]); break; case GL_TEXTURE_MAG_FILTER: res = set_sampler_mag_filter(ctx, sampObj, params[0]); break; case GL_TEXTURE_MIN_LOD: res = set_sampler_min_lod(ctx, sampObj, (GLfloat) params[0]); break; case GL_TEXTURE_MAX_LOD: res = set_sampler_max_lod(ctx, sampObj, (GLfloat) params[0]); break; case GL_TEXTURE_LOD_BIAS: res = set_sampler_lod_bias(ctx, sampObj, (GLfloat) params[0]); break; case GL_TEXTURE_COMPARE_MODE: res = set_sampler_compare_mode(ctx, sampObj, params[0]); break; case GL_TEXTURE_COMPARE_FUNC: res = set_sampler_compare_func(ctx, sampObj, params[0]); break; case GL_TEXTURE_MAX_ANISOTROPY_EXT: res = set_sampler_max_anisotropy(ctx, sampObj, (GLfloat) params[0]); break; case GL_TEXTURE_CUBE_MAP_SEAMLESS: res = set_sampler_cube_map_seamless(ctx, sampObj, params[0]); break; case GL_TEXTURE_SRGB_DECODE_EXT: res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) params[0]); break; case GL_TEXTURE_BORDER_COLOR: res = set_sampler_border_colorui(ctx, sampObj, params); break; default: res = INVALID_PNAME; } switch (res) { case GL_FALSE: /* no change */ break; case GL_TRUE: /* state change - we do nothing special at this time */ break; case INVALID_PNAME: _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterIuiv(pname=%s)\n", _mesa_enum_to_string(pname)); break; case INVALID_PARAM: _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterIuiv(param=%u)\n", params[0]); break; case INVALID_VALUE: _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterIuiv(param=%u)\n", params[0]); break; default: ; } }