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"
60 int state; /*state of region*/
62 struct xorg_list link;
81 struct xorg_list opBox;
103 struct xorg_list opBox;
111 PicturePtr pSrcPicture;
112 PicturePtr pMaskPicture;
113 PicturePtr pDstPicture;
114 PixmapPtr pSrcPixmap;
115 PixmapPtr pMaskPixmap;
116 PixmapPtr pDstPixmap;
127 struct xorg_list opBox;
140 struct xorg_list opBox;
153 struct xorg_list opBox;
156 typedef void (* DoDrawProcPtr) (PixmapPtr pPix, Bool isPart,
158 int clip_x, int clip_y,
159 int w, int h, void* data);
161 typedef void (* DoDrawProcPtrEx) (ExaBox* box, void* data);
163 static ExaOpInfo OpInfo[EXA_NUM_PREPARE_INDICES];
164 static OpSolid gOpSolid;
165 static OpCopy gOpCopy;
166 static OpComposite gOpComposite;
170 ExaBox* _swBoxAdd (struct xorg_list *l, BoxPtr b1, BoxPtr b2)
174 rgn = calloc (1, sizeof (ExaBox));
175 rgn->state = secUtilBoxIntersect (&rgn->box, b1, b2);
176 if (rgnOUT == rgn->state)
182 xorg_list_add (&rgn->link, l);
186 void _swBoxMerge (struct xorg_list *l, struct xorg_list* b, struct xorg_list* t)
188 ExaBox *b1 = NULL, *b2 = NULL;
191 xorg_list_for_each_entry (b1, b, link)
193 xorg_list_for_each_entry (b2, t, link)
195 r = _swBoxAdd (l, &b1->box, &b2->box);
198 r->pSrc = b1->pSrc ? b1->pSrc : b2->pSrc;
199 r->pMask= b1->pMask ? b1->pMask : b2->pMask;
200 r->pDst = b1->pDst ? b1->pDst : b2->pDst;
206 void _swBoxMove (struct xorg_list* l, int tx, int ty)
210 xorg_list_for_each_entry (b, l, link)
212 secUtilBoxMove (&b->box, tx, ty);
216 void _swBoxRemoveAll (struct xorg_list* l)
218 ExaBox *ref = NULL, *next = NULL;
220 xorg_list_for_each_entry_safe (ref, next, l, link)
222 xorg_list_del (&ref->link);
227 int _swBoxIsOne (struct xorg_list* l)
231 if (l->next == l->prev)
240 void _swBoxPrint (ExaBox* sb1, const char* name)
244 xorg_list_for_each_entry (b, &sb1->link, link)
246 XDBG_DEBUG (MEXA, "[%s] %d,%d - %d,%d\n", name,
247 b->box.x1, b->box.y1, b->box.x2, b->box.y2);
251 static ExaOpInfo* _swPrepareAccess (PixmapPtr pPix, int index)
253 ScreenPtr pScreen = pPix->drawable.pScreen;
254 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
255 SECPtr pSec = SECPTR (pScrn);
256 SECPixmapPriv *privPixmap = (SECPixmapPriv*)exaGetPixmapDriverPrivate (pPix);
257 ExaOpInfo* op = &OpInfo[index];
258 int opt = TBM_OPTION_READ;
261 tbm_bo_handle bo_handle;
262 SECFbBoDataPtr bo_data;
266 XDBG_RETURN_VAL_IF_FAIL ((privPixmap != NULL), NULL);
268 if (index == EXA_PREPARE_DEST || index == EXA_PREPARE_AUX_DEST)
269 opt |= TBM_OPTION_WRITE;
272 if (privPixmap->exaOpInfo)
274 op = (ExaOpInfo*)privPixmap->exaOpInfo;
276 XDBG_TRACE (MEXAS, "pix:%p index:%d hint:%d ptr:%p ref:%d\n",
277 pPix, index, pPix->usage_hint, pPix->devPrivate.ptr, op->refcnt);
282 memset (op, 0x00, sizeof (ExaOpInfo));
287 if (pPix->usage_hint == CREATE_PIXMAP_USAGE_FB)
289 ret = secFbFindBo (pSec->pFb,
290 pPix->drawable.x, pPix->drawable.y,
291 pPix->drawable.width, pPix->drawable.height,
293 XDBG_TRACE (MEXAS,"FB ret:%d num_pix:%d, %dx%d+%d+%d\n",
295 pPix->drawable.width, pPix->drawable.height,
296 pPix->drawable.x, pPix->drawable.y);
298 if (ret == rgnSAME && num_bo == 1)
303 op->buf[0].pixmap = pPix;
304 op->buf[0].bo = bos[0];
305 bo_handle = tbm_bo_map (op->buf[0].bo, TBM_DEVICE_CPU, op->opt);
306 op->buf[0].addr = bo_handle.ptr;
307 op->buf[0].pixmap->devPrivate.ptr = op->buf[0].addr;
308 op->buf[0].pos.x1 = 0;
309 op->buf[0].pos.y1 = 0;
310 op->buf[0].pos.x2 = pPix->drawable.width;
311 op->buf[0].pos.y2 = pPix->drawable.height;
320 bos = (tbm_bo *)calloc(1, sizeof(tbm_bo));
321 bos[0] = pSec->pFb->default_bo;
323 #endif //NO_CRTC_MODE
328 for (i = 0; i < num_bo; i++)
330 tbm_bo_get_user_data (bos[i], TBM_BO_DATA_FB, (void**)&bo_data);
331 op->buf[i].pixmap = secRenderBoGetPixmap (pSec->pFb, bos[i]);
332 op->buf[i].bo = bos[i];
333 bo_handle = tbm_bo_map (bos[i], TBM_DEVICE_CPU, op->opt);
334 op->buf[i].addr = bo_handle.ptr;
335 op->buf[i].pixmap->devPrivate.ptr = op->buf[i].addr;
336 op->buf[i].pos = bo_data->pos;
351 op->buf[0].pixmap = pPix;
354 op->buf[0].bo = privPixmap->bo;
355 bo_handle = tbm_bo_map (op->buf[0].bo, TBM_DEVICE_CPU, op->opt);
356 op->buf[0].addr = bo_handle.ptr;
360 op->buf[0].bo = privPixmap->bo;
361 op->buf[0].addr = privPixmap->pPixData;
363 op->buf[0].pixmap->devPrivate.ptr = op->buf[0].addr;
364 op->buf[0].pos.x1 = 0;
365 op->buf[0].pos.y1 = 0;
366 op->buf[0].pos.x2 = pPix->drawable.width;
367 op->buf[0].pos.y2 = pPix->drawable.height;
370 privPixmap->exaOpInfo = op;
372 XDBG_TRACE (MEXAS, "pix:%p index:%d hint:%d ptr:%p ref:%d\n",
373 pPix, index, pPix->usage_hint, pPix->devPrivate.ptr, op->refcnt);
377 static void _swFinishAccess (PixmapPtr pPix, int index)
379 XDBG_RETURN_IF_FAIL (pPix!=NULL);
381 SECPixmapPriv *privPixmap = (SECPixmapPriv*)exaGetPixmapDriverPrivate (pPix);
385 XDBG_RETURN_IF_FAIL (privPixmap!=NULL);
386 XDBG_RETURN_IF_FAIL (privPixmap->exaOpInfo!=NULL);
388 op = (ExaOpInfo*)privPixmap->exaOpInfo;
393 for (i=0; i < op->num; i++)
397 tbm_bo_unmap (op->buf[i].bo);
399 if( index == EXA_PREPARE_DEST && pPix->usage_hint == CREATE_PIXMAP_USAGE_FB )
401 // In this case, DEST is framebuffer. It is updated by CPU.
402 // After that LCD will use this buffer.
403 // So we should call cache op!!
404 tbm_bo_map(op->buf[i].bo, TBM_DEVICE_3D, TBM_OPTION_READ);
405 tbm_bo_unmap(op->buf[i].bo);
408 pScreen = pPix->drawable.pScreen;
410 if( pScreen != NULL )
412 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
413 SECPtr pSec = SECPTR(pScrn);
415 pSec->is_fb_touched = TRUE;
418 op->buf[i].bo = NULL;
421 if (op->buf[i].pixmap)
423 op->buf[i].pixmap->devPrivate.ptr = NULL;
424 op->buf[i].pixmap = NULL;
426 op->buf[i].addr = NULL;
429 privPixmap->exaOpInfo = NULL;
432 if (pPix->usage_hint == CREATE_PIXMAP_USAGE_OVERLAY)
433 secLayerUpdate (secLayerFind (LAYER_OUTPUT_LCD, LAYER_UPPER));
435 XDBG_TRACE (MEXAS, "pix:%p index:%d hint:%d ptr:%p ref:%d\n",
436 pPix, index, pPix->usage_hint, pPix->devPrivate.ptr, op->refcnt);
440 _swDoDraw (struct xorg_list *l, DoDrawProcPtrEx do_draw, void* data)
443 xorg_list_for_each_entry (box, l, link)
450 _swDoSolid (ExaBox* box, void* data)
452 XDBG_TRACE (MEXAS, "(%d,%d), (%d,%d) off(%d,%d)\n",
460 fbFill (&box->pDst->pixmap->drawable,
462 box->box.x1 + gOpSolid.x - box->pDst->pos.x1,
463 box->box.y1 + gOpSolid.y - box->pDst->pos.y1,
464 box->box.x2- box->box.x1,
465 box->box.y2- box->box.y1);
469 _swDoCopy (ExaBox* box, void* data)
471 CARD8 alu = gOpCopy.alu;
472 FbBits pm = gOpCopy.pm;
479 _X_UNUSED int srcXoff, srcYoff;
480 _X_UNUSED int dstXoff, dstYoff;
481 int srcX, srcY, dstX, dstY, width, height;
483 XDBG_TRACE (MEXAS, "box(%d,%d),(%d,%d) src(%d,%d) dst(%d,%d)\n",
493 srcX = gOpCopy.srcX + box->box.x1 - box->pSrc->pos.x1;
494 srcY = gOpCopy.srcY + box->box.y1 - box->pSrc->pos.y1;
495 dstX = gOpCopy.dstX + box->box.x1 - box->pDst->pos.x1;
496 dstY = gOpCopy.dstY + box->box.y1 - box->pDst->pos.y1;
497 width = box->box.x2 - box->box.x1;
498 height = box->box.y2 - box->box.y1;
500 fbGetDrawable (&box->pSrc->pixmap->drawable, src, srcStride, srcBpp, srcXoff, srcYoff);
501 fbGetDrawable (&box->pDst->pixmap->drawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
502 /* temp fix : do right things later */
508 if (pm != FB_ALLONES ||
511 gOpCopy.upsidedown ||
512 !pixman_blt ((uint32_t *)src, (uint32_t *)dst,
516 srcX, srcY, dstX, dstY, width, height))
518 fbBlt (src + srcY * srcStride,
522 dst + dstY * dstStride,
539 _swDoComposite (ExaBox* box, void* data)
541 PicturePtr pDstPicture;
542 pixman_image_t *src, *mask, *dest;
543 int src_xoff, src_yoff, msk_xoff, msk_yoff;
548 if (box->state == rgnPART)
550 XDBG_RETURN_IF_FAIL (gOpComposite.pSrcPicture->transform == NULL);
551 XDBG_RETURN_IF_FAIL (gOpComposite.pMaskPicture &&
552 gOpComposite.pMaskPicture->transform == NULL);
555 pDstPicture = gOpComposite.pDstPicture;
557 src = image_from_pict (gOpComposite.pSrcPicture, FALSE, &src_xoff, &src_yoff);
558 mask = image_from_pict (gOpComposite.pMaskPicture, FALSE, &msk_xoff, &msk_yoff);
560 fbGetPixmapBitsData (box->pDst->pixmap, bits, stride, bpp);
561 dest = pixman_image_create_bits (pDstPicture->format,
562 box->pDst->pixmap->drawable.width,
563 box->pDst->pixmap->drawable.height,
564 (uint32_t *)bits, stride * sizeof (FbStride));
566 pixman_image_composite (gOpComposite.op,
568 gOpComposite.srcX + box->box.x1,
569 gOpComposite.srcY + box->box.y1,
570 gOpComposite.maskX + box->box.x1,
571 gOpComposite.maskY + box->box.y1,
572 gOpComposite.dstX + box->box.x1 - box->pDst->pos.x1,
573 gOpComposite.dstY + box->box.y1 - box->pDst->pos.y1,
574 box->box.x2 - box->box.x1,
575 box->box.y2 - box->box.y1);
577 free_pixman_pict (gOpComposite.pSrcPicture, src);
578 free_pixman_pict (gOpComposite.pMaskPicture, mask);
579 pixman_image_unref (dest);
583 _swDoUploadToScreen (ExaBox* box, void* data)
588 _X_UNUSED int dstXoff, dstYoff;
593 fbGetDrawable (&box->pDst->pixmap->drawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
595 srcStride = gOpUTS.src_pitch/sizeof (uint32_t);
596 dstX = gOpUTS.x + box->box.x1 - box->pDst->pos.x1;
597 dstY = gOpUTS.y + box->box.y1 - box->pDst->pos.y1;
598 width = box->box.x2 - box->box.x1;
599 height = box->box.y2 - box->box.y1;
601 XDBG_TRACE (MEXAS, "src(%p, %d) %d,%d,%d,%d\n",
602 gOpUTS.src, srcStride, dstX, dstY, width, height);
606 XDBG_WARNING(MEXAS, "dstBpp:%d\n", dstBpp);
610 if (!pixman_blt ((uint32_t *)gOpUTS.src,
615 box->box.x1, box->box.y1,
619 unsigned char *pDst, *pSrc;
620 int dst_pitch, src_pitch, cpp;
622 pDst = (unsigned char*)dst;
623 pSrc = (unsigned char*)gOpUTS.src;
625 src_pitch = gOpUTS.src_pitch;
626 dst_pitch = box->pDst->pixmap->devKind;
628 pSrc += box->box.y1 * src_pitch + box->box.x1 * cpp;
629 pDst += dstY * dst_pitch + dstX * cpp;
631 for (; height > 0; height--) {
632 memcpy(pDst, pSrc, width * cpp);
640 _swDoDownladFromScreen (ExaBox* box, void* data)
645 _X_UNUSED int srcXoff, srcYoff;
650 fbGetDrawable (&box->pSrc->pixmap->drawable, src, srcStride, srcBpp, srcXoff, srcYoff);
652 dstStride = gOpDFS.dst_pitch/sizeof (uint32_t);
653 srcX = gOpDFS.x + box->box.x1 - box->pSrc->pos.x1;
654 srcY = gOpDFS.y + box->box.y1 - box->pSrc->pos.y1;
655 width = box->box.x2 - box->box.x1;
656 height = box->box.y2 - box->box.y1;
658 XDBG_TRACE (MEXAS, "dst(%p, %d) %d,%d,%d,%d\n",
659 gOpDFS.dst, dstStride, srcX, srcY, width, height);
663 XDBG_WARNING(MEXAS, "srcBpp:%d\n", srcBpp);
667 if (!pixman_blt ((uint32_t *)src,
668 (uint32_t *)gOpDFS.dst,
673 box->box.x1, box->box.y1,
676 unsigned char *pDst, *pSrc;
677 int dst_pitch, src_pitch, cpp;
679 pDst = (unsigned char*)gOpDFS.dst;
680 pSrc = (unsigned char*)src;
682 src_pitch = box->pSrc->pixmap->devKind;
683 dst_pitch = gOpDFS.dst_pitch;
685 pSrc += srcY * src_pitch + srcX * cpp;
686 pDst += box->box.y1 * dst_pitch + box->box.x1 * cpp;
688 for (; height > 0; height--) {
689 memcpy(pDst, pSrc, width * cpp);
697 SECExaSwPrepareSolid (PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
699 ScreenPtr pScreen = pPixmap->drawable.pScreen;
700 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
701 ChangeGCVal tmpval[3];
703 XDBG_TRACE (MEXAS, "\n");
704 memset (&gOpSolid, 0x00, sizeof (gOpSolid));
706 /* Put ff at the alpha bits when transparency is set to xv */
707 if (pPixmap->drawable.depth == 24)
708 fg = fg | (~ (pScrn->mask.red|pScrn->mask.green|pScrn->mask.blue));
711 gOpSolid.planemask = planemask;
712 gOpSolid.pixmap = pPixmap;
714 gOpSolid.pOpDst = _swPrepareAccess (pPixmap, EXA_PREPARE_DEST);
715 XDBG_GOTO_IF_FAIL (gOpSolid.pOpDst, bail);
716 gOpSolid.pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
719 tmpval[1].val = planemask;
721 ChangeGC (NullClient, gOpSolid.pGC, GCFunction|GCPlaneMask|GCForeground, tmpval);
722 ValidateGC (&pPixmap->drawable, gOpSolid.pGC);
729 XDBG_TRACE (MEXAS, "FAIL: pix:%p hint:%d, num_pix:%d\n",
730 pPixmap, pPixmap->usage_hint, gOpSolid.pOpDst->num);
731 gOpSolid.bDo = FALSE;
739 SECExaSwSolid (PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
741 XDBG_TRACE (MEXAS, " (%d,%d), (%d,%d)\n", x1,y1,x2,y2);
742 if (gOpSolid.bDo == FALSE) return;
749 if (gOpSolid.pOpDst->isSame)
758 box.pDst = &gOpSolid.pOpDst->buf[0];
759 _swDoSolid (&box, NULL);
768 xorg_list_init (&gOpSolid.opBox);
775 for (i=0; i<gOpSolid.pOpDst->num; i++)
777 box = _swBoxAdd (&gOpSolid.opBox,
778 &gOpSolid.pOpDst->buf[i].pos,
782 box->pDst = &gOpSolid.pOpDst->buf[i];
785 _swBoxMove (&gOpSolid.opBox, -x1, -y1);
787 /* Call solid function */
788 _swDoDraw (&gOpSolid.opBox,
792 _swBoxRemoveAll (&gOpSolid.opBox);
797 SECExaSwDoneSolid (PixmapPtr pPixmap)
799 XDBG_TRACE (MEXAS, "\n");
802 FreeScratchGC (gOpSolid.pGC);
807 _swFinishAccess (gOpSolid.pixmap, EXA_PREPARE_DEST);
811 SECExaSwPrepareCopy (PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap,
812 int dx, int dy, int alu, Pixel planemask)
814 int num_dst_pix = -1;
815 int num_src_pix = -1;
817 XDBG_TRACE (MEXAS, "\n");
818 memset (&gOpCopy, 0x00, sizeof (gOpCopy));
821 gOpCopy.pm = planemask;
822 gOpCopy.reverse = (dx == 1)?0:1;
823 gOpCopy.upsidedown = (dy == 1)?0:1;
824 gOpCopy.pDstPix = pDstPixmap;
825 gOpCopy.pSrcPix = pSrcPixmap;
827 gOpCopy.pOpDst = _swPrepareAccess (pDstPixmap, EXA_PREPARE_DEST);
828 XDBG_GOTO_IF_FAIL (gOpCopy.pOpDst, bail);
829 gOpCopy.pOpSrc = _swPrepareAccess (pSrcPixmap, EXA_PREPARE_SRC);
830 XDBG_GOTO_IF_FAIL (gOpCopy.pOpDst, bail);
837 XDBG_TRACE (MEXAS, "FAIL\n");
838 XDBG_TRACE (MEXAS, " SRC pix:%p, hint:%d, num_pix:%d\n",
839 pSrcPixmap, pSrcPixmap->usage_hint, num_src_pix);
840 XDBG_TRACE (MEXAS, " DST pix:%p, hint:%d, num_pix:%d\n",
841 pDstPixmap, pDstPixmap->usage_hint, num_dst_pix);
849 SECExaSwCopy (PixmapPtr pDstPixmap, int srcX, int srcY,
850 int dstX, int dstY, int width, int height)
852 XDBG_TRACE (MEXAS, "src(%d,%d) dst(%d,%d) %dx%d\n",
853 srcX, srcY, dstX, dstY, width, height);
855 if (gOpSolid.bDo == FALSE) return;
861 gOpCopy.width = width;
862 gOpCopy.height = height;
864 if (gOpCopy.pOpSrc->isSame && gOpCopy.pOpDst->isSame)
873 box.pDst = &gOpCopy.pOpDst->buf[0];
874 box.pSrc = &gOpCopy.pOpSrc->buf[0];
875 _swDoCopy (&box, NULL);
880 struct xorg_list lSrc, lDst;
888 b.y2 = dstY + height;
889 xorg_list_init (&lDst);
890 for (i=0; i<gOpCopy.pOpDst->num; i++)
892 box = _swBoxAdd (&lDst,
893 &gOpCopy.pOpDst->buf[i].pos,
897 box->pDst = &gOpCopy.pOpDst->buf[i];
900 _swBoxMove (&lDst, -dstX, -dstY);
906 b.y2 = srcY + height;
908 xorg_list_init (&lSrc);
909 for (i=0; i<gOpCopy.pOpSrc->num; i++)
911 box = _swBoxAdd (&lSrc,
912 &gOpCopy.pOpSrc->buf[i].pos,
916 box->pSrc = &gOpCopy.pOpSrc->buf[i];
919 _swBoxMove (&lSrc, -srcX, -srcY);
921 //Merge and call copy
922 xorg_list_init (&gOpCopy.opBox);
923 _swBoxMerge (&gOpCopy.opBox, &lSrc, &lDst);
924 _swDoDraw (&gOpCopy.opBox,
928 _swBoxRemoveAll (&lSrc);
929 _swBoxRemoveAll (&lDst);
930 _swBoxRemoveAll (&gOpCopy.opBox);
935 SECExaSwDoneCopy (PixmapPtr pDstPixmap)
937 XDBG_TRACE (MEXAS, "\n");
940 _swFinishAccess (gOpCopy.pDstPix, EXA_PREPARE_DEST);
942 _swFinishAccess (gOpCopy.pSrcPix, EXA_PREPARE_SRC);
946 SECExaSwCheckComposite (int op, PicturePtr pSrcPicture,
947 PicturePtr pMaskPicture, PicturePtr pDstPicture)
953 SECExaSwPrepareComposite (int op, PicturePtr pSrcPicture,
954 PicturePtr pMaskPicture, PicturePtr pDstPicture,
955 PixmapPtr pSrcPixmap,
956 PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap)
958 XDBG_TRACE (MEXAS, "\n");
959 memset (&gOpComposite, 0x00, sizeof (gOpComposite));
960 XDBG_GOTO_IF_FAIL (pDstPixmap != NULL, bail);
962 gOpComposite.op = op;
963 gOpComposite.pDstPicture = pDstPicture;
964 gOpComposite.pSrcPicture = pSrcPicture;
965 gOpComposite.pMaskPicture = pMaskPicture;
966 gOpComposite.pSrcPixmap = pSrcPixmap;
967 gOpComposite.pMaskPixmap = pMaskPixmap;
968 gOpComposite.pDstPixmap = pDstPixmap;
970 gOpComposite.pOpDst = _swPrepareAccess (pDstPixmap, EXA_PREPARE_DEST);
974 gOpComposite.pOpSrc = _swPrepareAccess (pSrcPixmap, EXA_PREPARE_SRC);
975 XDBG_GOTO_IF_FAIL (gOpComposite.pOpSrc->num == 1, bail);
980 gOpComposite.pOpMask = _swPrepareAccess (pMaskPixmap, EXA_PREPARE_MASK);
981 XDBG_GOTO_IF_FAIL (gOpComposite.pOpMask->num == 1, bail);
984 gOpComposite.bDo = TRUE;
989 XDBG_TRACE (MEXAS, "FAIL: op%d\n", op);
990 XDBG_TRACE (MEXAS, " SRC picture:%p pix:%p\n", pSrcPicture, pSrcPixmap);
991 XDBG_TRACE (MEXAS, " MASK picture:%p pix:%p\n", pMaskPicture, pMaskPixmap);
992 XDBG_TRACE (MEXAS, " DST picture:%p pix:%p\n", pDstPicture, pDstPixmap);
994 gOpComposite.bDo = FALSE;
1000 SECExaSwComposite (PixmapPtr pDstPixmap, int srcX, int srcY,
1001 int maskX, int maskY, int dstX, int dstY,
1002 int width, int height)
1004 XDBG_TRACE (MEXAS, "s(%d,%d), m(%d,%d) d(%d,%d) %dx%d\n",
1009 if (!gOpComposite.bDo) return;
1011 gOpComposite.srcX = srcX;
1012 gOpComposite.srcY = srcY;
1013 gOpComposite.maskX = maskX;
1014 gOpComposite.maskY = maskY;
1015 gOpComposite.dstX = dstX;
1016 gOpComposite.dstY = dstY;
1017 gOpComposite.width = width;
1018 gOpComposite.height = height;
1020 if (gOpComposite.pOpDst->isSame)
1028 box.box.y2 = height;
1029 box.pDst = &gOpComposite.pOpDst->buf[0];
1030 box.pSrc = (gOpComposite.pOpSrc)? (&gOpComposite.pOpSrc->buf[0]):NULL;
1031 box.pSrc = (gOpComposite.pOpMask)? (&gOpComposite.pOpMask->buf[0]):NULL;
1033 _swDoComposite (&box, NULL);
1042 xorg_list_init (&gOpComposite.opBox);
1049 for (i=0; i<gOpComposite.pOpDst->num; i++)
1051 box = _swBoxAdd (&gOpComposite.opBox,
1052 &gOpComposite.pOpDst->buf[i].pos,
1056 box->pDst = &gOpComposite.pOpDst->buf[i];
1057 box->pSrc = (gOpComposite.pOpSrc)? (&gOpComposite.pOpSrc->buf[0]):NULL;
1058 box->pMask= (gOpComposite.pOpMask)? (&gOpComposite.pOpMask->buf[0]):NULL;
1061 _swBoxMove (&gOpComposite.opBox, -dstX, -dstY);
1063 /* Call solid function */
1064 _swDoDraw (&gOpComposite.opBox,
1065 _swDoComposite, NULL);
1068 _swBoxRemoveAll (&gOpComposite.opBox);
1072 /* done composite : sw done composite, not using pvr2d */
1074 SECExaSwDoneComposite (PixmapPtr pDst)
1076 XDBG_TRACE (MEXAS, "\n");
1077 if (gOpComposite.pDstPixmap != NULL)
1078 _swFinishAccess (gOpComposite.pDstPixmap, EXA_PREPARE_DEST);
1079 if (gOpComposite.pSrcPixmap != NULL)
1080 _swFinishAccess (gOpComposite.pSrcPixmap, EXA_PREPARE_SRC);
1081 if (gOpComposite.pMaskPixmap != NULL)
1082 _swFinishAccess (gOpComposite.pMaskPixmap, EXA_PREPARE_MASK);
1086 SECExaSwUploadToScreen (PixmapPtr pDst, int x, int y, int w, int h,
1087 char *src, int src_pitch)
1089 XDBG_RETURN_VAL_IF_FAIL (src!=NULL, TRUE);
1090 XDBG_TRACE (MEXAS, "src(%p, %d) %d,%d,%d,%d\n", src, src_pitch, x,y,w,h);
1091 XDBG_TRACE (MEXAS, "\tdst depth:%d, bpp:%d, pitch:%d, %dx%d\n",
1092 pDst->drawable.depth, pDst->drawable.bitsPerPixel, pDst->devKind,
1093 pDst->drawable.width, pDst->drawable.height);
1101 gOpUTS.src_pitch = src_pitch;
1102 gOpUTS.pOpDst = _swPrepareAccess (pDst, EXA_PREPARE_DEST);
1104 if (gOpUTS.pOpDst->isSame)
1113 box.pDst = &gOpUTS.pOpDst->buf[0];
1114 _swDoUploadToScreen (&box, NULL);
1123 xorg_list_init (&gOpUTS.opBox);
1130 for (i=0; i<gOpUTS.pOpDst->num; i++)
1132 box = _swBoxAdd (&gOpUTS.opBox,
1133 &gOpUTS.pOpDst->buf[i].pos,
1137 box->pDst = &gOpUTS.pOpDst->buf[i];
1140 _swBoxMove (&gOpUTS.opBox, -x, -y);
1142 /* Call solid function */
1143 _swDoDraw (&gOpUTS.opBox,
1144 _swDoUploadToScreen, NULL);
1147 _swBoxRemoveAll (&gOpUTS.opBox);
1150 _swFinishAccess (pDst, EXA_PREPARE_DEST);
1157 SECExaSwDownloadFromScreen (PixmapPtr pSrc, int x, int y, int w, int h,
1158 char *dst, int dst_pitch)
1160 XDBG_RETURN_VAL_IF_FAIL (dst!=NULL, TRUE);
1161 XDBG_TRACE (MEXAS, "dst(%p, %d) %d,%d,%d,%d\n", dst, dst_pitch, x,y,w,h);
1169 gOpDFS.dst_pitch = dst_pitch;
1170 gOpDFS.pOpSrc = _swPrepareAccess (pSrc, EXA_PREPARE_SRC);
1172 if (gOpDFS.pOpSrc->isSame)
1181 box.pSrc = &gOpDFS.pOpSrc->buf[0];
1182 _swDoDownladFromScreen (&box, NULL);
1191 xorg_list_init (&gOpDFS.opBox);
1198 for (i=0; i<gOpDFS.pOpSrc->num; i++)
1200 box = _swBoxAdd (&gOpDFS.opBox,
1201 &gOpDFS.pOpSrc->buf[i].pos,
1205 box->pSrc = &gOpDFS.pOpSrc->buf[i];
1208 _swBoxMove (&gOpDFS.opBox, -x, -y);
1210 /* Call solid function */
1211 _swDoDraw (&gOpDFS.opBox,
1212 _swDoDownladFromScreen, NULL);
1215 _swBoxRemoveAll (&gOpDFS.opBox);
1218 _swFinishAccess (pSrc, EXA_PREPARE_SRC);
1222 int SECExaMarkSync(ScreenPtr pScreen)
1224 XDBG_RETURN_VAL_IF_FAIL (pScreen != NULL, TRUE);
1227 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1228 SECPtr pSec = SECPTR(pScrn);
1230 if( pSec && pSec->is_fb_touched == TRUE )
1232 XDBG_TRACE(MEXAS, "UpdateRequest to the display!\n");
1234 ret = secDisplayUpdateRequest(pScrn);
1235 pSec->is_fb_touched = FALSE;
1241 Bool secExaSwInit (ScreenPtr pScreen, ExaDriverPtr pExaDriver)
1243 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1245 pExaDriver->PrepareSolid = SECExaSwPrepareSolid;
1246 pExaDriver->Solid = SECExaSwSolid;
1247 pExaDriver->DoneSolid = SECExaSwDoneSolid;
1249 pExaDriver->PrepareCopy = SECExaSwPrepareCopy;
1250 pExaDriver->Copy = SECExaSwCopy;
1251 pExaDriver->DoneCopy = SECExaSwDoneCopy;
1253 pExaDriver->CheckComposite = SECExaSwCheckComposite;
1254 pExaDriver->PrepareComposite = SECExaSwPrepareComposite;
1255 pExaDriver->Composite = SECExaSwComposite;
1256 pExaDriver->DoneComposite = SECExaSwDoneComposite;
1258 pExaDriver->UploadToScreen = SECExaSwUploadToScreen;
1259 pExaDriver->DownloadFromScreen = SECExaSwDownloadFromScreen;
1261 pExaDriver->MarkSync = SECExaMarkSync;
1263 xf86DrvMsg (pScrn->scrnIndex, X_INFO
1264 , "Succeed to Initialize SW EXA\n");
1269 void secExaSwDeinit (ScreenPtr pScreen)
1271 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1273 xf86DrvMsg (pScrn->scrnIndex, X_INFO
1274 , "Succeed to finish SW EXA\n");