mesa: fix glGetInteger*(GL_SAMPLER_BINDING).

If the sampler object has been deleted on another context, an
alternative context may reference the old sampler. So ensure the sampler
object still exists.

Note: this is a candidate for the stable branch.

Signed-off-by: Alan Hourihane <alanh@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Alan Hourihane 2013-03-06 18:14:01 +00:00
parent eddf33f711
commit 5984a911f9
3 changed files with 14 additions and 2 deletions

View file

@ -34,6 +34,7 @@
#include "state.h"
#include "texcompress.h"
#include "framebuffer.h"
#include "samplerobj.h"
/* This is a table driven implemetation of the glGet*v() functions.
* The basic idea is that most getters just look up an int somewhere
@ -827,7 +828,16 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
{
struct gl_sampler_object *samp =
ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler;
v->value_int = samp ? samp->Name : 0;
/*
* The sampler object may have been deleted on another context,
* so we try to lookup the sampler object before returning its Name.
*/
if (samp && _mesa_lookup_samplerobj(ctx, samp->Name)) {
v->value_int = samp->Name;
} else {
v->value_int = 0;
}
}
break;
/* GL_ARB_uniform_buffer_object */

View file

@ -40,7 +40,7 @@
#include "main/samplerobj.h"
static struct gl_sampler_object *
struct gl_sampler_object *
_mesa_lookup_samplerobj(struct gl_context *ctx, GLuint name)
{
if (name == 0)

View file

@ -62,6 +62,8 @@ _mesa_reference_sampler_object(struct gl_context *ctx,
_mesa_reference_sampler_object_(ctx, ptr, samp);
}
extern struct gl_sampler_object *
_mesa_lookup_samplerobj(struct gl_context *ctx, GLuint name);
extern struct gl_sampler_object *
_mesa_new_sampler_object(struct gl_context *ctx, GLuint name);