static void *brw_create_blend_state( struct pipe_context *pipe, const struct pipe_blend_state *templ ) { struct brw_blend_state *blend = CALLOC_STRUCT(brw_blend_state); if (blend == NULL) return NULL; if (templ->logicop_enable) { blend->cc2.logicop_enable = 1; blend->cc5.logicop_func = translate_logicop(templ->logicop_func); } else if (templ->rt[0].blend_enable) { blend->cc6.dest_blend_factor = translate_blend_factor(templ->rt[0].rgb_dst_factor); blend->cc6.src_blend_factor = translate_blend_factor(templ->rt[0].rgb_src_factor); blend->cc6.blend_function = translate_blend_equation(templ->rt[0].rgb_func); blend->cc5.ia_dest_blend_factor = translate_blend_factor(templ->rt[0].alpha_dst_factor); blend->cc5.ia_src_blend_factor = translate_blend_factor(templ->rt[0].alpha_src_factor); blend->cc5.ia_blend_function = translate_blend_equation(templ->rt[0].alpha_func); blend->cc3.blend_enable = 1; blend->cc3.ia_blend_enable = (blend->cc6.dest_blend_factor != blend->cc5.ia_dest_blend_factor || blend->cc6.src_blend_factor != blend->cc5.ia_src_blend_factor || blend->cc6.blend_function != blend->cc5.ia_blend_function); /* Per-surface blend enables, currently just follow global * state: */ blend->ss0.color_blend = 1; } blend->cc5.dither_enable = templ->dither; if (BRW_DEBUG & DEBUG_STATS) blend->cc5.statistics_enable = 1; /* Per-surface color mask -- just follow global state: */ blend->ss0.writedisable_red = (templ->rt[0].colormask & PIPE_MASK_R) ? 0 : 1; blend->ss0.writedisable_green = (templ->rt[0].colormask & PIPE_MASK_G) ? 0 : 1; blend->ss0.writedisable_blue = (templ->rt[0].colormask & PIPE_MASK_B) ? 0 : 1; blend->ss0.writedisable_alpha = (templ->rt[0].colormask & PIPE_MASK_A) ? 0 : 1; return (void *)blend; }
static void update_blend( struct st_context *st ) { struct pipe_blend_state *blend = &st->state.blend; unsigned num_state = 1; unsigned i; memset(blend, 0, sizeof(*blend)); if (blend_per_rt(st->ctx) || colormask_per_rt(st->ctx)) { num_state = st->ctx->Const.MaxDrawBuffers; blend->independent_blend_enable = 1; } /* Note it is impossible to correctly deal with EXT_blend_logic_op and EXT_draw_buffers2/EXT_blend_equation_separate at the same time. These combinations would require support for per-rt logicop enables and separate alpha/rgb logicop/blend support respectively. Neither possible in gallium nor most hardware. Assume these combinations don't happen. */ if (st->ctx->Color.ColorLogicOpEnabled || (st->ctx->Color.BlendEnabled && st->ctx->Color.BlendEquationRGB == GL_LOGIC_OP)) { /* logicop enabled */ blend->logicop_enable = 1; blend->logicop_func = translate_logicop(st->ctx->Color.LogicOp); } else if (st->ctx->Color.BlendEnabled) { /* blending enabled */ for (i = 0; i < num_state; i++) { blend->rt[i].blend_enable = (st->ctx->Color.BlendEnabled >> i) & 0x1; blend->rt[i].rgb_func = translate_blend(st->ctx->Color.BlendEquationRGB); if (st->ctx->Color.BlendEquationRGB == GL_MIN || st->ctx->Color.BlendEquationRGB == GL_MAX) { /* Min/max are special */ blend->rt[i].rgb_src_factor = PIPE_BLENDFACTOR_ONE; blend->rt[i].rgb_dst_factor = PIPE_BLENDFACTOR_ONE; } else { blend->rt[i].rgb_src_factor = translate_blend(st->ctx->Color.BlendSrcRGB); blend->rt[i].rgb_dst_factor = translate_blend(st->ctx->Color.BlendDstRGB); } blend->rt[i].alpha_func = translate_blend(st->ctx->Color.BlendEquationA); if (st->ctx->Color.BlendEquationA == GL_MIN || st->ctx->Color.BlendEquationA == GL_MAX) { /* Min/max are special */ blend->rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ONE; blend->rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ONE; } else { blend->rt[i].alpha_src_factor = translate_blend(st->ctx->Color.BlendSrcA); blend->rt[i].alpha_dst_factor = translate_blend(st->ctx->Color.BlendDstA); } } } else { /* no blending / logicop */ } /* Colormask - maybe reverse these bits? */ for (i = 0; i < num_state; i++) {
static void update_blend( struct st_context *st ) { struct pipe_blend_state *blend = &st->state.blend; const struct gl_context *ctx = st->ctx; unsigned num_state = 1; unsigned i, j; memset(blend, 0, sizeof(*blend)); if (blend_per_rt(ctx) || colormask_per_rt(ctx)) { num_state = ctx->Const.MaxDrawBuffers; blend->independent_blend_enable = 1; } if (ctx->Color.ColorLogicOpEnabled) { /* logicop enabled */ blend->logicop_enable = 1; blend->logicop_func = translate_logicop(ctx->Color.LogicOp); } else if (ctx->Color.BlendEnabled) { /* blending enabled */ for (i = 0, j = 0; i < num_state; i++) { blend->rt[i].blend_enable = (ctx->Color.BlendEnabled >> i) & 0x1; if (ctx->Extensions.ARB_draw_buffers_blend) j = i; blend->rt[i].rgb_func = translate_blend(ctx->Color.Blend[j].EquationRGB); if (ctx->Color.Blend[i].EquationRGB == GL_MIN || ctx->Color.Blend[i].EquationRGB == GL_MAX) { /* Min/max are special */ blend->rt[i].rgb_src_factor = PIPE_BLENDFACTOR_ONE; blend->rt[i].rgb_dst_factor = PIPE_BLENDFACTOR_ONE; } else { blend->rt[i].rgb_src_factor = translate_blend(ctx->Color.Blend[j].SrcRGB); blend->rt[i].rgb_dst_factor = translate_blend(ctx->Color.Blend[j].DstRGB); } blend->rt[i].alpha_func = translate_blend(ctx->Color.Blend[j].EquationA); if (ctx->Color.Blend[i].EquationA == GL_MIN || ctx->Color.Blend[i].EquationA == GL_MAX) { /* Min/max are special */ blend->rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ONE; blend->rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ONE; } else { blend->rt[i].alpha_src_factor = translate_blend(ctx->Color.Blend[j].SrcA); blend->rt[i].alpha_dst_factor = translate_blend(ctx->Color.Blend[j].DstA); } } } else { /* no blending / logicop */ } /* Colormask - maybe reverse these bits? */ for (i = 0; i < num_state; i++) {