summaryrefslogtreecommitdiffstats
path: root/src/intel/vulkan
diff options
context:
space:
mode:
Diffstat (limited to 'src/intel/vulkan')
-rw-r--r--src/intel/vulkan/anv_device.c22
-rw-r--r--src/intel/vulkan/anv_image.c27
-rw-r--r--src/intel/vulkan/anv_private.h10
3 files changed, 21 insertions, 38 deletions
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 00b0b653333..a83b7a39f6a 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -1835,21 +1835,10 @@ VkResult anv_AllocateMemory(
if (dedicated_info && dedicated_info->image != VK_NULL_HANDLE) {
ANV_FROM_HANDLE(anv_image, image, dedicated_info->image);
- /* For images using modifiers, we require a dedicated allocation
- * and we set the BO tiling to match the tiling of the underlying
- * modifier. This is a bit unfortunate as this is completely
- * pointless for Vulkan. However, GL needs to be able to map things
- * so it needs the tiling to be set. The only way to do this in a
- * non-racy way is to set the tiling in the creator of the BO so that
- * makes it our job.
- *
- * One of these days, once the GL driver learns to not map things
- * through the GTT in random places, we can drop this and start
- * allowing multiple modified images in the same BO.
+ /* Some legacy (non-modifiers) consumers need the tiling to be set on
+ * the BO. In this case, we have a dedicated allocation.
*/
- if (image->drm_format_mod != DRM_FORMAT_MOD_INVALID) {
- assert(isl_drm_modifier_get_info(image->drm_format_mod)->tiling ==
- image->planes[0].surface.isl.tiling);
+ if (image->needs_set_tiling) {
const uint32_t i915_tiling =
isl_tiling_to_i915_tiling(image->planes[0].surface.isl.tiling);
int ret = anv_gem_set_tiling(device, mem->bo->gem_handle,
@@ -2217,8 +2206,9 @@ void anv_GetImageMemoryRequirements2KHR(
switch (ext->sType) {
case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR: {
VkMemoryDedicatedRequirementsKHR *requirements = (void *)ext;
- if (image->drm_format_mod != DRM_FORMAT_MOD_INVALID) {
- /* Require a dedicated allocation for images with modifiers.
+ if (image->needs_set_tiling) {
+ /* If we need to set the tiling for external consumers, we need a
+ * dedicated allocation.
*
* See also anv_AllocateMemory.
*/
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;
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 37e63f56aa0..3d5259794bc 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -2403,10 +2403,14 @@ struct anv_image {
VkImageUsageFlags usage; /**< Superset of VkImageCreateInfo::usage. */
VkImageTiling tiling; /** VkImageCreateInfo::tiling */
- /**
- * DRM format modifier for this image or DRM_FORMAT_MOD_INVALID.
+ /** True if this is needs to be bound to an appropriately tiled BO.
+ *
+ * When not using modifiers, consumers such as X11, Wayland, and KMS need
+ * the tiling passed via I915_GEM_SET_TILING. When exporting these buffers
+ * we require a dedicated allocation so that we can know to allocate a
+ * tiled buffer.
*/
- uint64_t drm_format_mod;
+ bool needs_set_tiling;
VkDeviceSize size;
uint32_t alignment;