Module: Mesa
Branch: master
Commit: 3b77826cc19d7a6a7e5cc6af6552d0ba89ec2922
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=3b77826cc19d7a6a7e5cc6af6552d0ba89ec2922

Author: Ilia Mirkin <[email protected]>
Date:   Fri Nov 20 13:27:49 2015 -0500

freedreno/a4xx: logic op handling

Signed-off-by: Ilia Mirkin <[email protected]>

---

 src/gallium/drivers/freedreno/a3xx/a3xx.xml.h     |   19 -------------------
 src/gallium/drivers/freedreno/a4xx/a4xx.xml.h     |    9 +++++++--
 src/gallium/drivers/freedreno/a4xx/fd4_blend.c    |   11 +++++++----
 src/gallium/drivers/freedreno/a4xx/fd4_draw.c     |    3 +--
 src/gallium/drivers/freedreno/a4xx/fd4_gmem.c     |    3 +--
 src/gallium/drivers/freedreno/adreno_common.xml.h |   19 +++++++++++++++++++
 6 files changed, 35 insertions(+), 29 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a3xx/a3xx.xml.h 
b/src/gallium/drivers/freedreno/a3xx/a3xx.xml.h
index 2e3abfc..a6940df 100644
--- a/src/gallium/drivers/freedreno/a3xx/a3xx.xml.h
+++ b/src/gallium/drivers/freedreno/a3xx/a3xx.xml.h
@@ -262,25 +262,6 @@ enum a3xx_sp_perfcounter_select {
        SP_ALU_ACTIVE_CYCLES = 29,
 };
 
