diff options
author | Jason Ekstrand <[email protected]> | 2018-01-24 19:47:14 -0800 |
---|---|---|
committer | Daniel Stone <[email protected]> | 2018-02-21 22:37:10 +0000 |
commit | adca1e4a92a53a403b7620c3356dcf038f0bcecc (patch) | |
tree | 58d26708fe61e40080bdca7526a78b3c8322dbf1 /src/intel/vulkan/anv_image.c | |
parent | f5433e4d6ce247b86daed741c07aa99f2bd02c0d (diff) |
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
50485723523d2948a44570ba110f02f726f86a54.
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 <[email protected]>
Diffstat (limited to 'src/intel/vulkan/anv_image.c')
-rw-r--r-- | src/intel/vulkan/anv_image.c | 27 |
1 files changed, 8 insertions, 19 deletions
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index a297cc47320..c3d1810cee8 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -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; |