From 5f11b10f2c6a7dc94b8abdbffb755505f8a3a0ec Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Mon, 23 Jun 2014 17:43:08 +0100 Subject: [PATCH] i965: Allow the blorp blit between BGR and RGB Previously the blorp blitter would only be used if the format is identical or there is only a difference between whether there is an alpha component or not. This patch makes it also allow the blorp blitter if the only difference is the ordering of the RGB components (ie, RGB or BGR). This is particularly useful since commit 61e264f4fcdba3623 because Mesa now prefers RGB ordering for textures but the window system buffers are still created as BGR. That means that the blorp blitter won't be used for the (probably) common case of blitting from a texture to the window system buffer. This doesn't cause any regressions in the FBO piglit tests on Haswell. On Sandybridge it causes the fbo-blit-stretch test to fail but that is only because it was failing anyway before the above commit and that commit hid the problem. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=68365 Reviewed-by: Matt Turner --- src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 28 +++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp index 118af273505..d7f5f7dbd4f 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp @@ -119,21 +119,35 @@ do_blorp_blit(struct brw_context *brw, GLbitfield buffer_bit, dst_irb->need_downsample = true; } +static bool +format_is_rgba_or_rgbx_byte(mesa_format format) +{ + switch (format) { + case MESA_FORMAT_B8G8R8X8_UNORM: + case MESA_FORMAT_B8G8R8A8_UNORM: + case MESA_FORMAT_R8G8B8X8_UNORM: + case MESA_FORMAT_R8G8B8A8_UNORM: + return true; + default: + return false; + } +} + static bool color_formats_match(mesa_format src_format, mesa_format dst_format) { mesa_format linear_src_format = _mesa_get_srgb_format_linear(src_format); mesa_format linear_dst_format = _mesa_get_srgb_format_linear(dst_format); - /* Normally, we require the formats to be equal. However, we also support + /* 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). + * (overriding alpha to 1.0 via blending) as well as swizzling between BGR + * and RGB. */ - return linear_src_format == linear_dst_format || - (linear_src_format == MESA_FORMAT_B8G8R8X8_UNORM && - linear_dst_format == MESA_FORMAT_B8G8R8A8_UNORM) || - (linear_src_format == MESA_FORMAT_B8G8R8A8_UNORM && - linear_dst_format == MESA_FORMAT_B8G8R8X8_UNORM); + + return (linear_src_format == linear_dst_format || + (format_is_rgba_or_rgbx_byte(linear_src_format) && + format_is_rgba_or_rgbx_byte(linear_dst_format))); } static bool -- 2.30.2