anv: Separate surface states by layout instead of aux_usage

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Jason Ekstrand
2017-07-11 08:53:42 -07:00
parent 628bfaf1c6
commit 1e32c8303a
4 changed files with 58 additions and 53 deletions

View File

@@ -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),
};
}

View File

@@ -748,54 +748,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 */
@@ -866,14 +862,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) {

View File

@@ -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 {
@@ -2164,14 +2160,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

View File

@@ -1584,28 +1584,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