nvk: Disallow GetMemoryFdProperties with OPAQUE_FD_BIT
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35213>
This commit is contained in:
Faith Ekstrand 2025-05-28 12:15:49 -04:00
parent 601cf33c44
commit cfeda2d8ae

View file

@ -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;