vreg.cpp revision 8cfe2efff2058bd07777056112155ea5353dcfba
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/* $Id$ */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/** @file
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Visible Regions processing API implementation
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/*
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Copyright (C) 2012 Oracle Corporation
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
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.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#include <cr_vreg.h>
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#include <iprt/err.h>
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#include <iprt/assert.h>
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync#include <iprt/asm.h>
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync#include <cr_error.h>
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync#define WARN(_m) do { crWarning _m ; } while (0)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifndef IN_RING0
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#include <iprt/memcache.h>
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifndef VBOXVDBG_VR_LAL_DISABLE
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncstatic RTMEMCACHE g_VBoxVrLookasideList;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define vboxVrRegLaAlloc(_c) RTMemCacheAlloc((_c))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define vboxVrRegLaFree(_c, _e) RTMemCacheFree((_c), (_e))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncDECLINLINE(int) vboxVrLaCreate(RTMEMCACHE *pCache, size_t cbElement)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync int rc = RTMemCacheCreate(pCache, cbElement,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync 0, /* size_t cbAlignment */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync UINT32_MAX, /* uint32_t cMaxObjects */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync NULL, /* PFNMEMCACHECTOR pfnCtor*/
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync NULL, /* PFNMEMCACHEDTOR pfnDtor*/
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync NULL, /* void *pvUser*/
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync 0 /* uint32_t fFlags*/
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync );
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!RT_SUCCESS(rc))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("RTMemCacheCreate failed rc %d", rc));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return rc;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return VINF_SUCCESS;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync}
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define vboxVrLaDestroy(_c) RTMemCacheDestroy((_c))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync#else
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# ifdef RT_OS_WINDOWS
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# ifdef PAGE_SIZE
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# undef PAGE_SIZE
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# ifdef PAGE_SHIFT
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# undef PAGE_SHIFT
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define VBOX_WITH_WORKAROUND_MISSING_PACK
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
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# pragma warning(disable : 4163)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# ifdef VBOX_WITH_WORKAROUND_MISSING_PACK
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# pragma warning(disable : 4103)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# include <ntddk.h>
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# pragma warning(default : 4163)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# ifdef VBOX_WITH_WORKAROUND_MISSING_PACK
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# pragma pack()
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# pragma warning(default : 4103)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# undef _InterlockedExchange
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# undef _InterlockedExchangeAdd
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# undef _InterlockedCompareExchange
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# undef _InterlockedAddLargeStatistic
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# undef _interlockedbittestandset
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# undef _interlockedbittestandreset
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# undef _interlockedbittestandset64
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# undef _interlockedbittestandreset64
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# else
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# include <ntddk.h>
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifndef VBOXVDBG_VR_LAL_DISABLE
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncstatic LOOKASIDE_LIST_EX g_VBoxVrLookasideList;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define vboxVrRegLaAlloc(_c) ExAllocateFromLookasideListEx(&(_c))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define vboxVrRegLaFree(_c, _e) ExFreeToLookasideListEx(&(_c), (_e))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define VBOXWDDMVR_MEMTAG 'vDBV'
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncDECLINLINE(int) vboxVrLaCreate(LOOKASIDE_LIST_EX *pCache, size_t cbElement)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync NTSTATUS Status = ExInitializeLookasideListEx(pCache,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync NULL, /* PALLOCATE_FUNCTION_EX Allocate */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync NULL, /* PFREE_FUNCTION_EX Free */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync NonPagedPool,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync 0, /* ULONG Flags */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync cbElement,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBOXWDDMVR_MEMTAG,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync 0 /* USHORT Depth - reserved, must be null */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync );
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!NT_SUCCESS(Status))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("ExInitializeLookasideListEx failed, Status (0x%x)", Status));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return VERR_GENERAL_FAILURE;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return VINF_SUCCESS;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync}
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define vboxVrLaDestroy(_c) ExDeleteLookasideListEx(&(_c))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# else
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# error "port me!"
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# endif
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync#endif
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef DEBUG_misha
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync//# define VBOXVDBG_VR_LAL_DISABLE
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifndef VBOXVDBG_VR_LAL_DISABLE
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic volatile int32_t g_cVBoxVrInits = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic PVBOXVR_REG vboxVrRegCreate()
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifndef VBOXVDBG_VR_LAL_DISABLE
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXVR_REG pReg = (PVBOXVR_REG)vboxVrRegLaAlloc(g_VBoxVrLookasideList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pReg)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("ExAllocateFromLookasideListEx failed!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return pReg;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return (PVBOXVR_REG)RTMemAlloc(sizeof (VBOXVR_REG));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrRegTerm(PVBOXVR_REG pReg)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifndef VBOXVDBG_VR_LAL_DISABLE
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync vboxVrRegLaFree(g_VBoxVrLookasideList, pReg);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTMemFree(pReg);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(void) VBoxVrListClear(PVBOXVR_LIST pList)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg, pRegNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListForEachSafe(&pList->ListHead, pReg, pRegNext, VBOXVR_REG, ListEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrRegTerm(pReg);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync VBoxVrListInit(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#define VBOXVR_MEMTAG 'vDBV'
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(int) VBoxVrInit()
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int32_t cNewRefs = ASMAtomicIncS32(&g_cVBoxVrInits);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(cNewRefs >= 1);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(cNewRefs == 1); /* <- debugging */
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (cNewRefs > 1)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifndef VBOXVDBG_VR_LAL_DISABLE
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync int rc = vboxVrLaCreate(&g_VBoxVrLookasideList, sizeof (VBOXVR_REG));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!RT_SUCCESS(rc))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("ExInitializeLookasideListEx failed, rc (%d)", rc));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(void) VBoxVrTerm()
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int32_t cNewRefs = ASMAtomicDecS32(&g_cVBoxVrInits);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(cNewRefs >= 0);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (cNewRefs > 0)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifndef VBOXVDBG_VR_LAL_DISABLE
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync vboxVrLaDestroy(g_VBoxVrLookasideList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsynctypedef DECLCALLBACK(int) FNVBOXVR_CB_COMPARATOR(const VBOXVR_REG *pReg1, const VBOXVR_REG *pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsynctypedef FNVBOXVR_CB_COMPARATOR *PFNVBOXVR_CB_COMPARATOR;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) vboxVrRegNonintersectedComparator(const RTRECT* pRect1, const RTRECT* pRect2)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(!VBoxRectIsIntersect(pRect1, pRect2));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pRect1->yTop != pRect2->yTop)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return pRect1->yTop - pRect2->yTop;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return pRect1->xLeft - pRect2->xLeft;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef DEBUG_misha
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrDbgListDoVerify(PVBOXVR_LIST pList)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1, pReg2;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListForEach(&pList->ListHead, pReg1, VBOXVR_REG, ListEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync Assert(!VBoxRectIsZero(&pReg1->Rect));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (RTLISTNODE *pEntry2 = pReg1->ListEntry.pNext; pEntry2 != &pList->ListHead; pEntry2 = pEntry2->pNext)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg2 = PVBOXVR_REG_FROM_ENTRY(pEntry2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(vboxVrRegNonintersectedComparator(&pReg1->Rect, &pReg2->Rect) < 0);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#define vboxVrDbgListVerify vboxVrDbgListDoVerify
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#define vboxVrDbgListVerify(_p) do {} while (0)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic int vboxVrListUniteIntersection(PVBOXVR_LIST pList, PVBOXVR_LIST pIntersection);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
d1cbcedef8f8eb139111351e183add8c0b7d3645vboxsync#define VBOXVR_INVALID_COORD (~0U)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLINLINE(void) vboxVrListRegAdd(PVBOXVR_LIST pList, PVBOXVR_REG pReg, PRTLISTNODE pPlace, bool fAfter)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (fAfter)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListPrepend(pPlace, &pReg->ListEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListAppend(pPlace, &pReg->ListEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync ++pList->cEntries;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrDbgListVerify(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLINLINE(void) vboxVrListRegRemove(PVBOXVR_LIST pList, PVBOXVR_REG pReg)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListNodeRemove(&pReg->ListEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync --pList->cEntries;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrDbgListVerify(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrListRegAddOrder(PVBOXVR_LIST pList, PRTLISTNODE pMemberEntry, PVBOXVR_REG pReg)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync do
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pMemberEntry != &pList->ListHead)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pMemberReg = PVBOXVR_REG_FROM_ENTRY(pMemberEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (vboxVrRegNonintersectedComparator(&pMemberReg->Rect, &pReg->Rect) < 0)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pMemberEntry = pMemberEntry->pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync continue;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegAdd(pList, pReg, pMemberEntry, false);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync } while (1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrListAddNonintersected(PVBOXVR_LIST pList1, PVBOXVR_LIST pList2)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PRTLISTNODE pEntry1 = pList1->ListHead.pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry2 = pList2->ListHead.pNext; pEntry2 != &pList2->ListHead; pEntry2 = pList2->ListHead.pNext)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg2 = PVBOXVR_REG_FROM_ENTRY(pEntry2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync do {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pEntry1 != &pList1->ListHead)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (vboxVrRegNonintersectedComparator(&pReg1->Rect, &pReg2->Rect) < 0)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pEntry1 = pEntry1->pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync continue;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegRemove(pList2, pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegAdd(pList1, pReg2, pEntry1, false);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync } while (1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(VBoxVrListIsEmpty(pList2));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncstatic int vboxVrListRegIntersectSubstNoJoin(PVBOXVR_LIST pList1, PVBOXVR_REG pReg1, const RTRECT * pRect2)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t topLim = VBOXVR_INVALID_COORD;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t bottomLim = VBOXVR_INVALID_COORD;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTLISTNODE List;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pBottomReg = NULL;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef DEBUG_misha
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTRECT tmpRect = pReg1->Rect;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrDbgListVerify(pList1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync Assert(!VBoxRectIsZero(pRect2));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListInit(&List);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(VBoxRectIsIntersect(&pReg1->Rect, pRect2));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.yTop < pRect2->yTop)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(pRect2->yTop < pReg1->Rect.yBottom);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pRegResult = vboxVrRegCreate();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yTop = pReg1->Rect.yTop;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.xLeft = pReg1->Rect.xLeft;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yBottom = pRect2->yTop;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.xRight = pReg1->Rect.xRight;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync topLim = pRect2->yTop;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListAppend(&List, &pRegResult->ListEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.yBottom > pRect2->yBottom)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(pRect2->yBottom > pReg1->Rect.yTop);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pRegResult = vboxVrRegCreate();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yTop = pRect2->yBottom;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.xLeft = pReg1->Rect.xLeft;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yBottom = pReg1->Rect.yBottom;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.xRight = pReg1->Rect.xRight;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync bottomLim = pRect2->yBottom;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pBottomReg = pRegResult;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.xLeft < pRect2->xLeft)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(pRect2->xLeft < pReg1->Rect.xRight);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pRegResult = vboxVrRegCreate();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yTop = topLim == VBOXVR_INVALID_COORD ? pReg1->Rect.yTop : topLim;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.xLeft = pReg1->Rect.xLeft;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yBottom = bottomLim == VBOXVR_INVALID_COORD ? pReg1->Rect.yBottom : bottomLim;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.xRight = pRect2->xLeft;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListAppend(&List, &pRegResult->ListEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.xRight > pRect2->xRight)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(pRect2->xRight > pReg1->Rect.xLeft);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pRegResult = vboxVrRegCreate();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yTop = topLim == VBOXVR_INVALID_COORD ? pReg1->Rect.yTop : topLim;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.xLeft = pRect2->xRight;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.yBottom = bottomLim == VBOXVR_INVALID_COORD ? pReg1->Rect.yBottom : bottomLim;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRegResult->Rect.xRight = pReg1->Rect.xRight;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListAppend(&List, &pRegResult->ListEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pBottomReg)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListAppend(&List, &pBottomReg->ListEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PRTLISTNODE pMemberEntry = pReg1->ListEntry.pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegRemove(pList1, pReg1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrRegTerm(pReg1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (RTListIsEmpty(&List))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS; /* the region is covered by the pRect2 */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PRTLISTNODE pEntry = List.pNext, pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (; pEntry != &List; pEntry = pNext)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pNext = pEntry->pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg = PVBOXVR_REG_FROM_ENTRY(pEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegAddOrder(pList1, pMemberEntry, pReg);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pMemberEntry = pEntry->pNext; /* the following elements should go after the given pEntry since they are ordered already */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync/* @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
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * @param ppNext specifies next reg entry to be used for iteration. the default is pReg1->ListEntry.pNext */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsynctypedef DECLCALLBACK(PRTLISTNODE) FNVBOXVR_CB_INTERSECTED_VISITOR(PVBOXVR_LIST pList1, PVBOXVR_REG pReg1, const RTRECT * pRect2, void *pvContext, PRTLISTNODE *ppNext);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsynctypedef FNVBOXVR_CB_INTERSECTED_VISITOR *PFNVBOXVR_CB_INTERSECTED_VISITOR;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrListVisitIntersected(PVBOXVR_LIST pList1, uint32_t cRects, const RTRECT *aRects, PFNVBOXVR_CB_INTERSECTED_VISITOR pfnVisitor, void* pvVisitor)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PRTLISTNODE pEntry1 = pList1->ListHead.pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PRTLISTNODE pNext1;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t iFirst2 = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (; pEntry1 != &pList1->ListHead; pEntry1 = pNext1)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pNext1 = pEntry1->pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (uint32_t i = iFirst2; i < cRects; ++i)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync const RTRECT *pRect2 = &aRects[i];
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync if (VBoxRectIsZero(pRect2))
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync continue;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!VBoxRectIsIntersect(&pReg1->Rect, pRect2))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync continue;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* the visitor can modify the list 1, apply necessary adjustments after it */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pEntry1 = pfnVisitor (pList1, pReg1, pRect2, pvVisitor, &pNext1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pEntry1 == &pList1->ListHead)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync/* @returns Entry to be iterated next. ListHead is returned to break the iteration
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsynctypedef DECLCALLBACK(PRTLISTNODE) FNVBOXVR_CB_NONINTERSECTED_VISITOR(PVBOXVR_LIST pList1, PVBOXVR_REG pReg1, void *pvContext);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsynctypedef FNVBOXVR_CB_NONINTERSECTED_VISITOR *PFNVBOXVR_CB_NONINTERSECTED_VISITOR;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic void vboxVrListVisitNonintersected(PVBOXVR_LIST pList1, uint32_t cRects, const RTRECT *aRects, PFNVBOXVR_CB_NONINTERSECTED_VISITOR pfnVisitor, void* pvVisitor)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PRTLISTNODE pEntry1 = pList1->ListHead.pNext;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PRTLISTNODE pNext1;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync uint32_t iFirst2 = 0;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync for (; pEntry1 != &pList1->ListHead; pEntry1 = pNext1)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync uint32_t i = iFirst2;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync for (; i < cRects; ++i)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync const RTRECT *pRect2 = &aRects[i];
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (VBoxRectIsZero(pRect2))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync continue;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (VBoxRectIsIntersect(&pReg1->Rect, pRect2))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync break;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (i == cRects)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pNext1 = pfnVisitor(pList1, pReg1, pvVisitor);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pNext1 = pEntry1->pNext;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrListJoinRectsHV(PVBOXVR_LIST pList, bool fHorizontal)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PRTLISTNODE pNext1, pNext2;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry1 = pList->ListHead.pNext; pEntry1 != &pList->ListHead; pEntry1 = pNext1)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pNext1 = pEntry1->pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry2 = pEntry1->pNext; pEntry2 != &pList->ListHead; pEntry2 = pNext2)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg2 = PVBOXVR_REG_FROM_ENTRY(pEntry2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pNext2 = pEntry2->pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (fHorizontal)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.yTop == pReg2->Rect.yTop)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.xRight == pReg2->Rect.xLeft)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* join rectangles */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegRemove(pList, pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.yBottom > pReg2->Rect.yBottom)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int32_t oldRight1 = pReg1->Rect.xRight;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int32_t oldBottom1 = pReg1->Rect.yBottom;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg1->Rect.xRight = pReg2->Rect.xRight;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg1->Rect.yBottom = pReg2->Rect.yBottom;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrDbgListVerify(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg2->Rect.xLeft = pReg1->Rect.xLeft;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg2->Rect.yTop = pReg1->Rect.yBottom;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg2->Rect.xRight = oldRight1;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg2->Rect.yBottom = oldBottom1;
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 pNext1 = pList->ListHead.pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else if (pReg1->Rect.yBottom < pReg2->Rect.yBottom)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg1->Rect.xRight = pReg2->Rect.xRight;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrDbgListVerify(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg2->Rect.yTop = pReg1->Rect.yBottom;
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 pNext1 = pList->ListHead.pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg1->Rect.xRight = pReg2->Rect.xRight;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrDbgListVerify(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* reset the pNext1 since it could be the pReg2 being destroyed */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pNext1 = pEntry1->pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* pNext2 stays the same since it is pReg2->ListEntry.pNext, which is kept intact */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrRegTerm(pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync continue;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else if (pReg1->Rect.yBottom == pReg2->Rect.yBottom)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(pReg1->Rect.yTop < pReg2->Rect.yTop); /* <- since pReg1 > pReg2 && pReg1->Rect.yTop != pReg2->Rect.yTop*/
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.xRight == pReg2->Rect.xLeft)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* join rectangles */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegRemove(pList, pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg1->Rect.yBottom = pReg2->Rect.yTop;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrDbgListVerify(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg2->Rect.xLeft = pReg1->Rect.xLeft;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
0e8453fd4bba7dd5e9ffe786904f7114393fb69cvboxsync vboxVrListRegAddOrder(pList, pNext2, pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
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 pNext1 = pList->ListHead.pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else if (pReg1->Rect.xLeft == pReg2->Rect.xRight)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* join rectangles */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegRemove(pList, pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg1->Rect.yBottom = pReg2->Rect.yTop;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrDbgListVerify(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg2->Rect.xRight = pReg1->Rect.xRight;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
0e8453fd4bba7dd5e9ffe786904f7114393fb69cvboxsync vboxVrListRegAddOrder(pList, pNext2, pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
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 pNext1 = pList->ListHead.pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync continue;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.yBottom == pReg2->Rect.yTop)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.xLeft == pReg2->Rect.xLeft)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pReg1->Rect.xRight == pReg2->Rect.xRight)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* join rects */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegRemove(pList, pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg1->Rect.yBottom = pReg2->Rect.yBottom;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrDbgListVerify(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* reset the pNext1 since it could be the pReg2 being destroyed */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pNext1 = pEntry1->pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* pNext2 stays the same since it is pReg2->ListEntry.pNext, which is kept intact */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrRegTerm(pReg2);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync continue;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* no more to be done for for pReg1 */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else if (pReg1->Rect.xRight > pReg2->Rect.xLeft)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* no more to be done for for pReg1 */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync continue;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else if (pReg1->Rect.yBottom < pReg2->Rect.yTop)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* no more to be done for for pReg1 */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic void vboxVrListJoinRects(PVBOXVR_LIST pList)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListJoinRectsHV(pList, true);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListJoinRectsHV(pList, false);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsynctypedef struct VBOXVR_CBDATA_SUBST
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync bool fChanged;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync} VBOXVR_CBDATA_SUBST, *PVBOXVR_CBDATA_SUBST;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(PRTLISTNODE) vboxVrListSubstNoJoinCb(PVBOXVR_LIST pList, PVBOXVR_REG pReg1, const RTRECT *pRect2, void *pvContext, PRTLISTNODE *ppNext)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_CBDATA_SUBST pData = (PVBOXVR_CBDATA_SUBST)pvContext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* store the prev to get the new pNext out of it*/
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PRTLISTNODE pPrev = pReg1->ListEntry.pPrev;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pData->fChanged = true;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(VBoxRectIsIntersect(&pReg1->Rect, pRect2));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* NOTE: the pReg1 will be invalid after the vboxVrListRegIntersectSubstNoJoin call!!! */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = vboxVrListRegIntersectSubstNoJoin(pList, pReg1, pRect2);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (RT_SUCCESS(rc))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *ppNext = pPrev->pNext;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return &pList->ListHead;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("vboxVrListRegIntersectSubstNoJoin failed!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(!RT_SUCCESS(rc));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pData->rc = rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *ppNext = &pList->ListHead;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return &pList->ListHead;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncstatic int vboxVrListSubstNoJoin(PVBOXVR_LIST pList, uint32_t cRects, const RTRECT * aRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync if (pfChanged)
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync *pfChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (VBoxVrListIsEmpty(pList))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync VBOXVR_CBDATA_SUBST Data;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Data.rc = VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Data.fChanged = false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListVisitIntersected(pList, cRects, aRects, vboxVrListSubstNoJoinCb, &Data);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!RT_SUCCESS(Data.rc))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("vboxVrListVisitIntersected failed!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return Data.rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync if (pfChanged)
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync *pfChanged = Data.fChanged;
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#if 0
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncstatic const RTRECT * vboxVrRectsOrder(uint32_t cRects, const RTRECT * aRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef DEBUG
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (uint32_t i = 0; i < cRects; ++i)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTRECT *pRectI = &aRects[i];
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (uint32_t j = i + 1; j < cRects; ++j)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTRECT *pRectJ = &aRects[j];
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(!VBoxRectIsIntersect(pRectI, pRectJ));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTRECT * pRects = (RTRECT *)aRects;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* check if rects are ordered already */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (uint32_t i = 0; i < cRects - 1; ++i)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTRECT *pRect1 = &pRects[i];
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTRECT *pRect2 = &pRects[i+1];
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (vboxVrRegNonintersectedComparator(pRect1, pRect2) < 0)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync continue;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("rects are unoreded!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pRects == aRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRects = (RTRECT *)RTMemAlloc(sizeof (RTRECT) * cRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("RTMemAlloc failed!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return NULL;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync memcpy(pRects, aRects, sizeof (RTRECT) * cRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(pRects != aRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int j = (int)i - 1;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync do {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTRECT Tmp = *pRect1;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pRect1 = *pRect2;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pRect2 = Tmp;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (j < 0)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (vboxVrRegNonintersectedComparator(pRect1, pRect1-1) > 0)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pRect2 = pRect1--;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync --j;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync } while (1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return pRects;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(void) VBoxVrListTranslate(PVBOXVR_LIST pList, int32_t x, int32_t y)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry1 = pList->ListHead.pNext; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->pNext)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync VBoxRectTranslate(&pReg1->Rect, x, y);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic DECLCALLBACK(PRTLISTNODE) vboxVrListIntersectNoJoinNonintersectedCb(PVBOXVR_LIST pList1, PVBOXVR_REG pReg1, void *pvContext)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBOXVR_CBDATA_SUBST *pData = (VBOXVR_CBDATA_SUBST*)pvContext;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PRTLISTNODE pNext = pReg1->ListEntry.pNext;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrDbgListVerify(pList1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrListRegRemove(pList1, pReg1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrRegTerm(pReg1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrDbgListVerify(pList1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->fChanged = true;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return pNext;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic DECLCALLBACK(PRTLISTNODE) vboxVrListIntersectNoJoinIntersectedCb(PVBOXVR_LIST pList1, PVBOXVR_REG pReg1, const RTRECT *pRect2, void *pvContext, PRTLISTNODE *ppNext)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_CBDATA_SUBST pData = (PVBOXVR_CBDATA_SUBST)pvContext;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->fChanged = true;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrDbgListVerify(pList1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PRTLISTNODE pMemberEntry = pReg1->ListEntry.pNext;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(VBoxRectIsIntersect(&pReg1->Rect, pRect2));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(!VBoxRectIsZero(pRect2));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrListRegRemove(pList1, pReg1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxRectIntersect(&pReg1->Rect, pRect2);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(!VBoxRectIsZero(&pReg1->Rect));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrListRegAddOrder(pList1, pMemberEntry, pReg1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrDbgListVerify(pList1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return &pReg1->ListEntry;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic int vboxVrListIntersectNoJoin(PVBOXVR_LIST pList, const VBOXVR_LIST *pList2, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (VBoxVrListIsEmpty(pList))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (VBoxVrListIsEmpty(pList2))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = true;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxVrListClear(pList);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PRTLISTNODE pNext1;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync for (PRTLISTNODE pEntry1 = pList->ListHead.pNext; pEntry1 != &pList->ListHead; pEntry1 = pNext1)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pNext1 = pEntry1->pNext;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync RTRECT RegRect1 = pReg1->Rect;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PRTLISTNODE pMemberEntry = pReg1->ListEntry.pNext;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync for (const RTLISTNODE *pEntry2 = pList2->ListHead.pNext; pEntry2 != &pList2->ListHead; pEntry2 = pEntry2->pNext)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync const VBOXVR_REG *pReg2 = PVBOXVR_REG_FROM_ENTRY(pEntry2);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync const RTRECT *pRect2 = &pReg2->Rect;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!VBoxRectIsIntersect(&RegRect1, pRect2))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync continue;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pReg1)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!VBoxRectCmp(&pReg1->Rect, pRect2))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* no change, and we can break the iteration here */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* zero up the pReg1 to mark it as intersected (see the code after this inner loop) */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pReg1 = NULL;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync break;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* @todo: this can have false-alarming sometimes if the separated rects will then be joind into the original rect,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * so far this should not be a problem for VReg clients, so keep it this way for now */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync fChanged = true;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* re-use the reg entry */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrListRegRemove(pList, pReg1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxRectIntersect(&pReg1->Rect, pRect2);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(!VBoxRectIsZero(&pReg1->Rect));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrListRegAddOrder(pList, pMemberEntry, pReg1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pReg1 = NULL;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(fChanged); /* <- should be set by the if branch above */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_REG pReg = vboxVrRegCreate();
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!pReg)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync WARN(("vboxVrRegCreate failed!"));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VERR_NO_MEMORY;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxRectIntersected(&RegRect1, pRect2, &pReg->Rect);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(!VBoxRectIsZero(&pReg->Rect));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrListRegAddOrder(pList, pList->ListHead.pNext, pReg);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pReg1)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* the region has no intersections, remove it */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrListRegRemove(pList, pReg1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrRegTerm(pReg1);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync fChanged = true;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) VBoxVrListIntersect(PVBOXVR_LIST pList, const VBOXVR_LIST *pList2, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = vboxVrListIntersectNoJoin(pList, pList2, pfChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!RT_SUCCESS(rc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync WARN(("vboxVrListSubstNoJoin failed!"));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (*pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrListJoinRects(pList);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) VBoxVrListRectsIntersect(PVBOXVR_LIST pList, uint32_t cRects, const RTRECT * aRects, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (VBoxVrListIsEmpty(pList))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!cRects)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = true;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxVrListClear(pList);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* we perform intersection using lists because the algorythm axpects the rects to be non-intersected,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * which list guaranties to us */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBOXVR_LIST TmpList;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxVrListInit(&TmpList);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VBoxVrListRectsAdd(&TmpList, cRects, aRects, NULL);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_SUCCESS(rc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = VBoxVrListIntersect(pList, &TmpList, pfChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!RT_SUCCESS(rc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync WARN(("VBoxVrListIntersect failed! rc %d", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync WARN(("VBoxVrListRectsAdd failed, rc %d", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxVrListClear(&TmpList);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(int) VBoxVrListRectsSubst(PVBOXVR_LIST pList, uint32_t cRects, const RTRECT * aRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#if 0
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync const RTRECT * pRects = vboxVrRectsOrder(cRects, aRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("vboxVrRectsOrder failed!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_NO_MEMORY;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync bool fChanged = false;
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync int rc = vboxVrListSubstNoJoin(pList, cRects, aRects, &fChanged);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!RT_SUCCESS(rc))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("vboxVrListSubstNoJoin failed!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync goto done;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync if (fChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync goto done;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListJoinRects(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncdone:
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#if 0
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pRects != aRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTMemFree(pRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync if (pfChanged)
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync *pfChanged = fChanged;
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) VBoxVrListRectsSet(PVBOXVR_LIST pList, uint32_t cRects, const RTRECT * aRects, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!cRects && VBoxVrListIsEmpty(pList))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* @todo: fChanged will have false alarming here, fix if needed */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxVrListClear(pList);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VBoxVrListRectsAdd(pList, cRects, aRects, NULL);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!RT_SUCCESS(rc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync WARN(("VBoxVrListRectsSet failed rc %d", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = true;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(int) VBoxVrListRectsAdd(PVBOXVR_LIST pList, uint32_t cRects, const RTRECT * aRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t cCovered = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#if 0
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef DEBUG
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (uint32_t i = 0; i < cRects; ++i)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTRECT *pRectI = &aRects[i];
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (uint32_t j = i + 1; j < cRects; ++j)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTRECT *pRectJ = &aRects[j];
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(!VBoxRectIsIntersect(pRectI, pRectJ));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* early sort out the case when there are no new rects */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (uint32_t i = 0; i < cRects; ++i)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync if (VBoxRectIsZero(&aRects[i]))
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync {
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync cCovered++;
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync continue;
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync }
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry1 = pList->ListHead.pNext; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->pNext)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (VBoxRectIsCoveres(&pReg1->Rect, &aRects[i]))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync cCovered++;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (cCovered == cRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* rects are not covered, need to go the slow way */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync VBOXVR_LIST DiffList;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync VBoxVrListInit(&DiffList);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync RTRECT * pListRects = NULL;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t cAllocatedRects = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync bool fNeedRectreate = true;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync bool fChanged = false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (uint32_t i = 0; i < cRects; ++i)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync if (VBoxRectIsZero(&aRects[i]))
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync continue;
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg = vboxVrRegCreate();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pReg)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("vboxVrRegCreate failed!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = VERR_NO_MEMORY;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pReg->Rect = aRects[i];
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t cListRects = VBoxVrListRectsCount(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!cListRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegAdd(pList, pReg, &pList->ListHead, false);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync fChanged = true;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync continue;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(VBoxVrListIsEmpty(&DiffList));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListRegAdd(&DiffList, pReg, &DiffList.ListHead, false);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (cAllocatedRects < cListRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync cAllocatedRects = cListRects + cRects;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(fNeedRectreate);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pListRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTMemFree(pListRects);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync pListRects = (RTRECT *)RTMemAlloc(sizeof (RTRECT) * cAllocatedRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pListRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("RTMemAlloc failed!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = VERR_NO_MEMORY;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (fNeedRectreate)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = VBoxVrListRectsGet(pList, cListRects, pListRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(rc == VINF_SUCCESS);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync fNeedRectreate = false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync bool fDummyChanged = false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = vboxVrListSubstNoJoin(&DiffList, cListRects, pListRects, &fDummyChanged);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!RT_SUCCESS(rc))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("vboxVrListSubstNoJoin failed!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = VERR_NO_MEMORY;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!VBoxVrListIsEmpty(&DiffList))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListAddNonintersected(pList, &DiffList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync fNeedRectreate = true;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync fChanged = true;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(VBoxVrListIsEmpty(&DiffList));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pListRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTMemFree(pListRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(VBoxVrListIsEmpty(&DiffList) || rc != VINF_SUCCESS);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync VBoxVrListClear(&DiffList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (fChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync vboxVrListJoinRects(pList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = fChanged;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(int) VBoxVrListRectsGet(PVBOXVR_LIST pList, uint32_t cRects, RTRECT * aRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (cRects < VBoxVrListRectsCount(pList))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_BUFFER_OVERFLOW;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t i = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync for (PRTLISTNODE pEntry1 = pList->ListHead.pNext; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->pNext, ++i)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_REG pReg1 = PVBOXVR_REG_FROM_ENTRY(pEntry1);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync aRects[i] = pReg1->Rect;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) VBoxVrListCmp(const VBOXVR_LIST *pList1, const VBOXVR_LIST *pList2)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync{
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync int cTmp = pList1->cEntries - pList2->cEntries;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (cTmp)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync return cTmp;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync PVBOXVR_REG pReg1, pReg2;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync for (pReg1 = RTListNodeGetNext(&pList1->ListHead, VBOXVR_REG, ListEntry),
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync pReg2 = RTListNodeGetNext(&pList2->ListHead, VBOXVR_REG, ListEntry);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync !RTListNodeIsDummy(&pList1->ListHead, pReg1, VBOXVR_REG, ListEntry);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync pReg1 = RT_FROM_MEMBER(pReg1->ListEntry.pNext, VBOXVR_REG, ListEntry),
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync pReg2 = RT_FROM_MEMBER(pReg2->ListEntry.pNext, VBOXVR_REG, ListEntry))
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(!RTListNodeIsDummy(&pList2->ListHead, pReg2, VBOXVR_REG, ListEntry));
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync cTmp = VBoxRectCmp(&pReg1->Rect, &pReg2->Rect);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (cTmp)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync return cTmp;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync }
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(RTListNodeIsDummy(&pList2->ListHead, pReg2, VBOXVR_REG, ListEntry));
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync return 0;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync}
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) VBoxVrListClone(const VBOXVR_LIST *pList, VBOXVR_LIST *pDstList)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync VBoxVrListInit(pDstList);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync const VBOXVR_REG *pReg;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync RTListForEach(&pList->ListHead, pReg, const VBOXVR_REG, ListEntry)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync PVBOXVR_REG pDstReg = (PVBOXVR_REG)vboxVrRegLaAlloc(g_VBoxVrLookasideList);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!pDstReg)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("vboxVrRegLaAlloc failed"));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync VBoxVrListClear(pDstList);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return VERR_NO_MEMORY;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pDstReg->Rect = pReg->Rect;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync vboxVrListRegAdd(pDstList, pDstReg, &pDstList->ListHead, true /*bool fAfter*/);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync Assert(pDstList->cEntries == pList->cEntries);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return VINF_SUCCESS;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync}
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(void) VBoxVrCompositorInit(PVBOXVR_COMPOSITOR pCompositor, PFNVBOXVRCOMPOSITOR_ENTRY_REMOVED pfnEntryRemoved)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListInit(&pCompositor->List);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync pCompositor->pfnEntryRemoved = pfnEntryRemoved;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync}
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(void) VBoxVrCompositorRegionsClear(PVBOXVR_COMPOSITOR pCompositor, bool *pfChanged)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync bool fChanged = false;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync PVBOXVR_COMPOSITOR_ENTRY pEntry, pEntryNext;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync RTListForEachSafe(&pCompositor->List, pEntry, pEntryNext, VBOXVR_COMPOSITOR_ENTRY, Node)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync VBoxVrCompositorEntryRemove(pCompositor, pEntry);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync fChanged = true;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (pfChanged)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync *pfChanged = fChanged;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync}
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(void) VBoxVrCompositorClear(PVBOXVR_COMPOSITOR pCompositor)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync VBoxVrCompositorRegionsClear(pCompositor, NULL);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
8238dbee2b0c21592e6af0fafcdb2e56cf3a791cvboxsyncDECLINLINE(void) vboxVrCompositorEntryAdd(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListPrepend(&pCompositor->List, &pEntry->Node);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
8238dbee2b0c21592e6af0fafcdb2e56cf3a791cvboxsyncDECLINLINE(void) vboxVrCompositorEntryRemove(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, PVBOXVR_COMPOSITOR_ENTRY pReplacingEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListNodeRemove(&pEntry->Node);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (pCompositor->pfnEntryRemoved)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync pCompositor->pfnEntryRemoved(pCompositor, pEntry, pReplacingEntry);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(void) VBoxVrCompositorEntryInit(PVBOXVR_COMPOSITOR_ENTRY pEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync VBoxVrListInit(&pEntry->Vr);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(bool) VBoxVrCompositorEntryRemove(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!VBoxVrCompositorEntryIsInList(pEntry))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync VBoxVrListClear(&pEntry->Vr);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync vboxVrCompositorEntryRemove(pCompositor, pEntry, NULL);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return true;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncstatic int vboxVrCompositorEntryRegionsSubst(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, uint32_t cRects, const RTRECT * paRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync bool fChanged;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = VBoxVrListRectsSubst(&pEntry->Vr, cRects, paRects, &fChanged);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (RT_SUCCESS(rc))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (VBoxVrListIsEmpty(&pEntry->Vr))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(fChanged);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync vboxVrCompositorEntryRemove(pCompositor, pEntry, NULL);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pfChanged = false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("VBoxVrListRectsSubst failed, rc %d", rc));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsAdd(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, uint32_t cRects, const RTRECT *paRects, PVBOXVR_COMPOSITOR_ENTRY *ppReplacedEntry, uint32_t *pfChangeFlags)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fOthersChanged = false, fCurChanged = false, fEntryChanged = false, fEntryWasInList = false, fEntryReplaced = false;
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync PVBOXVR_COMPOSITOR_ENTRY pCur, pNext;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync int rc = VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!cRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (pfChangeFlags)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync *pfChangeFlags = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (pEntry)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync fEntryWasInList = VBoxVrCompositorEntryIsInList(pEntry);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync rc = VBoxVrListRectsAdd(&pEntry->Vr, cRects, paRects, &fEntryChanged);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (RT_SUCCESS(rc))
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (VBoxVrListIsEmpty(&pEntry->Vr))
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync {
9333def4f76dd01eea8300d59512d421200e5db7vboxsync// WARN(("Empty rectangles passed in, is it expected?"));
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (pfChangeFlags)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync *pfChangeFlags = 0;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync return VINF_SUCCESS;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync }
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync }
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync else
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync WARN(("VBoxVrListRectsAdd failed, rc %d", rc));
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync return rc;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync }
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(!VBoxVrListIsEmpty(&pEntry->Vr));
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync }
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync else
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync {
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync fEntryChanged = true;
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync }
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync RTListForEachSafe(&pCompositor->List, pCur, pNext, VBOXVR_COMPOSITOR_ENTRY, Node)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(!VBoxVrListIsEmpty(&pCur->Vr));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pCur == pEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(fEntryWasInList);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (pEntry && !VBoxVrListCmp(&pCur->Vr, &pEntry->Vr))
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync VBoxVrListClear(&pCur->Vr);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync vboxVrCompositorEntryRemove(pCompositor, pCur, pEntry);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (ppReplacedEntry)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync *ppReplacedEntry = pCur;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync fEntryReplaced = true;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync break;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync rc = vboxVrCompositorEntryRegionsSubst(pCompositor, pCur, cRects, paRects, &fCurChanged);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (RT_SUCCESS(rc))
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync fOthersChanged |= fCurChanged;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync else
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync WARN(("vboxVrCompositorEntryRegionsSubst failed, rc %d", rc));
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync return rc;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync AssertRC(rc);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pEntry && !fEntryWasInList)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(!VBoxVrListIsEmpty(&pEntry->Vr));
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync vboxVrCompositorEntryAdd(pCompositor, pEntry);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync }
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (pfChangeFlags)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync uint32_t fFlags = 0;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync if (fOthersChanged)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_OTHER_ENTRIES_REGIONS_CHANGED;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else if (fEntryReplaced)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(fEntryChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync else if (fEntryChanged)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!fEntryWasInList)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(fEntryChanged);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync *pfChangeFlags = fFlags;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsSubst(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, uint32_t cRects, const RTRECT * paRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("VBoxVrCompositorEntryRegionsSubst called with zero entry, unsupported!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pfChanged = false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (VBoxVrListIsEmpty(&pEntry->Vr))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pfChanged = false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync int rc = vboxVrCompositorEntryRegionsSubst(pCompositor, pEntry, cRects, paRects, pfChanged);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (RT_SUCCESS(rc))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("pfChanged failed, rc %d", rc));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsSet(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, uint32_t cRects, const RTRECT *paRects, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("VBoxVrCompositorEntryRegionsSet called with zero entry, unsupported!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pfChanged = false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync bool fChanged = false, fCurChanged = false;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync uint32_t fChangeFlags = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync fCurChanged = VBoxVrCompositorEntryRemove(pCompositor, pEntry);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync fChanged |= fCurChanged;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync rc = VBoxVrCompositorEntryRegionsAdd(pCompositor, pEntry, cRects, paRects, NULL, &fChangeFlags);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (RT_SUCCESS(rc))
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync fChanged |= !!fChangeFlags;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("VBoxVrCompositorEntryRegionsAdd failed, rc %d", rc));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync AssertRC(rc);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pfChanged = fChanged;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryListIntersect(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, const VBOXVR_LIST *pList2, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (VBoxVrCompositorEntryIsInList(pEntry))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = VBoxVrListIntersect(&pEntry->Vr, pList2, &fChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_SUCCESS(rc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (VBoxVrListIsEmpty(&pEntry->Vr))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(fChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrCompositorEntryRemove(pCompositor, pEntry, NULL);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync WARN(("VBoxVrListRectsIntersect failed, rc %d", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsIntersect(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, uint32_t cRects, const RTRECT *paRects, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (VBoxVrCompositorEntryIsInList(pEntry))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = VBoxVrListRectsIntersect(&pEntry->Vr, cRects, paRects, &fChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_SUCCESS(rc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (VBoxVrListIsEmpty(&pEntry->Vr))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(fChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync vboxVrCompositorEntryRemove(pCompositor, pEntry, NULL);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync WARN(("VBoxVrListRectsIntersect failed, rc %d", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryListIntersectAll(PVBOXVR_COMPOSITOR pCompositor, const VBOXVR_LIST *pList2, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBOXVR_COMPOSITOR_ITERATOR Iter;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxVrCompositorIterInit(pCompositor, &Iter);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_COMPOSITOR_ENTRY pEntry;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync while ((pEntry = VBoxVrCompositorIterNext(&Iter)) != NULL)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fTmpChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int tmpRc = VBoxVrCompositorEntryListIntersect(pCompositor, pEntry, pList2, &fTmpChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_SUCCESS(tmpRc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync fChanged |= fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("VBoxVrCompositorEntryRegionsIntersect failed, rc %d", tmpRc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = tmpRc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsIntersectAll(PVBOXVR_COMPOSITOR pCompositor, uint32_t cRegions, const RTRECT *paRegions, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBOXVR_COMPOSITOR_ITERATOR Iter;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBoxVrCompositorIterInit(pCompositor, &Iter);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_COMPOSITOR_ENTRY pEntry;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync while ((pEntry = VBoxVrCompositorIterNext(&Iter)) != NULL)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fTmpChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int tmpRc = VBoxVrCompositorEntryRegionsIntersect(pCompositor, pEntry, cRegions, paRegions, &fTmpChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_SUCCESS(tmpRc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync fChanged |= fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("VBoxVrCompositorEntryRegionsIntersect failed, rc %d", tmpRc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = tmpRc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(int) VBoxVrCompositorEntryRegionsTranslate(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, int32_t x, int32_t y, bool *pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("VBoxVrCompositorEntryRegionsTranslate called with zero entry, unsupported!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pfChanged = false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if ((!x && !y)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync || !VBoxVrCompositorEntryIsInList(pEntry))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pfChanged = false;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync VBoxVrListTranslate(&pEntry->Vr, x, y);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(!VBoxVrListIsEmpty(&pEntry->Vr));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_COMPOSITOR_ENTRY pCur;
a61d11f3152f6e51d5210d4d38be612a60131c06vboxsync uint32_t cRects = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTRECT *paRects = NULL;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTListForEach(&pCompositor->List, pCur, VBOXVR_COMPOSITOR_ENTRY, Node)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(!VBoxVrListIsEmpty(&pCur->Vr));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pCur == pEntry)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync continue;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!paRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync cRects = VBoxVrListRectsCount(&pEntry->Vr);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(cRects);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync paRects = (RTRECT*)RTMemAlloc(cRects * sizeof (RTRECT));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!paRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("RTMemAlloc failed!"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = VERR_NO_MEMORY;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = VBoxVrListRectsGet(&pEntry->Vr, cRects, paRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!RT_SUCCESS(rc))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("VBoxVrListRectsGet failed! rc %d", rc));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync rc = vboxVrCompositorEntryRegionsSubst(pCompositor, pCur, cRects, paRects, NULL);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!RT_SUCCESS(rc))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync WARN(("vboxVrCompositorEntryRegionsSubst failed! rc %d", rc));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync break;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pfChanged)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pfChanged = true;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (paRects)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTMemFree(paRects);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncVBOXVREGDECL(void) VBoxVrCompositorVisit(PVBOXVR_COMPOSITOR pCompositor, PFNVBOXVRCOMPOSITOR_VISITOR pfnVisitor, void *pvVisitor)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PVBOXVR_COMPOSITOR_ENTRY pEntry, pEntryNext;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync RTListForEachSafe(&pCompositor->List, pEntry, pEntryNext, VBOXVR_COMPOSITOR_ENTRY, Node)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pfnVisitor(pCompositor, pEntry, pvVisitor))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync#define VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED UINT32_MAX
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic int crVrScrCompositorRectsAssignBuffer(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t cRects)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(cRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pCompositor->cRectsBuffer >= cRects)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pCompositor->cRects = cRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pCompositor->cRectsBuffer)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(pCompositor->paSrcRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync RTMemFree(pCompositor->paSrcRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->paSrcRects = NULL;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(pCompositor->paDstRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync RTMemFree(pCompositor->paDstRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->paDstRects = NULL;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync Assert(pCompositor->paDstUnstretchedRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync RTMemFree(pCompositor->paDstUnstretchedRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->paDstUnstretchedRects = NULL;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync else
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync Assert(!pCompositor->paSrcRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync Assert(!pCompositor->paDstRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync Assert(!pCompositor->paDstUnstretchedRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pCompositor->paSrcRects = (PRTRECT)RTMemAlloc(sizeof (*pCompositor->paSrcRects) * cRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pCompositor->paSrcRects)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pCompositor->paDstRects = (PRTRECT)RTMemAlloc(sizeof (*pCompositor->paDstRects) * cRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pCompositor->paDstRects)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->paDstUnstretchedRects = (PRTRECT)RTMemAlloc(sizeof (*pCompositor->paDstUnstretchedRects) * cRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (pCompositor->paDstUnstretchedRects)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->cRects = cRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->cRectsBuffer = cRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return VINF_SUCCESS;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync RTMemFree(pCompositor->paDstRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->paDstRects = NULL;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync else
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("RTMemAlloc failed!"));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync RTMemFree(pCompositor->paSrcRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->paSrcRects = NULL;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync else
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("RTMemAlloc failed!"));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pCompositor->cRects = VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pCompositor->cRectsBuffer = 0;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VERR_NO_MEMORY;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic void crVrScrCompositorRectsInvalidate(PVBOXVR_SCR_COMPOSITOR pCompositor)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pCompositor->cRects = VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic DECLCALLBACK(bool) crVrScrCompositorRectsCounterCb(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, void *pvVisitor)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync uint32_t* pCounter = (uint32_t*)pvVisitor;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(VBoxVrListRectsCount(&pEntry->Vr));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync *pCounter += VBoxVrListRectsCount(&pEntry->Vr);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return true;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsynctypedef struct VBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PRTRECT paSrcRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PRTRECT paDstRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync PRTRECT paDstUnstretchedRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync uint32_t cRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync} VBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER, *PVBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic DECLCALLBACK(bool) crVrScrCompositorRectsAssignerCb(PVBOXVR_COMPOSITOR pCCompositor, PVBOXVR_COMPOSITOR_ENTRY pCEntry, void *pvVisitor)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PVBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER pData = (PVBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER)pvVisitor;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PVBOXVR_SCR_COMPOSITOR pCompositor = VBOXVR_SCR_COMPOSITOR_FROM_COMPOSITOR(pCCompositor);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pCEntry);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pEntry->paSrcRects = pData->paSrcRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pEntry->paDstRects = pData->paDstRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->paDstUnstretchedRects = pData->paDstUnstretchedRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync uint32_t cRects = VBoxVrListRectsCount(&pCEntry->Vr);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(cRects);
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync Assert(cRects <= pData->cRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int rc = VBoxVrListRectsGet(&pCEntry->Vr, cRects, pEntry->paDstRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync AssertRC(rc);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync memcpy(pEntry->paDstUnstretchedRects, pEntry->paDstRects, cRects * sizeof (*pEntry->paDstUnstretchedRects));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!pEntry->Pos.x && !pEntry->Pos.y)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync memcpy(pEntry->paSrcRects, pEntry->paDstRects, cRects * sizeof (*pEntry->paSrcRects));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync else
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync for (uint32_t i = 0; i < cRects; ++i)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pEntry->paSrcRects[i].xLeft = (int32_t)((pEntry->paDstRects[i].xLeft - pEntry->Pos.x));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pEntry->paSrcRects[i].yTop = (int32_t)((pEntry->paDstRects[i].yTop - pEntry->Pos.y));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pEntry->paSrcRects[i].xRight = (int32_t)((pEntry->paDstRects[i].xRight - pEntry->Pos.x));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pEntry->paSrcRects[i].yBottom = (int32_t)((pEntry->paDstRects[i].yBottom - pEntry->Pos.y));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifndef IN_RING0
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (pCompositor->StretchX != 1. || pCompositor->StretchY != 1.)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync for (uint32_t i = 0; i < cRects; ++i)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pCompositor->StretchX != 1.)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->paDstRects[i].xLeft = (int32_t)(pEntry->paDstRects[i].xLeft * pCompositor->StretchX);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->paDstRects[i].xRight = (int32_t)(pEntry->paDstRects[i].xRight * pCompositor->StretchX);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pCompositor->StretchY != 1.)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->paDstRects[i].yTop = (int32_t)(pEntry->paDstRects[i].yTop * pCompositor->StretchY);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->paDstRects[i].yBottom = (int32_t)(pEntry->paDstRects[i].yBottom * pCompositor->StretchY);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync bool canZeroX = (pCompositor->StretchX < 1.);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync bool canZeroY = (pCompositor->StretchY < 1.);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (canZeroX && canZeroY)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync /* filter out zero rectangles*/
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync uint32_t iOrig, iNew;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync for (iOrig = 0, iNew = 0; iOrig < cRects; ++iOrig)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync PRTRECT pOrigRect = &pEntry->paSrcRects[iOrig];
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (pOrigRect->xLeft == pOrigRect->xRight
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync || pOrigRect->yTop == pOrigRect->yBottom)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync continue;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (iNew != iOrig)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync PRTRECT pNewRect = &pEntry->paSrcRects[iNew];
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync *pNewRect = *pOrigRect;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync ++iNew;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync Assert(iNew <= iOrig);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync uint32_t cDiff = iOrig - iNew;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (cDiff)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->cRects -= cDiff;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync cRects -= cDiff;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync#endif
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pEntry->cRects = cRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pData->paDstRects += cRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pData->paSrcRects += cRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pData->paDstUnstretchedRects += cRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pData->cRects -= cRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return true;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic int crVrScrCompositorRectsCheckInit(PVBOXVR_SCR_COMPOSITOR pCompositor)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pCompositor->cRects != VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync uint32_t cRects = 0;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorRectsCounterCb, &cRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!cRects)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pCompositor->cRects = 0;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int rc = crVrScrCompositorRectsAssignBuffer(pCompositor, cRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync VBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER AssignerData;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync AssignerData.paSrcRects = pCompositor->paSrcRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync AssignerData.paDstRects = pCompositor->paDstRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync AssignerData.paDstUnstretchedRects = pCompositor->paDstUnstretchedRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync AssignerData.cRects = pCompositor->cRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorRectsAssignerCb, &AssignerData);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(!AssignerData.cRects);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic int crVrScrCompositorEntryRegionsAdd(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t cRegions, const RTRECT *paRegions, uint32_t *pfChangedFlags)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync uint32_t fChangedFlags = 0;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync PVBOXVR_COMPOSITOR_ENTRY pReplacedEntry;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync int rc = VBoxVrCompositorEntryRegionsAdd(&pCompositor->Compositor, pEntry ? &pEntry->Ce : NULL, cRegions, paRegions, &pReplacedEntry, &fChangedFlags);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("VBoxVrCompositorEntryRegionsAdd failed, rc %d", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync VBOXVR_SCR_COMPOSITOR_ENTRY *pReplacedScrEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pReplacedEntry);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (fChangedFlags & VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync else if (fChangedFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync Assert(!CrVrScrCompositorEntryIsInList(pReplacedScrEntry));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync Assert(CrVrScrCompositorEntryIsInList(pEntry));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->cRects = pReplacedScrEntry->cRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->paSrcRects = pReplacedScrEntry->paSrcRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->paDstRects = pReplacedScrEntry->paDstRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->paDstUnstretchedRects = pReplacedScrEntry->paDstUnstretchedRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (fChangedFlags & VBOXVR_COMPOSITOR_CF_OTHER_ENTRIES_REGIONS_CHANGED)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorEntrySetAllChanged(pCompositor, true);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync else if ((fChangedFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED) && pEntry)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChangedFlags)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChangedFlags = fChangedFlags;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic int crVrScrCompositorEntryRegionsSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t cRegions, const RTRECT *paRegions, bool *pfChanged)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync bool fChanged;
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync CrVrScrCompositorEntryIsInList(pEntry);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int rc = VBoxVrCompositorEntryRegionsSet(&pCompositor->Compositor, &pEntry->Ce, cRegions, paRegions, &fChanged);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("VBoxVrCompositorEntryRegionsSet failed, rc %d", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (fChanged)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorEntrySetAllChanged(pCompositor, true);
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync if (!CrVrScrCompositorEntryIsInList(pEntry))
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync {
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync pEntry->cRects = 0;
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync pEntry->paSrcRects = NULL;
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync pEntry->paDstRects = NULL;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->paDstUnstretchedRects = NULL;
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pfChanged)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync *pfChanged = fChanged;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic int crVrScrCompositorEntryPositionSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos, bool *pfChanged)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync if (pfChanged)
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync *pfChanged = false;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pEntry && (pEntry->Pos.x != pPos->x || pEntry->Pos.y != pPos->y))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (VBoxVrCompositorEntryIsInList(&pEntry->Ce))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync int rc = VBoxVrCompositorEntryRegionsTranslate(&pCompositor->Compositor, &pEntry->Ce, pPos->x - pEntry->Pos.x, pPos->y - pEntry->Pos.y, pfChanged);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!RT_SUCCESS(rc))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("VBoxVrCompositorEntryRegionsTranslate failed rc %d", rc));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return rc;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pEntry->Pos = *pPos;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync if (pfChanged)
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync *pfChanged = true;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncstatic int crVrScrCompositorEntryEnsureRegionsInTex(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, bool *pfChanged)
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync{
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync RTRECT Rect;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync Rect.xLeft = pEntry->Pos.x;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync Rect.yTop = pEntry->Pos.y;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync Rect.xRight = pEntry->Pos.x + pEntry->Tex.width;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync Rect.yBottom = pEntry->Pos.y + pEntry->Tex.height;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync bool fChanged = false;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (pfChanged)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync *pfChanged = false;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync int rc = CrVrScrCompositorEntryRegionsIntersect(pCompositor, pEntry, 1, &Rect, &fChanged);
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync if (!RT_SUCCESS(rc))
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("CrVrScrCompositorEntryRegionsIntersect failed, rc %d", rc));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (fChanged)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync crVrScrCompositorRectsInvalidate(pCompositor);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (pfChanged)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync *pfChanged = fChanged;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync return rc;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync}
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRegionsAdd(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions, bool fPosRelated, uint32_t *pfChangeFlags)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync uint32_t fChangeFlags = 0;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fPosChanged = false;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync RTRECT *paTranslatedRects = NULL;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pPos)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = crVrScrCompositorEntryPositionSet(pCompositor, pEntry, pPos, &fPosChanged);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("RegionsAdd: crVrScrCompositorEntryPositionSet failed rc %d", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (fPosRelated)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!pEntry)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("Entry is expected to be specified for pos-related regions"));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return VERR_INVALID_PARAMETER;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (cRegions && (pEntry->Pos.x || pEntry->Pos.y))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync paTranslatedRects = (RTRECT*)RTMemAlloc(sizeof (RTRECT) * cRegions);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!paTranslatedRects)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("RTMemAlloc failed"));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return VERR_NO_MEMORY;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync memcpy (paTranslatedRects, paRegions, sizeof (RTRECT) * cRegions);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync for (uint32_t i = 0; i < cRegions; ++i)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync VBoxRectTranslate(&paTranslatedRects[i], pEntry->Pos.x, pEntry->Pos.y);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync paRegions = paTranslatedRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = crVrScrCompositorEntryRegionsAdd(pCompositor, pEntry, cRegions, paRegions, &fChangeFlags);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("crVrScrCompositorEntryRegionsAdd failed, rc %d", rc));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync goto done;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync if ((fPosChanged || (fChangeFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED)) && pEntry)
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync bool fAdjusted = false;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync rc = crVrScrCompositorEntryEnsureRegionsInTex(pCompositor, pEntry, &fAdjusted);
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync if (!RT_SUCCESS(rc))
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("crVrScrCompositorEntryEnsureRegionsInTex failed, rc %d", rc));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync goto done;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (fAdjusted)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync fChangeFlags &= ~VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync fChangeFlags |= VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync }
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync }
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (fChangeFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync fPosChanged = false;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChangeFlags)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (fPosChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* means entry was in list and was moved, so regions changed */
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync *pfChangeFlags = VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_OTHER_ENTRIES_REGIONS_CHANGED;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChangeFlags = fChangeFlags;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncdone:
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (paTranslatedRects)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync RTMemFree(paTranslatedRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
1ede9a25697f3a01a4362525e84330a7940b508fvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryTexUpdate(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const VBOXVR_TEXTURE *pTex)
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync{
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync bool fCompositorChanged = CrVrScrCompositorEntryIsUsed(pEntry) && (pEntry->Tex.width != pTex->width || pEntry->Tex.height != pTex->height);
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync pEntry->Tex = *pTex;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync if (fCompositorChanged)
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync int rc = crVrScrCompositorEntryEnsureRegionsInTex(pCompositor, pEntry, NULL);
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync if (!RT_SUCCESS(rc))
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("crVrScrCompositorEntryEnsureRegionsInTex failed rc %d", rc));
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync return rc;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync }
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync }
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync return VINF_SUCCESS;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync}
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRegionsSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions, bool fPosRelated, bool *pfChanged)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync /* @todo: the fChanged sate calculation is really rough now, this is enough for now though */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fChanged = false, fPosChanged = false;
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync bool fWasInList = CrVrScrCompositorEntryIsInList(pEntry);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync RTRECT *paTranslatedRects = NULL;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int rc = CrVrScrCompositorEntryRemove(pCompositor, pEntry);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("RegionsSet: CrVrScrCompositorEntryRemove failed rc %d", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pPos)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = crVrScrCompositorEntryPositionSet(pCompositor, pEntry, pPos, &fPosChanged);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("RegionsSet: crVrScrCompositorEntryPositionSet failed rc %d", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (fPosRelated)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!pEntry)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("Entry is expected to be specified for pos-related regions"));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return VERR_INVALID_PARAMETER;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (cRegions && (pEntry->Pos.x || pEntry->Pos.y))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync paTranslatedRects = (RTRECT*)RTMemAlloc(sizeof (RTRECT) * cRegions);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!paTranslatedRects)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("RTMemAlloc failed"));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return VERR_NO_MEMORY;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync memcpy (paTranslatedRects, paRegions, sizeof (RTRECT) * cRegions);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync for (uint32_t i = 0; i < cRegions; ++i)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync VBoxRectTranslate(&paTranslatedRects[i], pEntry->Pos.x, pEntry->Pos.y);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync paRegions = paTranslatedRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = crVrScrCompositorEntryRegionsSet(pCompositor, pEntry, cRegions, paRegions, &fChanged);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("crVrScrCompositorEntryRegionsSet failed, rc %d", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync if (fChanged && CrVrScrCompositorEntryIsUsed(pEntry))
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync rc = crVrScrCompositorEntryEnsureRegionsInTex(pCompositor, pEntry, NULL);
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync if (!RT_SUCCESS(rc))
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("crVrScrCompositorEntryEnsureRegionsInTex failed, rc %d", rc));
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync return rc;
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync }
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync }
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync *pfChanged = fPosChanged || fChanged || fWasInList;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryListIntersect(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const VBOXVR_LIST *pList2, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VBoxVrCompositorEntryListIntersect(&pCompositor->Compositor, &pEntry->Ce, pList2, &fChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!RT_SUCCESS(rc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("RegionsIntersect: VBoxVrCompositorEntryRegionsIntersect failed rc %d", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (fChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync crVrScrCompositorRectsInvalidate(pCompositor);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRegionsIntersect(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t cRegions, const RTRECT *paRegions, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VBoxVrCompositorEntryRegionsIntersect(&pCompositor->Compositor, &pEntry->Ce, cRegions, paRegions, &fChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!RT_SUCCESS(rc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("RegionsIntersect: VBoxVrCompositorEntryRegionsIntersect failed rc %d", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (fChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync crVrScrCompositorRectsInvalidate(pCompositor);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryListIntersectAll(PVBOXVR_SCR_COMPOSITOR pCompositor, const VBOXVR_LIST *pList2, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR Iter;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync CrVrScrCompositorIterInit(pCompositor, &Iter);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync while ((pEntry = CrVrScrCompositorIterNext(&Iter)) != NULL)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fTmpChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int tmpRc = CrVrScrCompositorEntryListIntersect(pCompositor, pEntry, pList2, &fTmpChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_SUCCESS(tmpRc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync fChanged |= fTmpChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("CrVrScrCompositorEntryRegionsIntersect failed, rc %d", tmpRc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = tmpRc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRegionsIntersectAll(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t cRegions, const RTRECT *paRegions, bool *pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR Iter;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync CrVrScrCompositorIterInit(pCompositor, &Iter);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync while ((pEntry = CrVrScrCompositorIterNext(&Iter)) != NULL)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync bool fTmpChanged = false;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int tmpRc = CrVrScrCompositorEntryRegionsIntersect(pCompositor, pEntry, cRegions, paRegions, &fTmpChanged);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_SUCCESS(tmpRc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync fChanged |= fTmpChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("CrVrScrCompositorEntryRegionsIntersect failed, rc %d", tmpRc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = tmpRc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (pfChanged)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pfChanged = fChanged;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryPosSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int rc = crVrScrCompositorEntryPositionSet(pCompositor, pEntry, pPos, NULL);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("RegionsSet: crVrScrCompositorEntryPositionSet failed rc %d", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync/* regions are valid until the next CrVrScrCompositor call */
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRegionsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int rc = crVrScrCompositorRectsCheckInit(pCompositor);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("crVrScrCompositorRectsCheckInit failed, rc %d", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(pCompositor->cRects != VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync *pcRegions = pEntry->cRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (ppaSrcRegions)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync *ppaSrcRegions = pEntry->paSrcRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (ppaDstRegions)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync *ppaDstRegions = pEntry->paDstRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (ppaDstUnstretchedRects)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync *ppaDstUnstretchedRects = pEntry->paDstUnstretchedRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(uint32_t) CrVrScrCompositorEntryFlagsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return CRBLT_FOP_COMBINE(pCompositor->fFlags, pEntry->fFlags);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync}
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(void) CrVrScrCompositorEntryFlagsSet(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t fFlags)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (pEntry->fFlags == fFlags)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->fFlags = fFlags;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync}
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRemove(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!VBoxVrCompositorEntryRemove(&pCompositor->Compositor, &pEntry->Ce))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync pEntry->cRects = 0;
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync pEntry->paSrcRects = NULL;
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync pEntry->paDstRects = NULL;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pEntry->paDstUnstretchedRects = NULL;
5060d2375aca9a234bf38465a6502e9eb454a2c5vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(void) CrVrScrCompositorInit(PVBOXVR_SCR_COMPOSITOR pCompositor)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync memset(pCompositor, 0, sizeof (*pCompositor));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxVrCompositorInit(&pCompositor->Compositor, NULL);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->fFlags = CRBLT_F_LINEAR | CRBLT_F_INVERT_YCOORDS;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifndef IN_RING0
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pCompositor->StretchX = 1.0;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pCompositor->StretchY = 1.0;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(void) CrVrScrCompositorRegionsClear(PVBOXVR_SCR_COMPOSITOR pCompositor, bool *pfChanged)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync /* set changed flag first, while entries are in the list and we have them */
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorEntrySetAllChanged(pCompositor, true);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync VBoxVrCompositorRegionsClear(&pCompositor->Compositor, pfChanged);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync crVrScrCompositorRectsInvalidate(pCompositor);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync}
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(void) CrVrScrCompositorClear(PVBOXVR_SCR_COMPOSITOR pCompositor)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorRegionsClear(pCompositor, NULL);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pCompositor->paDstRects)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync RTMemFree(pCompositor->paDstRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->paDstRects = NULL;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pCompositor->paSrcRects)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync RTMemFree(pCompositor->paSrcRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->paSrcRects = NULL;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (pCompositor->paDstUnstretchedRects)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync RTMemFree(pCompositor->paDstUnstretchedRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->paDstUnstretchedRects = NULL;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->cRects = 0;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync pCompositor->cRectsBuffer = 0;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncVBOXVREGDECL(void) CrVrScrCompositorEntrySetAllChanged(PVBOXVR_SCR_COMPOSITOR pCompositor, bool fChanged)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR CIter;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pCurEntry;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorIterInit(pCompositor, &CIter);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync while ((pCurEntry = CrVrScrCompositorIterNext(&CIter)) != NULL)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorEntrySetChanged(pCurEntry, fChanged);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifndef IN_RING0
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncVBOXVREGDECL(void) CrVrScrCompositorSetStretching(PVBOXVR_SCR_COMPOSITOR pCompositor, float StretchX, float StretchY)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (pCompositor->StretchX == StretchX && pCompositor->StretchY == StretchY)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pCompositor->StretchX = StretchX;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pCompositor->StretchY = StretchY;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync CrVrScrCompositorEntrySetAllChanged(pCompositor, true);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync/* regions are valid until the next CrVrScrCompositor call */
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) CrVrScrCompositorRegionsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int rc = crVrScrCompositorRectsCheckInit(pCompositor);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
1ede9a25697f3a01a4362525e84330a7940b508fvboxsync WARN(("crVrScrCompositorRectsCheckInit failed, rc %d", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return rc;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(pCompositor->cRects != VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync *pcRegions = pCompositor->cRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (ppaSrcRegions)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync *ppaSrcRegions = pCompositor->paSrcRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (ppaDstRegions)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync *ppaDstRegions = pCompositor->paDstRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (ppaDstUnstretchedRects)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync *ppaDstUnstretchedRects = pCompositor->paDstUnstretchedRects;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return VINF_SUCCESS;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsynctypedef struct VBOXVR_SCR_COMPOSITOR_VISITOR_CB
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PFNVBOXVRSCRCOMPOSITOR_VISITOR pfnVisitor;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync void *pvVisitor;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync} VBOXVR_SCR_COMPOSITOR_VISITOR_CB, *PVBOXVR_SCR_COMPOSITOR_VISITOR_CB;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic DECLCALLBACK(bool) crVrScrCompositorVisitCb(PVBOXVR_COMPOSITOR pCCompositor, PVBOXVR_COMPOSITOR_ENTRY pCEntry, void *pvVisitor)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PVBOXVR_SCR_COMPOSITOR_VISITOR_CB pData = (PVBOXVR_SCR_COMPOSITOR_VISITOR_CB)pvVisitor;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PVBOXVR_SCR_COMPOSITOR pCompositor = VBOXVR_SCR_COMPOSITOR_FROM_COMPOSITOR(pCCompositor);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pCEntry);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return pData->pfnVisitor(pCompositor, pEntry, pData->pvVisitor);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncVBOXVREGDECL(void) CrVrScrCompositorVisit(PVBOXVR_SCR_COMPOSITOR pCompositor, PFNVBOXVRSCRCOMPOSITOR_VISITOR pfnVisitor, void *pvVisitor)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync VBOXVR_SCR_COMPOSITOR_VISITOR_CB Data;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Data.pfnVisitor = pfnVisitor;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Data.pvVisitor = pvVisitor;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorVisitCb, &Data);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) CrVrScrCompositorClone(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync /* for simplicity just copy from one to another */
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorInit(pDstCompositor);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR CIter;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorIterInit(pCompositor, &CIter);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync int rc = VINF_SUCCESS;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync uint32_t cRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync const RTRECT *pRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync while ((pEntry = CrVrScrCompositorIterNext(&CIter)) != NULL)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync /* get source rects, that will be non-stretched and entry pos - pased */
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync rc = CrVrScrCompositorEntryRegionsGet(pCompositor, pEntry, &cRects, NULL, NULL, &pRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!RT_SUCCESS(rc))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("CrVrScrCompositorEntryRegionsGet failed, rc %d", rc));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return rc;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pDstEntry = pfnEntryFor(pEntry, pvEntryFor);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!pDstEntry)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("pfnEntryFor failed"));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return VERR_INVALID_STATE;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync rc = CrVrScrCompositorEntryRegionsSet(pDstCompositor, pDstEntry, CrVrScrCompositorEntryPosGet(pEntry), cRects, pRects, false, NULL);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!RT_SUCCESS(rc))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync crWarning("CrVrScrCompositorEntryRegionsSet failed, rc %d", rc);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return rc;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return rc;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync}
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) CrVrScrCompositorIntersectList(PVBOXVR_SCR_COMPOSITOR pCompositor, const VBOXVR_LIST *pVr, bool *pfChanged)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR CIter;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorIterInit(pCompositor, &CIter);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync int rc = VINF_SUCCESS;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync uint32_t cRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync const RTRECT *pRects;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync bool fChanged = false;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync while ((pEntry = CrVrScrCompositorIterNext(&CIter)) != NULL)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync bool fCurChanged = false;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync /* get source rects, that will be non-stretched and entry pos - pased */
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync rc = CrVrScrCompositorEntryRegionsGet(pCompositor, pEntry, &cRects, NULL, NULL, &pRects);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!RT_SUCCESS(rc))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("CrVrScrCompositorEntryRegionsGet failed, rc %d", rc));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync break;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync rc = CrVrScrCompositorEntryListIntersect(pCompositor, pEntry, pVr, &fCurChanged);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!RT_SUCCESS(rc))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync crWarning("CrVrScrCompositorEntryRegionsSet failed, rc %d", rc);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync break;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync fChanged |= fCurChanged;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (pfChanged)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync *pfChanged = fChanged;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return rc;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync}
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncVBOXVREGDECL(int) CrVrScrCompositorIntersectedList(PVBOXVR_SCR_COMPOSITOR pCompositor, const VBOXVR_LIST *pVr, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor, bool *pfChanged)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync int rc = CrVrScrCompositorClone(pCompositor, pDstCompositor, pfnEntryFor, pvEntryFor);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!RT_SUCCESS(rc))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("CrVrScrCompositorClone failed, rc %d", rc));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return rc;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync rc = CrVrScrCompositorIntersectList(pDstCompositor, pVr, pfChanged);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!RT_SUCCESS(rc))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("CrVrScrCompositorIntersectList failed, rc %d", rc));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync CrVrScrCompositorClear(pDstCompositor);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return rc;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return VINF_SUCCESS;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync}