From 1a2f1e3f472b1abe83e7e872839bd9ed370fd268 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Tue, 16 Feb 2021 17:04:35 +0200 Subject: [PATCH] turnip: fill VkMemoryDedicatedRequirements We support VK_KHR_dedicated_allocation so we must fill VkMemoryDedicatedRequirements. Vulkan spec states: "[...] requiresDedicatedAllocation may be VK_TRUE under one of the following conditions: The pNext chain of VkImageCreateInfo for the call to vkCreateImage used to create the image being queried included a VkExternalMemoryImageCreateInfo structure, and any of the handle types specified in VkExternalMemoryImageCreateInfo::handleTypes requires dedicated allocation, as reported by vkGetPhysicalDeviceImageFormatProperties2 in VkExternalImageFormatProperties::externalMemoryProperties.externalMemoryFeatures, the requiresDedicatedAllocation field will be set to VK_TRUE." All handle types require dedicated allocation at the moment. Fixes: dEQP-VK.api.external.memory.opaque_fd.dedicated.image.info dEQP-VK.memory.requirements.dedicated_allocation.buffer.regular dEQP-VK.memory.requirements.dedicated_allocation.image.transient_tiling_optimal Signed-off-by: Danylo Piliaiev Part-of: --- .../ci/deqp-freedreno-a630-fails.txt | 2 -- src/freedreno/vulkan/tu_device.c | 28 +++++++++++++++++++ src/freedreno/vulkan/tu_image.c | 4 +++ src/freedreno/vulkan/tu_private.h | 2 ++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/freedreno/ci/deqp-freedreno-a630-fails.txt b/src/freedreno/ci/deqp-freedreno-a630-fails.txt index e6bbf23b132..15577411122 100644 --- a/src/freedreno/ci/deqp-freedreno-a630-fails.txt +++ b/src/freedreno/ci/deqp-freedreno-a630-fails.txt @@ -82,8 +82,6 @@ dEQP-VK.image.subresource_layout.3d.all_levels.r16g16_snorm,Fail dEQP-VK.image.subresource_layout.3d.all_levels.r16g16b16a16_snorm,Fail dEQP-VK.image.subresource_layout.3d.all_levels.r8_snorm,Fail dEQP-VK.image.subresource_layout.3d.all_levels.r8g8b8a8_snorm,Fail -dEQP-VK.memory.requirements.dedicated_allocation.buffer.regular,Fail -dEQP-VK.memory.requirements.dedicated_allocation.image.transient_tiling_optimal,Fail dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.workgroup.comp,Fail dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_local.image.comp,Fail dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_compare_always_greater,Fail diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index 9f5e1f0ec53..f4fe8e57746 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -1605,6 +1605,20 @@ tu_GetBufferMemoryRequirements2( .alignment = 64, .size = MAX2(align64(buffer->size, 64), buffer->size), }; + + vk_foreach_struct(ext, pMemoryRequirements->pNext) { + switch (ext->sType) { + case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: { + VkMemoryDedicatedRequirements *req = + (VkMemoryDedicatedRequirements *) ext; + req->requiresDedicatedAllocation = false; + req->prefersDedicatedAllocation = req->requiresDedicatedAllocation; + break; + } + default: + break; + } + } } void @@ -1619,6 +1633,20 @@ tu_GetImageMemoryRequirements2(VkDevice device, .alignment = image->layout[0].base_align, .size = image->total_size }; + + vk_foreach_struct(ext, pMemoryRequirements->pNext) { + switch (ext->sType) { + case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: { + VkMemoryDedicatedRequirements *req = + (VkMemoryDedicatedRequirements *) ext; + req->requiresDedicatedAllocation = image->shareable; + req->prefersDedicatedAllocation = req->requiresDedicatedAllocation; + break; + } + default: + break; + } + } } void diff --git a/src/freedreno/vulkan/tu_image.c b/src/freedreno/vulkan/tu_image.c index c602f4b5878..7769cb86ed6 100644 --- a/src/freedreno/vulkan/tu_image.c +++ b/src/freedreno/vulkan/tu_image.c @@ -553,6 +553,10 @@ tu_CreateImage(VkDevice _device, if (!image) return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); + const VkExternalMemoryImageCreateInfo *external_info = + vk_find_struct_const(pCreateInfo->pNext, EXTERNAL_MEMORY_IMAGE_CREATE_INFO); + image->shareable = external_info != NULL; + image->vk_format = pCreateInfo->format; image->level_count = pCreateInfo->mipLevels; image->layer_count = pCreateInfo->arrayLayers; diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h index ff6b2f0418d..0c12cc35aa4 100644 --- a/src/freedreno/vulkan/tu_private.h +++ b/src/freedreno/vulkan/tu_private.h @@ -1281,6 +1281,8 @@ struct tu_image uint32_t lrz_height; uint32_t lrz_pitch; uint32_t lrz_offset; + + bool shareable; }; static inline uint32_t