anv/image: Create an additional surface state for sampling
authorNanley Chery <nanley.g.chery@intel.com>
Tue, 31 Jan 2017 19:04:42 +0000 (11:04 -0800)
committerNanley Chery <nanley.g.chery@intel.com>
Thu, 2 Mar 2017 21:17:54 +0000 (13:17 -0800)
This will be used to sample a depth input attachment without having to
pass through the HiZ buffer.

Signed-off-by: Nanley Chery <nanley.g.chery@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/vulkan/anv_image.c
src/intel/vulkan/anv_private.h

index 16a60833e022cf947e70bdbdfd39a219aaffa633..95ba12c928d527e3d25aa113b222b093f21ef896 100644 (file)
@@ -692,8 +692,19 @@ anv_CreateImageView(VkDevice _device,
        (image->usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT &&
         !(iview->aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT))) {
       iview->sampler_surface_state = alloc_surface_state(device);
+      iview->no_aux_sampler_surface_state = alloc_surface_state(device);
 
-      /* Select the optimal aux_usage for sampling. */
+      /* Sampling is performed in one of two buffer configurations in anv: with
+       * an auxiliary buffer or without it. Sampler states aren't always needed
+       * for both configurations, but are currently created unconditionally for
+       * simplicity.
+       *
+       * TODO: Consider allocating each surface state only when necessary.
+       */
+
+      /* Create a sampler state with the optimal aux_usage for sampling. This
+       * may use the aux_buffer.
+       */
       const enum isl_aux_usage surf_usage =
          anv_layout_to_aux_usage(&device->info, image, iview->aspect_mask,
                                  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
@@ -716,9 +727,18 @@ anv_CreateImageView(VkDevice _device,
                           .aux_usage = surf_usage,
                           .mocs = device->default_mocs);
 
+      /* Create a sampler state that only uses the main buffer. */
+      isl_surf_fill_state(&device->isl_dev,
+                          iview->no_aux_sampler_surface_state.map,
+                          .surf = &surface->isl,
+                          .view = &view,
+                          .mocs = device->default_mocs);
+
       anv_state_flush(device, iview->sampler_surface_state);
+      anv_state_flush(device, iview->no_aux_sampler_surface_state);
    } else {
       iview->sampler_surface_state.alloc_size = 0;
+      iview->no_aux_sampler_surface_state.alloc_size = 0;
    }
 
    /* NOTE: This one needs to go last since it may stomp isl_view.format */
index 49ca510998f947204e76fc994a4ebc35e30f990b..b12012d36c67ad3a730bd82152c9302955c4880a 100644 (file)
@@ -1818,6 +1818,12 @@ struct anv_image_view {
    /** RENDER_SURFACE_STATE when using image as a sampler surface. */
    struct anv_state sampler_surface_state;
 
+   /**
+    * RENDER_SURFACE_STATE when using image as a sampler surface with the
+    * auxiliary buffer disabled.
+    */
+   struct anv_state no_aux_sampler_surface_state;
+
    /**
     * RENDER_SURFACE_STATE when using image as a storage image. Separate states
     * for write-only and readable, using the real format for write-only and the