freedreno/a4xx: logic op handling
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user