[Mesa-dev] [PATCH 7/7] i965/blorp: Allow format conversions.

Ian Romanick idr at freedesktop.org
Tue Oct 8 11:37:21 PDT 2013


On 10/07/2013 04:31 PM, Kenneth Graunke wrote:
> BLORP performs blits by drawing a rectangle with a shader that samples
> from the source texture, and writes color data to the destination.
> 
> The sampler always returns 32-bit RGBA float data, regardless of the
> source format's component ordering or data type.  Likewise, the render
> target write message takes 32-bit RGBA float data, and converts it
> appropriately.  So the bulk of the work is already taken care of for us.
> 
> This greatly accelerates a lot of blits and CopyTexSubImage calls, and
> makes Legends of Aethereus playable on Ivybridge.  At the default
> settings, LOA continually blits between SRGBA8888 (the window format)
> and RGBA16_FLOAT.  Since neither BLORP nor our BLT paths supported this,
> it fell back to meta, spending 33% of the CPU in floorf() converting
> between floats and half-floats.
> 
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> index 2427085..c44f7c4 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> @@ -353,10 +353,23 @@ brw_blorp_copytexsubimage(struct brw_context *brw,
>     if (brw->gen < 6)
>        return false;
>  
> -   if (!color_formats_match(src_mt->format, dst_mt->format)) {
> +   if (_mesa_get_format_base_format(src_mt->format) !=
> +       _mesa_get_format_base_format(dst_mt->format)) {
>        return false;
>     }
>  
> +   /* We can't handle format conversions between Z24 and other formats since
> +    * we have to lie about the surface format.  See the comments in
> +    * brw_blorp_surface_info::set().
> +    */
> +   if ((src_mt->format == MESA_FORMAT_X8_Z24) ^
> +       (dst_mt->format == MESA_FORMAT_X8_Z24)) {

You can use != instead of ^ here.

> +      return false;
> +   }
> +
> +   if (!brw->format_supported_as_render_target[dst_mt->format])
> +      return false;
> +
>     /* Source clipping shouldn't be necessary, since copytexsubimage (in
>      * src/mesa/main/teximage.c) calls _mesa_clip_copytexsubimage() which
>      * takes care of it.
> 



More information about the mesa-dev mailing list