Mesa (master): svga: replace sampler assertion with conditional

Brian Paul brianp at kemper.freedesktop.org
Tue Apr 8 14:58:12 UTC 2014


Module: Mesa
Branch: master
Commit: 9bb2ec6fd1464d92f44b8aa693616edda9724312
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9bb2ec6fd1464d92f44b8aa693616edda9724312

Author: Brian Paul <brianp at vmware.com>
Date:   Thu Apr  3 08:45:42 2014 -0600

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" <mesa-stable at lists.freedesktop.org>
Reviewed-by: Thomas Hellstrom <thellstrom at vmware.com>

---

 src/gallium/drivers/svga/svga_state_fs.c  |   36 +++++++++++++++++++++++++----
 src/gallium/drivers/svga/svga_state_tss.c |    2 +-
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/svga/svga_state_fs.c b/src/gallium/drivers/svga/svga_state_fs.c
index dde739c..7931528 100644
--- a/src/gallium/drivers/svga/svga_state_fs.c
+++ b/src/gallium/drivers/svga/svga_state_fs.c
@@ -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;
diff --git a/src/gallium/drivers/svga/svga_state_tss.c b/src/gallium/drivers/svga/svga_state_tss.c
index 988372f..0ab571c 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);




More information about the mesa-commit mailing list