_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)
{
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;
- }
+ assert(samp->RefCount > 0);
+
+ samp->RefCount++;
+ *ptr = samp;
mtx_unlock(&samp->Mutex);
}
}
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]);
+ 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)
{
- 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;
+ return _mesa_lookup_samplerobj(ctx, sampler) != NULL;
}
void
struct gl_sampler_object *sampObj)
{
if (ctx->Texture.Unit[unit].Sampler != sampObj) {
- FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+ FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT);
}
_mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[unit].Sampler,
* 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;
_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 <first> through <first>+<count>-1 */
for (i = 0; i < count; i++) {
_mesa_reference_sampler_object(ctx,
&ctx->Texture.Unit[unit].Sampler,
NULL);
- ctx->NewState |= _NEW_TEXTURE;
+ ctx->NewState |= _NEW_TEXTURE_OBJECT;
}
}
}
static inline void
flush(struct gl_context *ctx)
{
- FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+ FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT);
}
void
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,
+ 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."
- *
- * In desktop GL, an GL_INVALID_VALUE is returned instead.
+ * "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, (_mesa_is_gles(ctx) ?
- GL_INVALID_OPERATION : GL_INVALID_VALUE),
- "glSamplerParameteri(sampler %u)", sampler);
- return;
+ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(invalid 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,
+ "glSamplerParameteri");
+ if (!sampObj)
+ return;
+
switch (pname) {
case GL_TEXTURE_WRAP_S:
res = set_sampler_wrap_s(ctx, sampObj, 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,
+ "glSamplerParameterf");
+ if (!sampObj)
return;
- }
switch (pname) {
case GL_TEXTURE_WRAP_S:
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,
+ "glSamplerParameteriv");
+ if (!sampObj)
return;
- }
switch (pname) {
case GL_TEXTURE_WRAP_S:
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,
+ "glSamplerParameterfv");
+ if (!sampObj)
return;
- }
switch (pname) {
case GL_TEXTURE_WRAP_S:
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,
+ "glSamplerParameterIiv");
+ if (!sampObj)
return;
- }
switch (pname) {
case GL_TEXTURE_WRAP_S:
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,
+ "glSamplerParameterIuiv");
+ if (!sampObj)
return;
- }
switch (pname) {
case GL_TEXTURE_WRAP_S:
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,
+ "glGetSamplerParameteriv");
+ if (!sampObj)
return;
- }
switch (pname) {
case GL_TEXTURE_WRAP_S:
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,
+ "glGetSamplerParameterfv");
+ if (!sampObj)
return;
- }
switch (pname) {
case GL_TEXTURE_WRAP_S:
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,
+ "glGetSamplerParameterIiv");
+ if (!sampObj)
return;
- }
switch (pname) {
case GL_TEXTURE_WRAP_S:
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,
+ "glGetSamplerParameterIuiv");
+ if (!sampObj)
return;
- }
switch (pname) {
case GL_TEXTURE_WRAP_S: