etnaviv: mask correct channel for RB swapped rendertargets
authorLucas Stach <dev@lynxeye.de>
Sun, 4 Jun 2017 19:06:32 +0000 (21:06 +0200)
committerChristian Gmeiner <christian.gmeiner@gmail.com>
Fri, 16 Jun 2017 13:26:23 +0000 (15:26 +0200)
Now that we support RB swapped targets by using a shader variant, we
must derive the color mask from both the blend state and the bound
framebuffer.

Fixes piglit: fbo-colormask-formats

Fixes: 7f62ffb68ad ("etnaviv: add support for rb swap")
Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Lucas Stach <dev@lynxeye.de>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
src/gallium/drivers/etnaviv/etnaviv_blend.c
src/gallium/drivers/etnaviv/etnaviv_blend.h
src/gallium/drivers/etnaviv/etnaviv_state.c

index ebef75daa7a7094a790421eae6a81842bdaa48cf..8ea09a37ae7fe5a5fdd125d56a33ab4be3479119 100644 (file)
@@ -48,7 +48,7 @@ etna_blend_state_create(struct pipe_context *pctx,
     * - NOT source factor is ONE and destination factor ZERO for both rgb and
     *   alpha (which would mean that blending is effectively disabled)
     */
     * - NOT source factor is ONE and destination factor ZERO for both rgb and
     *   alpha (which would mean that blending is effectively disabled)
     */
-   bool enable = rt0->blend_enable &&
+   co->enable = rt0->blend_enable &&
                  !(rt0->rgb_src_factor == PIPE_BLENDFACTOR_ONE &&
                    rt0->rgb_dst_factor == PIPE_BLENDFACTOR_ZERO &&
                    rt0->alpha_src_factor == PIPE_BLENDFACTOR_ONE &&
                  !(rt0->rgb_src_factor == PIPE_BLENDFACTOR_ONE &&
                    rt0->rgb_dst_factor == PIPE_BLENDFACTOR_ZERO &&
                    rt0->alpha_src_factor == PIPE_BLENDFACTOR_ONE &&
@@ -59,17 +59,11 @@ etna_blend_state_create(struct pipe_context *pctx,
     * - NOT source factor is equal to destination factor for both rgb abd
     *   alpha (which would effectively that mean alpha is not separate)
     */
     * - NOT source factor is equal to destination factor for both rgb abd
     *   alpha (which would effectively that mean alpha is not separate)
     */
-   bool separate_alpha = enable &&
+   bool separate_alpha = co->enable &&
                          !(rt0->rgb_src_factor == rt0->alpha_src_factor &&
                            rt0->rgb_dst_factor == rt0->alpha_dst_factor);
 
                          !(rt0->rgb_src_factor == rt0->alpha_src_factor &&
                            rt0->rgb_dst_factor == rt0->alpha_dst_factor);
 
-   /* If the complete render target is written, set full_overwrite:
-    * - The color mask is 1111
-    * - No blending is used
-    */
-   bool full_overwrite = (rt0->colormask == 15) && !enable;
-
-   if (enable) {
+   if (co->enable) {
       co->PE_ALPHA_CONFIG =
          VIVS_PE_ALPHA_CONFIG_BLEND_ENABLE_COLOR |
          COND(separate_alpha, VIVS_PE_ALPHA_CONFIG_BLEND_SEPARATE_ALPHA) |
       co->PE_ALPHA_CONFIG =
          VIVS_PE_ALPHA_CONFIG_BLEND_ENABLE_COLOR |
          COND(separate_alpha, VIVS_PE_ALPHA_CONFIG_BLEND_SEPARATE_ALPHA) |
@@ -83,10 +77,6 @@ etna_blend_state_create(struct pipe_context *pctx,
       co->PE_ALPHA_CONFIG = 0;
    }
 
       co->PE_ALPHA_CONFIG = 0;
    }
 
-   co->PE_COLOR_FORMAT =
-         VIVS_PE_COLOR_FORMAT_COMPONENTS(rt0->colormask) |
-         COND(full_overwrite, VIVS_PE_COLOR_FORMAT_OVERWRITE);
-
    co->PE_LOGIC_OP =
          VIVS_PE_LOGIC_OP_OP(so->logicop_enable ? so->logicop_func : LOGIC_OP_COPY) |
          0x000E4000 /* ??? */;
    co->PE_LOGIC_OP =
          VIVS_PE_LOGIC_OP_OP(so->logicop_enable ? so->logicop_func : LOGIC_OP_COPY) |
          0x000E4000 /* ??? */;
@@ -107,3 +97,35 @@ etna_blend_state_create(struct pipe_context *pctx,
 
    return co;
 }
 
    return co;
 }
+
+bool
+etna_update_blend(struct etna_context *ctx)
+{
+   struct pipe_framebuffer_state *pfb = &ctx->framebuffer_s;
+   struct pipe_blend_state *pblend = ctx->blend;
+   struct etna_blend_state *blend = etna_blend_state(pblend);
+   const struct pipe_rt_blend_state *rt0 = &pblend->rt[0];
+   uint32_t colormask;
+
+   if (pfb->cbufs[0] &&
+       translate_rs_format_rb_swap(pfb->cbufs[0]->texture->format)) {
+      colormask = rt0->colormask & (PIPE_MASK_A | PIPE_MASK_G);
+      if (rt0->colormask & PIPE_MASK_R)
+         colormask |= PIPE_MASK_B;
+      if (rt0->colormask & PIPE_MASK_B)
+         colormask |= PIPE_MASK_R;
+   } else {
+      colormask = rt0->colormask;
+   }
+
+   /* If the complete render target is written, set full_overwrite:
+    * - The color mask is 1111
+    * - No blending is used
+    */
+   bool full_overwrite = (rt0->colormask == 0xf) && !blend->enable;
+   blend->PE_COLOR_FORMAT =
+            VIVS_PE_COLOR_FORMAT_COMPONENTS(colormask) |
+            COND(full_overwrite, VIVS_PE_COLOR_FORMAT_OVERWRITE);
+
+   return true;
+}
index 54e7bab0f8a0ee49ff9be47b365cbce00a7aa2a2..e26864d409f280fbd1d5cb4922160facbedb49a5 100644 (file)
 #include "pipe/p_context.h"
 #include "pipe/p_state.h"
 
 #include "pipe/p_context.h"
 #include "pipe/p_state.h"
 
+struct etna_context;
+
 struct etna_blend_state {
    struct pipe_blend_state base;
 
 struct etna_blend_state {
    struct pipe_blend_state base;
 
+   bool enable;
+
    uint32_t PE_ALPHA_CONFIG;
    uint32_t PE_COLOR_FORMAT;
    uint32_t PE_LOGIC_OP;
    uint32_t PE_ALPHA_CONFIG;
    uint32_t PE_COLOR_FORMAT;
    uint32_t PE_LOGIC_OP;
@@ -49,4 +53,7 @@ void *
 etna_blend_state_create(struct pipe_context *pctx,
                         const struct pipe_blend_state *so);
 
 etna_blend_state_create(struct pipe_context *pctx,
                         const struct pipe_blend_state *so);
 
+bool
+etna_update_blend(struct etna_context *ctx);
+
 #endif
 #endif
index cd9f974112d9bb8d37e516d5937ee6eb00033894..fb7bb0f4c50d88bed181309dab7fdcd91d2a836e 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "hw/common.xml.h"
 
 
 #include "hw/common.xml.h"
 
+#include "etnaviv_blend.h"
 #include "etnaviv_clear_blit.h"
 #include "etnaviv_context.h"
 #include "etnaviv_format.h"
 #include "etnaviv_clear_blit.h"
 #include "etnaviv_context.h"
 #include "etnaviv_format.h"
@@ -596,6 +597,9 @@ static const struct etna_state_updater etna_state_updates[] = {
    },
    {
       etna_shader_link, ETNA_DIRTY_SHADER,
    },
    {
       etna_shader_link, ETNA_DIRTY_SHADER,
+   },
+   {
+      etna_update_blend, ETNA_DIRTY_BLEND | ETNA_DIRTY_FRAMEBUFFER
    }
 };
 
    }
 };