96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Visible Regions processing API implementation
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync * Copyright (C) 2012-2014 Oracle Corporation
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * available from http://www.virtualbox.org. This file is free software;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * you can redistribute it and/or modify it under the terms of the GNU
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * General Public License (GPL) as published by the Free Software
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync/*******************************************************************************
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync* Header Files *
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync*******************************************************************************/
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync# include "../include/cr_vreg.h"
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync# define vboxVrRegLaFree(_c, _e) RTMemCacheFree((_c), (_e))
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncDECLINLINE(int) vboxVrLaCreate(PRTMEMCACHE phCache, size_t cbElement)
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync 0 /* cbAlignment */,
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync 0 /* fFlags*/);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync# define vboxVrLaDestroy(_c) RTMemCacheDestroy((_c))
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync# endif /* !VBOXVDBG_VR_LAL_DISABLE */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync#else /* IN_RING0 */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# if (_MSC_VER >= 1400) && !defined(VBOX_WITH_PATCHED_DDK)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define _InterlockedExchange _InterlockedExchange_StupidDDKVsCompilerCrap
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define _InterlockedExchangeAdd _InterlockedExchangeAdd_StupidDDKVsCompilerCrap
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define _InterlockedCompareExchange _InterlockedCompareExchange_StupidDDKVsCompilerCrap
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define _InterlockedAddLargeStatistic _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define _interlockedbittestandset _interlockedbittestandset_StupidDDKVsCompilerCrap
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define _interlockedbittestandreset _interlockedbittestandreset_StupidDDKVsCompilerCrap
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define _interlockedbittestandset64 _interlockedbittestandset64_StupidDDKVsCompilerCrap
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define _interlockedbittestandreset64 _interlockedbittestandreset64_StupidDDKVsCompilerCrap
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync# define vboxVrRegLaAlloc(_c) ExAllocateFromLookasideListEx(&(_c))
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync# define vboxVrRegLaFree(_c, _e) ExFreeToLookasideListEx(&(_c), (_e))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncDECLINLINE(int) vboxVrLaCreate(LOOKASIDE_LIST_EX *pCache, size_t cbElement)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync NTSTATUS Status = ExInitializeLookasideListEx(pCache,
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync 0, /* ULONG Flags */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync 0 /* USHORT Depth - reserved, must be null */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("ExInitializeLookasideListEx failed, Status (0x%x)", Status));
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync# define vboxVrLaDestroy(_c) ExDeleteLookasideListEx(&(_c))
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync# else /* !RT_OS_WINDOWS */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync# endif /* !RT_OS_WINDOWS */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync#endif /* IN_RING0 */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync/*******************************************************************************
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync* Defined Constants And Macros *
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync*******************************************************************************/
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync/*******************************************************************************
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync* Global Variables *
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync*******************************************************************************/
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXVR_REG pReg = (PVBOXVR_REG)vboxVrRegLaAlloc(g_VBoxVrLookasideList);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync return (PVBOXVR_REG)RTMemAlloc(sizeof(VBOXVR_REG));
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(void) VBoxVrListClear(PVBOXVR_LIST pList)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListForEachSafe(&pList->ListHead, pReg, pRegNext, VBOXVR_REG, ListEntry)
d331ca5667e19a46f1e967617184483bec985e86vboxsync/* moves list data to pDstList and empties the pList */
d331ca5667e19a46f1e967617184483bec985e86vboxsyncVBOXVREGDECL(void) VBoxVrListMoveTo(PVBOXVR_LIST pList, PVBOXVR_LIST pDstList)
d331ca5667e19a46f1e967617184483bec985e86vboxsync pDstList->ListHead.pNext->pPrev = &pDstList->ListHead;
d331ca5667e19a46f1e967617184483bec985e86vboxsync pDstList->ListHead.pPrev->pNext = &pDstList->ListHead;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int32_t cNewRefs = ASMAtomicIncS32(&g_cVBoxVrInits);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync int rc = vboxVrLaCreate(&g_VBoxVrLookasideList, sizeof(VBOXVR_REG));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("ExInitializeLookasideListEx failed, rc (%d)", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int32_t cNewRefs = ASMAtomicDecS32(&g_cVBoxVrInits);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsynctypedef DECLCALLBACK(int) FNVBOXVR_CB_COMPARATOR(PCVBOXVR_REG pReg1, PCVBOXVR_REG pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsynctypedef FNVBOXVR_CB_COMPARATOR *PFNVBOXVR_CB_COMPARATOR;
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic DECLCALLBACK(int) vboxVrRegNonintersectedComparator(PCRTRECT pRect1, PCRTRECT pRect2)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrDbgListDoVerify(PVBOXVR_LIST pList)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListForEach(&pList->ListHead, pReg1, VBOXVR_REG, ListEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (RTLISTNODE *pEntry2 = pReg1->ListEntry.pNext; pEntry2 != &pList->ListHead; pEntry2 = pEntry2->pNext)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(vboxVrRegNonintersectedComparator(&pReg1->Rect, &pReg2->Rect) < 0);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync# define vboxVrDbgListVerify(_p) vboxVrDbgListDoVerify(_p)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLINLINE(void) vboxVrListRegAdd(PVBOXVR_LIST pList, PVBOXVR_REG pReg, PRTLISTNODE pPlace, bool fAfter)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLINLINE(void) vboxVrListRegRemove(PVBOXVR_LIST pList, PVBOXVR_REG pReg)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrListRegAddOrder(PVBOXVR_LIST pList, PRTLISTNODE pMemberEntry, PVBOXVR_REG pReg)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pMemberReg = PVBOXVR_REG_FROM_ENTRY(pMemberEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (vboxVrRegNonintersectedComparator(&pMemberReg->Rect, &pReg->Rect) < 0)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegAdd(pList, pReg, pMemberEntry, false);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrListAddNonintersected(PVBOXVR_LIST pList1, PVBOXVR_LIST pList2)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry2 = pList2->ListHead.pNext; pEntry2 != &pList2->ListHead; pEntry2 = pList2->ListHead.pNext)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg2 = PVBOXVR_REG_FROM_ENTRY(pEntry2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (vboxVrRegNonintersectedComparator(&pReg1->Rect, &pReg2->Rect) < 0)
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic int vboxVrListRegIntersectSubstNoJoin(PVBOXVR_LIST pList1, PVBOXVR_REG pReg1, PCRTRECT pRect2)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yTop = topLim == VBOXVR_INVALID_COORD ? pReg1->Rect.yTop : topLim;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yBottom = bottomLim == VBOXVR_INVALID_COORD ? pReg1->Rect.yBottom : bottomLim;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yTop = topLim == VBOXVR_INVALID_COORD ? pReg1->Rect.yTop : topLim;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yBottom = bottomLim == VBOXVR_INVALID_COORD ? pReg1->Rect.yBottom : bottomLim;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS; /* the region is covered by the pRect2 */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pMemberEntry = pEntry->pNext; /* the following elements should go after the given pEntry since they are ordered already */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync * @returns Entry to be used for continuing the rectangles iterations being made currently on the callback call.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * ListHead is returned to break the current iteration
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync * @param ppNext specifies next reg entry to be used for iteration. the default is pReg1->ListEntry.pNext */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsynctypedef DECLCALLBACK(PRTLISTNODE) FNVBOXVR_CB_INTERSECTED_VISITOR(PVBOXVR_LIST pList1, PVBOXVR_REG pReg1,
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync PCRTRECT pRect2, void *pvContext, PRTLISTNODE *ppNext);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsynctypedef FNVBOXVR_CB_INTERSECTED_VISITOR *PFNVBOXVR_CB_INTERSECTED_VISITOR;
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic void vboxVrListVisitIntersected(PVBOXVR_LIST pList1, uint32_t cRects, PCRTRECT aRects,
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync PFNVBOXVR_CB_INTERSECTED_VISITOR pfnVisitor, void* pvVisitor)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (; pEntry1 != &pList1->ListHead; pEntry1 = pNext1)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* the visitor can modify the list 1, apply necessary adjustments after it */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pEntry1 = pfnVisitor (pList1, pReg1, pRect2, pvVisitor, &pNext1);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync * @returns Entry to be iterated next. ListHead is returned to break the
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync * iteration
6902a98267d5180fb081cb5273751d0a628bf04dvboxsynctypedef DECLCALLBACK(PRTLISTNODE) FNVBOXVR_CB_NONINTERSECTED_VISITOR(PVBOXVR_LIST pList1, PVBOXVR_REG pReg1, void *pvContext);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsynctypedef FNVBOXVR_CB_NONINTERSECTED_VISITOR *PFNVBOXVR_CB_NONINTERSECTED_VISITOR;
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic void vboxVrListVisitNonintersected(PVBOXVR_LIST pList1, uint32_t cRects, PCRTRECT aRects,
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync PFNVBOXVR_CB_NONINTERSECTED_VISITOR pfnVisitor, void* pvVisitor)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync for (; pEntry1 != &pList1->ListHead; pEntry1 = pNext1)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync for (; i < cRects; ++i)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrListJoinRectsHV(PVBOXVR_LIST pList, bool fHorizontal)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry1 = pList->ListHead.pNext; pEntry1 != &pList->ListHead; pEntry1 = pNext1)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry2 = pEntry1->pNext; pEntry2 != &pList->ListHead; pEntry2 = pNext2)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg2 = PVBOXVR_REG_FROM_ENTRY(pEntry2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* join rectangles */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegAddOrder(pList, pReg1->ListEntry.pNext, pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * and thus can match one of the previous rects */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegAddOrder(pList, pReg1->ListEntry.pNext, pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * and thus can match one of the previous rects */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync /* reset the pNext1 since it could be the pReg2 being destroyed */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync /* pNext2 stays the same since it is pReg2->ListEntry.pNext, which is kept intact */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else if (pReg1->Rect.yBottom == pReg2->Rect.yBottom)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(pReg1->Rect.yTop < pReg2->Rect.yTop); /* <- since pReg1 > pReg2 && pReg1->Rect.yTop != pReg2->Rect.yTop*/
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* join rectangles */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * and thus can match one of the previous rects */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* join rectangles */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * and thus can match one of the previous rects */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* join rects */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* reset the pNext1 since it could be the pReg2 being destroyed */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* pNext2 stays the same since it is pReg2->ListEntry.pNext, which is kept intact */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* no more to be done for for pReg1 */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* no more to be done for for pReg1 */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* no more to be done for for pReg1 */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic DECLCALLBACK(PRTLISTNODE) vboxVrListSubstNoJoinCb(PVBOXVR_LIST pList, PVBOXVR_REG pReg1, PCRTRECT pRect2,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_CBDATA_SUBST pData = (PVBOXVR_CBDATA_SUBST)pvContext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* store the prev to get the new pNext out of it*/
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* NOTE: the pReg1 will be invalid after the vboxVrListRegIntersectSubstNoJoin call!!! */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = vboxVrListRegIntersectSubstNoJoin(pList, pReg1, pRect2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("vboxVrListRegIntersectSubstNoJoin failed!"));
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic int vboxVrListSubstNoJoin(PVBOXVR_LIST pList, uint32_t cRects, PCRTRECT aRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListVisitIntersected(pList, cRects, aRects, vboxVrListSubstNoJoinCb, &Data);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic PCRTRECT vboxVrRectsOrder(uint32_t cRects, PCRTRECT aRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* check if rects are ordered already */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (vboxVrRegNonintersectedComparator(pRect1, pRect2) < 0)
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync pRects = (PRTRECT)RTMemAlloc(sizeof(RTRECT) * cRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int j = (int)i - 1;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (vboxVrRegNonintersectedComparator(pRect1, pRect1-1) > 0)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(void) VBoxVrListTranslate(PVBOXVR_LIST pList, int32_t x, int32_t y)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry1 = pList->ListHead.pNext; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->pNext)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic DECLCALLBACK(PRTLISTNODE) vboxVrListIntersectNoJoinNonintersectedCb(PVBOXVR_LIST pList1, PVBOXVR_REG pReg1, void *pvContext)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBOXVR_CBDATA_SUBST *pData = (VBOXVR_CBDATA_SUBST*)pvContext;
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic DECLCALLBACK(PRTLISTNODE) vboxVrListIntersectNoJoinIntersectedCb(PVBOXVR_LIST pList1, PVBOXVR_REG pReg1, PCRTRECT pRect2,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_CBDATA_SUBST pData = (PVBOXVR_CBDATA_SUBST)pvContext;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrListRegAddOrder(pList1, pMemberEntry, pReg1);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic int vboxVrListIntersectNoJoin(PVBOXVR_LIST pList, PCVBOXVR_LIST pList2, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync for (PRTLISTNODE pEntry1 = pList->ListHead.pNext; pEntry1 != &pList->ListHead; pEntry1 = pNext1)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync for (const RTLISTNODE *pEntry2 = pList2->ListHead.pNext; pEntry2 != &pList2->ListHead; pEntry2 = pEntry2->pNext)
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync PCVBOXVR_REG pReg2 = PVBOXVR_REG_FROM_ENTRY(pEntry2);
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* no change */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* zero up the pReg1 to mark it as intersected (see the code after this inner loop) */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync break; /* and we can break the iteration here */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /*just to ensure the VBoxRectCovers is true for equal rects */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* @todo: this can have false-alarming sometimes if the separated rects will then be joind into the original rect,
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync * so far this should not be a problem for VReg clients, so keep it this way for now */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* re-use the reg entry */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(fChanged); /* <- should be set by the if branch above */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxRectIntersected(&RegRect1, pRect2, &pReg->Rect);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrListRegAddOrder(pList, pList->ListHead.pNext, pReg);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* the region has no intersections, remove it */
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrListIntersect(PVBOXVR_LIST pList, PCVBOXVR_LIST pList2, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = vboxVrListIntersectNoJoin(pList, pList2, pfChanged);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrListRectsIntersect(PVBOXVR_LIST pList, uint32_t cRects, PCRTRECT aRects, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* we perform intersection using lists because the algorythm axpects the rects to be non-intersected,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * which list guaranties to us */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VBoxVrListRectsAdd(&TmpList, cRects, aRects, NULL);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = VBoxVrListIntersect(pList, &TmpList, pfChanged);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrListRectsSubst(PVBOXVR_LIST pList, uint32_t cRects, PCRTRECT aRects, bool *pfChanged)
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync PCRTRECT pRects = vboxVrRectsOrder(cRects, aRects);
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync int rc = vboxVrListSubstNoJoin(pList, cRects, aRects, &fChanged);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrListRectsSet(PVBOXVR_LIST pList, uint32_t cRects, PCRTRECT aRects, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* @todo: fChanged will have false alarming here, fix if needed */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VBoxVrListRectsAdd(pList, cRects, aRects, NULL);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrListRectsAdd(PVBOXVR_LIST pList, uint32_t cRects, PCRTRECT aRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* early sort out the case when there are no new rects */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry1 = pList->ListHead.pNext; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->pNext)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* rects are not covered, need to go the slow way */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegAdd(pList, pReg, &pList->ListHead, false);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync vboxVrListRegAdd(&DiffList, pReg, &DiffList.ListHead, false);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync pListRects = (RTRECT *)RTMemAlloc(sizeof(RTRECT) * cAllocatedRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = VBoxVrListRectsGet(pList, cListRects, pListRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = vboxVrListSubstNoJoin(&DiffList, cListRects, pListRects, &fDummyChanged);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(VBoxVrListIsEmpty(&DiffList) || rc != VINF_SUCCESS);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(int) VBoxVrListRectsGet(PVBOXVR_LIST pList, uint32_t cRects, RTRECT * aRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry1 = pList->ListHead.pNext; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->pNext, ++i)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) VBoxVrListCmp(const VBOXVR_LIST *pList1, const VBOXVR_LIST *pList2)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync for (pReg1 = RTListNodeGetNext(&pList1->ListHead, VBOXVR_REG, ListEntry),
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync pReg2 = RTListNodeGetNext(&pList2->ListHead, VBOXVR_REG, ListEntry);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync !RTListNodeIsDummy(&pList1->ListHead, pReg1, VBOXVR_REG, ListEntry);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync pReg1 = RT_FROM_MEMBER(pReg1->ListEntry.pNext, VBOXVR_REG, ListEntry),
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync pReg2 = RT_FROM_MEMBER(pReg2->ListEntry.pNext, VBOXVR_REG, ListEntry) )
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(!RTListNodeIsDummy(&pList2->ListHead, pReg2, VBOXVR_REG, ListEntry));
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(RTListNodeIsDummy(&pList2->ListHead, pReg2, VBOXVR_REG, ListEntry));
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrListClone(PCVBOXVR_LIST pList, PVBOXVR_LIST pDstList)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync RTListForEach(&pList->ListHead, pReg, const VBOXVR_REG, ListEntry)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync vboxVrListRegAdd(pDstList, pDstReg, &pDstList->ListHead, true /*bool fAfter*/);
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsyncVBOXVREGDECL(void) VBoxVrCompositorInit(PVBOXVR_COMPOSITOR pCompositor, PFNVBOXVRCOMPOSITOR_ENTRY_RELEASED pfnEntryReleased)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(void) VBoxVrCompositorRegionsClear(PVBOXVR_COMPOSITOR pCompositor, bool *pfChanged)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync RTListForEachSafe(&pCompositor->List, pEntry, pEntryNext, VBOXVR_COMPOSITOR_ENTRY, Node)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(void) VBoxVrCompositorClear(PVBOXVR_COMPOSITOR pCompositor)
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncDECLINLINE(void) vboxVrCompositorEntryRelease(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync pCompositor->pfnEntryReleased(pCompositor, pEntry, pReplacingEntry);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncDECLINLINE(void) vboxVrCompositorEntryAddRef(PVBOXVR_COMPOSITOR_ENTRY pEntry)
8238dbee2b0c21592e6af0fafcdb2e56cf3a791cvboxsyncDECLINLINE(void) vboxVrCompositorEntryAdd(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry)
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncDECLINLINE(void) vboxVrCompositorEntryRemove(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, pReplacingEntry);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic void vboxVrCompositorEntryReplace(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
d331ca5667e19a46f1e967617184483bec985e86vboxsync VBoxVrListMoveTo(&pEntry->Vr, &pReplacingEntry->Vr);
d331ca5667e19a46f1e967617184483bec985e86vboxsync pReplacingEntry->Node.pNext->pPrev = &pReplacingEntry->Node;
d331ca5667e19a46f1e967617184483bec985e86vboxsync pReplacingEntry->Node.pPrev->pNext = &pReplacingEntry->Node;
d331ca5667e19a46f1e967617184483bec985e86vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, pReplacingEntry);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(void) VBoxVrCompositorEntryInit(PVBOXVR_COMPOSITOR_ENTRY pEntry)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(bool) VBoxVrCompositorEntryRemove(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return false;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync vboxVrCompositorEntryRemove(pCompositor, pEntry, NULL);
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return true;
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(bool) VBoxVrCompositorEntryReplace(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
d331ca5667e19a46f1e967617184483bec985e86vboxsync return false;
d331ca5667e19a46f1e967617184483bec985e86vboxsync vboxVrCompositorEntryReplace(pCompositor, pEntry, pNewEntry);
d331ca5667e19a46f1e967617184483bec985e86vboxsync return true;
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncstatic int vboxVrCompositorEntryRegionsSubst(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync uint32_t cRects, PCRTRECT paRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = VBoxVrListRectsSubst(&pEntry->Vr, cRects, paRects, &fChanged);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync vboxVrCompositorEntryRemove(pCompositor, pEntry, NULL);
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsAdd(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync uint32_t cRects, PCRTRECT paRects, PVBOXVR_COMPOSITOR_ENTRY *ppReplacedEntry,
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync fEntryWasInList = VBoxVrCompositorEntryIsInList(pEntry);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync rc = VBoxVrListRectsAdd(&pEntry->Vr, cRects, paRects, &fEntryChanged);
9333def4f76dd01eea8300d59512d421200e5db7vboxsync// WARN(("Empty rectangles passed in, is it expected?"));
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync RTListForEachSafe(&pCompositor->List, pCur, pNext, VBOXVR_COMPOSITOR_ENTRY, Node)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (pEntry && !VBoxVrListCmp(&pCur->Vr, &pEntry->Vr))
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync vboxVrCompositorEntryRemove(pCompositor, pCur, pEntry);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync rc = vboxVrCompositorEntryRegionsSubst(pCompositor, pCur, cRects, paRects, &fCurChanged);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync WARN(("vboxVrCompositorEntryRegionsSubst failed, rc %d", rc));
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync | VBOXVR_COMPOSITOR_CF_OTHER_ENTRIES_REGIONS_CHANGED;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync vboxVrCompositorEntryRelease(pCompositor, pReplacedEntry, pEntry);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED;
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsSubst(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync uint32_t cRects, PCRTRECT paRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("VBoxVrCompositorEntryRegionsSubst called with zero entry, unsupported!"));
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync int rc = vboxVrCompositorEntryRegionsSubst(pCompositor, pEntry, cRects, paRects, pfChanged);
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsSet(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync uint32_t cRects, PCRTRECT paRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("VBoxVrCompositorEntryRegionsSet called with zero entry, unsupported!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync fCurChanged = VBoxVrCompositorEntryRemove(pCompositor, pEntry);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync rc = VBoxVrCompositorEntryRegionsAdd(pCompositor, pEntry, cRects, paRects, NULL, &fChangeFlags);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("VBoxVrCompositorEntryRegionsAdd failed, rc %d", rc));
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryListIntersect(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = VBoxVrListIntersect(&pEntry->Vr, pList2, &fChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrCompositorEntryRemove(pCompositor, pEntry, NULL);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync WARN(("VBoxVrListRectsIntersect failed, rc %d", rc));
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsIntersect(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync uint32_t cRects, PCRTRECT paRects, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = VBoxVrListRectsIntersect(&pEntry->Vr, cRects, paRects, &fChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrCompositorEntryRemove(pCompositor, pEntry, NULL);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync WARN(("VBoxVrListRectsIntersect failed, rc %d", rc));
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryListIntersectAll(PVBOXVR_COMPOSITOR pCompositor, PCVBOXVR_LIST pList2, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync while ((pEntry = VBoxVrCompositorIterNext(&Iter)) != NULL)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int tmpRc = VBoxVrCompositorEntryListIntersect(pCompositor, pEntry, pList2, &fTmpChanged);
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("VBoxVrCompositorEntryRegionsIntersect failed, rc %d", tmpRc));
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsIntersectAll(PVBOXVR_COMPOSITOR pCompositor, uint32_t cRegions, PCRTRECT paRegions,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync while ((pEntry = VBoxVrCompositorIterNext(&Iter)) != NULL)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int tmpRc = VBoxVrCompositorEntryRegionsIntersect(pCompositor, pEntry, cRegions, paRegions, &fTmpChanged);
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("VBoxVrCompositorEntryRegionsIntersect failed, rc %d", tmpRc));
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsTranslate(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("VBoxVrCompositorEntryRegionsTranslate called with zero entry, unsupported!"));
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync if ( (!x && !y)
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListForEach(&pCompositor->List, pCur, VBOXVR_COMPOSITOR_ENTRY, Node)
8410b2c7821e11060f3cdb85cbcadbfeca632265vboxsync paRects = (RTRECT*)RTMemAlloc(cRects * sizeof(RTRECT));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = VBoxVrListRectsGet(&pEntry->Vr, cRects, paRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = vboxVrCompositorEntryRegionsSubst(pCompositor, pCur, cRects, paRects, NULL);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("vboxVrCompositorEntryRegionsSubst failed! rc %d", rc));
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(void) VBoxVrCompositorVisit(PVBOXVR_COMPOSITOR pCompositor, PFNVBOXVRCOMPOSITOR_VISITOR pfnVisitor, void *pvVisitor)