From c8d64860ec751add841870139d6bdda9120d4e2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Briano?= Date: Mon, 8 Jul 2024 11:37:57 -0700 Subject: [PATCH] anv: set MOCS for protected memory when needed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We were missing setting the EncryptedData bit in the MOCS field when emitting the surface states for protected buffer/images. How this works on ADL remains a mystery to me. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/11313 Reviewed-by: José Roberto de Souza Part-of: --- src/intel/vulkan/anv_descriptor_set.c | 2 ++ src/intel/vulkan/anv_device.c | 2 ++ src/intel/vulkan/anv_image.c | 3 +++ src/intel/vulkan/genX_cmd_buffer.c | 15 ++++++++++++++- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c index 21fa7f534ca..1088ed521e1 100644 --- a/src/intel/vulkan/anv_descriptor_set.c +++ b/src/intel/vulkan/anv_descriptor_set.c @@ -2470,6 +2470,8 @@ anv_descriptor_set_write_buffer(struct anv_device *device, enum isl_format format = anv_isl_format_for_descriptor_type(device, desc->type); + if (bind_addr.bo && bind_addr.bo->alloc_flags & ANV_BO_ALLOC_PROTECTED) + usage |= ISL_SURF_USAGE_PROTECTED_BIT; isl_buffer_fill_state(&device->isl_dev, desc_map, .address = anv_address_physical(bind_addr), .mocs = isl_mocs(&device->isl_dev, usage, diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 598a80a033c..5c81aa96a6c 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -5352,6 +5352,8 @@ anv_fill_buffer_surface_state(struct anv_device *device, struct anv_address address, uint32_t range, uint32_t stride) { + if (address.bo && address.bo->alloc_flags & ANV_BO_ALLOC_PROTECTED) + usage |= ISL_SURF_USAGE_PROTECTED_BIT; isl_buffer_fill_state(&device->isl_dev, surface_state_ptr, .address = anv_address_physical(address), .mocs = isl_mocs(&device->isl_dev, usage, diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 7186f7f492c..35dda2311da 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -3349,6 +3349,9 @@ anv_image_fill_surface_state(struct anv_device *device, } state_inout->clear_address = clear_address; + if (image->vk.create_flags & VK_IMAGE_CREATE_PROTECTED_BIT) + view_usage |= ISL_SURF_USAGE_PROTECTED_BIT; + isl_surf_fill_state(&device->isl_dev, surface_state_map, .surf = isl_surf, .view = &view, diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index e419d1403a9..f0af5222423 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -107,7 +107,20 @@ fill_state_base_addr(struct anv_cmd_buffer *cmd_buffer, sba->GeneralStateBaseAddressModifyEnable = true; sba->GeneralStateBufferSizeModifyEnable = true; - sba->StatelessDataPortAccessMOCS = mocs; +#if GFX_VERx10 == 120 + /* Since DG2, scratch surfaces have their own surface state with its own + * MOCS setting, but prior to that, the MOCS for scratch accesses are + * governed by SBA.StatelessDataPortAccessMOCS. + */ + const isl_surf_usage_flags_t protected_usage = + cmd_buffer->vk.pool->flags & VK_COMMAND_POOL_CREATE_PROTECTED_BIT ? + ISL_SURF_USAGE_PROTECTED_BIT : 0; + const uint32_t stateless_mocs = isl_mocs(&device->isl_dev, protected_usage, false); +#else + const uint32_t stateless_mocs = mocs; +#endif + + sba->StatelessDataPortAccessMOCS = stateless_mocs; #if GFX_VERx10 >= 125 sba->SurfaceStateBaseAddress =