etnaviv: fix alpha blending cases
authorJonathan Marek <jonathan@marek.ca>
Wed, 3 Jul 2019 18:04:20 +0000 (14:04 -0400)
committerJonathan Marek <jonathan@marek.ca>
Thu, 18 Jul 2019 03:07:35 +0000 (23:07 -0400)
We need to check rgb_func/alpha_func when determining if blend or separate
alpha is required.

Signed-off-by: Jonathan Marek <jonathan@marek.ca>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
src/gallium/drivers/etnaviv/etnaviv_blend.c

index 366be02f0cab2477dfef8fd84eb35d1610eb6fbe..2e5538e3577cdba98fb0e51150090dac6c5f0f9f 100644 (file)
@@ -49,23 +49,26 @@ etna_blend_state_create(struct pipe_context *pctx,
 
    /* Enable blending if
     * - blend enabled in blend state
-    * - 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 and eq is ADD for
+    *   both rgb and alpha (which mean that blending is effectively disabled)
     */
    alpha_enable = rt0->blend_enable &&
                  !(rt0->rgb_src_factor == PIPE_BLENDFACTOR_ONE &&
                    rt0->rgb_dst_factor == PIPE_BLENDFACTOR_ZERO &&
+                   rt0->rgb_func == PIPE_BLEND_ADD &&
                    rt0->alpha_src_factor == PIPE_BLENDFACTOR_ONE &&
-                   rt0->alpha_dst_factor == PIPE_BLENDFACTOR_ZERO);
+                   rt0->alpha_dst_factor == PIPE_BLENDFACTOR_ZERO &&
+                   rt0->alpha_func == PIPE_BLEND_ADD);
 
    /* Enable separate alpha if
     * - Blending enabled (see above)
-    * - NOT source factor is equal to destination factor for both rgb abd
-    *   alpha (which would effectively that mean alpha is not separate)
+    * - NOT source/destination factor and eq is same for both rgb and alpha
+    *   (which would effectively that mean alpha is not separate), and
     */
    bool separate_alpha = alpha_enable &&
                          !(rt0->rgb_src_factor == rt0->alpha_src_factor &&
-                           rt0->rgb_dst_factor == rt0->alpha_dst_factor);
+                           rt0->rgb_dst_factor == rt0->alpha_dst_factor &&
+                           rt0->rgb_func == rt0->alpha_func);
 
    if (alpha_enable) {
       co->PE_ALPHA_CONFIG =