svga: fix texture buffer object regression
authorBrian Paul <brianp@vmware.com>
Fri, 30 Jun 2017 21:08:49 +0000 (14:08 -0700)
committerBrian Paul <brianp@vmware.com>
Mon, 3 Jul 2017 16:10:13 +0000 (10:10 -0600)
With change 8aba778fa2cd98a0b5a7429d3c5057778a0c808c we stopped binding
sampler objects for texture buffers.  That broke our texture sample /
sampler view setup code.

Now, we loop over the max(num samplers, num sampler views) and handle
the sampler and view information separately.  For texture buffers,
the sampler will be NULL but the sampler view non-null.

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
src/gallium/drivers/svga/svga_shader.c

index d069b0d29c40c7c751defe062c77f41cae74a62d..ef3b021d404c9b14ac1797e20870be65da9cc613 100644 (file)
@@ -199,13 +199,13 @@ svga_init_shader_key_common(const struct svga_context *svga,
    /* In case the number of samplers and sampler_views doesn't match,
     * loop over the lower of the two counts.
     */
-   key->num_textures = MIN2(svga->curr.num_sampler_views[shader],
+   key->num_textures = MAX2(svga->curr.num_sampler_views[shader],
                             svga->curr.num_samplers[shader]);
 
    for (i = 0; i < key->num_textures; i++) {
       struct pipe_sampler_view *view = svga->curr.sampler_views[shader][i];
       const struct svga_sampler_state *sampler = svga->curr.sampler[shader][i];
-      if (view && sampler) {
+      if (view) {
          assert(view->texture);
          assert(view->texture->target < (1 << 4)); /* texture_target:4 */
 
@@ -224,13 +224,6 @@ svga_init_shader_key_common(const struct svga_context *svga,
             }
          }
 
-         if (!sampler->normalized_coords) {
-            assert(idx < (1 << 5));  /* width_height_idx:5 bitfield */
-            key->tex[i].width_height_idx = idx++;
-            key->tex[i].unnormalized = TRUE;
-            ++key->num_unnormalized_coords;
-         }
-
          swizzle_tab = (!util_format_has_alpha(view->format) &&
                         svga_texture_device_format_has_alpha(view->texture)) ?
             set_alpha : copy_alpha;
@@ -246,6 +239,15 @@ svga_init_shader_key_common(const struct svga_context *svga,
          key->tex[i].swizzle_b = swizzle_tab[view->swizzle_b];
          key->tex[i].swizzle_a = swizzle_tab[view->swizzle_a];
       }
+
+      if (sampler) {
+         if (!sampler->normalized_coords) {
+            assert(idx < (1 << 5));  /* width_height_idx:5 bitfield */
+            key->tex[i].width_height_idx = idx++;
+            key->tex[i].unnormalized = TRUE;
+            ++key->num_unnormalized_coords;
+         }
+      }
    }
 }