mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-28 23:20:08 +01:00
v3dv: Split v3dv_image_init to use layout setting logic separately
In AHB importing flow, the format is known at vkCreateImage step, but buffer layout itself is not yet known. Buffer layout and modifier must be updated later in vkBindImageMemory. Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com> Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14195>
This commit is contained in:
parent
1fc460b203
commit
def20cbb07
2 changed files with 42 additions and 16 deletions
|
|
@ -362,6 +362,34 @@ v3dv_layer_offset(const struct v3dv_image *image, uint32_t level, uint32_t layer
|
|||
layer * image->planes[plane].cube_map_stride;
|
||||
}
|
||||
|
||||
VkResult
|
||||
v3dv_update_image_layout(struct v3dv_device *device,
|
||||
struct v3dv_image *image,
|
||||
uint64_t modifier,
|
||||
bool disjoint,
|
||||
const VkImageDrmFormatModifierExplicitCreateInfoEXT *explicit_mod_info)
|
||||
{
|
||||
assert(!explicit_mod_info ||
|
||||
image->plane_count == explicit_mod_info->drmFormatModifierPlaneCount);
|
||||
|
||||
assert(!explicit_mod_info ||
|
||||
modifier == explicit_mod_info->drmFormatModifier);
|
||||
|
||||
image->tiled = modifier != DRM_FORMAT_MOD_LINEAR;
|
||||
|
||||
image->vk.drm_format_mod = modifier;
|
||||
|
||||
bool ok =
|
||||
v3d_setup_slices(image, disjoint,
|
||||
explicit_mod_info ? explicit_mod_info->pPlaneLayouts : NULL);
|
||||
if (!ok) {
|
||||
assert(explicit_mod_info);
|
||||
return VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT;
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
VkResult
|
||||
v3dv_image_init(struct v3dv_device *device,
|
||||
const VkImageCreateInfo *pCreateInfo,
|
||||
|
|
@ -419,6 +447,10 @@ v3dv_image_init(struct v3dv_device *device,
|
|||
tiling = VK_IMAGE_TILING_LINEAR;
|
||||
}
|
||||
|
||||
if (modifier == DRM_FORMAT_MOD_INVALID)
|
||||
modifier = (tiling == VK_IMAGE_TILING_OPTIMAL) ? DRM_FORMAT_MOD_BROADCOM_UIF
|
||||
: DRM_FORMAT_MOD_LINEAR;
|
||||
|
||||
const struct v3dv_format *format =
|
||||
v3dv_X(device, get_format)(image->vk.format);
|
||||
v3dv_assert(format != NULL && format->plane_count);
|
||||
|
|
@ -427,9 +459,8 @@ v3dv_image_init(struct v3dv_device *device,
|
|||
pCreateInfo->samples == VK_SAMPLE_COUNT_4_BIT);
|
||||
|
||||
image->format = format;
|
||||
|
||||
image->plane_count = vk_format_get_plane_count(image->vk.format);
|
||||
assert(!explicit_mod_info ||
|
||||
image->plane_count == explicit_mod_info->drmFormatModifierPlaneCount);
|
||||
|
||||
const struct vk_format_ycbcr_info *ycbcr_info =
|
||||
vk_format_get_ycbcr_info(image->vk.format);
|
||||
|
|
@ -452,12 +483,6 @@ v3dv_image_init(struct v3dv_device *device,
|
|||
ycbcr_info->planes[plane].denominator_scales[1];
|
||||
}
|
||||
}
|
||||
if (modifier == DRM_FORMAT_MOD_INVALID)
|
||||
modifier = (tiling == VK_IMAGE_TILING_OPTIMAL) ? DRM_FORMAT_MOD_BROADCOM_UIF
|
||||
: DRM_FORMAT_MOD_LINEAR;
|
||||
image->tiled = modifier != DRM_FORMAT_MOD_LINEAR;
|
||||
|
||||
image->vk.drm_format_mod = modifier;
|
||||
|
||||
/* Our meta paths can create image views with compatible formats for any
|
||||
* image, so always set this flag to keep the common Vulkan image code
|
||||
|
|
@ -466,15 +491,9 @@ v3dv_image_init(struct v3dv_device *device,
|
|||
image->vk.create_flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
|
||||
|
||||
bool disjoint = image->vk.create_flags & VK_IMAGE_CREATE_DISJOINT_BIT;
|
||||
bool ok =
|
||||
v3d_setup_slices(image, disjoint,
|
||||
explicit_mod_info ? explicit_mod_info->pPlaneLayouts : NULL);
|
||||
if (!ok) {
|
||||
assert(explicit_mod_info);
|
||||
return VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT;
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
return v3dv_update_image_layout(device, image, modifier, disjoint,
|
||||
explicit_mod_info);
|
||||
}
|
||||
|
||||
static VkResult
|
||||
|
|
|
|||
|
|
@ -2603,6 +2603,13 @@ u64_compare(const void *key1, const void *key2)
|
|||
# undef v3dX
|
||||
#endif
|
||||
|
||||
VkResult
|
||||
v3dv_update_image_layout(struct v3dv_device *device,
|
||||
struct v3dv_image *image,
|
||||
uint64_t modifier,
|
||||
bool disjoint,
|
||||
const VkImageDrmFormatModifierExplicitCreateInfoEXT *explicit_mod_info);
|
||||
|
||||
#ifdef ANDROID
|
||||
VkResult
|
||||
v3dv_gralloc_to_drm_explicit_layout(struct u_gralloc *gralloc,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue