<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">Two trivial comments which you  can take or leave below.  With that, 1-10 and 12 are</div><div class="gmail_quote"><br></div><div class="gmail_quote">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>></div><div class="gmail_quote"><br></div><div class="gmail_quote">Once we sort out patch 11, we should be good to land.  Thanks for the good work!</div><div class="gmail_quote"><br></div><div class="gmail_quote">--Jason<br></div><div class="gmail_quote"><br></div><div class="gmail_quote">On Thu, Oct 5, 2017 at 9:30 AM, Lionel Landwerlin <span dir="ltr"><<a href="mailto:lionel.g.landwerlin@intel.com" target="_blank">lionel.g.landwerlin@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">v2: Make GetImageMemoryRequirements2KHR<wbr>() iterate over all pInfo<br>
    structs (Lionel)<br>
    Handle VkSamplerYcbcrConversionImageF<wbr>ormatPropertiesKHR (Andrew/Jason)<br>
    Iterator over BindImageMemory2KHR's pNext structs correctly (Jason)<br>
<br>
Signed-off-by: Lionel Landwerlin <<a href="mailto:lionel.g.landwerlin@intel.com">lionel.g.landwerlin@intel.com</a><wbr>><br>
---<br>
 src/intel/vulkan/anv_device.c      | 51 +++++++++++++++++++++++-<br>
 src/intel/vulkan/anv_<wbr>extensions.py |  1 +<br>
 src/intel/vulkan/anv_formats.c     | 82 ++++++++++++++++++++++++++++++<wbr>++++----<br>
 src/intel/vulkan/anv_image.c       | 21 +++++++++-<br>
 src/intel/vulkan/anv_private.h     |  4 ++<br>
 src/intel/vulkan/genX_state.c      | 50 ++++++++++++++++++-----<br>
 6 files changed, 189 insertions(+), 20 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_device.<wbr>c b/src/intel/vulkan/anv_device.<wbr>c<br>
index d576bb55315..798fdff3c89 100644<br>
--- a/src/intel/vulkan/anv_device.<wbr>c<br>
+++ b/src/intel/vulkan/anv_device.<wbr>c<br>
@@ -703,6 +703,13 @@ void anv_<wbr>GetPhysicalDeviceFeatures2KHR(<br>
          break;<br>
       }<br>
<br>
+      case VK_STRUCTURE_TYPE_PHYSICAL_<wbr>DEVICE_SAMPLER_YCBCR_<wbr>CONVERSION_FEATURES_KHR: {<br>
+         VkPhysicalDeviceSamplerYcbcrCo<wbr>nversionFeaturesKHR *features =<br>
+            (<wbr>VkPhysicalDeviceSamplerYcbcrCo<wbr>nversionFeaturesKHR *) ext;<br>
+         features-><wbr>samplerYcbcrConversion = true;<br>
+         break;<br>
+      }<br>
+<br>
       default:<br>
          anv_debug_ignored_stype(ext-><wbr>sType);<br>
          break;<br>
