nvk: Implement bufferDeviceAddressCaptureReplay
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10158 Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26242>
This commit is contained in:

committed by
Marge Bot

parent
b4cfac64c8
commit
7f6d3b82c8
@@ -26,12 +26,53 @@ nvk_get_buffer_alignment(UNUSED const struct nv_device_info *info,
|
|||||||
VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR))
|
VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR))
|
||||||
alignment = MAX2(alignment, NVK_MIN_UBO_ALIGNMENT);
|
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);
|
alignment = MAX2(alignment, 4096);
|
||||||
|
|
||||||
return alignment;
|
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
|
VKAPI_ATTR VkResult VKAPI_CALL
|
||||||
nvk_CreateBuffer(VkDevice device,
|
nvk_CreateBuffer(VkDevice device,
|
||||||
const VkBufferCreateInfo *pCreateInfo,
|
const VkBufferCreateInfo *pCreateInfo,
|
||||||
@@ -50,7 +91,8 @@ nvk_CreateBuffer(VkDevice device,
|
|||||||
return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
|
return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||||
|
|
||||||
if (buffer->vk.size > 0 &&
|
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 =
|
const uint32_t alignment =
|
||||||
nvk_get_buffer_alignment(&nvk_device_physical(dev)->info,
|
nvk_get_buffer_alignment(&nvk_device_physical(dev)->info,
|
||||||
buffer->vk.usage,
|
buffer->vk.usage,
|
||||||
@@ -60,9 +102,17 @@ nvk_CreateBuffer(VkDevice device,
|
|||||||
|
|
||||||
const bool sparse_residency =
|
const bool sparse_residency =
|
||||||
buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
|
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;
|
||||||
|
|
||||||
buffer->addr = nouveau_ws_alloc_vma(dev->ws_dev, 0, buffer->vma_size_B,
|
uint64_t bda_replay_addr = 0;
|
||||||
alignment, false, sparse_residency);
|
if (bda_capture_replay)
|
||||||
|
bda_replay_addr = nvk_get_bda_replay_addr(pCreateInfo);
|
||||||
|
|
||||||
|
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) {
|
if (buffer->addr == 0) {
|
||||||
vk_buffer_destroy(&dev->vk, pAllocator, &buffer->vk);
|
vk_buffer_destroy(&dev->vk, pAllocator, &buffer->vk);
|
||||||
return vk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY,
|
return vk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY,
|
||||||
@@ -89,10 +139,12 @@ nvk_DestroyBuffer(VkDevice device,
|
|||||||
if (buffer->vma_size_B > 0) {
|
if (buffer->vma_size_B > 0) {
|
||||||
const bool sparse_residency =
|
const bool sparse_residency =
|
||||||
buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
|
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_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,
|
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);
|
vk_buffer_destroy(&dev->vk, pAllocator, &buffer->vk);
|
||||||
|
@@ -237,7 +237,7 @@ nvk_get_device_features(const struct nv_device_info *info,
|
|||||||
.hostQueryReset = true,
|
.hostQueryReset = true,
|
||||||
.timelineSemaphore = true,
|
.timelineSemaphore = true,
|
||||||
.bufferDeviceAddress = true,
|
.bufferDeviceAddress = true,
|
||||||
.bufferDeviceAddressCaptureReplay = false,
|
.bufferDeviceAddressCaptureReplay = true,
|
||||||
.bufferDeviceAddressMultiDevice = false,
|
.bufferDeviceAddressMultiDevice = false,
|
||||||
.shaderOutputViewportIndex = info->cls_eng3d >= MAXWELL_B,
|
.shaderOutputViewportIndex = info->cls_eng3d >= MAXWELL_B,
|
||||||
.shaderOutputLayer = 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,
|
.borderColorSwizzleFromImage = false,
|
||||||
|
|
||||||
/* VK_EXT_buffer_device_address */
|
/* VK_EXT_buffer_device_address */
|
||||||
.bufferDeviceAddressCaptureReplayEXT = false,
|
.bufferDeviceAddressCaptureReplayEXT = true,
|
||||||
|
|
||||||
/* VK_EXT_conditional_rendering */
|
/* VK_EXT_conditional_rendering */
|
||||||
.conditionalRendering = true,
|
.conditionalRendering = true,
|
||||||
|
Reference in New Issue
Block a user