static void * nv50_blend_state_create(struct pipe_context *pipe, const struct pipe_blend_state *cso) { struct nv50_blend_stateobj *so = CALLOC_STRUCT(nv50_blend_stateobj); int i; boolean emit_common_func = cso->rt[0].blend_enable; uint32_t ms; if (nv50_context(pipe)->screen->tesla->oclass >= NVA3_3D_CLASS) { SB_BEGIN_3D(so, BLEND_INDEPENDENT, 1); SB_DATA (so, cso->independent_blend_enable); } so->pipe = *cso; SB_BEGIN_3D(so, COLOR_MASK_COMMON, 1); SB_DATA (so, !cso->independent_blend_enable); SB_BEGIN_3D(so, BLEND_ENABLE_COMMON, 1); SB_DATA (so, !cso->independent_blend_enable); if (cso->independent_blend_enable) { SB_BEGIN_3D(so, BLEND_ENABLE(0), 8); for (i = 0; i < 8; ++i) { SB_DATA(so, cso->rt[i].blend_enable); if (cso->rt[i].blend_enable) emit_common_func = TRUE; } if (nv50_context(pipe)->screen->tesla->oclass >= NVA3_3D_CLASS) { emit_common_func = FALSE; for (i = 0; i < 8; ++i) { if (!cso->rt[i].blend_enable) continue; SB_BEGIN_3D_(so, NVA3_3D_IBLEND_EQUATION_RGB(i), 6); SB_DATA (so, nvgl_blend_eqn(cso->rt[i].rgb_func)); SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_src_factor)); SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_dst_factor)); SB_DATA (so, nvgl_blend_eqn(cso->rt[i].alpha_func)); SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_src_factor)); SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_dst_factor)); } } } else { SB_BEGIN_3D(so, BLEND_ENABLE(0), 1); SB_DATA (so, cso->rt[0].blend_enable); } if (emit_common_func) { SB_BEGIN_3D(so, BLEND_EQUATION_RGB, 5); SB_DATA (so, nvgl_blend_eqn(cso->rt[0].rgb_func)); SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_src_factor)); SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_dst_factor)); SB_DATA (so, nvgl_blend_eqn(cso->rt[0].alpha_func)); SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_src_factor)); SB_BEGIN_3D(so, BLEND_FUNC_DST_ALPHA, 1); SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_dst_factor)); } if (cso->logicop_enable) { SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 2); SB_DATA (so, 1); SB_DATA (so, nvgl_logicop_func(cso->logicop_func)); } else { SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 1); SB_DATA (so, 0); } if (cso->independent_blend_enable) { SB_BEGIN_3D(so, COLOR_MASK(0), 8); for (i = 0; i < 8; ++i) SB_DATA(so, nv50_colormask(cso->rt[i].colormask)); } else { SB_BEGIN_3D(so, COLOR_MASK(0), 1); SB_DATA (so, nv50_colormask(cso->rt[0].colormask)); } ms = 0; if (cso->alpha_to_coverage) ms |= NV50_3D_MULTISAMPLE_CTRL_ALPHA_TO_COVERAGE; if (cso->alpha_to_one) ms |= NV50_3D_MULTISAMPLE_CTRL_ALPHA_TO_ONE; SB_BEGIN_3D(so, MULTISAMPLE_CTRL, 1); SB_DATA (so, ms); assert(so->size <= (sizeof(so->state) / sizeof(so->state[0]))); return so; }
static void * nv50_blend_state_create(struct pipe_context *pipe, const struct pipe_blend_state *cso) { struct nv50_blend_stateobj *so = CALLOC_STRUCT(nv50_blend_stateobj); int i; bool emit_common_func = cso->rt[0].blend_enable; if (nv50_context(pipe)->screen->tesla->oclass >= NVA3_3D_CLASS) { SB_BEGIN_3D(so, BLEND_INDEPENDENT, 1); SB_DATA (so, cso->independent_blend_enable); } so->pipe = *cso; SB_BEGIN_3D(so, COLOR_MASK_COMMON, 1); SB_DATA (so, !cso->independent_blend_enable); SB_BEGIN_3D(so, BLEND_ENABLE_COMMON, 1); SB_DATA (so, !cso->independent_blend_enable); if (cso->independent_blend_enable) { SB_BEGIN_3D(so, BLEND_ENABLE(0), 8); for (i = 0; i < 8; ++i) { SB_DATA(so, cso->rt[i].blend_enable); if (cso->rt[i].blend_enable) emit_common_func = true; } if (nv50_context(pipe)->screen->tesla->oclass >= NVA3_3D_CLASS) { emit_common_func = false; for (i = 0; i < 8; ++i) { if (!cso->rt[i].blend_enable) continue; SB_BEGIN_3D_(so, NVA3_3D_IBLEND_EQUATION_RGB(i), 6); SB_DATA (so, nvgl_blend_eqn(cso->rt[i].rgb_func)); SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_src_factor)); SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_dst_factor)); SB_DATA (so, nvgl_blend_eqn(cso->rt[i].alpha_func)); SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_src_factor)); SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_dst_factor)); } } } else { SB_BEGIN_3D(so, BLEND_ENABLE(0), 1); SB_DATA (so, cso->rt[0].blend_enable); } if (emit_common_func) { SB_BEGIN_3D(so, BLEND_EQUATION_RGB, 5); SB_DATA (so, nvgl_blend_eqn(cso->rt[0].rgb_func)); SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_src_factor)); SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_dst_factor)); SB_DATA (so, nvgl_blend_eqn(cso->rt[0].alpha_func)); SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_src_factor)); SB_BEGIN_3D(so, BLEND_FUNC_DST_ALPHA, 1); SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_dst_factor)); } if (cso->logicop_enable) { SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 2); SB_DATA (so, 1); SB_DATA (so, nvgl_logicop_func(cso->logicop_func)); } else { SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 1); SB_DATA (so, 0); } if (cso->independent_blend_enable) { SB_BEGIN_3D(so, COLOR_MASK(0), 8); for (i = 0; i < 8; ++i) SB_DATA(so, nv50_colormask(cso->rt[i].colormask)); } else { SB_BEGIN_3D(so, COLOR_MASK(0), 1); SB_DATA (so, nv50_colormask(cso->rt[0].colormask)); } assert(so->size <= ARRAY_SIZE(so->state)); return so; }