anv/image: Separate modifiers from legacy scanout
For a bit there, we had a bug in i965 where it ignored the tiling of the
modifier and used the one from the BO instead. At one point, we though
this was best fixed by setting a tiling from Vulkan. However, we've
decided that i965 was just doing the wrong thing and have fixed it as of
5048572352
.
The old assumptions also affected the solution we used for legacy
scanout in Vulkan. Instead of treating it specially, we just treated it
like a modifier like we do in GL. This commit goes back to making it
it's own thing so that it's clear in the driver when we're using
modifiers and when we're using legacy paths.
v2 (Jason Ekstrand):
- Rename legacy_scanout to needs_set_tiling
Reviewed-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:

committed by
Daniel Stone

parent
f5433e4d6c
commit
adca1e4a92
@@ -93,7 +93,8 @@ choose_isl_surf_usage(VkImageCreateFlags vk_create_flags,
|
||||
|
||||
static isl_tiling_flags_t
|
||||
choose_isl_tiling_flags(const struct anv_image_create_info *anv_info,
|
||||
const struct isl_drm_modifier_info *isl_mod_info)
|
||||
const struct isl_drm_modifier_info *isl_mod_info,
|
||||
bool legacy_scanout)
|
||||
{
|
||||
const VkImageCreateInfo *base_info = anv_info->vk_info;
|
||||
isl_tiling_flags_t flags = 0;
|
||||
@@ -112,6 +113,9 @@ choose_isl_tiling_flags(const struct anv_image_create_info *anv_info,
|
||||
if (anv_info->isl_tiling_flags)
|
||||
flags &= anv_info->isl_tiling_flags;
|
||||
|
||||
if (legacy_scanout)
|
||||
flags &= ISL_TILING_LINEAR_BIT | ISL_TILING_X_BIT;
|
||||
|
||||
if (isl_mod_info)
|
||||
flags &= 1 << isl_mod_info->tiling;
|
||||
|
||||
@@ -504,19 +508,6 @@ make_surface(const struct anv_device *dev,
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
static const struct isl_drm_modifier_info *
|
||||
get_legacy_scanout_drm_format_mod(VkImageTiling tiling)
|
||||
{
|
||||
switch (tiling) {
|
||||
case VK_IMAGE_TILING_OPTIMAL:
|
||||
return isl_drm_modifier_get_info(I915_FORMAT_MOD_X_TILED);
|
||||
case VK_IMAGE_TILING_LINEAR:
|
||||
return isl_drm_modifier_get_info(DRM_FORMAT_MOD_LINEAR);
|
||||
default:
|
||||
unreachable("bad VkImageTiling");
|
||||
}
|
||||
}
|
||||
|
||||
VkResult
|
||||
anv_image_create(VkDevice _device,
|
||||
const struct anv_image_create_info *create_info,
|
||||
@@ -533,8 +524,6 @@ anv_image_create(VkDevice _device,
|
||||
|
||||
const struct wsi_image_create_info *wsi_info =
|
||||
vk_find_struct_const(pCreateInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA);
|
||||
if (wsi_info && wsi_info->scanout)
|
||||
isl_mod_info = get_legacy_scanout_drm_format_mod(pCreateInfo->tiling);
|
||||
|
||||
anv_assert(pCreateInfo->mipLevels > 0);
|
||||
anv_assert(pCreateInfo->arrayLayers > 0);
|
||||
@@ -559,14 +548,14 @@ anv_image_create(VkDevice _device,
|
||||
image->usage = pCreateInfo->usage;
|
||||
image->tiling = pCreateInfo->tiling;
|
||||
image->disjoint = pCreateInfo->flags & VK_IMAGE_CREATE_DISJOINT_BIT_KHR;
|
||||
image->drm_format_mod = isl_mod_info ? isl_mod_info->modifier :
|
||||
DRM_FORMAT_MOD_INVALID;
|
||||
image->needs_set_tiling = wsi_info && wsi_info->scanout;
|
||||
|
||||
const struct anv_format *format = anv_get_format(image->vk_format);
|
||||
assert(format != NULL);
|
||||
|
||||
const isl_tiling_flags_t isl_tiling_flags =
|
||||
choose_isl_tiling_flags(create_info, isl_mod_info);
|
||||
choose_isl_tiling_flags(create_info, isl_mod_info,
|
||||
image->needs_set_tiling);
|
||||
|
||||
image->n_planes = format->n_planes;
|
||||
|
||||
|
Reference in New Issue
Block a user