diff --git a/.pick_status.json b/.pick_status.json index d84ad010edb..59b16540873 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -164,7 +164,7 @@ "description": "nvk: Capture/replay buffer addresses for EDB capture/replay", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "3f1c3f04be93a3efaaac794cd48a825907ad07fe", "notes": null diff --git a/src/nouveau/vulkan/nvk_buffer.c b/src/nouveau/vulkan/nvk_buffer.c index 55faf24750c..ce780b9ecbe 100644 --- a/src/nouveau/vulkan/nvk_buffer.c +++ b/src/nouveau/vulkan/nvk_buffer.c @@ -11,6 +11,10 @@ #include "nvk_queue.h" #include "nvkmd/nvkmd.h" +#define NVK_BUFFER_CREATE_CAPTURE_REPLAY_BITS \ + (VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT | \ + VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT) + static uint32_t nvk_get_buffer_alignment(const struct nvk_physical_device *pdev, VkBufferUsageFlags2KHR usage_flags, @@ -32,7 +36,7 @@ nvk_get_buffer_alignment(const struct nvk_physical_device *pdev, alignment = MAX2(alignment, NVK_DGC_ALIGN); if (create_flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT | - VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT)) + NVK_BUFFER_CREATE_CAPTURE_REPLAY_BITS)) alignment = MAX2(alignment, pdev->nvkmd->bind_align_B); return alignment; @@ -70,6 +74,22 @@ nvk_get_bda_replay_addr(const VkBufferCreateInfo *pCreateInfo) break; } + case VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT: { + const VkOpaqueCaptureDescriptorDataCreateInfoEXT *dd = (void *)ext; + if (dd->opaqueCaptureDescriptorData != NULL) { + uint64_t dd_addr = 0; + memcpy(&dd_addr, dd->opaqueCaptureDescriptorData, sizeof(dd_addr)); + +#ifdef NDEBUG + return dd_addr; +#else + assert(addr == 0 || dd_addr == addr); + addr = dd_addr; +#endif + } + break; + } + default: break; } @@ -98,7 +118,7 @@ nvk_CreateBuffer(VkDevice device, if (buffer->vk.size > 0 && (buffer->vk.create_flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT | - VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT))) { + NVK_BUFFER_CREATE_CAPTURE_REPLAY_BITS))) { const uint32_t alignment = nvk_get_buffer_alignment(nvk_device_physical(dev), buffer->vk.usage, @@ -111,7 +131,7 @@ nvk_CreateBuffer(VkDevice device, va_flags |= NVKMD_VA_SPARSE; uint64_t fixed_addr = 0; - if (buffer->vk.create_flags & VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT) { + if (buffer->vk.create_flags & NVK_BUFFER_CREATE_CAPTURE_REPLAY_BITS) { va_flags |= NVKMD_VA_REPLAY; fixed_addr = nvk_get_bda_replay_addr(pCreateInfo); @@ -327,5 +347,10 @@ nvk_GetBufferOpaqueCaptureDescriptorDataEXT( const VkBufferCaptureDescriptorDataInfoEXT *pInfo, void *pData) { + VK_FROM_HANDLE(nvk_buffer, buffer, pInfo->buffer); + const uint64_t addr = vk_buffer_address(&buffer->vk, 0); + + memcpy(pData, &addr, sizeof(addr)); + return VK_SUCCESS; } diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index a3923b62f97..5374e991780 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -1045,7 +1045,7 @@ nvk_get_device_properties(const struct nvk_instance *instance, .maxSamplerDescriptorBufferBindings = 32, .maxEmbeddedImmutableSamplerBindings = 32, .maxEmbeddedImmutableSamplers = 4000, - .bufferCaptureReplayDescriptorDataSize = 0, + .bufferCaptureReplayDescriptorDataSize = sizeof(uint64_t), .imageCaptureReplayDescriptorDataSize = 0, .imageViewCaptureReplayDescriptorDataSize = sizeof(struct nvk_image_view_capture),