From b461335f64cd004fb20df337c761196123bd54aa Mon Sep 17 00:00:00 2001 From: Luigi Santivetti Date: Wed, 22 Nov 2023 09:51:06 +0000 Subject: [PATCH] pvr: add support for VK_KHR_maintenance1 VK_KHR_maintenance1 is a collection of several tweaks and additions to the 1.0 version of the Vulkan spec, promoted to core in more recent versions. This change exposes the extension and only adds what was missing from our implementation, however the driver largely already had support for what is required by this extension. Signed-off-by: Luigi Santivetti Acked-by: Erik Faye-Lund Part-of: --- docs/features.txt | 2 +- src/imagination/vulkan/pvr_cmd_buffer.c | 12 ++++++++---- src/imagination/vulkan/pvr_device.c | 1 + src/imagination/vulkan/pvr_image.c | 6 ++++++ src/imagination/vulkan/pvr_tex_state.c | 2 ++ 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index 7560df67f24..01dcd9cf8c7 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -449,7 +449,7 @@ Vulkan 1.1 -- all DONE: anv, hk, lvp, nvk, panvk/v10+, radv, tu, vn VK_KHR_external_semaphore_capabilities DONE (anv, dzn, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) VK_KHR_get_memory_requirements2 DONE (anv, dzn, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) VK_KHR_get_physical_device_properties2 DONE (anv, dzn, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) - VK_KHR_maintenance1 DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn) + VK_KHR_maintenance1 DONE (anv, dzn, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) VK_KHR_maintenance2 DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn) VK_KHR_maintenance3 DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn) VK_KHR_multiview DONE (anv, dzn, hasvk, lvp, nvk, panvk/v10+, radv, tu, v3dv, vn) diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index 41a441968df..41115aed7e8 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -1027,9 +1027,12 @@ static void pvr_setup_pbe_state( surface_params.addr = PVR_DEV_ADDR_OFFSET(image->vma->dev_addr, image->mip_levels[iview->vk.base_mip_level].offset); - surface_params.addr = - PVR_DEV_ADDR_OFFSET(surface_params.addr, - iview->vk.base_array_layer * image->layer_size); + + if (!iview->vk.storage.z_slice_offset) { + surface_params.addr = + PVR_DEV_ADDR_OFFSET(surface_params.addr, + iview->vk.base_array_layer * image->layer_size); + } surface_params.mem_layout = image->memlayout; surface_params.stride = pvr_stride_from_pitch(level_pitch, iview->vk.format); @@ -1087,7 +1090,8 @@ static void pvr_setup_pbe_state( #undef PVR_DEC_IF_NOT_ZERO - render_params.slice = 0; + render_params.slice = iview->vk.storage.z_slice_offset; + render_params.mrt_index = mrt_index; pvr_pbe_pack_state(dev_info, diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index 8b67492f376..3e08b013174 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -182,6 +182,7 @@ static void pvr_physical_device_get_supported_extensions( .KHR_get_memory_requirements2 = true, .KHR_image_format_list = true, .KHR_index_type_uint8 = false, + .KHR_maintenance1 = true, .KHR_present_id2 = PVR_USE_WSI_PLATFORM, .KHR_present_wait2 = PVR_USE_WSI_PLATFORM, .KHR_shader_expect_assume = false, diff --git a/src/imagination/vulkan/pvr_image.c b/src/imagination/vulkan/pvr_image.c index 88c11328908..80f3e18ed9f 100644 --- a/src/imagination/vulkan/pvr_image.c +++ b/src/imagination/vulkan/pvr_image.c @@ -328,6 +328,12 @@ VkResult pvr_CreateImageView(VkDevice _device, image = pvr_image_view_get_image(iview); + if (image->vk.image_type == VK_IMAGE_TYPE_3D && + (iview->vk.view_type == VK_IMAGE_VIEW_TYPE_2D_ARRAY || + iview->vk.view_type == VK_IMAGE_VIEW_TYPE_2D)) { + iview->vk.layer_count = image->vk.extent.depth; + } + info.type = iview->vk.view_type; info.base_level = iview->vk.base_mip_level; info.mip_levels = iview->vk.level_count; diff --git a/src/imagination/vulkan/pvr_tex_state.c b/src/imagination/vulkan/pvr_tex_state.c index b1a360d8e71..e120a893b0d 100644 --- a/src/imagination/vulkan/pvr_tex_state.c +++ b/src/imagination/vulkan/pvr_tex_state.c @@ -117,6 +117,8 @@ VkResult pvr_pack_tex_state(struct pvr_device *device, } } else if (mem_layout == PVR_MEMLAYOUT_3DTWIDDLED) { switch (iview_type) { + case VK_IMAGE_VIEW_TYPE_2D: + case VK_IMAGE_VIEW_TYPE_2D_ARRAY: case VK_IMAGE_VIEW_TYPE_3D: word0.textype = ROGUE_TEXSTATE_TEXTYPE_3D; break;