static NCURSES_INLINE NCURSES_CH_T render_char(WINDOW *win, NCURSES_CH_T ch) /* compute a rendition of the given char correct for the current context */ { attr_t a = WINDOW_ATTRS(win); int pair = GetPair(ch); if (ISBLANK(ch) && AttrOf(ch) == A_NORMAL && pair == 0) { /* color/pair in attrs has precedence over bkgrnd */ ch = win->_nc_bkgd; SetAttr(ch, a | AttrOf(win->_nc_bkgd)); if ((pair = GET_WINDOW_PAIR(win)) == 0) pair = GetPair(win->_nc_bkgd); SetPair(ch, pair); } else { /* color in attrs has precedence over bkgrnd */ a |= AttrOf(win->_nc_bkgd) & COLOR_MASK(a); /* color in ch has precedence */ if (pair == 0) { if ((pair = GET_WINDOW_PAIR(win)) == 0) pair = GetPair(win->_nc_bkgd); } #if 0 if (pair > 255) { NCURSES_CH_T fixme = ch; SetPair(fixme, pair); } #endif AddAttr(ch, (a & COLOR_MASK(AttrOf(ch)))); SetPair(ch, pair); } TR(TRACE_VIRTPUT, ("render_char bkg %s (%d), attrs %s (%d) -> ch %s (%d)", _tracech_t2(1, CHREF(win->_nc_bkgd)), GetPair(win->_nc_bkgd), _traceattr(WINDOW_ATTRS(win)), GET_WINDOW_PAIR(win), _tracech_t2(3, CHREF(ch)), GetPair(ch))); return (ch); }
static inline chtype render_char(WINDOW *win, chtype ch) /* compute a rendition of the given char correct for the current context */ { chtype a = win->_attrs; if (ch == ' ') { /* color in attrs has precedence over bkgd */ ch = a | (win->_bkgd & COLOR_MASK(a)); } else { /* color in attrs has precedence over bkgd */ a |= (win->_bkgd & A_ATTRIBUTES) & COLOR_MASK(a); /* color in ch has precedence */ ch |= (a & COLOR_MASK(ch)); } TR(TRACE_VIRTPUT, ("bkg = %lx, attrs = %lx -> ch = %lx", win->_bkgd, win->_attrs, ch)); return(ch); }
static void nv50_blitctx_prepare_state(struct nv50_blitctx *blit) { struct nouveau_channel *chan = blit->screen->base.channel; /* blend state */ BEGIN_RING(chan, RING_3D(COLOR_MASK(0)), 1); OUT_RING (chan, blit->color_mask); BEGIN_RING(chan, RING_3D(BLEND_ENABLE(0)), 1); OUT_RING (chan, 0); BEGIN_RING(chan, RING_3D(LOGIC_OP_ENABLE), 1); OUT_RING (chan, 0); /* rasterizer state */ #ifndef NV50_SCISSORS_CLIPPING BEGIN_RING(chan, RING_3D(SCISSOR_ENABLE(0)), 1); OUT_RING (chan, 1); #endif BEGIN_RING(chan, RING_3D(VERTEX_TWO_SIDE_ENABLE), 1); OUT_RING (chan, 0); BEGIN_RING(chan, RING_3D(FRAG_COLOR_CLAMP_EN), 1); OUT_RING (chan, 0); BEGIN_RING(chan, RING_3D(MULTISAMPLE_ENABLE), 1); OUT_RING (chan, 0); BEGIN_RING(chan, RING_3D(MSAA_MASK(0)), 4); OUT_RING (chan, 0xffff); OUT_RING (chan, 0xffff); OUT_RING (chan, 0xffff); OUT_RING (chan, 0xffff); BEGIN_RING(chan, RING_3D(POLYGON_MODE_FRONT), 3); OUT_RING (chan, NV50_3D_POLYGON_MODE_FRONT_FILL); OUT_RING (chan, NV50_3D_POLYGON_MODE_BACK_FILL); OUT_RING (chan, 0); BEGIN_RING(chan, RING_3D(CULL_FACE_ENABLE), 1); OUT_RING (chan, 0); BEGIN_RING(chan, RING_3D(POLYGON_STIPPLE_ENABLE), 1); OUT_RING (chan, 0); BEGIN_RING(chan, RING_3D(POLYGON_OFFSET_FILL_ENABLE), 1); OUT_RING (chan, 0); /* zsa state */ BEGIN_RING(chan, RING_3D(DEPTH_TEST_ENABLE), 1); OUT_RING (chan, 0); BEGIN_RING(chan, RING_3D(STENCIL_ENABLE), 1); OUT_RING (chan, 0); BEGIN_RING(chan, RING_3D(ALPHA_TEST_ENABLE), 1); OUT_RING (chan, 0); }
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 * nvc0_blend_state_create(struct pipe_context *pipe, const struct pipe_blend_state *cso) { struct nvc0_blend_stateobj *so = CALLOC_STRUCT(nvc0_blend_stateobj); int i; int r; /* reference */ uint8_t blend_en = 0; bool indep_masks = false; bool indep_funcs = false; so->pipe = *cso; /* check which states actually have differing values */ if (cso->independent_blend_enable) { for (r = 0; r < 8 && !cso->rt[r].blend_enable; ++r); blend_en |= 1 << r; for (i = r + 1; i < 8; ++i) { if (!cso->rt[i].blend_enable) continue; blend_en |= 1 << i; if (cso->rt[i].rgb_func != cso->rt[r].rgb_func || cso->rt[i].rgb_src_factor != cso->rt[r].rgb_src_factor || cso->rt[i].rgb_dst_factor != cso->rt[r].rgb_dst_factor || cso->rt[i].alpha_func != cso->rt[r].alpha_func || cso->rt[i].alpha_src_factor != cso->rt[r].alpha_src_factor || cso->rt[i].alpha_dst_factor != cso->rt[r].alpha_dst_factor) { indep_funcs = true; break; } } for (; i < 8; ++i) blend_en |= (cso->rt[i].blend_enable ? 1 : 0) << i; for (i = 1; i < 8; ++i) { if (cso->rt[i].colormask != cso->rt[0].colormask) { indep_masks = true; break; } } } else { r = 0; if (cso->rt[0].blend_enable) blend_en = 0xff; } 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)); SB_IMMED_3D(so, MACRO_BLEND_ENABLES, 0); } else { SB_IMMED_3D(so, LOGIC_OP_ENABLE, 0); SB_IMMED_3D(so, BLEND_INDEPENDENT, indep_funcs); SB_IMMED_3D(so, MACRO_BLEND_ENABLES, blend_en); if (indep_funcs) { for (i = 0; i < 8; ++i) { if (cso->rt[i].blend_enable) { SB_BEGIN_3D(so, IBLEND_EQUATION_RGB(i), 6); SB_DATA (so, nvgl_blend_eqn(cso->rt[i].rgb_func)); SB_DATA (so, nvc0_blend_fac(cso->rt[i].rgb_src_factor)); SB_DATA (so, nvc0_blend_fac(cso->rt[i].rgb_dst_factor)); SB_DATA (so, nvgl_blend_eqn(cso->rt[i].alpha_func)); SB_DATA (so, nvc0_blend_fac(cso->rt[i].alpha_src_factor)); SB_DATA (so, nvc0_blend_fac(cso->rt[i].alpha_dst_factor)); } } } else if (blend_en) { SB_BEGIN_3D(so, BLEND_EQUATION_RGB, 5); SB_DATA (so, nvgl_blend_eqn(cso->rt[r].rgb_func)); SB_DATA (so, nvc0_blend_fac(cso->rt[r].rgb_src_factor)); SB_DATA (so, nvc0_blend_fac(cso->rt[r].rgb_dst_factor)); SB_DATA (so, nvgl_blend_eqn(cso->rt[r].alpha_func)); SB_DATA (so, nvc0_blend_fac(cso->rt[r].alpha_src_factor)); SB_BEGIN_3D(so, BLEND_FUNC_DST_ALPHA, 1); SB_DATA (so, nvc0_blend_fac(cso->rt[r].alpha_dst_factor)); } SB_IMMED_3D(so, COLOR_MASK_COMMON, !indep_masks); if (indep_masks) { SB_BEGIN_3D(so, COLOR_MASK(0), 8); for (i = 0; i < 8; ++i) SB_DATA(so, nvc0_colormask(cso->rt[i].colormask)); } else { SB_BEGIN_3D(so, COLOR_MASK(0), 1); SB_DATA (so, nvc0_colormask(cso->rt[0].colormask)); } } assert(so->size <= ARRAY_SIZE(so->state)); 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; }
static void * nvc0_blend_state_create(struct pipe_context *pipe, const struct pipe_blend_state *cso) { struct nvc0_blend_stateobj *so = CALLOC_STRUCT(nvc0_blend_stateobj); int i; uint32_t ms; so->pipe = *cso; SB_IMMED_3D(so, BLEND_INDEPENDENT, cso->independent_blend_enable); if (!cso->logicop_enable) SB_IMMED_3D(so, LOGIC_OP_ENABLE, 0); 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)); SB_IMMED_3D(so, BLEND_ENABLES, 0); } else if (!cso->independent_blend_enable) { SB_IMMED_3D(so, BLEND_ENABLES, cso->rt[0].blend_enable ? 0xff : 0); if (cso->rt[0].blend_enable) { SB_BEGIN_3D(so, BLEND_EQUATION_RGB, 5); SB_DATA (so, nvgl_blend_eqn(cso->rt[0].rgb_func)); SB_DATA (so, nvc0_blend_fac(cso->rt[0].rgb_src_factor)); SB_DATA (so, nvc0_blend_fac(cso->rt[0].rgb_dst_factor)); SB_DATA (so, nvgl_blend_eqn(cso->rt[0].alpha_func)); SB_DATA (so, nvc0_blend_fac(cso->rt[0].alpha_src_factor)); SB_BEGIN_3D(so, BLEND_FUNC_DST_ALPHA, 1); SB_DATA (so, nvc0_blend_fac(cso->rt[0].alpha_dst_factor)); } SB_IMMED_3D(so, COLOR_MASK_COMMON, 1); SB_BEGIN_3D(so, COLOR_MASK(0), 1); SB_DATA (so, nvc0_colormask(cso->rt[0].colormask)); } else { uint8_t en = 0; for (i = 0; i < 8; ++i) { if (!cso->rt[i].blend_enable) continue; en |= 1 << i; SB_BEGIN_3D(so, IBLEND_EQUATION_RGB(i), 6); SB_DATA (so, nvgl_blend_eqn(cso->rt[i].rgb_func)); SB_DATA (so, nvc0_blend_fac(cso->rt[i].rgb_src_factor)); SB_DATA (so, nvc0_blend_fac(cso->rt[i].rgb_dst_factor)); SB_DATA (so, nvgl_blend_eqn(cso->rt[i].alpha_func)); SB_DATA (so, nvc0_blend_fac(cso->rt[i].alpha_src_factor)); SB_DATA (so, nvc0_blend_fac(cso->rt[i].alpha_dst_factor)); } SB_IMMED_3D(so, BLEND_ENABLES, en); SB_IMMED_3D(so, COLOR_MASK_COMMON, 0); SB_BEGIN_3D(so, COLOR_MASK(0), 8); for (i = 0; i < 8; ++i) SB_DATA(so, nvc0_colormask(cso->rt[i].colormask)); } ms = 0; if (cso->alpha_to_coverage) ms |= NVC0_3D_MULTISAMPLE_CTRL_ALPHA_TO_COVERAGE; if (cso->alpha_to_one) ms |= NVC0_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; }