_mesa_HashLookup(ctx->Shared->SamplerObjects, name);
}
+static struct gl_sampler_object *
+_mesa_lookup_samplerobj_locked(struct gl_context *ctx, GLuint name)
+{
+ if (name == 0)
+ return NULL;
+ else
+ return (struct gl_sampler_object *)
+ _mesa_HashLookupLocked(ctx->Shared->SamplerObjects, name);
+}
static inline void
begin_samplerobj_lookups(struct gl_context *ctx)
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 =
ctx->Driver.NewSamplerObject(ctx, first + i);
- _mesa_HashInsert(ctx->Shared->SamplerObjects, first + i, sampObj);
+ _mesa_HashInsertLocked(ctx->Shared->SamplerObjects, first + i, sampObj);
samplers[i] = first + i;
}
+
+ _mesa_HashUnlockMutex(ctx->Shared->SamplerObjects);
}
void GLAPIENTRY
return;
}
- mtx_lock(&ctx->Shared->Mutex);
+ _mesa_HashLockMutex(ctx->Shared->SamplerObjects);
for (i = 0; i < count; i++) {
if (samplers[i]) {
GLuint j;
struct gl_sampler_object *sampObj =
- _mesa_lookup_samplerobj(ctx, samplers[i]);
+ _mesa_lookup_samplerobj_locked(ctx, samplers[i]);
if (sampObj) {
/* If the sampler is currently bound, unbind it. */
}
/* 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);
}
return sampObj != 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);
+ }
+
+ _mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[unit].Sampler,
+ sampObj);
+}
void GLAPIENTRY
_mesa_BindSampler(GLuint unit, GLuint sampler)
}
}
- 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);
}
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
}
+void
+_mesa_set_sampler_wrap(struct gl_context *ctx, struct gl_sampler_object *samp,
+ GLenum s, GLenum t, GLenum r)
+{
+ assert(validate_texture_wrap_mode(ctx, s));
+ assert(validate_texture_wrap_mode(ctx, t));
+ assert(validate_texture_wrap_mode(ctx, r));
+
+ if (samp->WrapS == s && samp->WrapT == t && samp->WrapR == r)
+ return;
+
+ flush(ctx);
+ samp->WrapS = s;
+ samp->WrapT = t;
+ samp->WrapR = r;
+}
#define INVALID_PARAM 0x100
#define INVALID_PNAME 0x101
return INVALID_PARAM;
}
+void
+_mesa_set_sampler_filters(struct gl_context *ctx,
+ struct gl_sampler_object *samp,
+ GLenum min_filter, GLenum mag_filter)
+{
+ assert(min_filter == GL_NEAREST ||
+ min_filter == GL_LINEAR ||
+ min_filter == GL_NEAREST_MIPMAP_NEAREST ||
+ min_filter == GL_LINEAR_MIPMAP_NEAREST ||
+ min_filter == GL_NEAREST_MIPMAP_LINEAR ||
+ min_filter == GL_LINEAR_MIPMAP_LINEAR);
+ assert(mag_filter == GL_NEAREST ||
+ mag_filter == GL_LINEAR);
+
+ if (samp->MinFilter == min_filter && samp->MagFilter == mag_filter)
+ return;
+
+ flush(ctx);
+ samp->MinFilter = min_filter;
+ samp->MagFilter = mag_filter;
+}
static GLuint
set_sampler_min_filter(struct gl_context *ctx, struct gl_sampler_object *samp,
return GL_TRUE;
}
+void
+_mesa_set_sampler_srgb_decode(struct gl_context *ctx,
+ struct gl_sampler_object *samp, GLenum param)
+{
+ assert(param == GL_DECODE_EXT || param == GL_SKIP_DECODE_EXT);
+
+ flush(ctx);
+ samp->sRGBDecode = param;
+}
+
static GLuint
set_sampler_srgb_decode(struct gl_context *ctx,
struct gl_sampler_object *samp, GLenum param)
* "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),
+ _mesa_error(ctx, GL_INVALID_OPERATION,
"glSamplerParameteri(sampler %u)", sampler);
return;
}
* "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),
+ _mesa_error(ctx, GL_INVALID_OPERATION,
"glSamplerParameterf(sampler %u)", sampler);
return;
}
*
* "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),
+ _mesa_error(ctx, GL_INVALID_OPERATION,
"glSamplerParameteriv(sampler %u)", sampler);
return;
}
* "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),
+ _mesa_error(ctx, GL_INVALID_OPERATION,
"glSamplerParameterfv(sampler %u)", sampler);
return;
}
sampObj = _mesa_lookup_samplerobj(ctx, sampler);
if (!sampObj) {
- _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterIiv(sampler %u)",
- sampler);
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glSamplerParameterIiv(sampler %u)", sampler);
return;
}
sampObj = _mesa_lookup_samplerobj(ctx, sampler);
if (!sampObj) {
- _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterIuiv(sampler %u)",
- sampler);
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glSamplerParameterIuiv(sampler %u)", sampler);
return;
}
* "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),
+ _mesa_error(ctx, GL_INVALID_OPERATION,
"glGetSamplerParameteriv(sampler %u)", sampler);
return;
}
* "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),
+ _mesa_error(ctx, GL_INVALID_OPERATION,
"glGetSamplerParameterfv(sampler %u)", sampler);
return;
}
sampObj = _mesa_lookup_samplerobj(ctx, sampler);
if (!sampObj) {
- _mesa_error(ctx, GL_INVALID_VALUE,
+ _mesa_error(ctx, GL_INVALID_OPERATION,
"glGetSamplerParameterIiv(sampler %u)",
sampler);
return;
sampObj = _mesa_lookup_samplerobj(ctx, sampler);
if (!sampObj) {
- _mesa_error(ctx, GL_INVALID_VALUE,
+ _mesa_error(ctx, GL_INVALID_OPERATION,
"glGetSamplerParameterIuiv(sampler %u)",
sampler);
return;