static Bool NV30EXAPicture(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict, int unit, uint32_t *color, uint32_t *alpha, uint32_t *solid) { uint32_t shift, source; if (pPict && pPict->pDrawable) { if (!NV30EXATexture(pScrn, pPix, pPict, unit)) return FALSE; *solid = 0x00000000; source = RCSRC_TEX(unit); } else if (pPict) { *solid = pPict->pSourcePict->solidFill.color; source = RCSRC_COL(unit); } if (pPict && PICT_FORMAT_RGB(pPict->format)) *color = RCSEL_COLOR | source; else *color = RCSEL_ALPHA | RCINP_ZERO; if (pPict && PICT_FORMAT_A(pPict->format)) *alpha = RCSEL_ALPHA | source; else *alpha = RCSEL_ALPHA | RCINP_ONE; if (unit) shift = RCINP_B__SHIFT; else shift = RCINP_A__SHIFT; *color <<= shift; *alpha <<= shift; return TRUE; }
Bool NV30EXAPrepareComposite(int op, PicturePtr psPict, PicturePtr pmPict, PicturePtr pdPict, PixmapPtr psPix, PixmapPtr pmPix, PixmapPtr pdPix) { ScrnInfoPtr pScrn = xf86Screens[psPix->drawable.pScreen->myNum]; NVPtr pNv = NVPTR(pScrn); struct nouveau_channel *chan = pNv->chan; struct nouveau_grobj *rankine = pNv->Nv3D; nv_pict_op_t *blend; int fpid = NV30EXA_FPID_PASS_COL0; NV30EXA_STATE; if (MARK_RING(chan, 128, 1 + 1 + 4)) return FALSE; blend = NV30_GetPictOpRec(op); NV30_SetupBlend(pScrn, blend, pdPict->format, (pmPict && pmPict->componentAlpha && PICT_FORMAT_RGB(pmPict->format))); if (!NV30_SetupSurface(pScrn, pdPix, pdPict) || !NV30EXATexture(pScrn, psPix, psPict, 0)) { MARK_UNDO(chan); return FALSE; } #if 0 #define printformat(f) ErrorF("(%xh %s %dbpp A%dR%dG%dB%d)",f,(f>>16)&0xf==2?"ARGB":"ABGR",(f>>24),(f&0xf000)>>12,(f&0xf00)>>8,(f&0xf0)>>4,f&0xf) ErrorF("Preparecomposite src(%dx%d)",psPict->pDrawable->width,psPict->pDrawable->height); printformat((psPict->format)); ErrorF(" dst(%dx%d)",pdPict->pDrawable->width,pdPict->pDrawable->height); printformat((pdPict->format)); if (pmPict) { ErrorF(" mask(%dx%d)",pmPict->pDrawable->width,pmPict->pDrawable->height); printformat((pmPict->format)); } ErrorF("\n"); #endif if (pmPict) { if (!NV30EXATexture(pScrn, pmPix, pmPict, 1)) { MARK_UNDO(chan); return FALSE; } if (pmPict->componentAlpha && PICT_FORMAT_RGB(pmPict->format)) { if (blend->src_alpha) fpid = NV30EXA_FPID_COMPOSITE_MASK_SA_CA; else fpid = NV30EXA_FPID_COMPOSITE_MASK_CA; } else { fpid = NV30EXA_FPID_COMPOSITE_MASK; } state->have_mask = TRUE; } else { fpid = NV30EXA_FPID_PASS_TEX0; state->have_mask = FALSE; } if (!NV30_LoadFragProg(pScrn, (pdPict->format == PICT_a8) ? nv40_fp_map_a8[fpid] : nv40_fp_map[fpid])) { MARK_UNDO(chan); return FALSE; } BEGIN_RING(chan, rankine, 0x23c, 1); OUT_RING (chan, pmPict?3:1); pNv->alu = op; pNv->pspict = psPict; pNv->pmpict = pmPict; pNv->pdpict = pdPict; pNv->pspix = psPix; pNv->pmpix = pmPix; pNv->pdpix = pdPix; chan->flush_notify = NV30EXAStateCompositeReemit; return TRUE; }