ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
int pipe = secModeGetCrtcPipe(pCrtc);
PresentVblankEventPtr pEvent = NULL;
+ SECPtr pSec = SECPTR (pScrn);
Bool ret;
ret = secModePageFlip (pScrn, NULL, pEvent, pipe, pExaPixPriv->bo,
NULL, client_idx, drawable_id,
secPresentFlipEventHandler);
- if (!ret) {
- secPresentFlipAbort(pEvent);
- XDBG_WARNING(MDRI3, "fail to flip\n");
- }
- else
- {
- XDBG_DEBUG(MDRI3, "flip OK\n");
- }
+ if (!ret)
+ {
+ secPresentFlipAbort(pEvent);
+ XDBG_WARNING(MDRI3, "fail to flip\n");
+ }
+ else
+ {
+ /*FIXME -
+ * Should we swap front bo and presented bo?
+ * Should we set up presented pixmap as root?
+ * */
+ PixmapPtr pRootPix = pScreen->GetWindowPixmap (pScreen->root);;
+ SECPixmapPriv *pRootPixPriv = exaGetPixmapDriverPrivate (pRootPix);
+ tbm_bo front_bo = pRootPixPriv->bo ? pRootPixPriv->bo : pSec->pFb->default_bo;
+
+ XDBG_DEBUG(MDRI3, "doPageFlip id:0x%x Client:%d pipe:%d\n"
+ "Present: pix(ptr:%p id:x%x), bo(ptr:%p name:%d) -->\n"
+ "Root: pix(ptr:%p id:x%x), bo(ptr:%p name:%d)\n",
+ (unsigned int )pExaPixPriv->owner, client_idx, pipe,
+ pPixmap, pPixmap->drawable.id, pExaPixPriv->bo, tbm_bo_export(pExaPixPriv->bo),
+ pPixmap, pRootPix->drawable.id, front_bo, tbm_bo_export(front_bo) );
+
+ secFbSwapBo(pSec->pFb, pExaPixPriv->bo);
+ }
return ret;
}
else
flag = TBM_BO_DEFAULT;
- bo = tbm_bo_alloc (pSec->tbm_bufmgr, pitch*height, flag);
- XDBG_GOTO_IF_FAIL (bo != NULL, fail);
-
if (prev_bo != NULL)
{
- tbm_bo_swap(bo, prev_bo);
-
- //delete prev bo(naw _bo contains an old GEM object)
- tbm_bo_unref(bo);
- //delete TBM_BO_DATA_FB if present, because the new will be created in here
- tbm_bo_delete_user_data(prev_bo, TBM_BO_DATA_FB);
-
+ XDBG_RETURN_VAL_IF_FAIL (tbm_bo_size(prev_bo) >= (pitch*height), NULL);
+
+ tbm_bo_delete_user_data(prev_bo, TBM_BO_DATA_FB);
+
+ /* TODO: check flags*/
+
bo = prev_bo;
}
+ else
+ {
+ bo = tbm_bo_alloc (pSec->tbm_bufmgr, pitch*height, flag);
+ XDBG_GOTO_IF_FAIL (bo != NULL, fail);
+ }
/* memset 0x0 */
bo_handle1 = tbm_bo_map (bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE);