From 953fca352bf59cd0ecc205354aea562cd743662e Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Wed, 29 Oct 2025 10:58:59 -0700 Subject: [PATCH] tu: Add capture/replay for sparse buffers and descriptor buffer. This matches the behavior of radv for these two. Fixes: dEQP-VK.binding_model.descriptor_buffer.traditional_buffer.capture_replay.sparse_buffer_descriptor_data_consistency dEQP-VK.binding_model.descriptor_buffer.traditional_buffer.capture_replay.sparse_buffer_descriptor_data_consistency_and_usage Fixes: 8feed47fce26 ("tu: Initial support for sparse binding") (cherry picked from commit 7372c7c9e20341fa0edf0bea62c1b119076628e2) Part-of: --- .pick_status.json | 2 +- src/freedreno/ci/freedreno-a618-fails.txt | 3 --- src/freedreno/ci/freedreno-a660-fails.txt | 2 -- src/freedreno/ci/freedreno-a750-fails.txt | 3 --- src/freedreno/vulkan/tu_buffer.cc | 23 +++++++++++++++++++++++ src/freedreno/vulkan/tu_device.cc | 2 +- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index a773c0a3f3f..961afc1864e 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -4654,7 +4654,7 @@ "description": "tu: Add capture/replay for sparse buffers and descriptor buffer.", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "8feed47fce263438d1b2546e8f3475a4e0caa8d6", "notes": null diff --git a/src/freedreno/ci/freedreno-a618-fails.txt b/src/freedreno/ci/freedreno-a618-fails.txt index 1a28be6df9d..707a5910674 100644 --- a/src/freedreno/ci/freedreno-a618-fails.txt +++ b/src/freedreno/ci/freedreno-a618-fails.txt @@ -244,8 +244,6 @@ gmem-dEQP-VK.transform_feedback.simple.draw_indirect_multiview_counter_offset_16 nobin-dEQP-VK.transform_feedback.simple.draw_indirect_multiview_counter_offset_16,Fail # New failures with VKCTS 1.4.4.0 -dEQP-VK.binding_model.descriptor_buffer.traditional_buffer.capture_replay.sparse_buffer_descriptor_data_consistency_and_usage,Fail -dEQP-VK.binding_model.descriptor_buffer.traditional_buffer.capture_replay.sparse_buffer_descriptor_data_consistency,Fail dEQP-VK.pipeline.monolithic.misc.identically_defined_layout,Fail dEQP-VK.renderpasses.dynamic_rendering.complete_secondary_cmd_buff.fragment_density_map.offset.clamp_to_edge.hor_offset_negative,Fail dEQP-VK.renderpasses.dynamic_rendering.complete_secondary_cmd_buff.fragment_density_map.offset.clamp_to_edge.hor_offset_negative_multiview,Fail @@ -341,7 +339,6 @@ dEQP-VK.renderpasses.renderpass2.fragment_density_map.offset.oversized_fdm.vert_ dEQP-VK.renderpasses.renderpass2.fragment_density_map.offset.oversized_fdm.vert_offset_negative,Fail dEQP-VK.tessellation.misc_draw.tess_factor_barrier_bug,Crash bypass-dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.basic.partial_binding_depth_stencil,Fail -gmem-dEQP-VK.binding_model.descriptor_buffer.traditional_buffer.capture_replay.sparse_buffer_descriptor_data_consistency_and_usage,Fail gmem-dEQP-VK.renderpasses.dynamic_rendering.complete_secondary_cmd_buff.fragment_density_map.offset.clamp_to_edge.vert_offset_negative,Fail gmem-dEQP-VK.renderpasses.dynamic_rendering.complete_secondary_cmd_buff.fragment_density_map.offset.oversized_fdm.vert_offset_negative_suspend_resume,Fail gmem-dEQP-VK.renderpasses.dynamic_rendering.partial_secondary_cmd_buff.fragment_density_map.offset.min_shift.hor_offset_negative_multiview,Fail diff --git a/src/freedreno/ci/freedreno-a660-fails.txt b/src/freedreno/ci/freedreno-a660-fails.txt index 03efe9d01d5..6238737e68d 100644 --- a/src/freedreno/ci/freedreno-a660-fails.txt +++ b/src/freedreno/ci/freedreno-a660-fails.txt @@ -41,8 +41,6 @@ gmem-dEQP-VK.transform_feedback.simple.draw_indirect_multiview_counter_offset_24 nobin-dEQP-VK.transform_feedback.simple.draw_indirect_multiview_counter_offset_16,Fail # New failures with VKCTS 1.4.4.0 -dEQP-VK.binding_model.descriptor_buffer.traditional_buffer.capture_replay.sparse_buffer_descriptor_data_consistency_and_usage,Fail -dEQP-VK.binding_model.descriptor_buffer.traditional_buffer.capture_replay.sparse_buffer_descriptor_data_consistency,Fail dEQP-VK.pipeline.monolithic.misc.identically_defined_layout,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.basic.partial_binding_depth_stencil,Fail dEQP-VK.tessellation.misc_draw.tess_factor_barrier_bug,Crash diff --git a/src/freedreno/ci/freedreno-a750-fails.txt b/src/freedreno/ci/freedreno-a750-fails.txt index 30bb5758c80..dbb042e3e2a 100644 --- a/src/freedreno/ci/freedreno-a750-fails.txt +++ b/src/freedreno/ci/freedreno-a750-fails.txt @@ -29,11 +29,8 @@ dynamic-dEQP-VK.renderpass2.depth_stencil_resolve.image_2d_32_32.samples_2.d32_s dynamic-dEQP-VK.renderpass2.depth_stencil_resolve.image_2d_32_32.samples_2.d32_sfloat_s8_uint_separate_layouts.compatibility_depth_zero_stencil_zero_testing_stencil,Fail # New failures with VKCTS 1.4.4.0 -dEQP-VK.binding_model.descriptor_buffer.traditional_buffer.capture_replay.sparse_buffer_descriptor_data_consistency_and_usage,Fail -dEQP-VK.binding_model.descriptor_buffer.traditional_buffer.capture_replay.sparse_buffer_descriptor_data_consistency,Fail dEQP-VK.pipeline.monolithic.misc.identically_defined_layout,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.basic.partial_binding_depth_stencil,Fail -gmem-dEQP-VK.binding_model.descriptor_buffer.traditional_buffer.capture_replay.sparse_buffer_descriptor_data_consistency_and_usage,Fail # Bad assumptions in piglit about layout of multiplanar formats, diff --git a/src/freedreno/vulkan/tu_buffer.cc b/src/freedreno/vulkan/tu_buffer.cc index 429e8f28309..e7f6a549d56 100644 --- a/src/freedreno/vulkan/tu_buffer.cc +++ b/src/freedreno/vulkan/tu_buffer.cc @@ -38,6 +38,8 @@ tu_CreateBuffer(VkDevice _device, flags |= TU_SPARSE_VMA_MAP_ZERO; if (pCreateInfo->flags & VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT) flags |= TU_SPARSE_VMA_REPLAYABLE; + if (pCreateInfo->flags & VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT) + flags |= TU_SPARSE_VMA_REPLAYABLE; const VkBufferOpaqueCaptureAddressCreateInfo *replay_info = vk_find_struct_const(pCreateInfo->pNext, @@ -47,6 +49,13 @@ tu_CreateBuffer(VkDevice _device, flags |= TU_SPARSE_VMA_REPLAYABLE; } + const VkOpaqueCaptureDescriptorDataCreateInfoEXT *descriptor_replay_info = + vk_find_struct_const(pCreateInfo->pNext, OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT); + if (descriptor_replay_info && descriptor_replay_info->opaqueCaptureDescriptorData) { + client_address = *(const uint64_t *) descriptor_replay_info->opaqueCaptureDescriptorData; + flags |= TU_SPARSE_VMA_REPLAYABLE; + } + VkResult result = tu_sparse_vma_init(device, &buffer->vk.base, &buffer->vma, &buffer->vk.device_address, flags, @@ -231,3 +240,17 @@ uint64_t tu_GetBufferOpaqueCaptureAddress( return 0; } + +VkResult VKAPI_CALL +tu_GetBufferOpaqueCaptureDescriptorDataEXT(VkDevice device, + const VkBufferCaptureDescriptorDataInfoEXT *pInfo, + void *pData) +{ + VK_FROM_HANDLE(tu_buffer, buffer, pInfo->buffer); + + /* Save the buffer iova so that when replaying sparse buffers have a + * consistent iova and therefore consistent descriptor contents. + */ + *(uint64_t *)pData = buffer->vk.device_address; + return VK_SUCCESS; +} diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc index a57dfe5b6ce..15c865c3943 100644 --- a/src/freedreno/vulkan/tu_device.cc +++ b/src/freedreno/vulkan/tu_device.cc @@ -1348,7 +1348,7 @@ tu_get_properties(struct tu_physical_device *pdevice, props->maxSamplerDescriptorBufferBindings = pdevice->usable_sets; props->maxEmbeddedImmutableSamplerBindings = pdevice->usable_sets; props->maxEmbeddedImmutableSamplers = max_descriptor_set_size; - props->bufferCaptureReplayDescriptorDataSize = 0; + props->bufferCaptureReplayDescriptorDataSize = sizeof(uint64_t); props->imageCaptureReplayDescriptorDataSize = sizeof(uint64_t); props->imageViewCaptureReplayDescriptorDataSize = 0; props->samplerCaptureReplayDescriptorDataSize = 0;