mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 17:30:12 +01:00
venus: fix external image creation
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21379>
This commit is contained in:
parent
953ff3cf55
commit
23c350517a
2 changed files with 85 additions and 2 deletions
|
|
@ -18,8 +18,11 @@
|
|||
#include "vn_android.h"
|
||||
#include "vn_device.h"
|
||||
#include "vn_device_memory.h"
|
||||
#include "vn_physical_device.h"
|
||||
#include "vn_wsi.h"
|
||||
|
||||
/* image commands */
|
||||
|
||||
static void
|
||||
vn_image_init_memory_requirements(struct vn_image *img,
|
||||
struct vn_device *dev,
|
||||
|
|
@ -283,7 +286,65 @@ vn_image_create_deferred(struct vn_device *dev,
|
|||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
/* image commands */
|
||||
struct vn_image_create_info {
|
||||
VkImageCreateInfo create;
|
||||
VkExternalMemoryImageCreateInfo external;
|
||||
VkImageFormatListCreateInfo format_list;
|
||||
VkImageStencilUsageCreateInfo stencil;
|
||||
VkImageDrmFormatModifierListCreateInfoEXT modifier_list;
|
||||
VkImageDrmFormatModifierExplicitCreateInfoEXT modifier_explicit;
|
||||
};
|
||||
|
||||
static const VkImageCreateInfo *
|
||||
vn_image_fix_create_info(
|
||||
const VkImageCreateInfo *create_info,
|
||||
const VkExternalMemoryHandleTypeFlagBits renderer_handle_type,
|
||||
struct vn_image_create_info *local_info)
|
||||
{
|
||||
local_info->create = *create_info;
|
||||
VkBaseOutStructure *cur = (void *)&local_info->create;
|
||||
|
||||
vk_foreach_struct_const(src, create_info->pNext) {
|
||||
void *next = NULL;
|
||||
switch (src->sType) {
|
||||
case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
|
||||
memcpy(&local_info->external, src, sizeof(local_info->external));
|
||||
local_info->external.handleTypes = renderer_handle_type;
|
||||
next = &local_info->external;
|
||||
break;
|
||||
case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
|
||||
memcpy(&local_info->format_list, src,
|
||||
sizeof(local_info->format_list));
|
||||
next = &local_info->format_list;
|
||||
break;
|
||||
case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
|
||||
memcpy(&local_info->stencil, src, sizeof(local_info->stencil));
|
||||
next = &local_info->stencil;
|
||||
break;
|
||||
case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
|
||||
memcpy(&local_info->modifier_list, src,
|
||||
sizeof(local_info->modifier_list));
|
||||
next = &local_info->modifier_list;
|
||||
break;
|
||||
case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
|
||||
memcpy(&local_info->modifier_explicit, src,
|
||||
sizeof(local_info->modifier_explicit));
|
||||
next = &local_info->modifier_explicit;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (next) {
|
||||
cur->pNext = next;
|
||||
cur = next;
|
||||
}
|
||||
}
|
||||
|
||||
cur->pNext = NULL;
|
||||
|
||||
return &local_info->create;
|
||||
}
|
||||
|
||||
VkResult
|
||||
vn_CreateImage(VkDevice device,
|
||||
|
|
@ -295,6 +356,8 @@ vn_CreateImage(VkDevice device,
|
|||
struct vn_device *dev = vn_device_from_handle(device);
|
||||
const VkAllocationCallbacks *alloc =
|
||||
pAllocator ? pAllocator : &dev->base.base.alloc;
|
||||
const VkExternalMemoryHandleTypeFlagBits renderer_handle_type =
|
||||
dev->physical_device->external_memory.renderer_handle_type;
|
||||
struct vn_image *img;
|
||||
VkResult result;
|
||||
|
||||
|
|
@ -331,7 +394,19 @@ vn_CreateImage(VkDevice device,
|
|||
}
|
||||
}
|
||||
|
||||
/* No need to fix external handle type for:
|
||||
* - common wsi image: dma_buf is hard-coded in wsi_configure_native_image
|
||||
* - common wsi image alias: it aligns with wsi_info on external handle
|
||||
* - Android wsi image: VK_ANDROID_native_buffer involves no external info
|
||||
* - AHB external image: deferred creation reconstructs external info
|
||||
*
|
||||
* Must fix the external handle type for:
|
||||
* - non-AHB external image requesting handle types different from renderer
|
||||
*
|
||||
* Will have to fix more when renderer handle type is no longer dma_buf.
|
||||
*/
|
||||
if (wsi_info) {
|
||||
assert(external_info->handleTypes == renderer_handle_type);
|
||||
result = vn_wsi_create_image(dev, pCreateInfo, wsi_info, alloc, &img);
|
||||
} else if (anb_info) {
|
||||
result =
|
||||
|
|
@ -342,6 +417,13 @@ vn_CreateImage(VkDevice device,
|
|||
result = vn_wsi_create_image_from_swapchain(
|
||||
dev, pCreateInfo, swapchain_info, alloc, &img);
|
||||
} else {
|
||||
struct vn_image_create_info local_info;
|
||||
if (external_info &&
|
||||
external_info->handleTypes != renderer_handle_type) {
|
||||
pCreateInfo = vn_image_fix_create_info(
|
||||
pCreateInfo, renderer_handle_type, &local_info);
|
||||
}
|
||||
|
||||
result = vn_image_create(dev, pCreateInfo, alloc, &img);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -186,7 +186,8 @@ vn_wsi_create_image_from_swapchain(
|
|||
const VkExternalMemoryImageCreateInfo local_external_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
|
||||
.pNext = local_create_info.pNext,
|
||||
.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
|
||||
.handleTypes =
|
||||
dev->physical_device->external_memory.renderer_handle_type,
|
||||
};
|
||||
local_create_info.pNext = &local_external_info;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue