<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Oct 24, 2017 at 4:49 AM, Jose Maria Casanova Crespo <span dir="ltr"><<a href="mailto:jmcasanova@igalia.com" target="_blank">jmcasanova@igalia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Alejandro Piñeiro <<a href="mailto:apinheiro@igalia.com" target="_blank">apinheiro@igalia.com</a>><br>
<br>
>From Vulkan 1.0.50 spec, Section 3.30.1. Format Definition:<br>
    VK_FORMAT_R16G16_SFLOAT<br>
<br>
    A two-component, 32-bit signed floating-point format that has a<br>
    16-bit R component in bytes 0..1, and a 16-bit G component in<br>
    bytes 2..3.<br>
<br>
So this format expects those 16-bit floats to be passed without any<br>
conversion (applies too using 2/3/4 components, and with int formats)<br></blockquote><div><br></div><div>I don't think this assertion is really accurate.  The assumption on vertex data and other inputs has always been that they will get up-converted.  The 16-bit storage extension provides a mechanism to get them more directly and efficiently, however.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
But from skl PRM, vol 07, section FormatConversion, page 445 there is<br>
a table that points that *16*FLOAT formats are converted to FLOAT,<br>
that in that context, is a 32-bit float. This is similar to the<br>
*64*FLOAT formats, that converts 64-bit floats to 32-bit floats.<br>
<br>
Unfortunately, while with 64-bit floats we have the alternative to use<br>
*64*PASSTHRU formats, it is not the case with 16-bits.<br>
<br>
This issue happens too with 16-bit int surface formats.<br>
<br>
As a workaround, if we are using a 16-bit location at the shader, we<br>
use 32-bit formats to avoid the conversion, and will fix getting the<br>
proper content later. Note that as we are using 32-bit formats, we<br>
can use formats with less components (example: use *R32* for *R16G16*).<br>
<br>
Signed-off-by: Jose Maria Casanova Crespo <<a href="mailto:jmcasanova@igalia.com" target="_blank">jmcasanova@igalia.com</a>><br>
Signed-off-by: Alejandro Piñeiro <<a href="mailto:apinheiro@igalia.com" target="_blank">apinheiro@igalia.com</a>><br>
<br>
v2: Always use UINT surface format variants. (Topi Pohjolainen)<br>
---<br>
 src/intel/vulkan/genX_pipelin<wbr>e.c | 34 ++++++++++++++++++++++++++++++<wbr>++++<br>
 1 file changed, 34 insertions(+)<br>
<br>
diff --git a/src/intel/vulkan/genX_pipeli<wbr>ne.c b/src/intel/vulkan/genX_pipeli<wbr>ne.c<br>
index c2fa9c0ff7..7c5c6df7e0 100644<br>
--- a/src/intel/vulkan/genX_pipeli<wbr>ne.c<br>
+++ b/src/intel/vulkan/genX_pipeli<wbr>ne.c<br>
@@ -83,6 +83,31 @@ vertex_element_comp_control(en<wbr>um isl_format format, unsigned comp)<br>
    }<br>
 }<br>
<br>
+#if GEN_GEN >= 8<br>
+static enum isl_format<br>
+adjust_16bit_format(enum isl_format format)<br>
+{<br>
+   switch(format) {<br>
+   case ISL_FORMAT_R16_UINT:<br>
+   case ISL_FORMAT_R16_SINT:<br>
+   case ISL_FORMAT_R16_FLOAT:<br>
+   case ISL_FORMAT_R16G16_UINT:<br>
+   case ISL_FORMAT_R16G16_SINT:<br>
+   case ISL_FORMAT_R16G16_FLOAT:<br>
+      return ISL_FORMAT_R32_UINT;<br>
+   case ISL_FORMAT_R16G16B16_UINT:<br>
+   case ISL_FORMAT_R16G16B16_SINT:<br>
+   case ISL_FORMAT_R16G16B16_FLOAT:<br>
+   case ISL_FORMAT_R16G16B16A16_UINT:<br>
+   case ISL_FORMAT_R16G16B16A16_SINT:<br>
+   case ISL_FORMAT_R16G16B16A16_FLOAT:<br>
+      return ISL_FORMAT_R32G32_UINT;<br>
+   default:<br>
+      return format;<br>
+   }<br>
+}<br>
+#endif<br>
+<br>
 static void<br>
 emit_vertex_input(struct anv_pipeline *pipeline,<br>
                   const VkPipelineVertexInputStateCrea<wbr>teInfo *info)<br>
@@ -95,6 +120,10 @@ emit_vertex_input(struct anv_pipeline *pipeline,<br>
    assert((inputs_read & ((1 << VERT_ATTRIB_GENERIC0) - 1)) == 0);<br>
    const uint32_t elements = inputs_read >> VERT_ATTRIB_GENERIC0;<br>
    const uint32_t elements_double = double_inputs_read >> VERT_ATTRIB_GENERIC0;<br>
+#if GEN_GEN >= 8<br>
+   const uint64_t half_inputs_read = vs_prog_data->half_inputs_read<wbr>;<br>
+   const uint32_t elements_half = half_inputs_read >> VERT_ATTRIB_GENERIC0;<br>
+#endif<br>
    const bool needs_svgs_elem = vs_prog_data->uses_vertexid ||<br>
                                 vs_prog_data->uses_instanceid ||<br>
                                 vs_prog_data->uses_basevertex ||<br>
@@ -125,6 +154,11 @@ emit_vertex_input(struct anv_pipeline *pipeline,<br>
                                                   VK_IMAGE_ASPECT_COLOR_BIT,<br>
                                                   VK_IMAGE_TILING_LINEAR);<br>
<br>
+#if GEN_GEN >= 8<br>
+      if ((elements_half & (1 << desc->location)) != 0) {<br>
+         format = adjust_16bit_format(format);<br>
+      }<br>
+#endif<br>
       assert(desc->binding < MAX_VBS);<br>
<br>
       if ((elements & (1 << desc->location)) == 0)<br>
<span class="m_-1307486366485375446HOEnZb"><font color="#888888">--<br>
2.13.6<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">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>