@@ -1826,8 +1833,48 @@ void anv_<wbr>GetImageMemoryRequirements2KHR<wbr>(<br>
     const VkImageMemoryRequirementsInfo2<wbr>KHR*    pInfo,<br>
     VkMemoryRequirements2KHR*                   pMemoryRequirements)<br>
 {<br>
-   anv_<wbr>GetImageMemoryRequirements(_<wbr>device, pInfo->image,<br>
-                                  &pMemoryRequirements-><wbr>memoryRequirements);<br>
+   vk_foreach_struct_const(ext, pInfo) {<br>
+      switch (ext->sType) {<br>
+      case VK_STRUCTURE_TYPE_IMAGE_<wbr>MEMORY_REQUIREMENTS_INFO_2_<wbr>KHR: {<br>
+         anv_<wbr>GetImageMemoryRequirements(_<wbr>device, pInfo->image,<br>
+                                        &pMemoryRequirements-><wbr>memoryRequirements);<br>
+         break;<br></blockquote><div><br></div><div>In general, I prefer to handle pInfo directly and only use foreach_struct for the extensions.  I don't care too much though.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+      }<br>
+      case VK_STRUCTURE_TYPE_IMAGE_PLANE_<wbr>MEMORY_REQUIREMENTS_INFO_KHR: {<br>
+         ANV_FROM_HANDLE(anv_image, image, pInfo->image);<br>
+         ANV_FROM_HANDLE(anv_device, device, _device);<br>
+         struct anv_physical_device *pdevice = &device->instance-><wbr>physicalDevice;<br>
+         const VkImagePlaneMemoryRequirements<wbr>InfoKHR *plane_reqs =<br>
+            (const VkImagePlaneMemoryRequirements<wbr>InfoKHR *) ext;<br>
+         uint32_t plane = anv_image_aspect_to_plane(<wbr>image->aspects,<br>
+                                                    plane_reqs->planeAspect);<br>
+<br>
+         assert(image->planes[plane].<wbr>offset == 0);<br>
+<br>
+         /* The Vulkan spec (git aaed022) says:<br>
+          *<br>
+          *    memoryTypeBits is a bitfield and contains one bit set for every<br>
+          *    supported memory type for the resource. The bit `1<<i` is set<br>
+          *    if and only if the memory type `i` in the<br>
+          *    VkPhysicalDeviceMemoryProperti<wbr>es structure for the physical<br>
+          *    device is supported.<br>
+          *<br>
+          * All types are currently supported for images.<br>
+          */<br>
+         pMemoryRequirements-><wbr>memoryRequirements.<wbr>memoryTypeBits =<br>
+               (1ull << pdevice->memory.type_count) - 1;<br>
+<br>
+         pMemoryRequirements-><wbr>memoryRequirements.size = image->planes[plane].size;<br>
+         pMemoryRequirements-><wbr>memoryRequirements.alignment =<br>
+            image->planes[plane].<wbr>alignment;<br>
+         break;<br>
+      }<br>
+<br>
+      default:<br>
+         anv_debug_ignored_stype(ext-><wbr>sType);<br>
+         break;<br>
+      }<br>
+   }<br>
<br>
    vk_foreach_struct(ext, pMemoryRequirements->pNext) {<br>
       switch (ext->sType) {<br>
diff --git a/src/intel/vulkan/anv_<wbr>extensions.py b/src/intel/vulkan/anv_<wbr>extensions.py<br>
index 491e7086838..a828a668d65 100644<br>
--- a/src/intel/vulkan/anv_<wbr>extensions.py<br>
+++ b/src/intel/vulkan/anv_<wbr>extensions.py<br>
@@ -74,6 +74,7 @@ EXTENSIONS = [<br>
     Extension('VK_KHR_push_<wbr>descriptor',                   1, True),<br>
     Extension('VK_KHR_relaxed_<wbr>block_layout',              1, True),<br>
     Extension('VK_KHR_sampler_<wbr>mirror_clamp_to_edge',      1, True),<br>
+    Extension('VK_KHR_sampler_<wbr>ycbcr_conversion',          1, True),<br>
     Extension('VK_KHR_shader_draw_<wbr>parameters',            1, True),<br>
     Extension('VK_KHR_storage_<wbr>buffer_storage_class',      1, True),<br>
     Extension('VK_KHR_surface',                          25, 'ANV_HAS_SURFACE'),<br>
diff --git a/src/intel/vulkan/anv_<wbr>formats.c b/src/intel/vulkan/anv_<wbr>formats.c<br>
index 879eb072b10..1d92b29c7e6 100644<br>
--- a/src/intel/vulkan/anv_<wbr>formats.c<br>
+++ b/src/intel/vulkan/anv_<wbr>formats.c<br>
@@ -683,7 +683,8 @@ static VkResult<br>
 anv_get_image_format_<wbr>properties(<br>
    struct anv_physical_device *physical_device,<br>
    const VkPhysicalDeviceImageFormatInf<wbr>o2KHR *info,<br>
-   VkImageFormatProperties *pImageFormatProperties)<br>
+   VkImageFormatProperties *pImageFormatProperties,<br>
+   uint32_t *out_planes)<br></blockquote><div><br></div><div>Why not just make this a VkSamplerYcbcrConversionImageF<wbr>ormatPropertiesKHR *?  It doesn't really matter but it seems a tiny bit cleaner.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
 {<br>
    VkFormatProperties format_props;<br>
    VkFormatFeatureFlags format_feature_flags;<br>
@@ -816,6 +817,9 @@ anv_get_image_format_<wbr>properties(<br>
       .maxResourceSize = UINT32_MAX,<br>
    };<br>
<br>
+   if (out_planes)<br>
+      *out_planes = format->n_planes;<br>
+<br>
    return VK_SUCCESS;<br>
<br>
 unsupported:<br>
@@ -852,7 +856,7 @@ VkResult anv_<wbr>GetPhysicalDeviceImageFormatPr<wbr>operties(<br>
    };<br>
<br>
    return anv_get_image_format_<wbr>properties(physical_device, &info,<br>
-                                          pImageFormatProperties);<br>
+                                          pImageFormatProperties, NULL);<br>
 }<br>
<br>
 static const VkExternalMemoryPropertiesKHR prime_fd_props = {<br>
@@ -874,13 +878,9 @@ VkResult anv_<wbr>GetPhysicalDeviceImageFormatPr<wbr>operties2KHR(<br>
    ANV_FROM_HANDLE(anv_physical_<wbr>device, physical_device, physicalDevice);<br>
    const VkPhysicalDeviceExternalImageF<wbr>ormatInfoKHR *external_info = NULL;<br>
    VkExternalImageFormatPropertie<wbr>sKHR *external_props = NULL;<br>
+   VkSamplerYcbcrConversionImageF<wbr>ormatPropertiesKHR *ycbcr_props = NULL;<br>
    VkResult result;<br>
<br>
-   result = anv_get_image_format_<wbr>properties(physical_device, base_info,<br>
-               &base_props-><wbr>imageFormatProperties);<br>
-   if (result != VK_SUCCESS)<br>
-      goto fail;<br>
-<br>
    /* Extract input structs */<br>
    vk_foreach_struct_const(s, base_info->pNext) {<br>
       switch (s->sType) {<br>
@@ -899,12 +899,21 @@ VkResult anv_<wbr>GetPhysicalDeviceImageFormatPr<wbr>operties2KHR(<br>
       case VK_STRUCTURE_TYPE_EXTERNAL_<wbr>IMAGE_FORMAT_PROPERTIES_KHR:<br>
          external_props = (void *) s;<br>
          break;<br>
+      case VK_STRUCTURE_TYPE_SAMPLER_<wbr>YCBCR_CONVERSION_IMAGE_FORMAT_<wbr>PROPERTIES_KHR:<br>
+         ycbcr_props = (void *) s;<br>
+         break;<br>
       default:<br>
          anv_debug_ignored_stype(s-><wbr>sType);<br>
          break;<br>
       }<br>
    }<br>
<br>
+   result = anv_get_image_format_<wbr>properties(physical_device, base_info,<br>
+               &base_props-><wbr>imageFormatProperties,<br>
+               ycbcr_props ? &ycbcr_props-><wbr>combinedImageSamplerDescriptor<wbr>Count : NULL);<br>
+   if (result != VK_SUCCESS)<br>
+      goto fail;<br>
+<br>
    /* From the Vulkan 1.0.42 spec:<br>
     *<br>
     *    If handleType is 0, vkGetPhysicalDeviceImageFormat<wbr>Properties2KHR will<br>
@@ -1006,3 +1015,62 @@ void anv_<wbr>GetPhysicalDeviceExternalBuffe<wbr>rPropertiesKHR(<br>
    pExternalBufferProperties-><wbr>externalMemoryProperties =<br>
       (<wbr>VkExternalMemoryPropertiesKHR) {0};<br>
 }<br>
+<br>
+VkResult anv_<wbr>CreateSamplerYcbcrConversionKH<wbr>R(<br>
+    VkDevice                                    _device,<br>
+    const VkSamplerYcbcrConversionCreate<wbr>InfoKHR* pCreateInfo,<br>
+    const VkAllocationCallbacks*                pAllocator,<br>
+    VkSamplerYcbcrConversionKHR*                pYcbcrConversion)<br>
+{<br>
+   ANV_FROM_HANDLE(anv_device, device, _device);<br>
+   struct anv_ycbcr_conversion *conversion;<br>
+<br>
+   assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_SAMPLER_<wbr>YCBCR_CONVERSION_CREATE_INFO_<wbr>KHR);<br>
+<br>
+   conversion = vk_alloc2(&device->alloc, pAllocator, sizeof(*conversion), 8,<br>
+                          VK_SYSTEM_ALLOCATION_SCOPE_<wbr>OBJECT);<br>
+   if (!conversion)<br>
+      return vk_error(VK_ERROR_OUT_OF_HOST_<wbr>MEMORY);<br>
+<br>
+   memset(conversion, 0, sizeof(*conversion));<br>
+<br>
+   conversion->format = anv_get_format(pCreateInfo-><wbr>format);<br>
+   conversion->ycbcr_model = pCreateInfo->ycbcrModel;<br>
+   conversion->ycbcr_range = pCreateInfo->ycbcrRange;<br>
+   conversion->mapping[0] = pCreateInfo->components.r;<br>
+   conversion->mapping[1] = pCreateInfo->components.g;<br>
+   conversion->mapping[2] = pCreateInfo->components.b;<br>
+   conversion->mapping[3] = pCreateInfo->components.a;<br>
+   conversion->chroma_offsets[0] = pCreateInfo->xChromaOffset;<br>
+   conversion->chroma_offsets[1] = pCreateInfo->yChromaOffset;<br>
+   conversion->chroma_filter = pCreateInfo->chromaFilter;<br>
+<br>
+   bool has_chroma_subsampled = false;<br>
+   for (uint32_t p = 0; p < conversion->format->n_planes; p++) {<br>
+      if (conversion->format->planes[p]<wbr>.has_chroma &&<br>
+          (conversion->format->planes[p]<wbr>.denominator_scales[0] > 1 ||<br>
+           conversion->format->planes[p].<wbr>denominator_scales[1] > 1))<br>
+         has_chroma_subsampled = true;<br>
+   }<br>
+   conversion->chroma_<wbr>reconstruction = has_chroma_subsampled &&<br>
+      (conversion->chroma_offsets[0] == VK_CHROMA_LOCATION_COSITED_<wbr>EVEN_KHR ||<br>
+       conversion->chroma_offsets[1] == VK_CHROMA_LOCATION_COSITED_<wbr>EVEN_KHR);<br>
+<br>
+   *pYcbcrConversion = anv_ycbcr_conversion_to_<wbr>handle(conversion);<br>
+<br>
+   return VK_SUCCESS;<br>
+}<br>
+<br>
+void anv_<wbr>DestroySamplerYcbcrConversionK<wbr>HR(<br>
+    VkDevice                                    _device,<br>
+    VkSamplerYcbcrConversionKHR                 YcbcrConversion,<br>
+    const VkAllocationCallbacks*                pAllocator)<br>
+{<br>
+   ANV_FROM_HANDLE(anv_device, device, _device);<br>
+   ANV_FROM_HANDLE(anv_ycbcr_<wbr>conversion, conversion, YcbcrConversion);<br>
+<br>
+   if (!conversion)<br>
+      return;<br>
+<br>
+   vk_free2(&device->alloc, pAllocator, conversion);<br>
+}<br>
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c<br>
index 3845ae0713c..770c096c8aa 100644<br>
--- a/src/intel/vulkan/anv_image.c<br>
+++ b/src/intel/vulkan/anv_image.c<br>
@@ -515,6 +515,7 @@ anv_image_create(VkDevice _device,<br>
    image->samples = pCreateInfo->samples;<br>
    image->usage = pCreateInfo->usage;<br>
    image->tiling = pCreateInfo->tiling;<br>
+   image->disjoint = pCreateInfo->flags & VK_IMAGE_CREATE_DISJOINT_BIT_<wbr>KHR;<br>
<br>
    const struct anv_format *format = anv_get_format(image->vk_<wbr>format);<br>
    assert(format != NULL);<br>
@@ -612,9 +613,25 @@ VkResult anv_BindImageMemory2KHR(<br>
       const VkBindImageMemoryInfoKHR *bind_info = &pBindInfos[i];<br>
       ANV_FROM_HANDLE(anv_device_<wbr>memory, mem, bind_info->memory);<br>
       ANV_FROM_HANDLE(anv_image, image, bind_info->image);<br>
-      uint32_t aspect_bit;<br>
+      VkImageAspectFlags aspects = image->aspects;<br>
+<br>
+      vk_foreach_struct_const(s, bind_info->pNext) {<br>
+         switch (s->sType) {<br>
+         case VK_STRUCTURE_TYPE_BIND_IMAGE_<wbr>PLANE_MEMORY_INFO_KHR: {<br>
+            const VkBindImagePlaneMemoryInfoKHR *plane_info =<br>
+               (const VkBindImagePlaneMemoryInfoKHR *) s;<br>
<br>
-      anv_foreach_image_aspect_bit(<wbr>aspect_bit, image, image->aspects) {<br>
+            aspects = plane_info->planeAspect;<br>
+            break;<br>
+         }<br>
+         default:<br>
+            anv_debug_ignored_stype(s-><wbr>sType);<br>
+            break;<br>
+         }<br>
+      }<br>
+<br>
+      uint32_t aspect_bit;<br>
+      anv_foreach_image_aspect_bit(<wbr>aspect_bit, image, aspects) {<br>
          uint32_t plane =<br>
             anv_image_aspect_to_plane(<wbr>image->aspects, 1UL << aspect_bit);<br>
          anv_image_bind_memory_plane(<wbr>device, image, plane,<br>
diff --git a/src/intel/vulkan/anv_<wbr>private.h b/src/intel/vulkan/anv_<wbr>private.h<br>
index 4fd716d6a6f..d12e2478a48 100644<br>
--- a/src/intel/vulkan/anv_<wbr>private.h<br>
+++ b/src/intel/vulkan/anv_<wbr>private.h<br>
@@ -2338,6 +2338,9 @@ struct anv_image {<br>
    VkDeviceSize size;<br>
    uint32_t alignment;<br>
<br>
+   /* Whether the image is made of several underlying buffer objects rather a<br>
+    * single one with different offsets.<br>
+    */<br>
    bool disjoint;<br>
<br>
    /**<br>
@@ -2858,6 +2861,7 @@ ANV_DEFINE_NONDISP_HANDLE_<wbr>CASTS(anv_sampler, VkSampler)<br>
 ANV_DEFINE_NONDISP_HANDLE_<wbr>CASTS(anv_semaphore, VkSemaphore)<br>
 ANV_DEFINE_NONDISP_HANDLE_<wbr>CASTS(anv_shader_module, VkShaderModule)<br>
 ANV_DEFINE_NONDISP_HANDLE_<wbr>CASTS(anv_debug_report_<wbr>callback, VkDebugReportCallbackEXT)<br>
+ANV_DEFINE_NONDISP_HANDLE_<wbr>CASTS(anv_ycbcr_conversion, VkSamplerYcbcrConversionKHR)<br>
<br>
 /* Gen-specific function declarations */<br>
 #ifdef genX<br>
diff --git a/src/intel/vulkan/genX_state.<wbr>c b/src/intel/vulkan/genX_state.<wbr>c<br>
index 91da05cddbf..b7e4e5bceab 100644<br>
--- a/src/intel/vulkan/genX_state.<wbr>c<br>
+++ b/src/intel/vulkan/genX_state.<wbr>c<br>
@@ -33,6 +33,8 @@<br>
 #include "genxml/gen_macros.h"<br>
 #include "genxml/genX_pack.h"<br>
<br>
+#include "vk_util.h"<br>
+<br>
 VkResult<br>
 genX(init_device_state)(struct anv_device *device)<br>
 {<br>
@@ -176,12 +178,44 @@ VkResult genX(CreateSampler)(<br>
    uint32_t border_color_offset = device->border_colors.offset +<br>
                                   pCreateInfo->borderColor * 64;<br>
<br>
-   bool enable_min_filter_addr_<wbr>rounding =<br>
-      pCreateInfo->minFilter != VK_FILTER_NEAREST;<br>
-   bool enable_mag_filter_addr_<wbr>rounding =<br>
-      pCreateInfo->magFilter != VK_FILTER_NEAREST;<br>
+   vk_foreach_struct(ext, pCreateInfo->pNext) {<br>
+      switch (ext->sType) {<br>
+      case VK_STRUCTURE_TYPE_SAMPLER_<wbr>YCBCR_CONVERSION_INFO_KHR: {<br>
+         VkSamplerYcbcrConversionInfoKH<wbr>R *pSamplerConversion =<br>
+            (<wbr>VkSamplerYcbcrConversionInfoKH<wbr>R *) ext;<br>
+         ANV_FROM_HANDLE(anv_ycbcr_<wbr>conversion, conversion,<br>
+                         pSamplerConversion-><wbr>conversion);<br>
+<br>
+         if (conversion == NULL)<br>
+            break;<br>
+<br>
+         sampler->n_planes = conversion->format->n_planes;<br>
+         sampler->conversion = conversion;<br>
+         break;<br>
+      }<br>
+      default:<br>
+         anv_debug_ignored_stype(ext-><wbr>sType);<br>
+         break;<br>
+      }<br>
+   }<br>
<br>
    for (unsigned p = 0; p < sampler->n_planes; p++) {<br>
+      const bool plane_has_chroma =<br>
+         sampler->conversion && sampler->conversion->format-><wbr>planes[p].has_chroma;<br>
+      const VkFilter min_filter =<br>
+         plane_has_chroma ? sampler->conversion->chroma_<wbr>filter : pCreateInfo->minFilter;<br>
+      const VkFilter mag_filter =<br>
+         plane_has_chroma ? sampler->conversion->chroma_<wbr>filter : pCreateInfo->magFilter;<br>
+      const bool enable_min_filter_addr_<wbr>rounding = min_filter != VK_FILTER_NEAREST;<br>
+      const bool enable_mag_filter_addr_<wbr>rounding = mag_filter != VK_FILTER_NEAREST;<br>
+      /* From Broadwell PRM, SAMPLER_STATE:<br>
+       *   "Mip Mode Filter must be set to MIPFILTER_NONE for Planar YUV surfaces."<br>
+       */<br>
+      const uint32_t mip_filter_mode =<br>
+         (sampler->conversion &&<br>
+          isl_format_is_yuv(sampler-><wbr>conversion->format->planes[0].<wbr>isl_format)) ?<br>
+         MIPFILTER_NONE : vk_to_gen_mipmap_mode[<wbr>pCreateInfo->mipmapMode];<br>
+<br>
       struct GENX(SAMPLER_STATE) sampler_state = {<br>
          .SamplerDisable = false,<br>
          .TextureBorderColorMode = DX10OGL,<br>
@@ -195,11 +229,9 @@ VkResult genX(CreateSampler)(<br>
 #if GEN_GEN == 8<br>
          .BaseMipLevel = 0.0,<br>
 #endif<br>
-         .MipModeFilter = vk_to_gen_mipmap_mode[<wbr>pCreateInfo->mipmapMode],<br>
-         .MagModeFilter = vk_to_gen_tex_filter(<wbr>pCreateInfo->magFilter,<br>
-                                               pCreateInfo->anisotropyEnable)<wbr>,<br>
-         .MinModeFilter = vk_to_gen_tex_filter(<wbr>pCreateInfo->minFilter,<br>
-                                               pCreateInfo->anisotropyEnable)<wbr>,<br>
+         .MipModeFilter = mip_filter_mode,<br>
+         .MagModeFilter = vk_to_gen_tex_filter(mag_<wbr>filter, pCreateInfo->anisotropyEnable)<wbr>,<br>
+         .MinModeFilter = vk_to_gen_tex_filter(min_<wbr>filter, pCreateInfo->anisotropyEnable)<wbr>,<br>
          .TextureLODBias = anv_clamp_f(pCreateInfo-><wbr>mipLodBias, -16, 15.996),<br>
          .AnisotropicAlgorithm = EWAApproximation,<br>
          .MinLOD = anv_clamp_f(pCreateInfo-><wbr>minLod, 0, 14),<br>
<span class="gmail-HOEnZb"><font color="#888888">--<br>
2.14.2<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>