-enum a3xx_rop_code {
-       ROP_CLEAR = 0,
-       ROP_NOR = 1,
-       ROP_AND_INVERTED = 2,
-       ROP_COPY_INVERTED = 3,
-       ROP_AND_REVERSE = 4,
-       ROP_INVERT = 5,
-       ROP_XOR = 6,
-       ROP_NAND = 7,
-       ROP_AND = 8,
-       ROP_EQUIV = 9,
-       ROP_NOOP = 10,
-       ROP_OR_INVERTED = 11,
-       ROP_COPY = 12,
-       ROP_OR_REVERSE = 13,
-       ROP_OR = 14,
-       ROP_SET = 15,
-};
-
 enum a3xx_rb_blend_opcode {
        BLEND_DST_PLUS_SRC = 0,
        BLEND_SRC_MINUS_DST = 1,
diff --git a/src/gallium/drivers/freedreno/a4xx/a4xx.xml.h 
b/src/gallium/drivers/freedreno/a4xx/a4xx.xml.h
index cc48cdc..9f35654 100644
--- a/src/gallium/drivers/freedreno/a4xx/a4xx.xml.h
+++ b/src/gallium/drivers/freedreno/a4xx/a4xx.xml.h
@@ -418,8 +418,13 @@ static inline uint32_t REG_A4XX_RB_MRT_CONTROL(uint32_t 
i0) { return 0x000020a4
 #define A4XX_RB_MRT_CONTROL_READ_DEST_ENABLE                   0x00000008
 #define A4XX_RB_MRT_CONTROL_BLEND                              0x00000010
 #define A4XX_RB_MRT_CONTROL_BLEND2                             0x00000020
-#define A4XX_RB_MRT_CONTROL_FASTCLEAR                          0x00000400
-#define A4XX_RB_MRT_CONTROL_B11                                        
0x00000800
+#define A4XX_RB_MRT_CONTROL_ROP_ENABLE                         0x00000040
+#define A4XX_RB_MRT_CONTROL_ROP_CODE__MASK                     0x00000f00
+#define A4XX_RB_MRT_CONTROL_ROP_CODE__SHIFT                    8
+static inline uint32_t A4XX_RB_MRT_CONTROL_ROP_CODE(enum a3xx_rop_code val)
+{
+       return ((val) << A4XX_RB_MRT_CONTROL_ROP_CODE__SHIFT) & 
A4XX_RB_MRT_CONTROL_ROP_CODE__MASK;
+}
 #define A4XX_RB_MRT_CONTROL_COMPONENT_ENABLE__MASK             0x0f000000
 #define A4XX_RB_MRT_CONTROL_COMPONENT_ENABLE__SHIFT            24
 static inline uint32_t A4XX_RB_MRT_CONTROL_COMPONENT_ENABLE(uint32_t val)
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_blend.c 
b/src/gallium/drivers/freedreno/a4xx/fd4_blend.c
index e9a9ac1..98a96c1 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_blend.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_blend.c
@@ -60,12 +60,12 @@ fd4_blend_state_create(struct pipe_context *pctx,
                const struct pipe_blend_state *cso)
 {
        struct fd4_blend_stateobj *so;
-//     enum a3xx_rop_code rop = ROP_COPY;
+       enum a3xx_rop_code rop = ROP_COPY;
        bool reads_dest = false;
        unsigned i, mrt_blend = 0;
 
        if (cso->logicop_enable) {
-//             rop = cso->logicop_func;  /* maps 1:1 */
+               rop = cso->logicop_func;  /* maps 1:1 */
 
                switch (cso->logicop_func) {
                case PIPE_LOGICOP_NOR:
@@ -116,7 +116,8 @@ fd4_blend_state_create(struct pipe_context *pctx,
 
 
                so->rb_mrt[i].control =
-                               0xc00 | /* XXX ROP_CODE ?? */
+                               A4XX_RB_MRT_CONTROL_ROP_CODE(rop) |
+                               COND(cso->logicop_enable, 
A4XX_RB_MRT_CONTROL_ROP_ENABLE) |
                                
A4XX_RB_MRT_CONTROL_COMPONENT_ENABLE(rt->colormask);
 
                if (rt->blend_enable) {
@@ -127,8 +128,10 @@ fd4_blend_state_create(struct pipe_context *pctx,
                        mrt_blend |= (1 << i);
                }
 
-               if (reads_dest)
+               if (reads_dest) {
                        so->rb_mrt[i].control |= 
A4XX_RB_MRT_CONTROL_READ_DEST_ENABLE;
+                       mrt_blend |= (1 << i);
+               }
 
                if (cso->dither)
                        so->rb_mrt[i].buf_info |= 
A4XX_RB_MRT_BUF_INFO_DITHER_MODE(DITHER_ALWAYS);
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c 
b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
index 54bd445..8cbe68d 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
@@ -271,8 +271,7 @@ fd4_clear(struct fd_context *ctx, unsigned buffers,
                mrt_comp[i] = (buffers & (PIPE_CLEAR_COLOR0 << i)) ? 0xf : 0x0;
 
                OUT_PKT0(ring, REG_A4XX_RB_MRT_CONTROL(i), 1);
-               OUT_RING(ring, A4XX_RB_MRT_CONTROL_FASTCLEAR |
-                               A4XX_RB_MRT_CONTROL_B11 |
+               OUT_RING(ring, A4XX_RB_MRT_CONTROL_ROP_CODE(ROP_COPY) |
                                A4XX_RB_MRT_CONTROL_COMPONENT_ENABLE(0xf));
 
                OUT_PKT0(ring, REG_A4XX_RB_MRT_BLEND_CONTROL(i), 1);
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c 
b/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c
index 3f8bbf3..2216081 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c
@@ -347,8 +347,7 @@ fd4_emit_tile_mem2gmem(struct fd_context *ctx, struct 
fd_tile *tile)
                mrt_comp[i] = ((i < pfb->nr_cbufs) && pfb->cbufs[i]) ? 0xf : 0;
 
                OUT_PKT0(ring, REG_A4XX_RB_MRT_CONTROL(i), 1);
-               OUT_RING(ring, A4XX_RB_MRT_CONTROL_FASTCLEAR |
-                               A4XX_RB_MRT_CONTROL_B11 |
+               OUT_RING(ring, A4XX_RB_MRT_CONTROL_ROP_CODE(ROP_COPY) |
                                A4XX_RB_MRT_CONTROL_COMPONENT_ENABLE(0xf));
 
                OUT_PKT0(ring, REG_A4XX_RB_MRT_BLEND_CONTROL(i), 1);
diff --git a/src/gallium/drivers/freedreno/adreno_common.xml.h 
b/src/gallium/drivers/freedreno/adreno_common.xml.h
index e45cab7..0e0f0e6 100644
--- a/src/gallium/drivers/freedreno/adreno_common.xml.h
+++ b/src/gallium/drivers/freedreno/adreno_common.xml.h
@@ -119,6 +119,25 @@ enum adreno_rb_copy_control_mode {
        RB_COPY_DEPTH_STENCIL = 5,
 };
 
+enum a3xx_rop_code {
+       ROP_CLEAR = 0,
+       ROP_NOR = 1,
+       ROP_AND_INVERTED = 2,
+       ROP_COPY_INVERTED = 3,
+       ROP_AND_REVERSE = 4,
+       ROP_INVERT = 5,
+       ROP_XOR = 6,
+       ROP_NAND = 7,
+       ROP_AND = 8,
+       ROP_EQUIV = 9,
+       ROP_NOOP = 10,
+       ROP_OR_INVERTED = 11,
+       ROP_COPY = 12,
+       ROP_OR_REVERSE = 13,
+       ROP_OR = 14,
+       ROP_SET = 15,
+};
+
 enum a3xx_render_mode {
        RB_RENDERING_PASS = 0,
        RB_TILING_PASS = 1,

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to