diff options
author | Jason Ekstrand <[email protected]> | 2017-07-15 02:08:01 +0200 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2017-07-15 08:59:38 -0700 |
commit | b70829708ac0598d17804f471d512fdfb44f331f (patch) | |
tree | 4128374b7d7336ca196ac1d3c2f614731c0faedd /src/amd/vulkan/radv_image.c | |
parent | 6ddc64b93ea462b9755f5f9abfc7c72aa014a5e0 (diff) |
radv: Implement VK_KHR_external_memory
This effectively reverts commit 43a171878bb4b5aedb36a. Technically,
VK_KHR_get_memory_requirements2 and VK_KHR_dedicated_allocation are
required for the KHR version but this at least restores the removed
functionality. This patch builds but has received zero testing.
Acked-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/amd/vulkan/radv_image.c')
-rw-r--r-- | src/amd/vulkan/radv_image.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index fc00d019d1d..17ee74b5f5b 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -27,6 +27,7 @@ #include "radv_private.h" #include "vk_format.h" +#include "vk_util.h" #include "radv_radeon_winsys.h" #include "sid.h" #include "gfx9d.h" @@ -783,9 +784,15 @@ radv_image_create(VkDevice _device, image->exclusive = pCreateInfo->sharingMode == VK_SHARING_MODE_EXCLUSIVE; if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) { for (uint32_t i = 0; i < pCreateInfo->queueFamilyIndexCount; ++i) - image->queue_family_mask |= 1u << pCreateInfo->pQueueFamilyIndices[i]; + if (pCreateInfo->pQueueFamilyIndices[i] == VK_QUEUE_FAMILY_EXTERNAL_KHR) + image->queue_family_mask |= (1u << RADV_MAX_QUEUE_FAMILIES) - 1u; + else + image->queue_family_mask |= 1u << pCreateInfo->pQueueFamilyIndices[i]; } + image->shareable = vk_find_struct_const(pCreateInfo->pNext, + EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR) != NULL; + radv_init_surface(device, &image->surface, create_info); device->ws->surface_init(device->ws, &image->info, &image->surface); @@ -962,6 +969,8 @@ unsigned radv_image_queue_family_mask(const struct radv_image *image, uint32_t f { if (!image->exclusive) return image->queue_family_mask; + if (family == VK_QUEUE_FAMILY_EXTERNAL_KHR) + return (1u << RADV_MAX_QUEUE_FAMILIES) - 1u; if (family == VK_QUEUE_FAMILY_IGNORED) return 1u << queue_family; return 1u << family; |