mesa: fix glGetInteger*(GL_SAMPLER_BINDING).
authorAlan Hourihane <alanh@vmware.com>
Wed, 6 Mar 2013 18:14:01 +0000 (18:14 +0000)
committerAlan Hourihane <alanh@vmware.com>
Thu, 7 Mar 2013 10:13:40 +0000 (10:13 +0000)
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>
src/mesa/main/get.c
src/mesa/main/samplerobj.c
src/mesa/main/samplerobj.h

index 2399f9c9dd3acf226fa208b7757b9b6498e9e15a..582ef3198063f7bce78a9bc4fbda583e5977357c 100644 (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 */
index 4664cc340539e788f1399443209c79c1368a875e..5cff329367bad4c1463f7e5cb554c802b8f443b1 100644 (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)
index 311425701d06d181edba3bda3796d6a4866be7f0..69e389949d84f57302de58e72d91e650a0b4a5c5 100644 (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);