From 1ef80b26d7488c1ac3174d4725d736ae3de9b4fd Mon Sep 17 00:00:00 2001 From: Nanley Chery Date: Fri, 24 Jun 2016 15:39:14 -0700 Subject: [PATCH] anv/image: Fix initialization of the ISL tiling If an internal user creates an image with Vulkan tiling VK_IMAGE_TILING_OPTIMAL and an ISL tiling that isn't set, ISL will fail to create the image as anv_image_create_info::isl_tiling_flags will be an invalid value. Correct this by making anv_image_create_info::isl_tiling_flags an opt-in, filtering bitmask, that allows the caller to specify which ISL tilings are acceptable, but not contradictory to the Vulkan tiling. Opt-out of filtering for vkCreateImage. Signed-off-by: Nanley Chery Reviewed-by: Jason Ekstrand --- src/intel/vulkan/anv_image.c | 15 +++++++++++---- src/intel/vulkan/anv_private.h | 3 +++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 23fdd93..c38f198 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -120,9 +120,17 @@ make_surface(const struct anv_device *dev, [VK_IMAGE_TYPE_3D] = ISL_SURF_DIM_3D, }; - isl_tiling_flags_t tiling_flags = anv_info->isl_tiling_flags; - if (vk_info->tiling == VK_IMAGE_TILING_LINEAR) - tiling_flags = ISL_TILING_LINEAR_BIT; + /* Translate the Vulkan tiling to an equivalent ISL tiling, then filter the + * result with an optionally provided ISL tiling argument. + */ + isl_tiling_flags_t tiling_flags = + (vk_info->tiling == VK_IMAGE_TILING_LINEAR) ? + ISL_TILING_LINEAR_BIT : ISL_TILING_ANY_MASK; + + if (anv_info->isl_tiling_flags) + tiling_flags &= anv_info->isl_tiling_flags; + + assert(tiling_flags); struct anv_surface *anv_surf = get_surface(image, aspect); @@ -260,7 +268,6 @@ anv_CreateImage(VkDevice device, return anv_image_create(device, &(struct anv_image_create_info) { .vk_info = pCreateInfo, - .isl_tiling_flags = ISL_TILING_ANY_MASK, }, pAllocator, pImage); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 7b2d1dd..4730641 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1698,7 +1698,10 @@ struct anv_image_view { struct anv_image_create_info { const VkImageCreateInfo *vk_info; + + /** An opt-in bitmask which filters an ISL-mapping of the Vulkan tiling. */ isl_tiling_flags_t isl_tiling_flags; + uint32_t stride; }; -- 2.7.4