svga: fix 1-element cube map array issue
authorBrian Paul <brianp@vmware.com>
Tue, 14 Nov 2017 16:36:23 +0000 (09:36 -0700)
committerBrian Paul <brianp@vmware.com>
Mon, 10 Sep 2018 19:07:30 +0000 (13:07 -0600)
As with 1D and 2D array textures, if there's only one array element
(one cubemap in this case) we have to issue different shader code.

This fixes a number of Piglit cubemap array tests.

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

index ebf1131d51d1e8238578dab51b92fdec40c7db73..1eb8b2297479ab093c4439e7de75d6ffd4936f74 100644 (file)
@@ -208,16 +208,20 @@ svga_init_shader_key_common(const struct svga_context *svga,
          assert(view->texture);
          assert(view->texture->target < (1 << 4)); /* texture_target:4 */
 
-         /* 1D/2D array textures with one slice are treated as non-arrays
-          * by the SVGA3D device.  Set the is_array flag only if we know that
-          * we have more than 1 element.  This will be used to select shader
-          * instruction/resource types during shader translation.
+         /* 1D/2D array textures with one slice and cube map array textures
+          * with one cube are treated as non-arrays by the SVGA3D device.
+          * Set the is_array flag only if we know that we have more than 1
+          * element.  This will be used to select shader instruction/resource
+          * types during shader translation.
           */
          switch (view->texture->target) {
          case PIPE_TEXTURE_1D_ARRAY:
          case PIPE_TEXTURE_2D_ARRAY:
             key->tex[i].is_array = view->texture->array_size > 1;
             break;
+         case PIPE_TEXTURE_CUBE_ARRAY:
+            key->tex[i].is_array = view->texture->array_size > 6;
+            break;
          default:
             ; /* nothing / silence compiler warning */
          }
index 03ea67cad6584e1a800843f00526bbac79cf18a4..85074187155d45384393531c2bd0369575b790bc 100644 (file)
@@ -3197,7 +3197,8 @@ tgsi_texture_to_resource_dimension(enum tgsi_texture_type target,
          : VGPU10_RESOURCE_DIMENSION_TEXTURE2DMS;
    case TGSI_TEXTURE_CUBE_ARRAY:
    case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
-      return VGPU10_RESOURCE_DIMENSION_TEXTURECUBEARRAY;
+      return is_array ? VGPU10_RESOURCE_DIMENSION_TEXTURECUBEARRAY
+         : VGPU10_RESOURCE_DIMENSION_TEXTURECUBE;
    default:
       assert(!"Unexpected resource type");
       return VGPU10_RESOURCE_DIMENSION_TEXTURE2D;