void * fd2_blend_state_create(struct pipe_context *pctx, const struct pipe_blend_state *cso) { const struct pipe_rt_blend_state *rt = &cso->rt[0]; struct fd2_blend_stateobj *so; if (cso->logicop_enable) { DBG("Unsupported! logicop"); return NULL; } if (cso->independent_blend_enable) { DBG("Unsupported! independent blend state"); return NULL; } so = CALLOC_STRUCT(fd2_blend_stateobj); if (!so) return NULL; so->base = *cso; so->rb_colorcontrol = A2XX_RB_COLORCONTROL_ROP_CODE(12); so->rb_blendcontrol = A2XX_RB_BLEND_CONTROL_COLOR_SRCBLEND(fd_blend_factor(rt->rgb_src_factor)) | A2XX_RB_BLEND_CONTROL_COLOR_COMB_FCN(blend_func(rt->rgb_func)) | A2XX_RB_BLEND_CONTROL_COLOR_DESTBLEND(fd_blend_factor(rt->rgb_dst_factor)) | A2XX_RB_BLEND_CONTROL_ALPHA_SRCBLEND(fd_blend_factor(rt->alpha_src_factor)) | A2XX_RB_BLEND_CONTROL_ALPHA_COMB_FCN(blend_func(rt->alpha_func)) | A2XX_RB_BLEND_CONTROL_ALPHA_DESTBLEND(fd_blend_factor(rt->alpha_dst_factor)); if (rt->colormask & PIPE_MASK_R) so->rb_colormask |= A2XX_RB_COLOR_MASK_WRITE_RED; if (rt->colormask & PIPE_MASK_G) so->rb_colormask |= A2XX_RB_COLOR_MASK_WRITE_GREEN; if (rt->colormask & PIPE_MASK_B) so->rb_colormask |= A2XX_RB_COLOR_MASK_WRITE_BLUE; if (rt->colormask & PIPE_MASK_A) so->rb_colormask |= A2XX_RB_COLOR_MASK_WRITE_ALPHA; if (!rt->blend_enable) so->rb_colorcontrol |= A2XX_RB_COLORCONTROL_BLEND_DISABLE; if (cso->dither) so->rb_colorcontrol |= A2XX_RB_COLORCONTROL_DITHER_MODE(DITHER_ALWAYS); return so; }
void * 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; bool reads_dest = false; unsigned i, mrt_blend = 0; if (cso->logicop_enable) { rop = cso->logicop_func; /* maps 1:1 */ switch (cso->logicop_func) { case PIPE_LOGICOP_NOR: case PIPE_LOGICOP_AND_INVERTED: case PIPE_LOGICOP_AND_REVERSE: case PIPE_LOGICOP_INVERT: case PIPE_LOGICOP_XOR: case PIPE_LOGICOP_NAND: case PIPE_LOGICOP_AND: case PIPE_LOGICOP_EQUIV: case PIPE_LOGICOP_NOOP: case PIPE_LOGICOP_OR_INVERTED: case PIPE_LOGICOP_OR_REVERSE: case PIPE_LOGICOP_OR: reads_dest = true; break; } } so = CALLOC_STRUCT(fd4_blend_stateobj); if (!so) return NULL; so->base = *cso; for (i = 0; i < ARRAY_SIZE(so->rb_mrt); 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_rgb = A4XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(rt->rgb_src_factor)) | A4XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) | A4XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor)); so->rb_mrt[i].blend_control_alpha = A4XX_RB_MRT_BLEND_CONTROL_ALPHA_SRC_FACTOR(fd_blend_factor(rt->alpha_src_factor)) | A4XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE(blend_func(rt->alpha_func)) | A4XX_RB_MRT_BLEND_CONTROL_ALPHA_DEST_FACTOR(fd_blend_factor(rt->alpha_dst_factor)); so->rb_mrt[i].blend_control_no_alpha_rgb = A4XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_src_factor))) | A4XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) | A4XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_dst_factor))); so->rb_mrt[i].control = 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) { 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; mrt_blend |= (1 << i); } if (cso->dither) 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) | COND(cso->independent_blend_enable, A4XX_RB_FS_OUTPUT_INDEPENDENT_BLEND); return so; }
void * 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; bool reads_dest = false; int i; if (cso->logicop_enable) { // rop = cso->logicop_func; /* maps 1:1 */ switch (cso->logicop_func) { case PIPE_LOGICOP_NOR: case PIPE_LOGICOP_AND_INVERTED: case PIPE_LOGICOP_AND_REVERSE: case PIPE_LOGICOP_INVERT: case PIPE_LOGICOP_XOR: case PIPE_LOGICOP_NAND: case PIPE_LOGICOP_AND: case PIPE_LOGICOP_EQUIV: case PIPE_LOGICOP_NOOP: case PIPE_LOGICOP_OR_INVERTED: case PIPE_LOGICOP_OR_REVERSE: case PIPE_LOGICOP_OR: reads_dest = true; break; } } if (cso->independent_blend_enable) { DBG("Unsupported! independent blend state"); return NULL; } so = CALLOC_STRUCT(fd4_blend_stateobj); if (!so) return NULL; so->base = *cso; for (i = 0; i < ARRAY_SIZE(so->rb_mrt); i++) { const struct pipe_rt_blend_state *rt = &cso->rt[i]; so->rb_mrt[i].blend_control = A4XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(rt->rgb_src_factor)) | A4XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) | A4XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor)) | A4XX_RB_MRT_BLEND_CONTROL_ALPHA_SRC_FACTOR(fd_blend_factor(rt->alpha_src_factor)) | A4XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE(blend_func(rt->alpha_func)) | A4XX_RB_MRT_BLEND_CONTROL_ALPHA_DEST_FACTOR(fd_blend_factor(rt->alpha_dst_factor)); so->rb_mrt[i].control = 0xc00 | /* XXX ROP_CODE ?? */ A4XX_RB_MRT_CONTROL_COMPONENT_ENABLE(rt->colormask); 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; so->rb_fs_output |= A4XX_RB_FS_OUTPUT_ENABLE_BLEND(1); } if (reads_dest) so->rb_mrt[i].control |= A4XX_RB_MRT_CONTROL_READ_DEST_ENABLE; if (cso->dither) so->rb_mrt[i].buf_info |= A4XX_RB_MRT_BUF_INFO_DITHER_MODE(DITHER_ALWAYS); } return so; }