summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFaith Ekstrand <faith.ekstrand@collabora.com>2023-11-16 17:24:42 -0600
committerMarge Bot <emma+marge@anholt.net>2023-11-17 03:07:02 +0000
commit7f6d3b82c8a2120e525cef5ff69e6e5f732f85c2 (patch)
treeb862b752b86148acc1f9fb63ac4d9776d75d64f9
parentb4cfac64c8a98026d3698a2231c09a21bbe5a2f4 (diff)
nvk: Implement bufferDeviceAddressCaptureReplay
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10158 Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26242>
-rw-r--r--src/nouveau/vulkan/nvk_buffer.c62
-rw-r--r--src/nouveau/vulkan/nvk_physical_device.c4
2 files changed, 59 insertions, 7 deletions
diff --git a/src/nouveau/vulkan/nvk_buffer.c b/src/nouveau/vulkan/nvk_buffer.c
index 487f771fb34..d2d8862f51e 100644
--- a/src/nouveau/vulkan/nvk_buffer.c
+++ b/src/nouveau/vulkan/nvk_buffer.c
@@ -26,12 +26,53 @@ nvk_get_buffer_alignment(UNUSED const struct nv_device_info *info,
VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR))
alignment = MAX2(alignment, NVK_MIN_UBO_ALIGNMENT);
- if (create_flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
+ if (create_flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT |
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT))
alignment = MAX2(alignment, 4096);
return alignment;
}
+static uint64_t
+nvk_get_bda_replay_addr(const VkBufferCreateInfo *pCreateInfo)
+{
+ uint64_t addr = 0;
+ vk_foreach_struct_const(ext, pCreateInfo->pNext) {
+ switch (ext->sType) {
+ case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
+ const VkBufferOpaqueCaptureAddressCreateInfo *bda = (void *)ext;
+ if (bda->opaqueCaptureAddress != 0) {
+#ifdef NDEBUG
+ return bda->opaqueCaptureAddress;
+#else
+ assert(addr == 0 || bda->opaqueCaptureAddress == addr);
+ addr = bda->opaqueCaptureAddress;
+#endif
+ }
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
+ const VkBufferDeviceAddressCreateInfoEXT *bda = (void *)ext;
+ if (bda->deviceAddress != 0) {
+#ifdef NDEBUG
+ return bda->deviceAddress;
+#else
+ assert(addr == 0 || bda->deviceAddress == addr);
+ addr = bda->deviceAddress;
+#endif
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ return addr;
+}
+
VKAPI_ATTR VkResult VKAPI_CALL
nvk_CreateBuffer(VkDevice device,
const VkBufferCreateInfo *pCreateInfo,
@@ -50,7 +91,8 @@ nvk_CreateBuffer(VkDevice device,
return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
if (buffer->vk.size > 0 &&
- (buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)) {
+ (buffer->vk.create_flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT |
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT))) {
const uint32_t alignment =
nvk_get_buffer_alignment(&nvk_device_physical(dev)->info,
buffer->vk.usage,
@@ -60,9 +102,17 @@ nvk_CreateBuffer(VkDevice device,
const bool sparse_residency =
buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
+ const bool bda_capture_replay =
+ buffer->vk.create_flags & VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT;
+
+ uint64_t bda_replay_addr = 0;
+ if (bda_capture_replay)
+ bda_replay_addr = nvk_get_bda_replay_addr(pCreateInfo);
- buffer->addr = nouveau_ws_alloc_vma(dev->ws_dev, 0, buffer->vma_size_B,
- alignment, false, sparse_residency);
+ buffer->addr = nouveau_ws_alloc_vma(dev->ws_dev, bda_replay_addr,
+ buffer->vma_size_B,
+ alignment, bda_capture_replay,
+ sparse_residency);
if (buffer->addr == 0) {
vk_buffer_destroy(&dev->vk, pAllocator, &buffer->vk);
return vk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY,
@@ -89,10 +139,12 @@ nvk_DestroyBuffer(VkDevice device,
if (buffer->vma_size_B > 0) {
const bool sparse_residency =
buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
+ const bool bda_capture_replay =
+ buffer->vk.create_flags & VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT;
nouveau_ws_bo_unbind_vma(dev->ws_dev, buffer->addr, buffer->vma_size_B);
nouveau_ws_free_vma(dev->ws_dev, buffer->addr, buffer->vma_size_B,
- false, sparse_residency);
+ bda_capture_replay, sparse_residency);
}
vk_buffer_destroy(&dev->vk, pAllocator, &buffer->vk);
diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c
index 86252246283..0acbb70dd18 100644
--- a/src/nouveau/vulkan/nvk_physical_device.c
+++ b/src/nouveau/vulkan/nvk_physical_device.c
@@ -237,7 +237,7 @@ nvk_get_device_features(const struct nv_device_info *info,
.hostQueryReset = true,
.timelineSemaphore = true,
.bufferDeviceAddress = true,
- .bufferDeviceAddressCaptureReplay = false,
+ .bufferDeviceAddressCaptureReplay = true,
.bufferDeviceAddressMultiDevice = false,
.shaderOutputViewportIndex = info->cls_eng3d >= MAXWELL_B,
.shaderOutputLayer = info->cls_eng3d >= MAXWELL_B,
@@ -277,7 +277,7 @@ nvk_get_device_features(const struct nv_device_info *info,
.borderColorSwizzleFromImage = false,
/* VK_EXT_buffer_device_address */
- .bufferDeviceAddressCaptureReplayEXT = false,
+ .bufferDeviceAddressCaptureReplayEXT = true,
/* VK_EXT_conditional_rendering */
.conditionalRendering = true,