i965: For color clears, only disable writes to components that exist.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 21 Mar 2014 10:47:16 +0000 (03:47 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 24 Mar 2014 21:46:05 +0000 (14:46 -0700)
The SIMD16 replicated FB write message only works if we don't need the
color calculator to mask our framebuffer writes.  Previously, we bailed
on it if color_mask wasn't <true, true, true, true>.  However, this was
needlessly strict for formats with fewer than four components - only the
components that actually exist matter.

WebGL Aquarium attempts to clear a BGRX texture with the ColorMask set
to <true, true, true, false>.  This will work perfectly fine with the
replicated data message; we just bailed unnecessarily.

Improves performance of WebGL Aquarium on Iris Pro (at 1920x1080) by
abound 50%, and Bay Trail (at 1366x768) by over 70% (using Chrome 24).

v2: Use _mesa_format_has_color_component() to properly handle ALPHA
    formats (and generally be less fragile).

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Tested-by: Dylan Baker <baker.dylan.c@gmail.com>
src/mesa/drivers/dri/i965/brw_blorp_clear.cpp

index 3c6c57beda8e8c644e239ce6c56b9c54f171b8da..fd18b45202ffe7bb1bb7ffc139fee6a896150634 100644 (file)
@@ -231,7 +231,8 @@ brw_blorp_clear_params::brw_blorp_clear_params(struct brw_context *brw,
     * state.  This is not documented.
     */
    for (int i = 0; i < 4; i++) {
-      if (!color_mask[i]) {
+      if (_mesa_format_has_color_component(irb->mt->format, i) &&
+          !color_mask[i]) {
          color_write_disable[i] = true;
          wm_prog_key.use_simd16_replicated_data = false;
       }