From 7b580a567f7637b87574a1432ea9f1a8b6a5ad1f Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 3 Apr 2014 08:45:42 -0600 Subject: [PATCH] svga: replace sampler assertion with conditional For TEX instructions, the set of samplers and sampler views should be consistent. The XA state tracker sometimes passes an inconsistent set of samplers and sampler views. Rather than assert and die, issue a warning. v2: add debugging code to detect inconsistent state. v3: also check for null sampler in svga_state_tss.c Cc: "10.0" "10.1" Reviewed-by: Thomas Hellstrom (cherry picked from commit 9bb2ec6fd1464d92f44b8aa693616edda9724312) Conflicts: src/gallium/drivers/svga/svga_state_fs.c --- src/gallium/drivers/svga/svga_state_fs.c | 34 +++++++++++++++++++++-- src/gallium/drivers/svga/svga_state_tss.c | 2 +- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/svga/svga_state_fs.c b/src/gallium/drivers/svga/svga_state_fs.c index f418ebf45f9..86a150aac1c 100644 --- a/src/gallium/drivers/svga/svga_state_fs.c +++ b/src/gallium/drivers/svga/svga_state_fs.c @@ -199,15 +199,43 @@ make_fs_key(const struct svga_context *svga, if (svga->curr.blend->need_white_fragments) { key->white_fragments = 1; } - + +#ifdef DEBUG + /* + * We expect a consistent set of samplers and sampler views. + * Do some debug checks/warnings here. + */ + { + static boolean warned = FALSE; + unsigned i, n = MAX2(svga->curr.num_sampler_views, + svga->curr.num_samplers); + /* Only warn once to prevent too much debug output */ + if (!warned) { + if (svga->curr.num_sampler_views != svga->curr.num_samplers) { + debug_printf("svga: mismatched number of sampler views (%u) " + "vs. samplers (%u)\n", + svga->curr.num_sampler_views, + svga->curr.num_samplers); + } + for (i = 0; i < n; i++) { + if ((svga->curr.sampler_views[i] == NULL) != + (svga->curr.sampler[i] == NULL)) + debug_printf("sampler_view[%u] = %p but sampler[%u] = %p\n", + i, svga->curr.sampler_views[i], + i, svga->curr.sampler[i]); + } + warned = TRUE; + } + } +#endif + /* XXX: want to limit this to the textures that the shader actually * refers to. * * SVGA_NEW_TEXTURE_BINDING | SVGA_NEW_SAMPLER */ for (i = 0; i < svga->curr.num_sampler_views; i++) { - if (svga->curr.sampler_views[i]) { - assert(svga->curr.sampler[i]); + if (svga->curr.sampler_views[i] && svga->curr.sampler[i]) { assert(svga->curr.sampler_views[i]->texture); key->tex[i].texture_target = svga->curr.sampler_views[i]->texture->target; if (!svga->curr.sampler[i]->normalized_coords) { diff --git a/src/gallium/drivers/svga/svga_state_tss.c b/src/gallium/drivers/svga/svga_state_tss.c index 137e2086c0c..a8ffbf225d1 100644 --- a/src/gallium/drivers/svga/svga_state_tss.c +++ b/src/gallium/drivers/svga/svga_state_tss.c @@ -85,7 +85,7 @@ update_tss_binding(struct svga_context *svga, struct pipe_sampler_view *sv = svga->curr.sampler_views[i]; /* get min max lod */ - if (sv) { + if (sv && s) { min_lod = MAX2(0, (s->view_min_lod + sv->u.tex.first_level)); max_lod = MIN2(s->view_max_lod + sv->u.tex.first_level, sv->texture->last_level);