svga: replace sampler assertion with conditional
authorBrian Paul <brianp@vmware.com>
Thu, 3 Apr 2014 14:45:42 +0000 (08:45 -0600)
committerBrian Paul <brianp@vmware.com>
Tue, 8 Apr 2014 14:45:18 +0000 (08:45 -0600)
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" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
src/gallium/drivers/svga/svga_state_fs.c
src/gallium/drivers/svga/svga_state_tss.c

index dde739c121d8871404aed86868d090d3d4a08df0..7931528c661421f97fdd48ec32f3edd36a6e0468 100644 (file)
@@ -235,15 +235,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) {
@@ -262,7 +290,7 @@ make_fs_key(const struct svga_context *svga,
 
    idx = 0;
    for (i = 0; i < svga->curr.num_samplers; ++i) {
-      if (svga->curr.sampler_views[i]) {
+      if (svga->curr.sampler_views[i] && svga->curr.sampler[i]) {
          struct pipe_resource *tex = svga->curr.sampler_views[i]->texture;
          struct svga_texture *stex = svga_texture(tex);
          SVGA3dSurfaceFormat format = stex->key.format;
index 988372f989bb9336cc7993dc5fe5c68bbffb5ff2..0ab571c05881992422a59d5733784bb63e88e0dd 100644 (file)
@@ -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);