diff options
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/vulkan/anv_device.c | 22 | ||||
-rw-r--r-- | src/intel/vulkan/anv_image.c | 27 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 10 |
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; |