1 /**************************************************************************
3 xserver-xorg-video-exynos
5 Copyright 2010 - 2011 Samsung Electronics co., Ltd. All Rights Reserved.
7 Contact: SooChan Lim <sc1.lim@samsung.com>
9 Permission is hereby granted, free of charge, to any person obtaining a
10 copy of this software and associated documentation files (the
11 "Software"), to deal in the Software without restriction, including
12 without limitation the rights to use, copy, modify, merge, publish,
13 distribute, sub license, and/or sell copies of the Software, and to
14 permit persons to whom the Software is furnished to do so, subject to
15 the following conditions:
17 The above copyright notice and this permission notice (including the
18 next paragraph) shall be included in all copies or substantial portions
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
24 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
25 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 **************************************************************************/
32 #include "sec_accel.h"
34 #include "sec_layer.h"
59 int state; /*state of region*/
61 struct xorg_list link;
80 struct xorg_list opBox;
102 struct xorg_list opBox;
110 PicturePtr pSrcPicture;
111 PicturePtr pMaskPicture;
112 PicturePtr pDstPicture;
113 PixmapPtr pSrcPixmap;
114 PixmapPtr pMaskPixmap;
115 PixmapPtr pDstPixmap;
126 struct xorg_list opBox;
139 struct xorg_list opBox;
152 struct xorg_list opBox;
155 typedef void (* DoDrawProcPtr) (PixmapPtr pPix, Bool isPart,
157 int clip_x, int clip_y,
158 int w, int h, void* data);
160 typedef void (* DoDrawProcPtrEx) (ExaBox* box, void* data);
162 static ExaOpInfo OpInfo[EXA_NUM_PREPARE_INDICES];
163 static OpSolid gOpSolid;
164 static OpCopy gOpCopy;
165 static OpComposite gOpComposite;
169 ExaBox* _swBoxAdd (struct xorg_list *l, BoxPtr b1, BoxPtr b2)
173 rgn = calloc (1, sizeof (ExaBox));
174 rgn->state = secUtilBoxIntersect (&rgn->box, b1, b2);
175 if (rgnOUT == rgn->state)
181 xorg_list_add (&rgn->link, l);
185 void _swBoxMerge (struct xorg_list *l, struct xorg_list* b, struct xorg_list* t)
187 ExaBox *b1 = NULL, *b2 = NULL;
190 xorg_list_for_each_entry (b1, b, link)
192 xorg_list_for_each_entry (b2, t, link)
194 r = _swBoxAdd (l, &b1->box, &b2->box);
197 r->pSrc = b1->pSrc ? b1->pSrc : b2->pSrc;
198 r->pMask= b1->pMask ? b1->pMask : b2->pMask;
199 r->pDst = b1->pDst ? b1->pDst : b2->pDst;
205 void _swBoxMove (struct xorg_list* l, int tx, int ty)
209 xorg_list_for_each_entry (b, l, link)
211 secUtilBoxMove (&b->box, tx, ty);
215 void _swBoxRemoveAll (struct xorg_list* l)
217 ExaBox *ref = NULL, *next = NULL;
219 xorg_list_for_each_entry_safe (ref, next, l, link)
221 xorg_list_del (&ref->link);
226 int _swBoxIsOne (struct xorg_list* l)
230 if (l->next == l->prev)
239 void _swBoxPrint (ExaBox* sb1, const char* name)
243 xorg_list_for_each_entry (b, &sb1->link, link)
245 XDBG_DEBUG (MEXA, "[%s] %d,%d - %d,%d\n", name,
246 b->box.x1, b->box.y1, b->box.x2, b->box.y2);
250 static ExaOpInfo* _swPrepareAccess (PixmapPtr pPix, int index)
252 ScreenPtr pScreen = pPix->drawable.pScreen;
253 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
254 SECPtr pSec = SECPTR (pScrn);
255 SECPixmapPriv *privPixmap = (SECPixmapPriv*)exaGetPixmapDriverPrivate (pPix);
256 ExaOpInfo* op = &OpInfo[index];
257 int opt = TBM_OPTION_READ;
260 tbm_bo_handle bo_handle;
261 SECFbBoDataPtr bo_data;
265 XDBG_RETURN_VAL_IF_FAIL ((privPixmap != NULL), NULL);
267 if (index == EXA_PREPARE_DEST || index == EXA_PREPARE_AUX_DEST)
268 opt |= TBM_OPTION_WRITE;
271 if (privPixmap->exaOpInfo)
273 op = (ExaOpInfo*)privPixmap->exaOpInfo;
275 XDBG_TRACE (MEXAS, "pix:%p index:%d hint:%d ptr:%p ref:%d\n",
276 pPix, index, pPix->usage_hint, pPix->devPrivate.ptr, op->refcnt);
281 memset (op, 0x00, sizeof (ExaOpInfo));
286 if (pPix->usage_hint == CREATE_PIXMAP_USAGE_FB)
288 ret = secFbFindBo (pSec->pFb,
289 pPix->drawable.x, pPix->drawable.y,
290 pPix->drawable.width, pPix->drawable.height,
292 XDBG_TRACE (MEXAS,"FB ret:%d num_pix:%d, %dx%d+%d+%d\n",
294 pPix->drawable.width, pPix->drawable.height,
295 pPix->drawable.x, pPix->drawable.y);
297 if (ret == rgnSAME && num_bo == 1)
302 op->buf[0].pixmap = pPix;
303 op->buf[0].bo = bos[0];
304 bo_handle = tbm_bo_map (op->buf[0].bo, TBM_DEVICE_CPU, op->opt);
305 op->buf[0].addr = bo_handle.ptr;
306 op->buf[0].pixmap->devPrivate.ptr = op->buf[0].addr;
307 op->buf[0].pos.x1 = 0;
308 op->buf[0].pos.y1 = 0;
309 op->buf[0].pos.x2 = pPix->drawable.width;
310 op->buf[0].pos.y2 = pPix->drawable.height;
319 bos = (tbm_bo *)calloc(1, sizeof(tbm_bo));
320 bos[0] = pSec->pFb->default_bo;
322 #endif //NO_CRTC_MODE
327 for (i = 0; i < num_bo; i++)
329 tbm_bo_get_user_data (bos[i], TBM_BO_DATA_FB, (void**)&bo_data);
330 op->buf[i].pixmap = secRenderBoGetPixmap (pSec->pFb, bos[i]);
331 op->buf[i].bo = bos[i];
332 bo_handle = tbm_bo_map (bos[i], TBM_DEVICE_CPU, op->opt);
333 op->buf[i].addr = bo_handle.ptr;
334 op->buf[i].pixmap->devPrivate.ptr = op->buf[i].addr;
335 op->buf[i].pos = bo_data->pos;
350 op->buf[0].pixmap = pPix;
353 op->buf[0].bo = privPixmap->bo;
354 bo_handle = tbm_bo_map (op->buf[0].bo, TBM_DEVICE_CPU, op->opt);
355 op->buf[0].addr = bo_handle.ptr;
359 op->buf[0].bo = privPixmap->bo;
360 op->buf[0].addr = privPixmap->pPixData;
362 op->buf[0].pixmap->devPrivate.ptr = op->buf[0].addr;
363 op->buf[0].pos.x1 = 0;
364 op->buf[0].pos.y1 = 0;
365 op->buf[0].pos.x2 = pPix->drawable.width;
366 op->buf[0].pos.y2 = pPix->drawable.height;
369 privPixmap->exaOpInfo = op;
371 XDBG_TRACE (MEXAS, "pix:%p index:%d hint:%d ptr:%p ref:%d\n",
372 pPix, index, pPix->usage_hint, pPix->devPrivate.ptr, op->refcnt);
376 static void _swFinishAccess (PixmapPtr pPix, int index)
378 XDBG_RETURN_IF_FAIL (pPix!=NULL);
380 SECPixmapPriv *privPixmap = (SECPixmapPriv*)exaGetPixmapDriverPrivate (pPix);
384 XDBG_RETURN_IF_FAIL (privPixmap!=NULL);
385 XDBG_RETURN_IF_FAIL (privPixmap->exaOpInfo!=NULL);
387 op = (ExaOpInfo*)privPixmap->exaOpInfo;
392 for (i=0; i < op->num; i++)
396 tbm_bo_unmap (op->buf[i].bo);
398 if( index == EXA_PREPARE_DEST && pPix->usage_hint == CREATE_PIXMAP_USAGE_FB )
400 // In this case, DEST is framebuffer. It is updated by CPU.
401 // After that LCD will use this buffer.
402 // So we should call cache op!!
403 tbm_bo_map(op->buf[i].bo, TBM_DEVICE_3D, TBM_OPTION_READ);
404 tbm_bo_unmap(op->buf[i].bo);
407 pScreen = pPix->drawable.pScreen;
409 if( pScreen != NULL )
411 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
412 SECPtr pSec = SECPTR(pScrn);
414 pSec->is_fb_touched = TRUE;
417 op->buf[i].bo = NULL;
420 if (op->buf[i].pixmap)
422 op->buf[i].pixmap->devPrivate.ptr = NULL;
423 op->buf[i].pixmap = NULL;
425 op->buf[i].addr = NULL;
428 privPixmap->exaOpInfo = NULL;
431 if (pPix->usage_hint == CREATE_PIXMAP_USAGE_OVERLAY)
432 secLayerUpdate (secLayerFind (LAYER_OUTPUT_LCD, LAYER_UPPER));
434 XDBG_TRACE (MEXAS, "pix:%p index:%d hint:%d ptr:%p ref:%d\n",
435 pPix, index, pPix->usage_hint, pPix->devPrivate.ptr, op->refcnt);
439 _swDoDraw (struct xorg_list *l, DoDrawProcPtrEx do_draw, void* data)
442 xorg_list_for_each_entry (box, l, link)
449 _swDoSolid (ExaBox* box, void* data)
451 XDBG_TRACE (MEXAS, "(%d,%d), (%d,%d) off(%d,%d)\n",
459 fbFill (&box->pDst->pixmap->drawable,
461 box->box.x1 + gOpSolid.x - box->pDst->pos.x1,
462 box->box.y1 + gOpSolid.y - box->pDst->pos.y1,
463 box->box.x2- box->box.x1,
464 box->box.y2- box->box.y1);
468 _swDoCopy (ExaBox* box, void* data)
470 CARD8 alu = gOpCopy.alu;
471 FbBits pm = gOpCopy.pm;
478 _X_UNUSED int srcXoff, srcYoff;
479 _X_UNUSED int dstXoff, dstYoff;
480 int srcX, srcY, dstX, dstY, width, height;
482 XDBG_TRACE (MEXAS, "box(%d,%d),(%d,%d) src(%d,%d) dst(%d,%d)\n",
492 srcX = gOpCopy.srcX + box->box.x1 - box->pSrc->pos.x1;
493 srcY = gOpCopy.srcY + box->box.y1 - box->pSrc->pos.y1;
494 dstX = gOpCopy.dstX + box->box.x1 - box->pDst->pos.x1;
495 dstY = gOpCopy.dstY + box->box.y1 - box->pDst->pos.y1;
496 width = box->box.x2 - box->box.x1;
497 height = box->box.y2 - box->box.y1;
499 fbGetDrawable (&box->pSrc->pixmap->drawable, src, srcStride, srcBpp, srcXoff, srcYoff);
500 fbGetDrawable (&box->pDst->pixmap->drawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
501 /* temp fix : do right things later */
507 if (pm != FB_ALLONES ||
510 gOpCopy.upsidedown ||
511 !pixman_blt ((uint32_t *)src, (uint32_t *)dst,
515 srcX, srcY, dstX, dstY, width, height))
517 fbBlt (src + srcY * srcStride,
521 dst + dstY * dstStride,
538 _swDoComposite (ExaBox* box, void* data)
540 PicturePtr pDstPicture;
541 pixman_image_t *src, *mask, *dest;
542 int src_xoff, src_yoff, msk_xoff, msk_yoff;
547 if (box->state == rgnPART)
549 XDBG_RETURN_IF_FAIL (gOpComposite.pSrcPicture->transform == NULL);
550 XDBG_RETURN_IF_FAIL (gOpComposite.pMaskPicture &&
551 gOpComposite.pMaskPicture->transform == NULL);
554 pDstPicture = gOpComposite.pDstPicture;
556 src = image_from_pict (gOpComposite.pSrcPicture, FALSE, &src_xoff, &src_yoff);
557 mask = image_from_pict (gOpComposite.pMaskPicture, FALSE, &msk_xoff, &msk_yoff);
559 fbGetPixmapBitsData (box->pDst->pixmap, bits, stride, bpp);
560 dest = pixman_image_create_bits (pDstPicture->format,
561 box->pDst->pixmap->drawable.width,
562 box->pDst->pixmap->drawable.height,
563 (uint32_t *)bits, stride * sizeof (FbStride));
565 pixman_image_composite (gOpComposite.op,
567 gOpComposite.srcX + box->box.x1,
568 gOpComposite.srcY + box->box.y1,
569 gOpComposite.maskX + box->box.x1,
570 gOpComposite.maskY + box->box.y1,
571 gOpComposite.dstX + box->box.x1 - box->pDst->pos.x1,
572 gOpComposite.dstY + box->box.y1 - box->pDst->pos.y1,
573 box->box.x2 - box->box.x1,
574 box->box.y2 - box->box.y1);
576 free_pixman_pict (gOpComposite.pSrcPicture, src);
577 free_pixman_pict (gOpComposite.pMaskPicture, mask);
578 pixman_image_unref (dest);
582 _swDoUploadToScreen (ExaBox* box, void* data)
587 _X_UNUSED int dstXoff, dstYoff;
592 fbGetDrawable (&box->pDst->pixmap->drawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
594 srcStride = gOpUTS.src_pitch/sizeof (uint32_t);
595 dstX = gOpUTS.x + box->box.x1 - box->pDst->pos.x1;
596 dstY = gOpUTS.y + box->box.y1 - box->pDst->pos.y1;
597 width = box->box.x2 - box->box.x1;
598 height = box->box.y2 - box->box.y1;
600 XDBG_TRACE (MEXAS, "src(%p, %d) %d,%d,%d,%d\n",
601 gOpUTS.src, srcStride, dstX, dstY, width, height);
605 XDBG_WARNING(MEXAS, "dstBpp:%d\n", dstBpp);
609 if (!pixman_blt ((uint32_t *)gOpUTS.src,
614 box->box.x1, box->box.y1,
618 unsigned char *pDst, *pSrc;
619 int dst_pitch, src_pitch, cpp;
621 pDst = (unsigned char*)dst;
622 pSrc = (unsigned char*)gOpUTS.src;
624 src_pitch = gOpUTS.src_pitch;
625 dst_pitch = box->pDst->pixmap->devKind;
627 pSrc += box->box.y1 * src_pitch + box->box.x1 * cpp;
628 pDst += dstY * dst_pitch + dstX * cpp;
630 for (; height > 0; height--) {
631 memcpy(pDst, pSrc, width * cpp);
639 _swDoDownladFromScreen (ExaBox* box, void* data)
644 _X_UNUSED int srcXoff, srcYoff;
649 fbGetDrawable (&box->pSrc->pixmap->drawable, src, srcStride, srcBpp, srcXoff, srcYoff);
651 dstStride = gOpDFS.dst_pitch/sizeof (uint32_t);
652 srcX = gOpDFS.x + box->box.x1 - box->pSrc->pos.x1;
653 srcY = gOpDFS.y + box->box.y1 - box->pSrc->pos.y1;
654 width = box->box.x2 - box->box.x1;
655 height = box->box.y2 - box->box.y1;
657 XDBG_TRACE (MEXAS, "dst(%p, %d) %d,%d,%d,%d\n",
658 gOpDFS.dst, dstStride, srcX, srcY, width, height);
662 XDBG_WARNING(MEXAS, "srcBpp:%d\n", srcBpp);
666 if (!pixman_blt ((uint32_t *)src,
667 (uint32_t *)gOpDFS.dst,
672 box->box.x1, box->box.y1,
675 unsigned char *pDst, *pSrc;
676 int dst_pitch, src_pitch, cpp;
678 pDst = (unsigned char*)gOpDFS.dst;
679 pSrc = (unsigned char*)src;
681 src_pitch = box->pSrc->pixmap->devKind;
682 dst_pitch = gOpDFS.dst_pitch;
684 pSrc += srcY * src_pitch + srcX * cpp;
685 pDst += box->box.y1 * dst_pitch + box->box.x1 * cpp;
687 for (; height > 0; height--) {
688 memcpy(pDst, pSrc, width * cpp);
696 SECExaSwPrepareSolid (PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
698 ScreenPtr pScreen = pPixmap->drawable.pScreen;
699 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
700 ChangeGCVal tmpval[3];
702 XDBG_TRACE (MEXAS, "\n");
703 memset (&gOpSolid, 0x00, sizeof (gOpSolid));
705 /* Put ff at the alpha bits when transparency is set to xv */
706 if (pPixmap->drawable.depth == 24)
707 fg = fg | (~ (pScrn->mask.red|pScrn->mask.green|pScrn->mask.blue));
710 gOpSolid.planemask = planemask;
711 gOpSolid.pixmap = pPixmap;
713 gOpSolid.pOpDst = _swPrepareAccess (pPixmap, EXA_PREPARE_DEST);
714 XDBG_GOTO_IF_FAIL (gOpSolid.pOpDst, bail);
715 gOpSolid.pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
718 tmpval[1].val = planemask;
720 ChangeGC (NullClient, gOpSolid.pGC, GCFunction|GCPlaneMask|GCForeground, tmpval);
721 ValidateGC (&pPixmap->drawable, gOpSolid.pGC);
728 XDBG_TRACE (MEXAS, "FAIL: pix:%p hint:%d, num_pix:%d\n",
729 pPixmap, pPixmap->usage_hint, gOpSolid.pOpDst->num);
730 gOpSolid.bDo = FALSE;
738 SECExaSwSolid (PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
740 XDBG_TRACE (MEXAS, " (%d,%d), (%d,%d)\n", x1,y1,x2,y2);
741 if (gOpSolid.bDo == FALSE) return;
748 if (gOpSolid.pOpDst->isSame)
757 box.pDst = &gOpSolid.pOpDst->buf[0];
758 _swDoSolid (&box, NULL);
767 xorg_list_init (&gOpSolid.opBox);
774 for (i=0; i<gOpSolid.pOpDst->num; i++)
776 box = _swBoxAdd (&gOpSolid.opBox,
777 &gOpSolid.pOpDst->buf[i].pos,
781 box->pDst = &gOpSolid.pOpDst->buf[i];
784 _swBoxMove (&gOpSolid.opBox, -x1, -y1);
786 /* Call solid function */
787 _swDoDraw (&gOpSolid.opBox,
791 _swBoxRemoveAll (&gOpSolid.opBox);
796 SECExaSwDoneSolid (PixmapPtr pPixmap)
798 XDBG_TRACE (MEXAS, "\n");
801 FreeScratchGC (gOpSolid.pGC);
806 _swFinishAccess (gOpSolid.pixmap, EXA_PREPARE_DEST);
810 SECExaSwPrepareCopy (PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap,
811 int dx, int dy, int alu, Pixel planemask)
813 int num_dst_pix = -1;
814 int num_src_pix = -1;
816 XDBG_TRACE (MEXAS, "\n");
817 memset (&gOpCopy, 0x00, sizeof (gOpCopy));
820 gOpCopy.pm = planemask;
821 gOpCopy.reverse = (dx == 1)?0:1;
822 gOpCopy.upsidedown = (dy == 1)?0:1;
823 gOpCopy.pDstPix = pDstPixmap;
824 gOpCopy.pSrcPix = pSrcPixmap;
826 gOpCopy.pOpDst = _swPrepareAccess (pDstPixmap, EXA_PREPARE_DEST);
827 XDBG_GOTO_IF_FAIL (gOpCopy.pOpDst, bail);
828 gOpCopy.pOpSrc = _swPrepareAccess (pSrcPixmap, EXA_PREPARE_SRC);
829 XDBG_GOTO_IF_FAIL (gOpCopy.pOpDst, bail);
836 XDBG_TRACE (MEXAS, "FAIL\n");
837 XDBG_TRACE (MEXAS, " SRC pix:%p, hint:%d, num_pix:%d\n",
838 pSrcPixmap, pSrcPixmap->usage_hint, num_src_pix);
839 XDBG_TRACE (MEXAS, " DST pix:%p, hint:%d, num_pix:%d\n",
840 pDstPixmap, pDstPixmap->usage_hint, num_dst_pix);
848 SECExaSwCopy (PixmapPtr pDstPixmap, int srcX, int srcY,
849 int dstX, int dstY, int width, int height)
851 XDBG_TRACE (MEXAS, "src(%d,%d) dst(%d,%d) %dx%d\n",
852 srcX, srcY, dstX, dstY, width, height);
854 if (gOpSolid.bDo == FALSE) return;
860 gOpCopy.width = width;
861 gOpCopy.height = height;
863 if (gOpCopy.pOpSrc->isSame && gOpCopy.pOpDst->isSame)
872 box.pDst = &gOpCopy.pOpDst->buf[0];
873 box.pSrc = &gOpCopy.pOpSrc->buf[0];
874 _swDoCopy (&box, NULL);
879 struct xorg_list lSrc, lDst;
887 b.y2 = dstY + height;
888 xorg_list_init (&lDst);
889 for (i=0; i<gOpCopy.pOpDst->num; i++)
891 box = _swBoxAdd (&lDst,
892 &gOpCopy.pOpDst->buf[i].pos,
896 box->pDst = &gOpCopy.pOpDst->buf[i];
899 _swBoxMove (&lDst, -dstX, -dstY);
905 b.y2 = srcY + height;
907 xorg_list_init (&lSrc);
908 for (i=0; i<gOpCopy.pOpSrc->num; i++)
910 box = _swBoxAdd (&lSrc,
911 &gOpCopy.pOpSrc->buf[i].pos,
915 box->pSrc = &gOpCopy.pOpSrc->buf[i];
918 _swBoxMove (&lSrc, -srcX, -srcY);
920 //Merge and call copy
921 xorg_list_init (&gOpCopy.opBox);
922 _swBoxMerge (&gOpCopy.opBox, &lSrc, &lDst);
923 _swDoDraw (&gOpCopy.opBox,
927 _swBoxRemoveAll (&lSrc);
928 _swBoxRemoveAll (&lDst);
929 _swBoxRemoveAll (&gOpCopy.opBox);
934 SECExaSwDoneCopy (PixmapPtr pDstPixmap)
936 XDBG_TRACE (MEXAS, "\n");
939 _swFinishAccess (gOpCopy.pDstPix, EXA_PREPARE_DEST);
941 _swFinishAccess (gOpCopy.pSrcPix, EXA_PREPARE_SRC);
945 SECExaSwCheckComposite (int op, PicturePtr pSrcPicture,
946 PicturePtr pMaskPicture, PicturePtr pDstPicture)
952 SECExaSwPrepareComposite (int op, PicturePtr pSrcPicture,
953 PicturePtr pMaskPicture, PicturePtr pDstPicture,
954 PixmapPtr pSrcPixmap,
955 PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap)
957 XDBG_TRACE (MEXAS, "\n");
958 memset (&gOpComposite, 0x00, sizeof (gOpComposite));
959 XDBG_GOTO_IF_FAIL (pDstPixmap != NULL, bail);
961 gOpComposite.op = op;
962 gOpComposite.pDstPicture = pDstPicture;
963 gOpComposite.pSrcPicture = pSrcPicture;
964 gOpComposite.pMaskPicture = pMaskPicture;
965 gOpComposite.pSrcPixmap = pSrcPixmap;
966 gOpComposite.pMaskPixmap = pMaskPixmap;
967 gOpComposite.pDstPixmap = pDstPixmap;
969 gOpComposite.pOpDst = _swPrepareAccess (pDstPixmap, EXA_PREPARE_DEST);
973 gOpComposite.pOpSrc = _swPrepareAccess (pSrcPixmap, EXA_PREPARE_SRC);
974 XDBG_GOTO_IF_FAIL (gOpComposite.pOpSrc->num == 1, bail);
979 gOpComposite.pOpMask = _swPrepareAccess (pMaskPixmap, EXA_PREPARE_MASK);
980 XDBG_GOTO_IF_FAIL (gOpComposite.pOpMask->num == 1, bail);
983 gOpComposite.bDo = TRUE;
988 XDBG_TRACE (MEXAS, "FAIL: op%d\n", op);
989 XDBG_TRACE (MEXAS, " SRC picture:%p pix:%p\n", pSrcPicture, pSrcPixmap);
990 XDBG_TRACE (MEXAS, " MASK picture:%p pix:%p\n", pMaskPicture, pMaskPixmap);
991 XDBG_TRACE (MEXAS, " DST picture:%p pix:%p\n", pDstPicture, pDstPixmap);
993 gOpComposite.bDo = FALSE;
999 SECExaSwComposite (PixmapPtr pDstPixmap, int srcX, int srcY,
1000 int maskX, int maskY, int dstX, int dstY,
1001 int width, int height)
1003 XDBG_TRACE (MEXAS, "s(%d,%d), m(%d,%d) d(%d,%d) %dx%d\n",
1008 if (!gOpComposite.bDo) return;
1010 gOpComposite.srcX = srcX;
1011 gOpComposite.srcY = srcY;
1012 gOpComposite.maskX = maskX;
1013 gOpComposite.maskY = maskY;
1014 gOpComposite.dstX = dstX;
1015 gOpComposite.dstY = dstY;
1016 gOpComposite.width = width;
1017 gOpComposite.height = height;
1019 if (gOpComposite.pOpDst->isSame)
1027 box.box.y2 = height;
1028 box.pDst = &gOpComposite.pOpDst->buf[0];
1029 box.pSrc = (gOpComposite.pOpSrc)? (&gOpComposite.pOpSrc->buf[0]):NULL;
1030 box.pSrc = (gOpComposite.pOpMask)? (&gOpComposite.pOpMask->buf[0]):NULL;
1032 _swDoComposite (&box, NULL);
1041 xorg_list_init (&gOpComposite.opBox);
1048 for (i=0; i<gOpComposite.pOpDst->num; i++)
1050 box = _swBoxAdd (&gOpComposite.opBox,
1051 &gOpComposite.pOpDst->buf[i].pos,
1055 box->pDst = &gOpComposite.pOpDst->buf[i];
1056 box->pSrc = (gOpComposite.pOpSrc)? (&gOpComposite.pOpSrc->buf[0]):NULL;
1057 box->pMask= (gOpComposite.pOpMask)? (&gOpComposite.pOpMask->buf[0]):NULL;
1060 _swBoxMove (&gOpComposite.opBox, -dstX, -dstY);
1062 /* Call solid function */
1063 _swDoDraw (&gOpComposite.opBox,
1064 _swDoComposite, NULL);
1067 _swBoxRemoveAll (&gOpComposite.opBox);
1071 /* done composite : sw done composite, not using pvr2d */
1073 SECExaSwDoneComposite (PixmapPtr pDst)
1075 XDBG_TRACE (MEXAS, "\n");
1076 if (gOpComposite.pDstPixmap != NULL)
1077 _swFinishAccess (gOpComposite.pDstPixmap, EXA_PREPARE_DEST);
1078 if (gOpComposite.pSrcPixmap != NULL)
1079 _swFinishAccess (gOpComposite.pSrcPixmap, EXA_PREPARE_SRC);
1080 if (gOpComposite.pMaskPixmap != NULL)
1081 _swFinishAccess (gOpComposite.pMaskPixmap, EXA_PREPARE_MASK);
1085 SECExaSwUploadToScreen (PixmapPtr pDst, int x, int y, int w, int h,
1086 char *src, int src_pitch)
1088 XDBG_RETURN_VAL_IF_FAIL (src!=NULL, TRUE);
1089 XDBG_TRACE (MEXAS, "src(%p, %d) %d,%d,%d,%d\n", src, src_pitch, x,y,w,h);
1090 XDBG_TRACE (MEXAS, "\tdst depth:%d, bpp:%d, pitch:%d, %dx%d\n",
1091 pDst->drawable.depth, pDst->drawable.bitsPerPixel, pDst->devKind,
1092 pDst->drawable.width, pDst->drawable.height);
1100 gOpUTS.src_pitch = src_pitch;
1101 gOpUTS.pOpDst = _swPrepareAccess (pDst, EXA_PREPARE_DEST);
1103 if (gOpUTS.pOpDst->isSame)
1112 box.pDst = &gOpUTS.pOpDst->buf[0];
1113 _swDoUploadToScreen (&box, NULL);
1122 xorg_list_init (&gOpUTS.opBox);
1129 for (i=0; i<gOpUTS.pOpDst->num; i++)
1131 box = _swBoxAdd (&gOpUTS.opBox,
1132 &gOpUTS.pOpDst->buf[i].pos,
1136 box->pDst = &gOpUTS.pOpDst->buf[i];
1139 _swBoxMove (&gOpUTS.opBox, -x, -y);
1141 /* Call solid function */
1142 _swDoDraw (&gOpUTS.opBox,
1143 _swDoUploadToScreen, NULL);
1146 _swBoxRemoveAll (&gOpUTS.opBox);
1149 _swFinishAccess (pDst, EXA_PREPARE_DEST);
1156 SECExaSwDownloadFromScreen (PixmapPtr pSrc, int x, int y, int w, int h,
1157 char *dst, int dst_pitch)
1159 XDBG_RETURN_VAL_IF_FAIL (dst!=NULL, TRUE);
1160 XDBG_TRACE (MEXAS, "dst(%p, %d) %d,%d,%d,%d\n", dst, dst_pitch, x,y,w,h);
1168 gOpDFS.dst_pitch = dst_pitch;
1169 gOpDFS.pOpSrc = _swPrepareAccess (pSrc, EXA_PREPARE_SRC);
1171 if (gOpDFS.pOpSrc->isSame)
1180 box.pSrc = &gOpDFS.pOpSrc->buf[0];
1181 _swDoDownladFromScreen (&box, NULL);
1190 xorg_list_init (&gOpDFS.opBox);
1197 for (i=0; i<gOpDFS.pOpSrc->num; i++)
1199 box = _swBoxAdd (&gOpDFS.opBox,
1200 &gOpDFS.pOpSrc->buf[i].pos,
1204 box->pSrc = &gOpDFS.pOpSrc->buf[i];
1207 _swBoxMove (&gOpDFS.opBox, -x, -y);
1209 /* Call solid function */
1210 _swDoDraw (&gOpDFS.opBox,
1211 _swDoDownladFromScreen, NULL);
1214 _swBoxRemoveAll (&gOpDFS.opBox);
1217 _swFinishAccess (pSrc, EXA_PREPARE_SRC);
1221 int SECExaMarkSync(ScreenPtr pScreen)
1223 XDBG_RETURN_VAL_IF_FAIL (pScreen != NULL, TRUE);
1226 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1227 SECPtr pSec = SECPTR(pScrn);
1229 if( pSec && pSec->is_fb_touched == TRUE )
1231 XDBG_TRACE(MEXAS, "UpdateRequest to the display!\n");
1233 ret = secDisplayUpdateRequest(pScrn);
1234 pSec->is_fb_touched = FALSE;
1240 Bool secExaSwInit (ScreenPtr pScreen, ExaDriverPtr pExaDriver)
1242 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1244 pExaDriver->PrepareSolid = SECExaSwPrepareSolid;
1245 pExaDriver->Solid = SECExaSwSolid;
1246 pExaDriver->DoneSolid = SECExaSwDoneSolid;
1248 pExaDriver->PrepareCopy = SECExaSwPrepareCopy;
1249 pExaDriver->Copy = SECExaSwCopy;
1250 pExaDriver->DoneCopy = SECExaSwDoneCopy;
1252 pExaDriver->CheckComposite = SECExaSwCheckComposite;
1253 pExaDriver->PrepareComposite = SECExaSwPrepareComposite;
1254 pExaDriver->Composite = SECExaSwComposite;
1255 pExaDriver->DoneComposite = SECExaSwDoneComposite;
1257 pExaDriver->UploadToScreen = SECExaSwUploadToScreen;
1258 pExaDriver->DownloadFromScreen = SECExaSwDownloadFromScreen;
1260 pExaDriver->MarkSync = SECExaMarkSync;
1262 xf86DrvMsg (pScrn->scrnIndex, X_INFO
1263 , "Succeed to Initialize SW EXA\n");
1268 void secExaSwDeinit (ScreenPtr pScreen)
1270 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1272 xf86DrvMsg (pScrn->scrnIndex, X_INFO
1273 , "Succeed to finish SW EXA\n");