freedreno/a4xx: add BPTC support
[mesa.git] / src / gallium / drivers / freedreno / a4xx / fd4_blend.c
index f569e9313c385507c43d760c3e6cc6377c8bff4a..d5e823ef69d22f265635c654799793c35c588e68 100644 (file)
@@ -32,7 +32,7 @@
 
 #include "fd4_blend.h"
 #include "fd4_context.h"
-#include "fd4_util.h"
+#include "fd4_format.h"
 
 static enum a4xx_rb_blend_opcode
 blend_func(unsigned func)
@@ -61,7 +61,7 @@ fd4_blend_state_create(struct pipe_context *pctx,
        struct fd4_blend_stateobj *so;
 //     enum a3xx_rop_code rop = ROP_COPY;
        bool reads_dest = false;
-       int i;
+       unsigned i, mrt_blend = 0;
 
        if (cso->logicop_enable) {
 //             rop = cso->logicop_func;  /* maps 1:1 */
@@ -84,11 +84,6 @@ fd4_blend_state_create(struct pipe_context *pctx,
                }
        }
 
-       if (cso->independent_blend_enable) {
-               DBG("Unsupported! independent blend state");
-               return NULL;
-       }
-
        so = CALLOC_STRUCT(fd4_blend_stateobj);
        if (!so)
                return NULL;
@@ -96,7 +91,12 @@ fd4_blend_state_create(struct pipe_context *pctx,
        so->base = *cso;
 
        for (i = 0; i < ARRAY_SIZE(so->rb_mrt); i++) {
-               const struct pipe_rt_blend_state *rt = &cso->rt[i];
+               const struct pipe_rt_blend_state *rt;
+
+               if (cso->independent_blend_enable)
+                       rt = &cso->rt[i];
+               else
+                       rt = &cso->rt[0];
 
                so->rb_mrt[i].blend_control =
                                A4XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(rt->rgb_src_factor)) |
@@ -110,11 +110,13 @@ fd4_blend_state_create(struct pipe_context *pctx,
                                0xc00 | /* XXX ROP_CODE ?? */
                                A4XX_RB_MRT_CONTROL_COMPONENT_ENABLE(rt->colormask);
 
-               if (rt->blend_enable)
+               if (rt->blend_enable) {
                        so->rb_mrt[i].control |=
                                        A4XX_RB_MRT_CONTROL_READ_DEST_ENABLE |
                                        A4XX_RB_MRT_CONTROL_BLEND |
                                        A4XX_RB_MRT_CONTROL_BLEND2;
+                       mrt_blend |= (1 << i);
+               }
 
                if (reads_dest)
                        so->rb_mrt[i].control |= A4XX_RB_MRT_CONTROL_READ_DEST_ENABLE;
@@ -123,5 +125,7 @@ fd4_blend_state_create(struct pipe_context *pctx,
                        so->rb_mrt[i].buf_info |= A4XX_RB_MRT_BUF_INFO_DITHER_MODE(DITHER_ALWAYS);
        }
 
+       so->rb_fs_output = A4XX_RB_FS_OUTPUT_ENABLE_BLEND(mrt_blend);
+
        return so;
 }