svga: add support for cubemap array
authorCharmaine Lee <charmainel@vmware.com>
Wed, 4 Oct 2017 16:56:30 +0000 (10:56 -0600)
committerBrian Paul <brianp@vmware.com>
Mon, 10 Sep 2018 19:07:30 +0000 (13:07 -0600)
This patch adds support for cubemap array for SM4_1.

Fixes piglit test arb_texture_cube_map_array-cubemap

Reviewed-by: Neha Bhende <bhenden@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/drivers/svga/svga_pipe_blit.c
src/gallium/drivers/svga/svga_resource_texture.c
src/gallium/drivers/svga/svga_screen.c
src/gallium/drivers/svga/svga_surface.c

index 9ab518314927fd622a5ea66e3ddbe058a68d3474..bb213ac92e8b3c4bcd14c9dbbc6e66ad1269b2ef 100644 (file)
@@ -191,8 +191,9 @@ static bool
 has_layer_face_index_in_z(enum pipe_texture_target target)
 {
    if (target == PIPE_TEXTURE_CUBE ||
+       target == PIPE_TEXTURE_1D_ARRAY ||
        target == PIPE_TEXTURE_2D_ARRAY ||
-       target == PIPE_TEXTURE_1D_ARRAY)
+       target == PIPE_TEXTURE_CUBE_ARRAY)
       return true;
    else
       return false;
