venus: pass necessary format list at ahb image format query
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15017>
This commit is contained in:
parent
c144df0fa8
commit
7c9f6c9964
|
@ -128,6 +128,41 @@ vn_android_ahb_format_from_vk_format(VkFormat format)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const VkFormat *
|
||||||
|
vn_android_format_to_view_formats(VkFormat format, uint32_t *out_count)
|
||||||
|
{
|
||||||
|
/* For AHB image prop query and creation, venus overrides the tiling to
|
||||||
|
* VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, which requires to chain
|
||||||
|
* VkImageFormatListCreateInfo struct in the corresponding pNext when the
|
||||||
|
* VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT is set. Those AHB images are assumed
|
||||||
|
* to be mutable no more than sRGB-ness, and the implementations can fail
|
||||||
|
* whenever going beyond.
|
||||||
|
*
|
||||||
|
* This helper provides the view formats that have sRGB variants for the
|
||||||
|
* image format that venus supports.
|
||||||
|
*/
|
||||||
|
static const VkFormat view_formats_r8g8b8a8[] = {
|
||||||
|
VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_SRGB
|
||||||
|
};
|
||||||
|
static const VkFormat view_formats_r8g8b8[] = { VK_FORMAT_R8G8B8_UNORM,
|
||||||
|
VK_FORMAT_R8G8B8_SRGB };
|
||||||
|
|
||||||
|
switch (format) {
|
||||||
|
case VK_FORMAT_R8G8B8A8_UNORM:
|
||||||
|
*out_count = ARRAY_SIZE(view_formats_r8g8b8a8);
|
||||||
|
return view_formats_r8g8b8a8;
|
||||||
|
break;
|
||||||
|
case VK_FORMAT_R8G8B8_UNORM:
|
||||||
|
*out_count = ARRAY_SIZE(view_formats_r8g8b8);
|
||||||
|
return view_formats_r8g8b8;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* let the caller handle the fallback case */
|
||||||
|
*out_count = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VkFormat
|
VkFormat
|
||||||
vn_android_drm_format_to_vk_format(uint32_t format)
|
vn_android_drm_format_to_vk_format(uint32_t format)
|
||||||
{
|
{
|
||||||
|
|
|
@ -40,6 +40,9 @@ vn_android_get_drm_format_modifier_info(
|
||||||
const VkPhysicalDeviceImageFormatInfo2 *format_info,
|
const VkPhysicalDeviceImageFormatInfo2 *format_info,
|
||||||
VkPhysicalDeviceImageDrmFormatModifierInfoEXT *out_info);
|
VkPhysicalDeviceImageDrmFormatModifierInfoEXT *out_info);
|
||||||
|
|
||||||
|
const VkFormat *
|
||||||
|
vn_android_format_to_view_formats(VkFormat format, uint32_t *out_count);
|
||||||
|
|
||||||
uint64_t
|
uint64_t
|
||||||
vn_android_get_ahb_usage(const VkImageUsageFlags usage,
|
vn_android_get_ahb_usage(const VkImageUsageFlags usage,
|
||||||
const VkImageCreateFlags flags);
|
const VkImageCreateFlags flags);
|
||||||
|
@ -106,6 +109,13 @@ vn_android_get_drm_format_modifier_info(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const VkFormat *
|
||||||
|
vn_android_format_to_view_formats(UNUSED VkFormat format,
|
||||||
|
UNUSED uint32_t *out_count)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint64_t
|
static inline uint64_t
|
||||||
vn_android_get_ahb_usage(UNUSED const VkImageUsageFlags usage,
|
vn_android_get_ahb_usage(UNUSED const VkImageUsageFlags usage,
|
||||||
UNUSED const VkImageCreateFlags flags)
|
UNUSED const VkImageCreateFlags flags)
|
||||||
|
|
|
@ -2129,6 +2129,7 @@ vn_physical_device_fix_image_format_info(
|
||||||
VkBaseOutStructure *dst = (void *)&local_info->format;
|
VkBaseOutStructure *dst = (void *)&local_info->format;
|
||||||
|
|
||||||
bool is_ahb = false;
|
bool is_ahb = false;
|
||||||
|
bool has_format_list = false;
|
||||||
/* we should generate deep copy functions... */
|
/* we should generate deep copy functions... */
|
||||||
vk_foreach_struct_const(src, info->pNext) {
|
vk_foreach_struct_const(src, info->pNext) {
|
||||||
void *pnext = NULL;
|
void *pnext = NULL;
|
||||||
|
@ -2143,6 +2144,7 @@ vn_physical_device_fix_image_format_info(
|
||||||
pnext = &local_info->external;
|
pnext = &local_info->external;
|
||||||
break;
|
break;
|
||||||
case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
|
case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
|
||||||
|
has_format_list = true;
|
||||||
memcpy(&local_info->list, src, sizeof(local_info->list));
|
memcpy(&local_info->list, src, sizeof(local_info->list));
|
||||||
pnext = &local_info->list;
|
pnext = &local_info->list;
|
||||||
break;
|
break;
|
||||||
|
@ -2175,6 +2177,35 @@ vn_physical_device_fix_image_format_info(
|
||||||
|
|
||||||
dst->pNext = (void *)&local_info->modifier;
|
dst->pNext = (void *)&local_info->modifier;
|
||||||
dst = dst->pNext;
|
dst = dst->pNext;
|
||||||
|
|
||||||
|
if ((info->flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) &&
|
||||||
|
!local_info->list.viewFormatCount) {
|
||||||
|
/* 12.3. Images
|
||||||
|
*
|
||||||
|
* If tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and flags
|
||||||
|
* contains VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, then the pNext chain
|
||||||
|
* must include a VkImageFormatListCreateInfo structure with non-zero
|
||||||
|
* viewFormatCount.
|
||||||
|
*/
|
||||||
|
VkImageFormatListCreateInfo *list = &local_info->list;
|
||||||
|
uint32_t vcount = 0;
|
||||||
|
const VkFormat *vformats =
|
||||||
|
vn_android_format_to_view_formats(info->format, &vcount);
|
||||||
|
if (!vformats) {
|
||||||
|
/* local_info persists through the image format query call */
|
||||||
|
vformats = &local_info->format.format;
|
||||||
|
vcount = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
list->sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO;
|
||||||
|
list->viewFormatCount = vcount;
|
||||||
|
list->pViewFormats = vformats;
|
||||||
|
|
||||||
|
if (!has_format_list) {
|
||||||
|
dst->pNext = (void *)list;
|
||||||
|
dst = dst->pNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dst->pNext = NULL;
|
dst->pNext = NULL;
|
||||||
|
|
Loading…
Reference in New Issue