anv: Adjust params of color buffer transitioning functions
authorNanley Chery <nanley.g.chery@intel.com>
Mon, 12 Jun 2017 19:58:32 +0000 (12:58 -0700)
committerNanley Chery <nanley.g.chery@intel.com>
Mon, 26 Jun 2017 18:09:12 +0000 (11:09 -0700)
Splitting out these fields will make the color buffer transitioning
function simpler when it gains more features.

v2: Remove unintended blank line (Iago Toral)

Signed-off-by: Nanley Chery <nanley.g.chery@intel.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/vulkan/anv_blorp.c
src/intel/vulkan/anv_private.h
src/intel/vulkan/genX_cmd_buffer.c

index 5ee850aa3e267f94e9ad7f06d7dd67ca699d2c64..5ee67f50c2bf41bf5d1fea8052602d6123b33157 100644 (file)
@@ -1436,11 +1436,16 @@ void anv_CmdResolveImage(
 void
 anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer,
                     const struct anv_image *image,
-                    const struct isl_view *view,
-                    const VkImageSubresourceRange *subresourceRange)
+                    const uint32_t base_level, const uint32_t level_count,
+                    const uint32_t base_layer, uint32_t layer_count)
 {
    assert(image->type == VK_IMAGE_TYPE_3D || image->extent.depth == 1);
 
+   if (image->type == VK_IMAGE_TYPE_3D) {
+      assert(base_layer == 0);
+      assert(layer_count == anv_minify(image->extent.depth, base_level));
+   }
+
    struct blorp_batch batch;
    blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
 
@@ -1466,11 +1471,8 @@ anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer,
    cmd_buffer->state.pending_pipe_bits |=
       ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
 
-   const uint32_t level_count =
-      view ? view->levels : anv_get_levelCount(image, subresourceRange);
    for (uint32_t l = 0; l < level_count; l++) {
-      const uint32_t level =
-         (view ? view->base_level : subresourceRange->baseMipLevel) + l;
+      const uint32_t level = base_level + l;
 
       const VkExtent3D extent = {
          .width = anv_minify(image->extent.width, level),
@@ -1478,24 +1480,13 @@ anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer,
          .depth = anv_minify(image->extent.depth, level),
       };
 
-      /* Blorp likes to treat 2D_ARRAY and 3D the same. */
-      uint32_t blorp_base_layer, blorp_layer_count;
-      if (image->type == VK_IMAGE_TYPE_3D) {
-         blorp_base_layer = 0;
-         blorp_layer_count = extent.depth;
-      } else if (view) {
-         blorp_base_layer = view->base_array_layer;
-         blorp_layer_count = view->array_len;
-      } else {
-         blorp_base_layer = subresourceRange->baseArrayLayer;
-         blorp_layer_count = anv_get_layerCount(image, subresourceRange);
-      }
+      if (image->type == VK_IMAGE_TYPE_3D)
+         layer_count = extent.depth;
 
       assert(level < anv_image_aux_levels(image));
-      assert(blorp_base_layer + blorp_layer_count <=
-             anv_image_aux_layers(image, level));
+      assert(base_layer + layer_count <= anv_image_aux_layers(image, level));
       blorp_fast_clear(&batch, &surf, surf.surf->format,
-                       level, blorp_base_layer, blorp_layer_count,
+                       level, base_layer, layer_count,
                        0, 0, extent.width, extent.height);
    }
 
index 1110088b82f2301edcf3fd0cb9a3360d4010161d..b6f9cbdfdbc79ad306f24c7473d255748dbe1fd1 100644 (file)
@@ -2132,8 +2132,8 @@ anv_gen8_hiz_op_resolve(struct anv_cmd_buffer *cmd_buffer,
 void
 anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer,
                     const struct anv_image *image,
-                    const struct isl_view *view,
-                    const VkImageSubresourceRange *subresourceRange);
+                    const uint32_t base_level, const uint32_t level_count,
+                    const uint32_t base_layer, uint32_t layer_count);
 
 enum isl_aux_usage
 anv_layout_to_aux_usage(const struct gen_device_info * const devinfo,
index c9e5fac3d6cea900fff99d12dee61995fa25238a..6a3e525eb3b9db29f448a95270856bafac0e8382 100644 (file)
@@ -387,10 +387,10 @@ transition_depth_buffer(struct anv_cmd_buffer *cmd_buffer,
 static void
 transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
                         const struct anv_image *image,
+                        const uint32_t base_level, uint32_t level_count,
+                        uint32_t base_layer, uint32_t layer_count,
                         VkImageLayout initial_layout,
-                        VkImageLayout final_layout,
-                        const struct isl_view *view,
-                        const VkImageSubresourceRange *subresourceRange)
+                        VkImageLayout final_layout)
 {
    if (image->aux_usage != ISL_AUX_USAGE_CCS_E)
       return;
@@ -399,13 +399,20 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
        initial_layout != VK_IMAGE_LAYOUT_PREINITIALIZED)
       return;
 
+   /* A transition of a 3D subresource works on all slices at a time. */
+   if (image->type == VK_IMAGE_TYPE_3D) {
+      base_layer = 0;
+      layer_count = anv_minify(image->extent.depth, base_level);
+   }
+
 #if GEN_GEN >= 9
    /* We're transitioning from an undefined layout so it doesn't really matter
     * what data ends up in the color buffer.  We do, however, need to ensure
     * that the CCS has valid data in it.  One easy way to do that is to
     * fast-clear the specified range.
     */
-   anv_image_ccs_clear(cmd_buffer, image, view, subresourceRange);
+   anv_image_ccs_clear(cmd_buffer, image, base_level, level_count,
+                       base_layer, layer_count);
 #endif
 }
 
@@ -990,18 +997,21 @@ void genX(CmdPipelineBarrier)(
       src_flags |= pImageMemoryBarriers[i].srcAccessMask;
       dst_flags |= pImageMemoryBarriers[i].dstAccessMask;
       ANV_FROM_HANDLE(anv_image, image, pImageMemoryBarriers[i].image);
-      if (pImageMemoryBarriers[i].subresourceRange.aspectMask &
-          VK_IMAGE_ASPECT_DEPTH_BIT) {
+      const VkImageSubresourceRange *range =
+         &pImageMemoryBarriers[i].subresourceRange;
+
+      if (range->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
          transition_depth_buffer(cmd_buffer, image,
                                  pImageMemoryBarriers[i].oldLayout,
                                  pImageMemoryBarriers[i].newLayout);
-      } else if (pImageMemoryBarriers[i].subresourceRange.aspectMask ==
-                 VK_IMAGE_ASPECT_COLOR_BIT) {
+      } else if (range->aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) {
          transition_color_buffer(cmd_buffer, image,
+                                 range->baseMipLevel,
+                                 anv_get_levelCount(image, range),
+                                 range->baseArrayLayer,
+                                 anv_get_layerCount(image, range),
                                  pImageMemoryBarriers[i].oldLayout,
-                                 pImageMemoryBarriers[i].newLayout,
-                                 NULL,
-                                 &pImageMemoryBarriers[i].subresourceRange);
+                                 pImageMemoryBarriers[i].newLayout);
       }
    }
 
@@ -2490,8 +2500,10 @@ cmd_buffer_subpass_transition_layouts(struct anv_cmd_buffer * const cmd_buffer,
                                     image->aspects, target_layout);
       } else if (image->aspects == VK_IMAGE_ASPECT_COLOR_BIT) {
          transition_color_buffer(cmd_buffer, image,
-                                 att_state->current_layout, target_layout,
-                                 &iview->isl, NULL);
+                                 iview->isl.base_level, 1,
+                                 iview->isl.base_array_layer,
+                                 iview->isl.array_len,
+                                 att_state->current_layout, target_layout);
       }
 
       att_state->current_layout = target_layout;