nvk: Implement VK_NVX_image_view_handle

This is used by DLSS to pass in image view
descriptors via parameter buffers for its
kernel launches.

Signed-off-by: Autumn Ashton <misyl@froggi.es>
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37889>
This commit is contained in:
Autumn Ashton 2025-10-15 14:58:42 +00:00 committed by Marge Bot
parent f861cd47d6
commit 15d375dc6e
5 changed files with 65 additions and 0 deletions

View file

@ -681,6 +681,7 @@ Khronos extensions that are not part of any Vulkan version:
VK_GOOGLE_user_type DONE (anv, hasvk, hk, nvk, panvk, radv, tu, vn)
VK_IMG_filter_cubic DONE (tu/a650+, vn)
VK_NV_compute_shader_derivatives DONE (anv, hasvk, nvk, radv, tu/a7xx+, vn)
VK_NVX_image_view_handle DONE (nvk)
VK_EXT_acquire_drm_display DONE (anv, hk, nvk, radv, tu, v3dv, vn)
VK_VALVE_mutable_descriptor_type DONE (anv, hasvk, hk, nvk, radv, tu, vn)
VK_AMD_buffer_marker DONE (anv, nvk, radv, tu)

View file

@ -86,3 +86,4 @@ VK_KHR_device_group on pvr
VK_KHR_buffer_device_address on pvr
GL_EXT_mesh_shader on zink
VK_KHR_wayland_surface on pvr
VK_NVX_image_view_handle on NVK

View file

@ -119,6 +119,12 @@ nvk_image_base_address(const struct nvk_image *image, uint8_t plane)
return nvk_image_plane_base_address(&image->planes[plane]);
}
static inline uint64_t
nvk_image_size_B(const struct nvk_image *image, uint8_t plane)
{
return image->planes[plane].nil.size_B;
}
static inline uint8_t
nvk_image_aspects_to_plane(const struct nvk_image *image,
VkImageAspectFlags aspectMask)

View file

@ -8,6 +8,7 @@
#include "nvk_entrypoints.h"
#include "nvk_format.h"
#include "nvk_image.h"
#include "nvk_sampler.h"
#include "nvk_physical_device.h"
#include "vk_format.h"
@ -359,3 +360,58 @@ nvk_GetImageViewOpaqueCaptureDescriptorDataEXT(
return VK_SUCCESS;
}
VKAPI_ATTR uint32_t VKAPI_CALL
nvk_GetImageViewHandleNVX(VkDevice _device,
const VkImageViewHandleInfoNVX *pInfo)
{
VK_FROM_HANDLE(nvk_image_view, view, pInfo->imageView);
VK_FROM_HANDLE(nvk_sampler, sampler, pInfo->sampler);
assert(view->plane_count == 1);
uint32_t handle = 0;
if (pInfo->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) {
struct nvk_storage_image_descriptor desc;
STATIC_ASSERT(sizeof(desc) == sizeof(handle));
desc.image_index = view->planes[0].storage_desc_index;
memcpy(&handle, &desc, sizeof(uint32_t));
} else {
struct nvk_sampled_image_descriptor desc;
STATIC_ASSERT(sizeof(desc) == sizeof(handle));
desc.image_index = view->planes[0].sampled_desc_index;
if (pInfo->descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) {
assert(sampler->plane_count == 1);
desc.sampler_index = sampler->planes[0].desc_index;
}
memcpy(&handle, &desc, sizeof(uint32_t));
}
return handle;
}
VKAPI_ATTR uint64_t VKAPI_CALL
nvk_GetImageViewHandle64NVX(VkDevice _device,
const VkImageViewHandleInfoNVX *pInfo)
{
/* NVK does not currently support 64-bit texture addressing,
* so this is the same as vkGetImageViewHandleNVX. */
return nvk_GetImageViewHandleNVX(_device, pInfo);
}
VKAPI_ATTR VkResult VKAPI_CALL
nvk_GetImageViewAddressNVX(VkDevice _device, VkImageView _imageView,
VkImageViewAddressPropertiesNVX *pProperties)
{
VK_FROM_HANDLE(nvk_image_view, image_view, _imageView);
const struct nvk_image *image = (struct nvk_image *)image_view->vk.image;
const uint8_t plane = image_view->planes[0].image_plane;
pProperties->deviceAddress = nvk_image_base_address(image, plane);
pProperties->size = nvk_image_size_B(image, plane);
return VK_SUCCESS;
}

View file

@ -290,6 +290,7 @@ nvk_get_device_extensions(const struct nvk_instance *instance,
.MESA_image_alignment_control = true,
.NV_compute_shader_derivatives = info->cls_eng3d >= TURING_A,
.NV_shader_sm_builtins = true,
.NVX_image_view_handle = info->cls_eng3d >= MAXWELL_A, /* needs true bindless descriptors */
.VALVE_mutable_descriptor_type = true,
};
}