static void * nv50_blend_state_create(struct pipe_context *pipe, const struct pipe_blend_state *cso) { struct nouveau_stateobj *so = so_new(64, 0); struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla; struct nv50_blend_stateobj *bso = CALLOC_STRUCT(nv50_blend_stateobj); unsigned cmask = 0, i; /*XXX ignored: * - dither */ if (cso->blend_enable == 0) { so_method(so, tesla, NV50TCL_BLEND_ENABLE(0), 8); for (i = 0; i < 8; i++) so_data(so, 0); } else { so_method(so, tesla, NV50TCL_BLEND_ENABLE(0), 8); for (i = 0; i < 8; i++) so_data(so, 1); so_method(so, tesla, NV50TCL_BLEND_EQUATION_RGB, 5); so_data (so, nvgl_blend_eqn(cso->rgb_func)); so_data (so, 0x4000 | nvgl_blend_func(cso->rgb_src_factor)); so_data (so, 0x4000 | nvgl_blend_func(cso->rgb_dst_factor)); so_data (so, nvgl_blend_eqn(cso->alpha_func)); so_data (so, 0x4000 | nvgl_blend_func(cso->alpha_src_factor)); so_method(so, tesla, NV50TCL_BLEND_FUNC_DST_ALPHA, 1); so_data (so, 0x4000 | nvgl_blend_func(cso->alpha_dst_factor)); } if (cso->logicop_enable == 0 ) { so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 1); so_data (so, 0); } else { so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 2); so_data (so, 1); so_data (so, nvgl_logicop_func(cso->logicop_func)); } if (cso->colormask & PIPE_MASK_R) cmask |= (1 << 0); if (cso->colormask & PIPE_MASK_G) cmask |= (1 << 4); if (cso->colormask & PIPE_MASK_B) cmask |= (1 << 8); if (cso->colormask & PIPE_MASK_A) cmask |= (1 << 12); so_method(so, tesla, NV50TCL_COLOR_MASK(0), 8); for (i = 0; i < 8; i++) so_data(so, cmask); bso->pipe = *cso; so_ref(so, &bso->so); so_ref(NULL, &so); return (void *)bso; }
static void * nv50_blend_state_create(struct pipe_context *pipe, const struct pipe_blend_state *cso) { struct nouveau_stateobj *so = so_new(5, 24, 0); struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla; struct nv50_blend_stateobj *bso = CALLOC_STRUCT(nv50_blend_stateobj); unsigned i, blend_enabled = 0; /*XXX ignored: * - dither */ so_method(so, tesla, NV50TCL_BLEND_ENABLE(0), 8); if (cso->independent_blend_enable) { for (i = 0; i < 8; ++i) { so_data(so, cso->rt[i].blend_enable); if (cso->rt[i].blend_enable) blend_enabled = 1; } } else if (cso->rt[0].blend_enable) { blend_enabled = 1; for (i = 0; i < 8; i++) so_data(so, 1); } else { for (i = 0; i < 8; i++) so_data(so, 0); } if (blend_enabled) { so_method(so, tesla, NV50TCL_BLEND_EQUATION_RGB, 5); so_data (so, nvgl_blend_eqn(cso->rt[0].rgb_func)); so_data (so, 0x4000 | nvgl_blend_func(cso->rt[0].rgb_src_factor)); so_data (so, 0x4000 | nvgl_blend_func(cso->rt[0].rgb_dst_factor)); so_data (so, nvgl_blend_eqn(cso->rt[0].alpha_func)); so_data (so, 0x4000 | nvgl_blend_func(cso->rt[0].alpha_src_factor)); so_method(so, tesla, NV50TCL_BLEND_FUNC_DST_ALPHA, 1); so_data (so, 0x4000 | nvgl_blend_func(cso->rt[0].alpha_dst_factor)); } if (cso->logicop_enable == 0 ) { so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 1); so_data (so, 0); } else { so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 2); so_data (so, 1); so_data (so, nvgl_logicop_func(cso->logicop_func)); } so_method(so, tesla, NV50TCL_COLOR_MASK(0), 8); if (cso->independent_blend_enable) for (i = 0; i < 8; ++i) so_data(so, nv50_colormask(cso->rt[i].colormask)); else { uint32_t cmask = nv50_colormask(cso->rt[0].colormask); for (i = 0; i < 8; i++) so_data(so, cmask); } bso->pipe = *cso; so_ref(so, &bso->so); so_ref(NULL, &so); return (void *)bso; }