diff options
-rw-r--r-- | src/intel/vulkan/anv_blorp.c | 50 | ||||
-rw-r--r-- | src/intel/vulkan/anv_image.c | 5 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 3 | ||||
-rw-r--r-- | src/intel/vulkan/genX_cmd_buffer.c | 6 |
4 files changed, 45 insertions, 19 deletions
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index e0c36e692f8..08e43cf1a54 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -169,8 +169,12 @@ get_blorp_surf_for_anv_buffer(struct anv_device *device, static void get_blorp_surf_for_anv_image(const struct anv_image *image, VkImageAspectFlags aspect, + enum isl_aux_usage aux_usage, struct blorp_surf *blorp_surf) { + if (aspect == VK_IMAGE_ASPECT_STENCIL_BIT) + aux_usage = ISL_AUX_USAGE_NONE; + const struct anv_surface *surface = anv_image_get_surface_for_aspect_mask(image, aspect); @@ -181,6 +185,15 @@ get_blorp_surf_for_anv_image(const struct anv_image *image, .offset = image->offset + surface->offset, }, }; + + if (aux_usage != ISL_AUX_USAGE_NONE) { + blorp_surf->aux_surf = &image->aux_surface.isl, + blorp_surf->aux_addr = (struct blorp_address) { + .buffer = image->bo, + .offset = image->offset + image->aux_surface.offset, + }; + blorp_surf->aux_usage = aux_usage; + } } void anv_CmdCopyImage( @@ -232,8 +245,10 @@ void anv_CmdCopyImage( VkImageAspectFlagBits aspect = (1 << a); struct blorp_surf src_surf, dst_surf; - get_blorp_surf_for_anv_image(src_image, aspect, &src_surf); - get_blorp_surf_for_anv_image(dst_image, aspect, &dst_surf); + get_blorp_surf_for_anv_image(src_image, aspect, src_image->aux_usage, + &src_surf); + get_blorp_surf_for_anv_image(dst_image, aspect, dst_image->aux_usage, + &dst_surf); for (unsigned i = 0; i < layer_count; i++) { blorp_copy(&batch, &src_surf, pRegions[r].srcSubresource.mipLevel, @@ -281,7 +296,8 @@ copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer, for (unsigned r = 0; r < regionCount; r++) { const VkImageAspectFlags aspect = pRegions[r].imageSubresource.aspectMask; - get_blorp_surf_for_anv_image(anv_image, aspect, &image.surf); + get_blorp_surf_for_anv_image(anv_image, aspect, anv_image->aux_usage, + &image.surf); image.offset = anv_sanitize_image_offset(anv_image->type, pRegions[r].imageOffset); image.level = pRegions[r].imageSubresource.mipLevel; @@ -425,8 +441,10 @@ void anv_CmdBlitImage( const VkImageSubresourceLayers *src_res = &pRegions[r].srcSubresource; const VkImageSubresourceLayers *dst_res = &pRegions[r].dstSubresource; - get_blorp_surf_for_anv_image(src_image, src_res->aspectMask, &src); - get_blorp_surf_for_anv_image(dst_image, dst_res->aspectMask, &dst); + get_blorp_surf_for_anv_image(src_image, src_res->aspectMask, + src_image->aux_usage, &src); + get_blorp_surf_for_anv_image(dst_image, dst_res->aspectMask, + dst_image->aux_usage, &dst); struct anv_format src_format = anv_get_format(&cmd_buffer->device->info, src_image->vk_format, @@ -788,7 +806,8 @@ void anv_CmdClearColorImage( memcpy(clear_color.u32, pColor->uint32, sizeof(pColor->uint32)); struct blorp_surf surf; - get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT, &surf); + get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT, + image->aux_usage, &surf); for (unsigned r = 0; r < rangeCount; r++) { if (pRanges[r].aspectMask == 0) @@ -841,14 +860,14 @@ void anv_CmdClearDepthStencilImage( struct blorp_surf depth, stencil; if (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT) { get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_DEPTH_BIT, - &depth); + image->aux_usage, &depth); } else { memset(&depth, 0, sizeof(depth)); } if (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT) { get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_STENCIL_BIT, - &stencil); + ISL_AUX_USAGE_NONE, &stencil); } else { memset(&stencil, 0, sizeof(stencil)); } @@ -1140,8 +1159,10 @@ resolve_image(struct blorp_batch *batch, VkImageAspectFlagBits aspect = 1 << a; struct blorp_surf src_surf, dst_surf; - get_blorp_surf_for_anv_image(src_image, aspect, &src_surf); - get_blorp_surf_for_anv_image(dst_image, aspect, &dst_surf); + get_blorp_surf_for_anv_image(src_image, aspect, + src_image->aux_usage, &src_surf); + get_blorp_surf_for_anv_image(dst_image, aspect, + dst_image->aux_usage, &dst_surf); blorp_blit(batch, &src_surf, src_level, src_layer, @@ -1233,13 +1254,8 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer, assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT); struct blorp_surf surf; - get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT, &surf); - surf.aux_surf = &image->aux_surface.isl; - surf.aux_addr = (struct blorp_address) { - .buffer = image->bo, - .offset = image->offset + image->aux_surface.offset, - }; - surf.aux_usage = att_state->aux_usage; + get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT, + att_state->aux_usage, &surf); for (uint32_t layer = 0; layer < fb->layers; layer++) { blorp_ccs_resolve(batch, &surf, diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 1fd0434d756..1ba4c51f2f8 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -242,6 +242,7 @@ anv_image_create(VkDevice _device, image->samples = pCreateInfo->samples; image->usage = pCreateInfo->usage; image->tiling = pCreateInfo->tiling; + image->aux_usage = ISL_AUX_USAGE_NONE; uint32_t b; for_each_bit(b, image->aspects) { @@ -507,6 +508,8 @@ anv_CreateImageView(VkDevice _device, iview->sampler_surface_state.map, .surf = &surface->isl, .view = &view, + .aux_surf = &image->aux_surface.isl, + .aux_usage = image->aux_usage, .mocs = device->default_mocs); if (!device->info.has_llc) @@ -529,6 +532,8 @@ anv_CreateImageView(VkDevice _device, iview->storage_surface_state.map, .surf = &surface->isl, .view = &view, + .aux_surf = &image->aux_surface.isl, + .aux_usage = image->aux_usage, .mocs = device->default_mocs); } else { anv_fill_buffer_surface_state(device, iview->storage_surface_state, diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index bb7837e3c0a..7d7380a9d46 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1555,6 +1555,9 @@ struct anv_image { }; }; + /** The aux usage for this surface when outside a render pass */ + enum isl_aux_usage aux_usage; + struct anv_surface aux_surface; }; diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index dc97f03f66c..8da432e259a 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -946,14 +946,16 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, surface_state = desc->image_view->sampler_surface_state; assert(surface_state.alloc_size); add_image_view_relocs(cmd_buffer, desc->image_view, - ISL_AUX_USAGE_NONE, surface_state); + desc->image_view->image->aux_usage, + surface_state); break; case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: { surface_state = desc->image_view->storage_surface_state; assert(surface_state.alloc_size); add_image_view_relocs(cmd_buffer, desc->image_view, - ISL_AUX_USAGE_NONE, surface_state); + desc->image_view->image->aux_usage, + surface_state); struct brw_image_param *image_param = &cmd_buffer->state.push_constants[stage]->images[image++]; |