st/mesa: fix sampler view counting
authorBrian Paul <brianp@vmware.com>
Fri, 17 Aug 2012 14:16:23 +0000 (08:16 -0600)
committerBrian Paul <brianp@vmware.com>
Sat, 18 Aug 2012 13:40:10 +0000 (07:40 -0600)
In the past, when we called pipe::set_sampler_views(n) the drivers set
samplers [n..MAX] to NULL.  We no longer do that.  The state tracker
code was already trying to set unused sampler views to NULL to cover
that case, but the logic was broken and unnoticed until now.  This patch
fixes it.

Strictly speaking, this patch shouldn't be necessary.  Drivers should simply
ignore unused samplers and sampler views.  But some drivers like llvmpipe (and
others?) count those things and they figure into state validation.  That could
be fixed in the future.

Fixes http://bugs.freedesktop.org/show_bug.cgi?id=53617

Reviewed-by: Marek Olšák <maraeo@gmail.com>
src/mesa/state_tracker/st_atom_texture.c

index 6e2efd960ddd1f6252685c79d87aeccebab4dfc4..df05e83c2d48fc87624bf7f21c24e50c9d168fa2 100644 (file)
@@ -265,7 +265,7 @@ update_textures(struct st_context *st,
 {
    const GLuint old_max = *num_textures;
    GLbitfield samplers_used = prog->SamplersUsed;
-   GLuint unit;
+   GLuint unit, new_count;
 
    if (samplers_used == 0x0 && old_max == 0)
       return;
@@ -294,9 +294,16 @@ update_textures(struct st_context *st,
       pipe_sampler_view_reference(&(sampler_views[unit]), sampler_view);
    }
 
+   /* Ex: if old_max = 3 and *num_textures = 1, we need to pass an
+    * array of views={X, NULL, NULL} to unref the old texture views
+    * at positions [1] and [2].
+    */
+   new_count = MAX2(*num_textures, old_max);
+   assert(new_count <= max_units);
+
    cso_set_sampler_views(st->cso_context,
                          shader_stage,
-                         MIN2(*num_textures, max_units),
+                         new_count,
                          sampler_views);
 }