From cfeda2d8ae7dd7917c562efa66cda814f1f47b96 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Wed, 28 May 2025 12:15:49 -0400 Subject: [PATCH] nvk: Disallow GetMemoryFdProperties with OPAQUE_FD_BIT Part-of: --- src/nouveau/vulkan/nvk_device_memory.c | 45 +++++++++++++------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/nouveau/vulkan/nvk_device_memory.c b/src/nouveau/vulkan/nvk_device_memory.c index db08ef4e4f1..19a127a64ed 100644 --- a/src/nouveau/vulkan/nvk_device_memory.c +++ b/src/nouveau/vulkan/nvk_device_memory.c @@ -70,41 +70,40 @@ nvk_GetMemoryFdPropertiesKHR(VkDevice device, VkResult result; switch (handleType) { - case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT: case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT: result = nvkmd_dev_import_dma_buf(dev->nvkmd, &dev->vk.base, fd, &mem); if (result != VK_SUCCESS) return result; break; + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT: + /* From the Vulkan 1.4.315 spec: + * + * VUID-vkGetMemoryFdPropertiesKHR-handleType-00674 + * + * "handleType must not be + * VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT" + */ + return vk_error(dev, VK_ERROR_INVALID_EXTERNAL_HANDLE); default: return vk_error(dev, VK_ERROR_INVALID_EXTERNAL_HANDLE); } uint32_t type_bits = 0; - if (handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT) { - for (unsigned t = 0; t < ARRAY_SIZE(pdev->mem_types); t++) { - const VkMemoryType *type = &pdev->mem_types[t]; - const enum nvkmd_mem_flags type_flags = - nvk_memory_type_flags(type, handleType); + for (unsigned t = 0; t < ARRAY_SIZE(pdev->mem_types); t++) { + const VkMemoryType *type = &pdev->mem_types[t]; + const enum nvkmd_mem_flags type_flags = + nvk_memory_type_flags(type, handleType); - /* Flags required to be set on mem to be imported as type - * - * If we're importing into a host-visible heap, we have to be able to - * map the memory. - */ - const enum nvkmd_mem_flags req_flags = type_flags & NVKMD_MEM_CAN_MAP; - if (req_flags & ~mem->flags) - continue; + /* Flags required to be set on mem to be imported as type + * + * If we're importing into a host-visible heap, we have to be able to + * map the memory. + */ + const enum nvkmd_mem_flags req_flags = type_flags & NVKMD_MEM_CAN_MAP; + if (req_flags & ~mem->flags) + continue; - type_bits |= (1 << t); - } - } else { - for (unsigned t = 0; t < ARRAY_SIZE(pdev->mem_types); t++) { - const enum nvkmd_mem_flags flags = - nvk_memory_type_flags(&pdev->mem_types[t], handleType); - if (!(flags & ~mem->flags)) - type_bits |= (1 << t); - } + type_bits |= (1 << t); } pMemoryFdProperties->memoryTypeBits = type_bits;