diff --git a/src/nouveau/vulkan/meson.build b/src/nouveau/vulkan/meson.build index c4cdf80047c..dc0072bbf99 100644 --- a/src/nouveau/vulkan/meson.build +++ b/src/nouveau/vulkan/meson.build @@ -2,6 +2,7 @@ # SPDX-License-Identifier: MIT nvk_files = files( '../../gallium/auxiliary/tgsi/tgsi_from_mesa.c', + 'nvk_acceleration_structure.c', 'nvk_buffer.c', 'nvk_buffer.h', 'nvk_buffer_view.c', diff --git a/src/nouveau/vulkan/nvk_acceleration_structure.c b/src/nouveau/vulkan/nvk_acceleration_structure.c new file mode 100644 index 00000000000..dba1c1f3376 --- /dev/null +++ b/src/nouveau/vulkan/nvk_acceleration_structure.c @@ -0,0 +1,15 @@ +/* + * Copyright © 2022 Collabora Ltd. and Red Hat Inc. + * SPDX-License-Identifier: MIT + */ + +#include "nvk_entrypoints.h" + +VKAPI_ATTR VkResult VKAPI_CALL +nvk_GetAccelerationStructureOpaqueCaptureDescriptorDataEXT( + VkDevice device, + const VkAccelerationStructureCaptureDescriptorDataInfoEXT *pInfo, + void *pData) +{ + return VK_SUCCESS; +} diff --git a/src/nouveau/vulkan/nvk_buffer.c b/src/nouveau/vulkan/nvk_buffer.c index bd658e75e59..aca246b6c9c 100644 --- a/src/nouveau/vulkan/nvk_buffer.c +++ b/src/nouveau/vulkan/nvk_buffer.c @@ -325,3 +325,12 @@ nvk_queue_buffer_bind(struct nvk_queue *queue, return result; } + +VKAPI_ATTR VkResult VKAPI_CALL +nvk_GetBufferOpaqueCaptureDescriptorDataEXT( + VkDevice device, + const VkBufferCaptureDescriptorDataInfoEXT *pInfo, + void *pData) +{ + return VK_SUCCESS; +} diff --git a/src/nouveau/vulkan/nvk_image.c b/src/nouveau/vulkan/nvk_image.c index 3daef287b41..4ed725bcd2a 100644 --- a/src/nouveau/vulkan/nvk_image.c +++ b/src/nouveau/vulkan/nvk_image.c @@ -1713,3 +1713,12 @@ nvk_queue_image_opaque_bind(struct nvk_queue *queue, return VK_SUCCESS; } + +VKAPI_ATTR VkResult VKAPI_CALL +nvk_GetImageOpaqueCaptureDescriptorDataEXT( + VkDevice _device, + const VkImageCaptureDescriptorDataInfoEXT *pInfo, + void *pData) +{ + return VK_SUCCESS; +} diff --git a/src/nouveau/vulkan/nvk_image_view.c b/src/nouveau/vulkan/nvk_image_view.c index 1b6e98f1c78..05816006a5d 100644 --- a/src/nouveau/vulkan/nvk_image_view.c +++ b/src/nouveau/vulkan/nvk_image_view.c @@ -106,6 +106,13 @@ nvk_image_view_init(struct nvk_device *dev, VK_FROM_HANDLE(nvk_image, image, pCreateInfo->image); VkResult result; + const VkOpaqueCaptureDescriptorDataCreateInfoEXT *cap_info = + vk_find_struct_const(pCreateInfo->pNext, + OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT); + struct nvk_image_view_capture cap = {}; + if (cap_info != NULL) + memcpy(&cap, cap_info->opaqueCaptureDescriptorData, sizeof(cap)); + memset(view, 0, sizeof(*view)); vk_image_view_init(&dev->vk, &view->vk, driver_internal, pCreateInfo); @@ -181,12 +188,21 @@ nvk_image_view_init(struct nvk_device *dev, nil_image_fill_tic(&nil_image, &pdev->info, &nil_view, base_addr, &tic); - result = nvk_descriptor_table_add(dev, &dev->images, tic, sizeof(tic), - &view->planes[view_plane].sampled_desc_index); + uint32_t desc_index = 0; + if (cap_info != NULL) { + desc_index = cap.planes[view_plane].sampled_desc_index; + result = nvk_descriptor_table_insert(dev, &dev->images, + desc_index, tic, sizeof(tic)); + } else { + result = nvk_descriptor_table_add(dev, &dev->images, + tic, sizeof(tic), &desc_index); + } if (result != VK_SUCCESS) { nvk_image_view_finish(dev, view); return result; } + + view->planes[view_plane].sampled_desc_index = desc_index; } if (view->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) { @@ -219,12 +235,21 @@ nvk_image_view_init(struct nvk_device *dev, nil_image_fill_tic(&nil_image, &pdev->info, &nil_view, base_addr, &tic); - result = nvk_descriptor_table_add(dev, &dev->images, tic, sizeof(tic), - &view->planes[view_plane].storage_desc_index); + uint32_t desc_index = 0; + if (cap_info != NULL) { + desc_index = cap.planes[view_plane].storage_desc_index; + result = nvk_descriptor_table_insert(dev, &dev->images, + desc_index, tic, sizeof(tic)); + } else { + result = nvk_descriptor_table_add(dev, &dev->images, + tic, sizeof(tic), &desc_index); + } if (result != VK_SUCCESS) { nvk_image_view_finish(dev, view); return result; } + + view->planes[view_plane].storage_desc_index = desc_index; } } @@ -290,3 +315,23 @@ nvk_DestroyImageView(VkDevice _device, nvk_image_view_finish(dev, view); vk_free2(&dev->vk.alloc, pAllocator, view); } + + +VKAPI_ATTR VkResult VKAPI_CALL +nvk_GetImageViewOpaqueCaptureDescriptorDataEXT( + VkDevice _device, + const VkImageViewCaptureDescriptorDataInfoEXT *pInfo, + void *pData) +{ + VK_FROM_HANDLE(nvk_image_view, view, pInfo->imageView); + + struct nvk_image_view_capture cap = {}; + for (uint8_t p = 0; p < view->plane_count; p++) { + cap.planes[p].sampled_desc_index = view->planes[p].sampled_desc_index; + cap.planes[p].storage_desc_index = view->planes[p].storage_desc_index; + } + + memcpy(pData, &cap, sizeof(cap)); + + return VK_SUCCESS; +} diff --git a/src/nouveau/vulkan/nvk_image_view.h b/src/nouveau/vulkan/nvk_image_view.h index d3e5e873f7a..a2f402aec55 100644 --- a/src/nouveau/vulkan/nvk_image_view.h +++ b/src/nouveau/vulkan/nvk_image_view.h @@ -33,6 +33,13 @@ struct nvk_image_view { VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_image_view, vk.base, VkImageView, VK_OBJECT_TYPE_IMAGE_VIEW) +struct nvk_image_view_capture { + struct { + uint32_t sampled_desc_index; + uint32_t storage_desc_index; + } planes[3]; +}; + VkResult nvk_image_view_init(struct nvk_device *dev, struct nvk_image_view *view, bool driver_internal, diff --git a/src/nouveau/vulkan/nvk_sampler.c b/src/nouveau/vulkan/nvk_sampler.c index fd359ab83f7..5b435dc3f20 100644 --- a/src/nouveau/vulkan/nvk_sampler.c +++ b/src/nouveau/vulkan/nvk_sampler.c @@ -293,20 +293,38 @@ nvk_CreateSampler(VkDevice device, struct nvk_sampler *sampler; VkResult result; + const VkOpaqueCaptureDescriptorDataCreateInfoEXT *cap_info = + vk_find_struct_const(pCreateInfo->pNext, + OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT); + struct nvk_sampler_capture cap = {}; + if (cap_info != NULL) + memcpy(&cap, cap_info->opaqueCaptureDescriptorData, sizeof(cap)); + sampler = vk_sampler_create(&dev->vk, pCreateInfo, pAllocator, sizeof(*sampler)); if (!sampler) return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY); - uint32_t samp[8] = {}; - sampler->plane_count = 1; - nvk_sampler_fill_header(pdev, pCreateInfo, &sampler->vk, samp); - result = nvk_descriptor_table_add(dev, &dev->samplers, - samp, sizeof(samp), - &sampler->planes[0].desc_index); - if (result != VK_SUCCESS) { - vk_sampler_destroy(&dev->vk, pAllocator, &sampler->vk); - return result; + { + uint32_t samp[8] = {}; + sampler->plane_count = 1; + nvk_sampler_fill_header(pdev, pCreateInfo, &sampler->vk, samp); + + uint32_t desc_index = 0; + if (cap_info != NULL) { + desc_index = cap.planes[0].desc_index; + result = nvk_descriptor_table_insert(dev, &dev->samplers, + desc_index, samp, sizeof(samp)); + } else { + result = nvk_descriptor_table_add(dev, &dev->samplers, + samp, sizeof(samp), &desc_index); + } + if (result != VK_SUCCESS) { + vk_sampler_destroy(&dev->vk, pAllocator, &sampler->vk); + return result; + } + + sampler->planes[0].desc_index = desc_index; } /* In order to support CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT, we @@ -329,18 +347,29 @@ nvk_CreateSampler(VkDevice device, plane2_info.magFilter = chroma_filter; plane2_info.minFilter = chroma_filter; - memset(samp, 0, sizeof(samp)); + uint32_t samp[8] = {}; sampler->plane_count = 2; nvk_sampler_fill_header(pdev, &plane2_info, &sampler->vk, samp); - result = nvk_descriptor_table_add(dev, &dev->samplers, - samp, sizeof(samp), - &sampler->planes[1].desc_index); + + uint32_t desc_index = 0; + if (cap_info != NULL) { + desc_index = cap.planes[1].desc_index; + result = nvk_descriptor_table_insert(dev, &dev->samplers, + desc_index, + samp, sizeof(samp)); + } else { + result = nvk_descriptor_table_add(dev, &dev->samplers, + samp, sizeof(samp), + &desc_index); + } if (result != VK_SUCCESS) { nvk_descriptor_table_remove(dev, &dev->samplers, sampler->planes[0].desc_index); vk_sampler_destroy(&dev->vk, pAllocator, &sampler->vk); return result; } + + sampler->planes[1].desc_index = desc_index; } } @@ -367,3 +396,20 @@ nvk_DestroySampler(VkDevice device, vk_sampler_destroy(&dev->vk, pAllocator, &sampler->vk); } + +VKAPI_ATTR VkResult VKAPI_CALL +nvk_GetSamplerOpaqueCaptureDescriptorDataEXT( + VkDevice _device, + const VkSamplerCaptureDescriptorDataInfoEXT *pInfo, + void *pData) +{ + VK_FROM_HANDLE(nvk_sampler, sampler, pInfo->sampler); + + struct nvk_sampler_capture cap = {}; + for (uint8_t p = 0; p < sampler->plane_count; p++) + cap.planes[p].desc_index = sampler->planes[p].desc_index; + + memcpy(pData, &cap, sizeof(cap)); + + return VK_SUCCESS; +} diff --git a/src/nouveau/vulkan/nvk_sampler.h b/src/nouveau/vulkan/nvk_sampler.h index fcbcaa9413b..57ecfd9deb4 100644 --- a/src/nouveau/vulkan/nvk_sampler.h +++ b/src/nouveau/vulkan/nvk_sampler.h @@ -26,6 +26,12 @@ struct nvk_sampler { VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_sampler, vk.base, VkSampler, VK_OBJECT_TYPE_SAMPLER) +struct nvk_sampler_capture { + struct { + uint32_t desc_index; + } planes[2]; +}; + static void nvk_sampler_fill_header(const struct nvk_physical_device *pdev, const struct VkSamplerCreateInfo *info,