st/mesa: fix sampler view counting

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>
This commit is contained in:
Brian Paul 2012-08-17 08:16:23 -06:00
parent d65eb02537
commit 5b542681dc

View 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);
}