On 6 June 2012 23:42, Kenneth Graunke <span dir="ltr">&lt;<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On 06/06/2012 12:20 PM, Paul Berry wrote:<br>
&gt; Previously the blorp engine only supported RGBA8 color buffers and<br>
&gt; 24-bit depth buffers.  This patch adds support for any color buffer<br>
&gt; format that is supported as a render target, and for 16-bit and 32-bit<br>
&gt; depth buffers.<br>
&gt;<br>
&gt; This required threading the brw_context struct through into<br>
&gt; brw_blorp_surface_info::set() so that it can consult the<br>
&gt; brw-&gt;render_target_format array.<br>
&gt; ---<br>
&gt;  src/mesa/drivers/dri/i965/brw_blorp.cpp      |   37 +++++++++++++++++++++++---<br>
&gt;  src/mesa/drivers/dri/i965/brw_blorp.h        |    3 +-<br>
&gt;  src/mesa/drivers/dri/i965/brw_blorp_blit.cpp |    4 +-<br>
&gt;  3 files changed, 37 insertions(+), 7 deletions(-)<br>
&gt;<br>
&gt; diff --git a/src/mesa/drivers/dri/i965/brw_blorp.cpp b/src/mesa/drivers/dri/i965/brw_blorp.cpp<br>
&gt; index d6d00e7..32ea738 100644<br>
&gt; --- a/src/mesa/drivers/dri/i965/brw_blorp.cpp<br>
&gt; +++ b/src/mesa/drivers/dri/i965/brw_blorp.cpp<br>
&gt; @@ -53,23 +53,52 @@ brw_blorp_mip_info::set(struct intel_mipmap_tree *mt,<br>
&gt;  }<br>
&gt;<br>
&gt;  void<br>
&gt; -brw_blorp_surface_info::set(struct intel_mipmap_tree *mt,<br>
&gt; +brw_blorp_surface_info::set(struct brw_context *brw,<br>
&gt; +                            struct intel_mipmap_tree *mt,<br>
&gt;                              unsigned int level, unsigned int layer)<br>
&gt;  {<br>
&gt;     brw_blorp_mip_info::set(mt, level, layer);<br>
&gt;     this-&gt;num_samples = mt-&gt;num_samples;<br>
&gt;     this-&gt;array_spacing_lod0 = mt-&gt;array_spacing_lod0;<br>
&gt; +   this-&gt;map_stencil_as_y_tiled = false;<br>
&gt;<br>
&gt; -   if (mt-&gt;format == MESA_FORMAT_S8) {<br>
&gt; +   switch (mt-&gt;format) {<br>
&gt; +   case MESA_FORMAT_S8:<br>
&gt;        /* The miptree is a W-tiled stencil buffer.  Surface states can&#39;t be set<br>
&gt;         * up for W tiling, so we&#39;ll need to use Y tiling and have the WM<br>
&gt;         * program swizzle the coordinates.<br>
&gt;         */<br>
&gt;        this-&gt;map_stencil_as_y_tiled = true;<br>
&gt;        this-&gt;brw_surfaceformat = BRW_SURFACEFORMAT_R8_UNORM;<br>
&gt; -   } else {<br>
&gt; -      this-&gt;map_stencil_as_y_tiled = false;<br>
&gt; +      break;<br>
&gt; +   case MESA_FORMAT_X8_Z24:<br>
&gt; +   case MESA_FORMAT_Z32_FLOAT:<br>
&gt; +      /* The miptree consists of 32 bits per pixel, arranged either as 24-bit<br>
&gt; +       * depth values interleaved with 8 &quot;don&#39;t care&quot; bits, or as 32-bit<br>
&gt; +       * floating point depth values.  Since depth values don&#39;t require any<br>
&gt; +       * blending, it doesn&#39;t matter how we interpret the bit pattern as long<br>
&gt; +       * as we copy the right amount of data, so just map it as 8-bit RGBA.<br>
<br>
</div></div>Nitpick...you&#39;re not mapping it as RGBA.  I would believe either<br>
&quot;just map it as 8-bit BGRA&quot; ... or &quot;as 8-bit ARGB&quot; since I can never<br>
keep the endianness straight.<br>
<br>
Of course, the point of the comment is precisely that it doesn&#39;t<br>
matter... :)<br></blockquote><div><br>Yeah, I didn&#39;t want to trouble the reader with this subtlety, but you are technically correct.  I&#39;ll update the comment.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<div class="im"><br>
&gt; +       */<br>
&gt;        this-&gt;brw_surfaceformat = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;<br>
&gt; +      break;<br>
&gt; +   case MESA_FORMAT_Z16:<br>
&gt; +      /* The miptree consists of 16 bits per pixel of depth data.  Since depth<br>
&gt; +       * values don&#39;t require any blending, it doesn&#39;t matter how we interpret<br>
&gt; +       * the bit pattern as long as we copy the right amount of data, so just<br>
&gt; +       * map is as 8-bit RG.<br>
&gt; +       */<br>
&gt; +      this-&gt;brw_surfaceformat = BRW_SURFACEFORMAT_R8G8_UNORM;<br>
&gt; +      break;<br>
&gt; +   default:<br>
&gt; +      /* Blorp blits don&#39;t support any sort of format conversion, so we can<br>
&gt; +       * safely assume that the same format is being used for the source and<br>
&gt; +       * destination.  Therefore the format must be supported as a render<br>
&gt; +       * target, even if this is the source image.  So we can convert to a<br>
&gt; +       * surface format using brw-&gt;render_target_format.<br>
&gt; +       */<br>
&gt; +      assert(brw-&gt;format_supported_as_render_target[mt-&gt;format]);<br>
&gt; +      this-&gt;brw_surfaceformat = brw-&gt;render_target_format[mt-&gt;format];<br>
<br>
</div>Why not just do:<br>
<br>
default:<br>
   this-&gt;brw_surfaceformat = brw_format_for_mesa_format(mt-&gt;format);<br></blockquote><div><br>The trouble is that brw-&gt;render_target_format[] and brw_format_for_mesa_format() don&#39;t do the same thing.  In particular, brw-&gt;render_target_format maps several formats that are otherwise unsupported as render targets onto equivalent formats that are supported:<br>
<br>BRW_SURFACEFORMAT_B8G8R8X8_UNORM -&gt; BRW_SURFACEFORMAT_B8G8R8A8_UNORM<br>BRW_SURFACEFORMAT_I32_FLOAT -&gt; BRW_SURFACEFORMAT_R32_FLOAT<br>BRW_SURFACEFORMAT_L32_FLOAT -&gt; BRW_SURFACEFORMAT_R32_FLOAT<br>BRW_SURFACEFORMAT_I16_FLOAT -&gt; BRW_SURFACEFORMAT_R16_FLOAT<br>
BRW_SURFACEFORMAT_L16_FLOAT -&gt; BRW_SURFACEFORMAT_R16_FLOAT<br><br>Blorp needs to use brw-&gt;render_target_format[] so that these mappings will occur, otherwise it will try to map the render target using an unsupported format.<br>
 </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Then you don&#39;t need to explain why it&#39;s safe to assume that source<br>
formats are render formats and access the array directly.  Obviously, it<br>
still needs to be renderable, but that&#39;s probably best captured<br>
elsewhere in an assert like<br>
<br>
assert(source_format == dest_format);<br>
<br>
which I assume you already have.<br>
<br>
With those minor changes, this is:<br>
Reviewed-by: Kenneth Graunke &lt;<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>&gt;<br>
<div class="HOEnZb"><div class="h5"><br>
&gt; +      break;<br>
&gt;     }<br>
&gt;  }<br>
&gt;<br>
&gt; diff --git a/src/mesa/drivers/dri/i965/brw_blorp.h b/src/mesa/drivers/dri/i965/brw_blorp.h<br>
&gt; index 0de3d1e..4c74c91 100644<br>
&gt; --- a/src/mesa/drivers/dri/i965/brw_blorp.h<br>
&gt; +++ b/src/mesa/drivers/dri/i965/brw_blorp.h<br>
&gt; @@ -66,7 +66,8 @@ class brw_blorp_surface_info : public brw_blorp_mip_info<br>
&gt;  public:<br>
&gt;     brw_blorp_surface_info();<br>
&gt;<br>
&gt; -   void set(struct intel_mipmap_tree *mt,<br>
&gt; +void set(struct brw_context *brw,<br>
&gt; +         struct intel_mipmap_tree *mt,<br>
&gt;              unsigned int level, unsigned int layer);<br>
&gt;<br>
&gt;     /* Setting this flag indicates that the buffer&#39;s contents are W-tiled<br>
&gt; diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp<br>
&gt; index 93c3f73..180468b 100644<br>
&gt; --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp<br>
&gt; +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp<br>
&gt; @@ -1274,8 +1274,8 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw,<br>
&gt;                                               GLuint dst_x1, GLuint dst_y1,<br>
&gt;                                               bool mirror_x, bool mirror_y)<br>
&gt;  {<br>
&gt; -   src.set(src_mt, 0, 0);<br>
&gt; -   dst.set(dst_mt, 0, 0);<br>
&gt; +   src.set(brw, src_mt, 0, 0);<br>
&gt; +   dst.set(brw, dst_mt, 0, 0);<br>
&gt;<br>
&gt;     use_wm_prog = true;<br>
&gt;     memset(&amp;wm_prog_key, 0, sizeof(wm_prog_key));<br>
</div></div></blockquote></div><br>