From: Kenneth Graunke Date: Tue, 29 Jan 2013 06:26:31 +0000 (-0800) Subject: i965/blorp: Support blits between ARGB and XRGB formats. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7d467f3c1583c94daffb58610d12eece1fddd9c2;p=mesa.git i965/blorp: Support blits between ARGB and XRGB formats. Now that we have support for overriding alpha to 1.0, we can handle blitting between these formats in either direction. For now, we only support two XRGB formats: MESA_FORMAT_XRGB8888 and MESA_FORMAT_RGBX8888_REV. Most places only appear to worry about the former, so ignore the latter for now. We can always add it later. NOTE: This is a candidate for the 9.1 branch. Signed-off-by: Kenneth Graunke Reviewed-by: Ian Romanick Tested-by: Martin Steigerwald --- diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp index f45bbbf4315..3615b097cef 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp @@ -184,10 +184,19 @@ formats_match(GLbitfield buffer_bit, struct intel_renderbuffer *src_irb, gl_format src_format = find_miptree(buffer_bit, src_irb)->format; gl_format dst_format = find_miptree(buffer_bit, dst_irb)->format; - return _mesa_get_srgb_format_linear(src_format) == - _mesa_get_srgb_format_linear(dst_format); -} + gl_format linear_src_format = _mesa_get_srgb_format_linear(src_format); + gl_format linear_dst_format = _mesa_get_srgb_format_linear(dst_format); + /* Normally, we require the formats to be equal. However, we also support + * blitting from ARGB to XRGB (discarding alpha), and from XRGB to ARGB + * (overriding alpha to 1.0 via blending). + */ + return linear_src_format == linear_dst_format || + (linear_src_format == MESA_FORMAT_XRGB8888 && + linear_dst_format == MESA_FORMAT_ARGB8888) || + (linear_src_format == MESA_FORMAT_ARGB8888 && + linear_dst_format == MESA_FORMAT_XRGB8888); +} static bool try_blorp_blit(struct intel_context *intel, @@ -1730,17 +1739,6 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw, src.set(brw, src_mt, src_level, src_layer); dst.set(brw, dst_mt, dst_level, dst_layer); - /* If we are blitting from sRGB to linear or vice versa, we still want the - * blit to be a direct copy, so we need source and destination to use the - * same format. However, we want the destination sRGB/linear state to be - * correct (so that sRGB blending is used when doing an MSAA resolve to an - * sRGB surface, and linear blending is used when doing an MSAA resolve to - * a linear surface). Since blorp blits don't support any format - * conversion (except between sRGB and linear), we can accomplish this by - * simply setting up the source to use the same format as the destination. - */ - assert(_mesa_get_srgb_format_linear(src_mt->format) == - _mesa_get_srgb_format_linear(dst_mt->format)); src.brw_surfaceformat = dst.brw_surfaceformat; use_wm_prog = true;