From: Michel Dänzer <michel.daen...@amd.com> 11 more little piglits.
NOTE: This is a candidate for the 9.1 branch. Signed-off-by: Michel Dänzer <michel.daen...@amd.com> --- Any ideas why this seems necessary with radeonsi but not with r600g? src/gallium/drivers/radeonsi/si_state.c | 116 +++++++++++++++++--------------- src/gallium/drivers/radeonsi/si_state.h | 3 +- 2 files changed, 61 insertions(+), 58 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index d20e3ff..144a29d 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -36,33 +36,6 @@ #include "si_state.h" #include "sid.h" -/* - * inferred framebuffer and blender state - */ -static void si_update_fb_blend_state(struct r600_context *rctx) -{ - struct si_pm4_state *pm4; - struct si_state_blend *blend = rctx->queued.named.blend; - uint32_t mask; - - if (blend == NULL) - return; - - pm4 = CALLOC_STRUCT(si_pm4_state); - if (pm4 == NULL) - return; - - mask = (1ULL << ((unsigned)rctx->framebuffer.nr_cbufs * 4)) - 1; - mask &= blend->cb_target_mask; - si_pm4_set_reg(pm4, R_028238_CB_TARGET_MASK, mask); - - si_pm4_set_state(rctx, fb_blend, pm4); -} - -/* - * Blender functions - */ - static uint32_t si_translate_blend_function(int blend_func) { switch (blend_func) { @@ -84,7 +57,7 @@ static uint32_t si_translate_blend_function(int blend_func) return 0; } -static uint32_t si_translate_blend_factor(int blend_fact) +static uint32_t si_translate_blend_factor(int blend_fact, bool dst_alpha) { switch (blend_fact) { case PIPE_BLENDFACTOR_ONE: @@ -94,7 +67,7 @@ static uint32_t si_translate_blend_factor(int blend_fact) case PIPE_BLENDFACTOR_SRC_ALPHA: return V_028780_BLEND_SRC_ALPHA; case PIPE_BLENDFACTOR_DST_ALPHA: - return V_028780_BLEND_DST_ALPHA; + return dst_alpha ? V_028780_BLEND_DST_ALPHA : V_028780_BLEND_ONE; case PIPE_BLENDFACTOR_DST_COLOR: return V_028780_BLEND_DST_COLOR; case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: @@ -110,7 +83,7 @@ static uint32_t si_translate_blend_factor(int blend_fact) case PIPE_BLENDFACTOR_INV_SRC_ALPHA: return V_028780_BLEND_ONE_MINUS_SRC_ALPHA; case PIPE_BLENDFACTOR_INV_DST_ALPHA: - return V_028780_BLEND_ONE_MINUS_DST_ALPHA; + return dst_alpha ? V_028780_BLEND_ONE_MINUS_DST_ALPHA : V_028780_BLEND_ZERO; case PIPE_BLENDFACTOR_INV_DST_COLOR: return V_028780_BLEND_ONE_MINUS_DST_COLOR; case PIPE_BLENDFACTOR_INV_CONST_COLOR: @@ -133,30 +106,25 @@ static uint32_t si_translate_blend_factor(int blend_fact) return 0; } -static void *si_create_blend_state(struct pipe_context *ctx, - const struct pipe_blend_state *state) +/* + * inferred framebuffer and blender state + */ +static void si_update_fb_blend_state(struct r600_context *rctx) { - struct si_state_blend *blend = CALLOC_STRUCT(si_state_blend); - struct si_pm4_state *pm4 = &blend->pm4; - - uint32_t color_control; + struct si_pm4_state *pm4; + struct si_state_blend *blend = rctx->queued.named.blend; + const struct pipe_blend_state *state; + uint32_t mask = 0; if (blend == NULL) - return NULL; - - color_control = S_028808_MODE(V_028808_CB_NORMAL); - if (state->logicop_enable) { - color_control |= S_028808_ROP3(state->logicop_func | (state->logicop_func << 4)); - } else { - color_control |= S_028808_ROP3(0xcc); - } - si_pm4_set_reg(pm4, R_028808_CB_COLOR_CONTROL, color_control); + return; - si_pm4_set_reg(pm4, R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, ~0); - si_pm4_set_reg(pm4, R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, ~0); + pm4 = CALLOC_STRUCT(si_pm4_state); + if (pm4 == NULL) + return; - blend->cb_target_mask = 0; - for (int i = 0; i < 8; i++) { + state = &blend->state; + for (int i = 0; i < rctx->framebuffer.nr_cbufs; i++) { /* state->rt entries > 0 only written if independent blending */ const int j = state->independent_blend_enable ? i : 0; @@ -166,31 +134,67 @@ static void *si_create_blend_state(struct pipe_context *ctx, unsigned eqA = state->rt[j].alpha_func; unsigned srcA = state->rt[j].alpha_src_factor; unsigned dstA = state->rt[j].alpha_dst_factor; - + const struct util_format_description *desc; unsigned blend_cntl = 0; + bool dst_alpha; - /* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */ - blend->cb_target_mask |= state->rt[j].colormask << (4 * i); + mask |= state->rt[j].colormask << (4 * i); if (!state->rt[j].blend_enable) { si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl); continue; } + desc = util_format_description(rctx->framebuffer.cbufs[i]->format); + dst_alpha = desc->swizzle[3] != PIPE_SWIZZLE_ONE; + blend_cntl |= S_028780_ENABLE(1); blend_cntl |= S_028780_COLOR_COMB_FCN(si_translate_blend_function(eqRGB)); - blend_cntl |= S_028780_COLOR_SRCBLEND(si_translate_blend_factor(srcRGB)); - blend_cntl |= S_028780_COLOR_DESTBLEND(si_translate_blend_factor(dstRGB)); + blend_cntl |= S_028780_COLOR_SRCBLEND(si_translate_blend_factor(srcRGB, dst_alpha)); + blend_cntl |= S_028780_COLOR_DESTBLEND(si_translate_blend_factor(dstRGB, dst_alpha)); if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) { blend_cntl |= S_028780_SEPARATE_ALPHA_BLEND(1); blend_cntl |= S_028780_ALPHA_COMB_FCN(si_translate_blend_function(eqA)); - blend_cntl |= S_028780_ALPHA_SRCBLEND(si_translate_blend_factor(srcA)); - blend_cntl |= S_028780_ALPHA_DESTBLEND(si_translate_blend_factor(dstA)); + blend_cntl |= S_028780_ALPHA_SRCBLEND(si_translate_blend_factor(srcA, dst_alpha)); + blend_cntl |= S_028780_ALPHA_DESTBLEND(si_translate_blend_factor(dstA, dst_alpha)); } si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl); } + si_pm4_set_reg(pm4, R_028238_CB_TARGET_MASK, mask); + + si_pm4_set_state(rctx, fb_blend, pm4); +} + +/* + * Blender functions + */ + +static void *si_create_blend_state(struct pipe_context *ctx, + const struct pipe_blend_state *state) +{ + struct si_state_blend *blend = CALLOC_STRUCT(si_state_blend); + struct si_pm4_state *pm4 = &blend->pm4; + + uint32_t color_control; + + if (blend == NULL) + return NULL; + + color_control = S_028808_MODE(V_028808_CB_NORMAL); + if (state->logicop_enable) { + color_control |= S_028808_ROP3(state->logicop_func | (state->logicop_func << 4)); + } else { + color_control |= S_028808_ROP3(0xcc); + } + si_pm4_set_reg(pm4, R_028808_CB_COLOR_CONTROL, color_control); + + si_pm4_set_reg(pm4, R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, ~0); + si_pm4_set_reg(pm4, R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, ~0); + + memcpy(&blend->state, state, sizeof(blend->state)); + return blend; } diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h index c49b029..6bf8fef 100644 --- a/src/gallium/drivers/radeonsi/si_state.h +++ b/src/gallium/drivers/radeonsi/si_state.h @@ -31,8 +31,7 @@ struct si_state_blend { struct si_pm4_state pm4; - uint32_t cb_target_mask; - uint32_t cb_color_control; + struct pipe_blend_state state; }; struct si_state_viewport { -- 1.8.1.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev