i965/blorp: Fix clear code for ignoring colormask for XRGB formats on Gen9+
authorTopi Pohjolainen <topi.pohjolainen@intel.com>
Fri, 22 Apr 2016 06:44:13 +0000 (09:44 +0300)
committerTopi Pohjolainen <topi.pohjolainen@intel.com>
Sat, 23 Apr 2016 04:29:15 +0000 (07:29 +0300)
This is equivalent of 73b01e2711ff45a1f313d5372d6c8fa4fe55d4d2
for blorp.

v2 (Ken): No need to call _mesa_format_has_color_component() now
          that the number of components is gotten from
          _mesa_base_format_component_count().

Signed-off-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_blorp_clear.cpp

index 51f915d285442b89576ca03d785994becc8ec60a..0a023e26531155d82aee21e65dd9bafabd03e2c0 100644 (file)
@@ -25,6 +25,7 @@
 #include "main/blend.h"
 #include "main/fbobject.h"
 #include "main/renderbuffer.h"
+#include "main/glformats.h"
 
 #include "util/ralloc.h"
 
@@ -135,6 +136,29 @@ brw_blorp_const_color_program::~brw_blorp_const_color_program()
    ralloc_free(mem_ctx);
 }
 
+static bool
+set_write_disables(const struct intel_renderbuffer *irb, 
+                   const GLubyte *color_mask, bool *color_write_disable)
+{
+   /* Format information in the renderbuffer represents the requirements
+    * given by the client. There are cases where the backing miptree uses,
+    * for example, RGBA to represent RGBX. Since the client is only expecting
+    * RGB we can treat alpha as not used and write whatever we like into it.
+    */
+   const GLenum base_format = irb->Base.Base._BaseFormat;
+   const int components = _mesa_base_format_component_count(base_format);
+   bool disables = false;
+
+   assert(components > 0);
+
+   for (int i = 0; i < components; i++) {
+      color_write_disable[i] = !color_mask[i];
+      disables = disables || !color_mask[i];
+   }
+
+   return disables;
+}
+
 brw_blorp_clear_params::brw_blorp_clear_params(struct brw_context *brw,
                                                struct gl_framebuffer *fb,
                                                struct gl_renderbuffer *rb,
@@ -185,13 +209,8 @@ brw_blorp_clear_params::brw_blorp_clear_params(struct brw_context *brw,
    /* Constant color writes ignore everyting in blend and color calculator
     * state.  This is not documented.
     */
-   for (int i = 0; i < 4; 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;
-      }
-   }
+   if (set_write_disables(irb, color_mask, color_write_disable))
+      wm_prog_key.use_simd16_replicated_data = false;
 
    if (irb->mt->fast_clear_state != INTEL_FAST_CLEAR_STATE_NO_MCS &&
        !partial_clear && wm_prog_key.use_simd16_replicated_data &&