@@ -209,8 +210,9 @@ adjust_z_layer(enum pipe_texture_target target,
                int z_in, unsigned *layer_out, unsigned *z_out)
 {
    if (target == PIPE_TEXTURE_CUBE ||
+       target == PIPE_TEXTURE_1D_ARRAY ||
        target == PIPE_TEXTURE_2D_ARRAY ||
-       target == PIPE_TEXTURE_1D_ARRAY) {
+       target == PIPE_TEXTURE_CUBE_ARRAY) {
       *layer_out = z_in;
       *z_out = 0;
    }
index 068862bb78039950d51379775f7ea0868c91b52f..aaf625349457ab6a1f8700a4abeaa0c2c23a38e8 100644 (file)
@@ -262,18 +262,22 @@ static inline boolean
 was_tex_rendered_to(struct pipe_resource *resource,
                     const struct pipe_transfer *transfer)
 {
-   unsigned face;
+   unsigned layer_face;
 
-   if (resource->target == PIPE_TEXTURE_CUBE) {
+   switch (resource->target) {
+   case PIPE_TEXTURE_CUBE:
       assert(transfer->box.depth == 1);
-      face = transfer->box.z;
-   }
-   else {
-      face = 0;
+   case PIPE_TEXTURE_1D_ARRAY:
+   case PIPE_TEXTURE_2D_ARRAY:
+   case PIPE_TEXTURE_CUBE_ARRAY:
+      layer_face = transfer->box.z;
+      break;
+   default:
+      layer_face = 0;
    }
 
    return svga_was_texture_rendered_to(svga_texture(resource),
-                                       face, transfer->level);
+                                       layer_face, transfer->level);
 }
 
 
@@ -505,7 +509,8 @@ svga_texture_transfer_map_direct(struct svga_context *svga,
       baseLevelSize.depth = tex->b.b.depth0;
 
       if ((tex->b.b.target == PIPE_TEXTURE_1D_ARRAY) ||
-          (tex->b.b.target == PIPE_TEXTURE_2D_ARRAY)) {
+          (tex->b.b.target == PIPE_TEXTURE_2D_ARRAY) ||
+          (tex->b.b.target == PIPE_TEXTURE_CUBE_ARRAY)) {
          st->base.layer_stride =
             svga3dsurface_get_image_offset(tex->key.format, baseLevelSize,
                                            tex->b.b.last_level + 1, 1, 0);
@@ -526,6 +531,7 @@ svga_texture_transfer_map_direct(struct svga_context *svga,
                                                st->base.box.x,
                                                st->base.box.y,
                                                st->base.box.z);
+
       return (void *) (map + offset);
    }
 }
@@ -578,8 +584,9 @@ svga_texture_transfer_map(struct pipe_context *pipe,
       st->slice = st->base.box.z;
       st->base.box.z = 0;   /* so we don't apply double offsets below */
       break;
-   case PIPE_TEXTURE_2D_ARRAY:
    case PIPE_TEXTURE_1D_ARRAY:
+   case PIPE_TEXTURE_2D_ARRAY:
+   case PIPE_TEXTURE_CUBE_ARRAY:
       st->slice = st->base.box.z;
       st->base.box.z = 0;   /* so we don't apply double offsets below */
 
@@ -727,6 +734,7 @@ update_image_vgpu10(struct svga_context *svga,
    unsigned subResource;
 
    subResource = slice * numMipLevels + level;
+
    ret = SVGA3D_vgpu10_UpdateSubResource(svga->swc, surf, box, subResource);
    if (ret != PIPE_OK) {
       svga_context_flush(svga, NULL);
@@ -801,6 +809,7 @@ svga_texture_transfer_unmap_direct(struct svga_context *svga,
          box.z = 0;
          break;
       case PIPE_TEXTURE_2D_ARRAY:
+      case PIPE_TEXTURE_CUBE_ARRAY:
          nlayers = box.d;
          box.z = 0;
          box.d = 1;
@@ -823,6 +832,7 @@ svga_texture_transfer_unmap_direct(struct svga_context *svga,
 
       if (svga_have_vgpu10(svga)) {
          unsigned i;
+
          for (i = 0; i < nlayers; i++) {
             ret = update_image_vgpu10(svga, surf, &box,
                                       st->slice + i, transfer->level,
@@ -1014,6 +1024,12 @@ svga_texture_create(struct pipe_screen *screen,
          tex->key.flags |= (SVGA3D_SURFACE_CUBEMAP | SVGA3D_SURFACE_ARRAY);
          tex->key.numFaces = 6;
          break;
+      case PIPE_TEXTURE_CUBE_ARRAY:
+         assert(svgascreen->sws->have_sm4_1);
+         tex->key.flags |= (SVGA3D_SURFACE_CUBEMAP | SVGA3D_SURFACE_ARRAY);
+         tex->key.numFaces = 1;  // arraySize already includes the 6 faces
+         tex->key.arraySize = template->array_size;
+         break;
       default:
          break;
       }
@@ -1408,6 +1424,7 @@ svga_texture_transfer_map_upload(struct svga_context *svga,
       st->upload.box.z = 0;
       break;
    case PIPE_TEXTURE_2D_ARRAY:
+   case PIPE_TEXTURE_CUBE_ARRAY:
       st->upload.nlayers = st->base.box.depth;
       st->upload.box.z = 0;
       st->upload.box.d = 1;
index be653bd4fe253d827490edb63179f573cbcf0933..23b165c37e9a29b0ad3383cf5502884d0cc26a34 100644 (file)
@@ -343,6 +343,9 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
       return 1;
 
+   case PIPE_CAP_CUBE_MAP_ARRAY:
+      return sws->have_sm4_1;
+
    /* Unsupported features */
    case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
    case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
@@ -354,7 +357,6 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
    case PIPE_CAP_COMPUTE:
    case PIPE_CAP_START_INSTANCE:
-   case PIPE_CAP_CUBE_MAP_ARRAY:
    case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
    case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
    case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
index cb74a00c1e0165441043a7ae030f65e1303ad335..6237999b75f9082a621ac16080aae2d3437b527a 100644 (file)
@@ -276,7 +276,8 @@ svga_create_surface_view(struct pipe_context *pipe,
       zslice = 0;
    }
    else if (pt->target == PIPE_TEXTURE_1D_ARRAY ||
-            pt->target == PIPE_TEXTURE_2D_ARRAY) {
+            pt->target == PIPE_TEXTURE_2D_ARRAY ||
+            pt->target == PIPE_TEXTURE_CUBE_ARRAY) {
       layer = surf_tmpl->u.tex.first_layer;
       zslice = 0;
       nlayers = surf_tmpl->u.tex.last_layer - surf_tmpl->u.tex.first_layer + 1;
@@ -347,6 +348,9 @@ svga_create_surface_view(struct pipe_context *pipe,
             if (nlayers == 6)
                flags |= SVGA3D_SURFACE_CUBEMAP;
             break;
+         case PIPE_TEXTURE_CUBE_ARRAY:
+            flags |= SVGA3D_SURFACE_CUBEMAP | SVGA3D_SURFACE_ARRAY;
+            break;   
          default:
             break;
          }