On Friday, June 05, 2015 03:14:30 PM Chris Wilson wrote: > The blitter already has code to accommodate filling in the alpha channel > for BGRX destination formats, so expand this to also allow filling the > alpha channgel in RGBX formats. > > More importantly for the next patch is moving the test into its own > function for the purpose of exporting the check to the callers. > > Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> > Cc: Jason Ekstrand <ja...@jlekstrand.net> > Cc: Alexander Monakov <amona...@gmail.com> > Cc: Kristian Høgsberg <k...@bitplanet.net> > Cc: Kenneth Graunke <kenn...@whitecape.org> > --- > src/mesa/drivers/dri/i965/intel_blit.c | 38 > +++++++++++++++++++++++++++------- > 1 file changed, 30 insertions(+), 8 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/intel_blit.c > b/src/mesa/drivers/dri/i965/intel_blit.c > index 360bfe8..02666dc 100644 > --- a/src/mesa/drivers/dri/i965/intel_blit.c > +++ b/src/mesa/drivers/dri/i965/intel_blit.c > @@ -138,6 +138,31 @@ static int blt_pitch(struct intel_mipmap_tree *mt) > return pitch; > } > > +static bool blt_compatible_formats(mesa_format src, mesa_format dst)
static bool blt_compatible_formats(mesa_format src, mesa_format dst) > +{ > + /* The BLT doesn't handle sRGB conversion */ > + assert(src == _mesa_get_srgb_format_linear(src)); > + assert(dst == _mesa_get_srgb_format_linear(dst)); > + > + /* No swizzle or format conversions possible, except... */ > + if (src == dst) > + return true; > + > + /* > + * ... we can either discard the alpha channel when going from A->X, /* ...we can either discard the alpha channel when going from A->X, > + * or we can fill the alpha channel with 0xff when going from X->A > + */ > + if (src == MESA_FORMAT_B8G8R8A8_UNORM || src == > MESA_FORMAT_B8G8R8X8_UNORM) > + return (dst == MESA_FORMAT_B8G8R8A8_UNORM || > + dst == MESA_FORMAT_B8G8R8X8_UNORM); > + > + if (src == MESA_FORMAT_R8G8B8A8_UNORM || src == > MESA_FORMAT_R8G8B8X8_UNORM) > + return (dst == MESA_FORMAT_R8G8B8A8_UNORM || > + dst == MESA_FORMAT_R8G8B8X8_UNORM); > + > + return false; > +} > + > /** > * Implements a rectangular block transfer (blit) of pixels between two > * miptrees. > @@ -180,11 +205,7 @@ intel_miptree_blit(struct brw_context *brw, > * the X channel don't matter), and XRGB8888 to ARGB8888 by setting the A > * channel to 1.0 at the end. > */ > - if (src_format != dst_format && > - ((src_format != MESA_FORMAT_B8G8R8A8_UNORM && > - src_format != MESA_FORMAT_B8G8R8X8_UNORM) || > - (dst_format != MESA_FORMAT_B8G8R8A8_UNORM && > - dst_format != MESA_FORMAT_B8G8R8X8_UNORM))) { > + if (!blt_compatible_formats(src_format, dst_format)) { > perf_debug("%s: Can't use hardware blitter from %s to %s, " > "falling back.\n", __func__, > _mesa_get_format_name(src_format), > @@ -269,12 +290,13 @@ intel_miptree_blit(struct brw_context *brw, > return false; > } > > - if (src_mt->format == MESA_FORMAT_B8G8R8X8_UNORM && > - dst_mt->format == MESA_FORMAT_B8G8R8A8_UNORM) { > + /* XXX This could be done in a single pass using XY_FULL_MONO_PATTERN_BLT > */ > + if (src_format != dst_format && > + (dst_format == MESA_FORMAT_B8G8R8X8_UNORM || > + dst_format == MESA_FORMAT_R8G8B8X8_UNORM)) > intel_miptree_set_alpha_to_one(brw, dst_mt, > dst_x, dst_y, > width, height); > - } > As Alexander noted, this is backwards. How about this as a solution: if (_mesa_get_format_bits(src_format, GL_ALPHA_BITS) == 0 && _mesa_get_format_bits(dst_format, GL_ALPHA_BITS) > 0) { intel_miptree_set_alpha_to_one(brw, dst_mt, dst_x, dst_y, width, height); } That reduces the number of places that need to enumerate formats, and expresses the condition pretty clearly - if we don't have alpha data, but need it, fill it in. With that change, the series is: Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> Thanks a lot for fixing this, Chris! > - } > return true; > } >
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev