<div dir="ltr">rb<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 14, 2016 at 8:32 AM, Nanley Chery <span dir="ltr"><<a href="mailto:nanleychery@gmail.com" target="_blank">nanleychery@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">If an internal user creates an image with Vulkan tiling VK_IMAGE_TILING_OPTIMAL<br>
and an ISL tiling that isn't set, ISL will fail to create the image as<br>
anv_image_create_info::isl_tiling_flags will be an invalid value.<br>
<br>
Correct this by making anv_image_create_info::isl_tiling_flags an opt-in,<br>
filtering bitmask, that allows the caller to specify which ISL tilings are<br>
acceptable, but not contradictory to the Vulkan tiling.<br>
<br>
Opt-out of filtering for vkCreateImage.<br>
<br>
Signed-off-by: Nanley Chery <<a href="mailto:nanley.g.chery@intel.com">nanley.g.chery@intel.com</a>><br>
---<br>
<br>
v2: Fix bug of vk tiling being ignored by internal users (Chad)<br>
    Fix bug in existing code (see commit message).<br>
<br>
 src/intel/vulkan/anv_image.c   | 15 +++++++++++----<br>
 src/intel/vulkan/anv_private.h |  3 +++<br>
 2 files changed, 14 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c<br>
index 23fdd93..312efe1 100644<br>
--- a/src/intel/vulkan/anv_image.c<br>
+++ b/src/intel/vulkan/anv_image.c<br>
@@ -120,9 +120,17 @@ make_surface(const struct anv_device *dev,<br>
       [VK_IMAGE_TYPE_3D] = ISL_SURF_DIM_3D,<br>
    };<br>
<br>
-   isl_tiling_flags_t tiling_flags = anv_info->isl_tiling_flags;<br>
-   if (vk_info->tiling == VK_IMAGE_TILING_LINEAR)<br>
-      tiling_flags = ISL_TILING_LINEAR_BIT;<br>
+   /* Translate the Vulkan tiling to an equivalent ISL tiling, then filter the<br>
+    * result with an optionally provided ISL tiling argument.<br>
+    */<br>
+   isl_tiling_flags_t tiling_flags =<br>
+      (pCreateInfo->tiling == VK_IMAGE_TILING_LINEAR) ?<br>
+      ISL_TILING_LINEAR_BIT : ISL_TILING_ANY_MASK;<br>
+<br>
+   if (anv_info->isl_tiling_flags)<br>
+      tiling_flags &= anv_info->isl_tiling_flags;<br>
+<br>
+   assert(tiling_flags);<br>
<br>
    struct anv_surface *anv_surf = get_surface(image, aspect);<br>
<br>
@@ -260,7 +268,6 @@ anv_CreateImage(VkDevice device,<br>
    return anv_image_create(device,<br>
       &(struct anv_image_create_info) {<br>
          .vk_info = pCreateInfo,<br>
-         .isl_tiling_flags = ISL_TILING_ANY_MASK,<br>
       },<br>
       pAllocator,<br>
       pImage);<br>
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h<br>
index 7b2d1dd..4730641 100644<br>
--- a/src/intel/vulkan/anv_private.h<br>
+++ b/src/intel/vulkan/anv_private.h<br>
@@ -1698,7 +1698,10 @@ struct anv_image_view {<br>
<br>
 struct anv_image_create_info {<br>
    const VkImageCreateInfo *vk_info;<br>
+<br>
+   /** An opt-in bitmask which filters an ISL-mapping of the Vulkan tiling. */<br>
    isl_tiling_flags_t isl_tiling_flags;<br>
+<br>
    uint32_t stride;<br>
 };<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.9.0<br>
<br>
</font></span></blockquote></div><br></div>