<div dir="ltr">On 2 December 2013 11:39, Francisco Jerez <span dir="ltr"><<a href="mailto:currojerez@riseup.net" target="_blank">currojerez@riseup.net</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">+static uint32_t<br>
+get_image_format(struct brw_context *brw, gl_format format)<br>
+{<br></blockquote><div><br></div>It's not clear without additional context that this function is only used in the case where the surface is both written to and read from.  Can we rename it to something like "get_image_format_for_rw"?  At the very least there should be a comment explaining this.<br>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+   switch (format) {<br>
+   case MESA_FORMAT_RGBA_UINT32:<br>
+   case MESA_FORMAT_RGBA_INT32:<br>
+   case MESA_FORMAT_RGBA_FLOAT32:<br>
+      /* Fail...  We need to fall back to untyped surface access for<br>
+       * all 128 bpp formats.<br>
+       */<br>
+      return BRW_SURFACEFORMAT_RAW;<br>
+<br>
+   case MESA_FORMAT_RGBA_UINT16:<br>
+   case MESA_FORMAT_RGBA_INT16:<br>
+   case MESA_FORMAT_RGBA_FLOAT16:<br>
+   case MESA_FORMAT_RGBA_16:<br>
+   case MESA_FORMAT_SIGNED_RGBA_16:<br>
+   case MESA_FORMAT_RG_UINT32:<br>
+   case MESA_FORMAT_RG_INT32:<br>
+   case MESA_FORMAT_RG_FLOAT32:<br>
+      /* HSW supports the R16G16B16A16_UINT format natively and<br>
+       * handles the pixel packing, unpacking and type conversion in<br>
+       * the shader for other 64 bpp formats.  IVB falls back to<br>
+       * untyped.<br>
+       */<br>
+      return (brw->is_haswell ? BRW_SURFACEFORMAT_R16G16B16A16_UINT :<br>
+              BRW_SURFACEFORMAT_RAW);<br>
+<br>
+   case MESA_FORMAT_RGBA_UINT8:<br>
+   case MESA_FORMAT_RGBA_INT8:<br>
+   case MESA_FORMAT_RGBA8888_REV:<br>
+   case MESA_FORMAT_SIGNED_RGBA8888_REV:<br>
+      /* HSW supports the R8G8B8A8_UINT format natively, type<br>
+       * conversion to other formats is handled in the shader.  IVB<br>
+       * uses R32_UINT and handles the pixel packing, unpacking and<br>
+       * type conversion in the shader.<br>
+       */<br>
+      return (brw->is_haswell ? BRW_SURFACEFORMAT_R8G8B8A8_UINT :<br>
+              BRW_SURFACEFORMAT_R32_UINT);<br>
+<br>
+   case MESA_FORMAT_RG_UINT16:<br>
+   case MESA_FORMAT_RG_INT16:<br>
+   case MESA_FORMAT_RG_FLOAT16:<br>
+   case MESA_FORMAT_GR1616:<br>
+   case MESA_FORMAT_SIGNED_GR1616:<br>
+      /* HSW supports the R16G16_UINT format natively, type conversion<br>
+       * to other formats is handled in the shader.  IVB uses R32_UINT<br>
+       * and handles the pixel packing, unpacking and type conversion<br>
+       * in the shader.<br>
+       */<br>
+      return (brw->is_haswell ? BRW_SURFACEFORMAT_R16G16_UINT :<br>
+              BRW_SURFACEFORMAT_R32_UINT);<br>
+<br>
+   case MESA_FORMAT_ABGR2101010_UINT:<br>
+   case MESA_FORMAT_ABGR2101010:<br>
+   case MESA_FORMAT_R11_G11_B10_FLOAT:<br>
+   case MESA_FORMAT_R_UINT32:<br>
+      /* Neither the 2/10/10/10 nor the 11/11/10 packed formats are<br>
+       * supported by the hardware.  Use R32_UINT and handle the pixel<br>
+       * packing, unpacking, and type conversion in the shader.<br>
+       */<br>
+      return BRW_SURFACEFORMAT_R32_UINT;<br>
+<br>
+   case MESA_FORMAT_R_INT32:<br>
+      return BRW_SURFACEFORMAT_R32_SINT;<br>
+<br>
+   case MESA_FORMAT_R_FLOAT32:<br>
+      return BRW_SURFACEFORMAT_R32_FLOAT;<br>
+<br>
+   case MESA_FORMAT_RG_UINT8:<br>
+   case MESA_FORMAT_RG_INT8:<br>
+   case MESA_FORMAT_GR88:<br>
+   case MESA_FORMAT_SIGNED_RG88_REV:<br>
+      /* HSW supports the R8G8_UINT format natively, type conversion<br>
+       * to other formats is handled in the shader.  IVB uses R16_UINT<br>
+       * and handles the pixel packing, unpacking and type conversion<br>
+       * in the shader.  Note that this relies on the undocumented<br>
+       * behavior that typed reads from R16_UINT surfaces actually do<br>
+       * a 32-bit misaligned read on IVB.  The alternative would be to<br>
+       * use two surface state entries with different formats for each<br>
+       * image, one for reading (using R32_UINT) and another one for<br>
+       * writing (using R8G8_UINT), but that would complicate the<br>
+       * shaders we generate even more.<br>
+       */<br>
+      return (brw->is_haswell ? BRW_SURFACEFORMAT_R8G8_UINT :<br>
+              BRW_SURFACEFORMAT_R16_UINT);<br>
+<br>
+   case MESA_FORMAT_R_UINT16:<br>
+   case MESA_FORMAT_R_FLOAT16:<br>
+   case MESA_FORMAT_R_INT16:<br>
+   case MESA_FORMAT_R16:<br>
+   case MESA_FORMAT_SIGNED_R16:<br>
+      /* HSW supports the R16_UINT format natively, type conversion to<br>
+       * other formats is handled in the shader.  IVB relies on the<br>
+       * same undocumented behavior described above.<br>
+       */<br>
+      return BRW_SURFACEFORMAT_R16_UINT;<br>
+<br>
+   case MESA_FORMAT_R_UINT8:<br>
+   case MESA_FORMAT_R_INT8:<br>
+   case MESA_FORMAT_R8:<br>
+   case MESA_FORMAT_SIGNED_R8:<br>
+      /* HSW supports the R8_UINT format natively, type conversion to<br>
+       * other formats is handled in the shader.  IVB relies on the<br>
+       * same undocumented behavior described above.<br>
+       */<br>
+      return BRW_SURFACEFORMAT_R8_UINT;<br>
+<br>
+   default:<br>
+      unreachable();<br></blockquote><div><br></div><div>Change to an assert.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+   }<br>
+}<br></blockquote><div><br></div><div>With those changes, this patch is:<br><br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br></div></div></div></div>