From 05c0015d6553509a787fd05e9eb1c936f60ddcd4 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Mon, 1 Jul 2024 16:49:38 +0300 Subject: [PATCH] anv: propagate protected information for blorp operations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lionel Landwerlin Cc: mesa-stable Reviewed-by: José Roberto de Souza Part-of: (cherry picked from commit d5b05265077adbbc6cf7a9c9a5e767fea7b165e8) --- .pick_status.json | 2 +- src/intel/vulkan/anv_blorp.c | 36 ++++++++++++++++++++++------------ src/intel/vulkan/anv_private.h | 15 +++++++++++++- src/intel/vulkan/genX_query.c | 7 +++++-- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index b3a8c1d44a6..26dfff7e050 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -804,7 +804,7 @@ "description": "anv: propagate protected information for blorp operations", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index 1fec49fdedd..5f2d6344078 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -180,7 +180,7 @@ anv_blorp_batch_finish(struct blorp_batch *batch) static isl_surf_usage_flags_t get_usage_flag_for_cmd_buffer(const struct anv_cmd_buffer *cmd_buffer, - bool is_dest) + bool is_dest, bool protected) { isl_surf_usage_flags_t usage; @@ -201,6 +201,9 @@ get_usage_flag_for_cmd_buffer(const struct anv_cmd_buffer *cmd_buffer, unreachable("Unhandled engine class"); } + if (protected) + usage |= ISL_SURF_USAGE_PROTECTED_BIT; + return usage; } @@ -209,13 +212,13 @@ get_blorp_surf_for_anv_address(struct anv_cmd_buffer *cmd_buffer, struct anv_address address, uint32_t width, uint32_t height, uint32_t row_pitch, enum isl_format format, - bool is_dest, + bool is_dest, bool protected, struct blorp_surf *blorp_surf, struct isl_surf *isl_surf) { bool ok UNUSED; isl_surf_usage_flags_t usage = - get_usage_flag_for_cmd_buffer(cmd_buffer, is_dest); + get_usage_flag_for_cmd_buffer(cmd_buffer, is_dest, protected); *blorp_surf = (struct blorp_surf) { .surf = isl_surf, @@ -253,7 +256,8 @@ get_blorp_surf_for_anv_buffer(struct anv_cmd_buffer *cmd_buffer, get_blorp_surf_for_anv_address(cmd_buffer, anv_address_add(buffer->address, offset), width, height, row_pitch, format, - is_dest, blorp_surf, isl_surf); + is_dest, anv_buffer_is_protected(buffer), + blorp_surf, isl_surf); } /* Pick something high enough that it won't be used in core and low enough it @@ -291,7 +295,8 @@ get_blorp_surf_for_anv_image(const struct anv_cmd_buffer *cmd_buffer, isl_surf_usage_flags_t isl_usage = get_usage_flag_for_cmd_buffer(cmd_buffer, - usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT); + usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT, + anv_image_is_protected(image)); const struct anv_surface *surface = &image->planes[plane].primary_surface; const struct anv_address address = anv_image_address(image, &surface->memory_range); @@ -1131,14 +1136,17 @@ void anv_CmdUpdateBuffer( .offset = tmp_addr.offset, .mocs = anv_mocs(cmd_buffer->device, NULL, get_usage_flag_for_cmd_buffer(cmd_buffer, - false /* is_dest */)), + false /* is_dest */, + false /* protected */)), }; struct blorp_address dst = { .buffer = dst_buffer->address.bo, .offset = dst_buffer->address.offset + dstOffset, .mocs = anv_mocs(cmd_buffer->device, dst_buffer->address.bo, - get_usage_flag_for_cmd_buffer(cmd_buffer, - true /* is_dest */)), + get_usage_flag_for_cmd_buffer( + cmd_buffer, + true /* is_dest */, + anv_buffer_is_protected(dst_buffer))), }; blorp_buffer_copy(&batch, src, dst, copy_size); @@ -1157,7 +1165,8 @@ void anv_cmd_buffer_fill_area(struct anv_cmd_buffer *cmd_buffer, struct anv_address address, VkDeviceSize size, - uint32_t data) + uint32_t data, + bool protected) { struct blorp_surf surf; struct isl_surf isl_surf; @@ -1189,7 +1198,7 @@ anv_cmd_buffer_fill_area(struct anv_cmd_buffer *cmd_buffer, }, MAX_SURFACE_DIM, MAX_SURFACE_DIM, MAX_SURFACE_DIM * bs, isl_format, - true /* is_dest */, + true /* is_dest */, protected, &surf, &isl_surf); blorp_clear(&batch, &surf, isl_format, ISL_SWIZZLE_IDENTITY, @@ -1209,7 +1218,7 @@ anv_cmd_buffer_fill_area(struct anv_cmd_buffer *cmd_buffer, }, MAX_SURFACE_DIM, height, MAX_SURFACE_DIM * bs, isl_format, - true /* is_dest */, + true /* is_dest */, protected, &surf, &isl_surf); blorp_clear(&batch, &surf, isl_format, ISL_SWIZZLE_IDENTITY, @@ -1227,7 +1236,7 @@ anv_cmd_buffer_fill_area(struct anv_cmd_buffer *cmd_buffer, }, width, 1, width * bs, isl_format, - true /* is_dest */, + true /* is_dest */, protected, &surf, &isl_surf); blorp_clear(&batch, &surf, isl_format, ISL_SWIZZLE_IDENTITY, @@ -1262,7 +1271,8 @@ void anv_CmdFillBuffer( anv_cmd_buffer_fill_area(cmd_buffer, anv_address_add(dst_buffer->address, dstOffset), - fillSize, data); + fillSize, data, + anv_buffer_is_protected(dst_buffer)); anv_add_buffer_write_pending_bits(cmd_buffer, "after fill buffer"); } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index f06b377305d..3136ec3214e 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3156,6 +3156,12 @@ struct anv_buffer { struct anv_sparse_binding_data sparse_data; }; +static inline bool +anv_buffer_is_protected(const struct anv_buffer *buffer) +{ + return buffer->vk.create_flags & VK_BUFFER_CREATE_PROTECTED_BIT; +} + static inline bool anv_buffer_is_sparse(const struct anv_buffer *buffer) { @@ -5223,6 +5229,12 @@ struct anv_image { struct list_head link; }; +static inline bool +anv_image_is_protected(const struct anv_image *image) +{ + return image->vk.create_flags & VK_IMAGE_CREATE_PROTECTED_BIT; +} + static inline bool anv_image_is_sparse(const struct anv_image *image) { @@ -5587,7 +5599,8 @@ void anv_cmd_buffer_fill_area(struct anv_cmd_buffer *cmd_buffer, struct anv_address address, VkDeviceSize size, - uint32_t data); + uint32_t data, + bool protected); VkResult anv_cmd_buffer_ensure_rcs_companion(struct anv_cmd_buffer *cmd_buffer); diff --git a/src/intel/vulkan/genX_query.c b/src/intel/vulkan/genX_query.c index 42d0c2a03b9..e24db439087 100644 --- a/src/intel/vulkan/genX_query.c +++ b/src/intel/vulkan/genX_query.c @@ -789,15 +789,18 @@ void genX(CmdResetQueryPool)( ANV_FROM_HANDLE(anv_query_pool, pool, queryPool); struct anv_physical_device *pdevice = cmd_buffer->device->physical; - /* Shader clearing is only possible on render/compute */ + /* Shader clearing is only possible on render/compute when not in protected + * mode. + */ if (anv_cmd_buffer_is_render_or_compute_queue(cmd_buffer) && + (cmd_buffer->vk.pool->flags & VK_COMMAND_POOL_CREATE_PROTECTED_BIT) != 0 && queryCount >= pdevice->instance->query_clear_with_blorp_threshold) { trace_intel_begin_query_clear_blorp(&cmd_buffer->trace); anv_cmd_buffer_fill_area(cmd_buffer, anv_query_address(pool, firstQuery), queryCount * pool->stride, - 0); + 0, false); /* The pending clearing writes are in compute if we're in gpgpu mode on * the render engine or on the compute engine.