<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>