[Mesa-dev] [PATCH 07/11] anv: Separate surface states by layout instead of aux_usage
Jason Ekstrand
jason at jlekstrand.net
Wed Jul 12 00:04:36 UTC 2017
---
src/intel/vulkan/anv_descriptor_set.c | 5 +---
src/intel/vulkan/anv_image.c | 56 ++++++++++++++++-------------------
src/intel/vulkan/anv_private.h | 21 ++++++-------
src/intel/vulkan/genX_cmd_buffer.c | 29 ++++++++++++------
4 files changed, 58 insertions(+), 53 deletions(-)
diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c
index 4b58b0b..91387c0 100644
--- a/src/intel/vulkan/anv_descriptor_set.c
+++ b/src/intel/vulkan/anv_descriptor_set.c
@@ -615,12 +615,9 @@ anv_descriptor_set_write_image_view(struct anv_descriptor_set *set,
*desc = (struct anv_descriptor) {
.type = type,
+ .layout = info->imageLayout,
.image_view = image_view,
.sampler = sampler,
- .aux_usage = image_view == NULL ? ISL_AUX_USAGE_NONE :
- anv_layout_to_aux_usage(devinfo, image_view->image,
- image_view->aspect_mask,
- info->imageLayout),
};
}
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
index f555db8..fe5544e 100644
--- a/src/intel/vulkan/anv_image.c
+++ b/src/intel/vulkan/anv_image.c
@@ -654,54 +654,50 @@ anv_CreateImageView(VkDevice _device,
if (image->usage & VK_IMAGE_USAGE_SAMPLED_BIT ||
(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);
+ iview->optimal_sampler_surface_state = alloc_surface_state(device);
+ iview->general_sampler_surface_state = alloc_surface_state(device);
- /* 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 =
+ iview->general_sampler_aux_usage =
+ anv_layout_to_aux_usage(&device->info, image, iview->aspect_mask,
+ VK_IMAGE_LAYOUT_GENERAL);
+ iview->optimal_sampler_aux_usage =
anv_layout_to_aux_usage(&device->info, image, iview->aspect_mask,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
/* If this is a HiZ buffer we can sample from with a programmable clear
* value (SKL+), define the clear value to the optimal constant.
*/
- const float red_clear_color = surf_usage == ISL_AUX_USAGE_HIZ &&
- device->info.gen >= 9 ?
- ANV_HZ_FC_VAL : 0.0f;
+ union isl_color_value clear_color = { .u32 = { 0, } };
+ if ((iview->aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) &&
+ device->info.gen >= 9)
+ clear_color.f32[0] = ANV_HZ_FC_VAL;
struct isl_view view = iview->isl;
view.usage |= ISL_SURF_USAGE_TEXTURE_BIT;
+
isl_surf_fill_state(&device->isl_dev,
- iview->sampler_surface_state.map,
+ iview->optimal_sampler_surface_state.map,
.surf = &surface->isl,
.view = &view,
- .clear_color.f32 = { red_clear_color,},
+ .clear_color = clear_color,
.aux_surf = &image->aux_surface.isl,
- .aux_usage = surf_usage,
+ .aux_usage = iview->optimal_sampler_aux_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,
+ iview->general_sampler_surface_state.map,
.surf = &surface->isl,
.view = &view,
+ .clear_color = clear_color,
+ .aux_surf = &image->aux_surface.isl,
+ .aux_usage = iview->general_sampler_aux_usage,
.mocs = device->default_mocs);
- anv_state_flush(device, iview->sampler_surface_state);
- anv_state_flush(device, iview->no_aux_sampler_surface_state);
+ anv_state_flush(device, iview->optimal_sampler_surface_state);
+ anv_state_flush(device, iview->general_sampler_surface_state);
} else {
- iview->sampler_surface_state.alloc_size = 0;
- iview->no_aux_sampler_surface_state.alloc_size = 0;
+ iview->optimal_sampler_surface_state.alloc_size = 0;
+ iview->general_sampler_surface_state.alloc_size = 0;
}
/* NOTE: This one needs to go last since it may stomp isl_view.format */
@@ -772,14 +768,14 @@ anv_DestroyImageView(VkDevice _device, VkImageView _iview,
if (!iview)
return;
- if (iview->sampler_surface_state.alloc_size > 0) {
+ if (iview->optimal_sampler_surface_state.alloc_size > 0) {
anv_state_pool_free(&device->surface_state_pool,
- iview->sampler_surface_state);
+ iview->optimal_sampler_surface_state);
}
- if (iview->no_aux_sampler_surface_state.alloc_size > 0) {
+ if (iview->general_sampler_surface_state.alloc_size > 0) {
anv_state_pool_free(&device->surface_state_pool,
- iview->no_aux_sampler_surface_state);
+ iview->general_sampler_surface_state);
}
if (iview->storage_surface_state.alloc_size > 0) {
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 3e7f9c7..649f19a 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -1077,13 +1077,9 @@ struct anv_descriptor {
union {
struct {
+ VkImageLayout layout;
struct anv_image_view *image_view;
struct anv_sampler *sampler;
-
- /* Used to determine whether or not we need the surface state to have
- * the auxiliary buffer enabled.
- */
- enum isl_aux_usage aux_usage;
};
struct {
@@ -2146,14 +2142,19 @@ struct anv_image_view {
VkFormat vk_format;
VkExtent3D extent; /**< Extent of VkImageViewCreateInfo::baseMipLevel. */
- /** 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 an image
+ * layout of SHADER_READ_ONLY_OPTIMAL or DEPTH_STENCIL_READ_ONLY_OPTIMAL.
+ */
+ enum isl_aux_usage optimal_sampler_aux_usage;
+ struct anv_state optimal_sampler_surface_state;
/**
- * RENDER_SURFACE_STATE when using image as a sampler surface with the
- * auxiliary buffer disabled.
+ * RENDER_SURFACE_STATE when using image as a sampler surface with an image
+ * layout of GENERAL.
*/
- struct anv_state no_aux_sampler_surface_state;
+ enum isl_aux_usage general_sampler_aux_usage;
+ struct anv_state general_sampler_surface_state;
/**
* RENDER_SURFACE_STATE when using image as a storage image. Separate states
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index 9b3bb10..897279c 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -1198,28 +1198,39 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
continue;
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
- case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
- surface_state = desc->aux_usage == ISL_AUX_USAGE_NONE ?
- desc->image_view->no_aux_sampler_surface_state :
- desc->image_view->sampler_surface_state;
+ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: {
+ enum isl_aux_usage aux_usage;
+ if (desc->layout == VK_IMAGE_LAYOUT_GENERAL) {
+ surface_state = desc->image_view->general_sampler_surface_state;
+ aux_usage = desc->image_view->general_sampler_aux_usage;
+ } else {
+ surface_state = desc->image_view->optimal_sampler_surface_state;
+ aux_usage = desc->image_view->optimal_sampler_aux_usage;
+ }
assert(surface_state.alloc_size);
add_image_relocs(cmd_buffer, desc->image_view->image,
desc->image_view->aspect_mask,
- desc->aux_usage, surface_state);
+ aux_usage, surface_state);
break;
+ }
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
assert(stage == MESA_SHADER_FRAGMENT);
if (desc->image_view->aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT) {
/* For depth and stencil input attachments, we treat it like any
* old texture that a user may have bound.
*/
- surface_state = desc->aux_usage == ISL_AUX_USAGE_NONE ?
- desc->image_view->no_aux_sampler_surface_state :
- desc->image_view->sampler_surface_state;
+ enum isl_aux_usage aux_usage;
+ if (desc->layout == VK_IMAGE_LAYOUT_GENERAL) {
+ surface_state = desc->image_view->general_sampler_surface_state;
+ aux_usage = desc->image_view->general_sampler_aux_usage;
+ } else {
+ surface_state = desc->image_view->optimal_sampler_surface_state;
+ aux_usage = desc->image_view->optimal_sampler_aux_usage;
+ }
assert(surface_state.alloc_size);
add_image_relocs(cmd_buffer, desc->image_view->image,
desc->image_view->aspect_mask,
- desc->aux_usage, surface_state);
+ aux_usage, surface_state);
} else {
/* For color input attachments, we create the surface state at
* vkBeginRenderPass time so that we can include aux and clear
--
2.5.0.400.gff86faf
More information about the mesa-dev
mailing list