From e96c55ff495528fc70fb5363d60bf4c645bc2082 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 15 Oct 2013 17:09:22 -0600 Subject: [PATCH] cso: fix incorrect sampler view count in cso_restore_sampler_views() During the recent bind_sampler_states() interface change in gallium we changed the CSO single_sampler_done() function so that if we were decreasing the number of sampler states bound in the driver, we'd null-out the "extra/old" sampler states to unbind them. See commit 1e2fbf265. However, we didn't make the corresponding fix for sampler views. This caused an assertion to fail in the svga driver which checked that the number of sampler views matched the number of sampler states. This patch fixes cso_restore_sampler_views() so that it nulls-out the extra/old sampler views if the number of new views is less than the number of current/old views. Reviewed-by: Jose Fonseca --- src/gallium/auxiliary/cso_cache/cso_context.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index 6642c454e56..4d7c3871256 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -1221,6 +1221,7 @@ cso_restore_sampler_views(struct cso_context *ctx, unsigned shader_stage) { struct sampler_info *info = &ctx->samplers[shader_stage]; unsigned i, nr_saved = info->nr_views_saved; + unsigned num; for (i = 0; i < nr_saved; i++) { pipe_sampler_view_reference(&info->views[i], NULL); @@ -1232,16 +1233,18 @@ cso_restore_sampler_views(struct cso_context *ctx, unsigned shader_stage) pipe_sampler_view_reference(&info->views[i], NULL); } + num = MAX2(info->nr_views, nr_saved); + /* bind the old/saved sampler views */ switch (shader_stage) { case PIPE_SHADER_FRAGMENT: - ctx->pipe->set_fragment_sampler_views(ctx->pipe, nr_saved, info->views); + ctx->pipe->set_fragment_sampler_views(ctx->pipe, num, info->views); break; case PIPE_SHADER_VERTEX: - ctx->pipe->set_vertex_sampler_views(ctx->pipe, nr_saved, info->views); + ctx->pipe->set_vertex_sampler_views(ctx->pipe, num, info->views); break; case PIPE_SHADER_GEOMETRY: - ctx->pipe->set_geometry_sampler_views(ctx->pipe, nr_saved, info->views); + ctx->pipe->set_geometry_sampler_views(ctx->pipe, num, info->views); break; default: assert(!"bad shader type in cso_restore_sampler_views()"); -- 2.30.2