03ae9c5414af053ec289804dc035ab639689bc32vboxsync/* $Id$ */
03ae9c5414af053ec289804dc035ab639689bc32vboxsync/** @file
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync * Compositor implementation.
03ae9c5414af053ec289804dc035ab639689bc32vboxsync */
03ae9c5414af053ec289804dc035ab639689bc32vboxsync
03ae9c5414af053ec289804dc035ab639689bc32vboxsync/*
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync * Copyright (C) 2013-2014 Oracle Corporation
03ae9c5414af053ec289804dc035ab639689bc32vboxsync *
03ae9c5414af053ec289804dc035ab639689bc32vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
03ae9c5414af053ec289804dc035ab639689bc32vboxsync * available from http://www.virtualbox.org. This file is free software;
03ae9c5414af053ec289804dc035ab639689bc32vboxsync * you can redistribute it and/or modify it under the terms of the GNU
03ae9c5414af053ec289804dc035ab639689bc32vboxsync * General Public License (GPL) as published by the Free Software
03ae9c5414af053ec289804dc035ab639689bc32vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
03ae9c5414af053ec289804dc035ab639689bc32vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
03ae9c5414af053ec289804dc035ab639689bc32vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
03ae9c5414af053ec289804dc035ab639689bc32vboxsync */
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync/*******************************************************************************
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync* Header Files *
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync*******************************************************************************/
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync#include "../include/cr_compositor.h"
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync/*******************************************************************************
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync* Defined Constants And Macros *
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync*******************************************************************************/
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#define VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED UINT32_MAX
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync#ifdef IN_VMSVGA3D
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync# define WARN AssertMsgFailed
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync#endif
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncstatic int crVrScrCompositorRectsAssignBuffer(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t cRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(cRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->cRectsBuffer >= cRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->cRects = cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->cRectsBuffer)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(pCompositor->paSrcRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTMemFree(pCompositor->paSrcRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->paSrcRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(pCompositor->paDstRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTMemFree(pCompositor->paDstRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->paDstRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(pCompositor->paDstUnstretchedRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTMemFree(pCompositor->paDstUnstretchedRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->paDstUnstretchedRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(!pCompositor->paSrcRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(!pCompositor->paDstRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(!pCompositor->paDstUnstretchedRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync pCompositor->paSrcRects = (PRTRECT)RTMemAlloc(sizeof(*pCompositor->paSrcRects) * cRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->paSrcRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync pCompositor->paDstRects = (PRTRECT)RTMemAlloc(sizeof(*pCompositor->paDstRects) * cRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->paDstRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync pCompositor->paDstUnstretchedRects = (PRTRECT)RTMemAlloc(sizeof(*pCompositor->paDstUnstretchedRects) * cRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->paDstUnstretchedRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->cRects = cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->cRectsBuffer = cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTMemFree(pCompositor->paDstRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->paDstRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RTMemAlloc failed!"));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTMemFree(pCompositor->paSrcRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->paSrcRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RTMemAlloc failed!"));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->cRects = VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->cRectsBuffer = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VERR_NO_MEMORY;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncstatic void crVrScrCompositorRectsInvalidate(PVBOXVR_SCR_COMPOSITOR pCompositor)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->cRects = VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncstatic DECLCALLBACK(bool) crVrScrCompositorRectsCounterCb(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync void *pvVisitor)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t* pCounter = (uint32_t*)pvVisitor;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(VBoxVrListRectsCount(&pEntry->Vr));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pCounter += VBoxVrListRectsCount(&pEntry->Vr);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return true;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsynctypedef struct VBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PRTRECT paSrcRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PRTRECT paDstRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PRTRECT paDstUnstretchedRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync} VBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER, *PVBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncstatic DECLCALLBACK(bool) crVrScrCompositorRectsAssignerCb(PVBOXVR_COMPOSITOR pCCompositor, PVBOXVR_COMPOSITOR_ENTRY pCEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync void *pvVisitor)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER pData = (PVBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER)pvVisitor;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR pCompositor = VBOXVR_SCR_COMPOSITOR_FROM_COMPOSITOR(pCCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pCEntry);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paSrcRects = pData->paSrcRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paDstRects = pData->paDstRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paDstUnstretchedRects = pData->paDstUnstretchedRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t cRects = VBoxVrListRectsCount(&pCEntry->Vr);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(cRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(cRects <= pData->cRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = VBoxVrListRectsGet(&pCEntry->Vr, cRects, pEntry->paDstUnstretchedRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync AssertRC(rc);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync if (!pEntry->Rect.xLeft && !pEntry->Rect.yTop)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync memcpy(pEntry->paSrcRects, pEntry->paDstUnstretchedRects, cRects * sizeof(*pEntry->paSrcRects));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync for (uint32_t i = 0; i < cRects; ++i)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pEntry->paSrcRects[i].xLeft = (int32_t)((pEntry->paDstUnstretchedRects[i].xLeft - pEntry->Rect.xLeft));
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pEntry->paSrcRects[i].yTop = (int32_t)((pEntry->paDstUnstretchedRects[i].yTop - pEntry->Rect.yTop));
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pEntry->paSrcRects[i].xRight = (int32_t)((pEntry->paDstUnstretchedRects[i].xRight - pEntry->Rect.xLeft));
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pEntry->paSrcRects[i].yBottom = (int32_t)((pEntry->paDstUnstretchedRects[i].yBottom - pEntry->Rect.yTop));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#ifndef IN_RING0
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->StretchX != 1. || pCompositor->StretchY != 1.)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync for (uint32_t i = 0; i < cRects; ++i)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->StretchX != 1.)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paDstRects[i].xLeft = (int32_t)(pEntry->paDstUnstretchedRects[i].xLeft * pCompositor->StretchX);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paDstRects[i].xRight = (int32_t)(pEntry->paDstUnstretchedRects[i].xRight * pCompositor->StretchX);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->StretchY != 1.)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paDstRects[i].yTop = (int32_t)(pEntry->paDstUnstretchedRects[i].yTop * pCompositor->StretchY);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paDstRects[i].yBottom = (int32_t)(pEntry->paDstUnstretchedRects[i].yBottom * pCompositor->StretchY);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#endif
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync memcpy(pEntry->paDstRects, pEntry->paDstUnstretchedRects, cRects * sizeof(*pEntry->paDstUnstretchedRects));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#if 0//ndef IN_RING0
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool canZeroX = (pCompositor->StretchX < 1.);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool canZeroY = (pCompositor->StretchY < 1.);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (canZeroX && canZeroY)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync /* filter out zero rectangles*/
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t iOrig, iNew;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync for (iOrig = 0, iNew = 0; iOrig < cRects; ++iOrig)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PRTRECT pOrigRect = &pEntry->paDstRects[iOrig];
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pOrigRect->xLeft != pOrigRect->xRight
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync && pOrigRect->yTop != pOrigRect->yBottom)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync continue;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (iNew != iOrig)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PRTRECT pNewRect = &pEntry->paSrcRects[iNew];
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pNewRect = *pOrigRect;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync ++iNew;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(iNew <= iOrig);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t cDiff = iOrig - iNew;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (cDiff)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->cRects -= cDiff;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync cRects -= cDiff;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#endif
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->cRects = cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pData->paDstRects += cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pData->paSrcRects += cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pData->paDstUnstretchedRects += cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pData->cRects -= cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return true;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncstatic int crVrScrCompositorRectsCheckInit(PCVBOXVR_SCR_COMPOSITOR pcCompositor)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PVBOXVR_SCR_COMPOSITOR pCompositor = const_cast<PVBOXVR_SCR_COMPOSITOR>(pcCompositor);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->cRects != VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t cRects = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorRectsCounterCb, &cRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!cRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->cRects = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = crVrScrCompositorRectsAssignBuffer(pCompositor, cRects);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER AssignerData;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync AssignerData.paSrcRects = pCompositor->paSrcRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync AssignerData.paDstRects = pCompositor->paDstRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync AssignerData.paDstUnstretchedRects = pCompositor->paDstUnstretchedRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync AssignerData.cRects = pCompositor->cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorRectsAssignerCb, &AssignerData);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(!AssignerData.cRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncstatic int crVrScrCompositorEntryRegionsAdd(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync uint32_t cRegions, PCRTRECT paRegions,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync VBOXVR_SCR_COMPOSITOR_ENTRY **ppReplacedScrEntry, uint32_t *pfChangedFlags)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t fChangedFlags = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_COMPOSITOR_ENTRY pReplacedEntry;
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync int rc = VBoxVrCompositorEntryRegionsAdd(&pCompositor->Compositor, pEntry ? &pEntry->Ce : NULL, cRegions,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync paRegions, &pReplacedEntry, &fChangedFlags);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("VBoxVrCompositorEntryRegionsAdd failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBOXVR_SCR_COMPOSITOR_ENTRY *pReplacedScrEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pReplacedEntry);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (fChangedFlags & VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else if (fChangedFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED)
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync Assert(pReplacedScrEntry);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (fChangedFlags & VBOXVR_COMPOSITOR_CF_OTHER_ENTRIES_REGIONS_CHANGED)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetAllChanged(pCompositor, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else if ((fChangedFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED) && pEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChangedFlags)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChangedFlags = fChangedFlags;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (ppReplacedScrEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *ppReplacedScrEntry = pReplacedScrEntry;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncstatic int crVrScrCompositorEntryRegionsSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync uint32_t cRegions, PCRTRECT paRegions, bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = VBoxVrCompositorEntryRegionsSet(&pCompositor->Compositor, &pEntry->Ce, cRegions, paRegions, &fChanged);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("VBoxVrCompositorEntryRegionsSet failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (fChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetAllChanged(pCompositor, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!CrVrScrCompositorEntryIsInList(pEntry))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->cRects = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paSrcRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paDstRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paDstUnstretchedRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChanged = fChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncstatic int crVrScrCompositorEntryPositionSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTPOINT pPos, bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pEntry && (pEntry->Rect.xLeft != pPos->x || pEntry->Rect.yTop != pPos->y))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (VBoxVrCompositorEntryIsInList(&pEntry->Ce))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync int rc = VBoxVrCompositorEntryRegionsTranslate(&pCompositor->Compositor, &pEntry->Ce, pPos->x - pEntry->Rect.xLeft,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync pPos->y - pEntry->Rect.yTop, pfChanged);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("VBoxVrCompositorEntryRegionsTranslate failed rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync VBoxRectMove(&pEntry->Rect, pPos->x, pPos->y);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChanged = true;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncstatic int crVrScrCompositorEntryEnsureRegionsBounds(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTRECT Rect;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Rect.xLeft = RT_MAX(pCompositor->Rect.xLeft, pEntry->Rect.xLeft);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Rect.yTop = RT_MAX(pCompositor->Rect.yTop, pEntry->Rect.yTop);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync Rect.xRight = RT_MIN(pCompositor->Rect.xRight, pEntry->Rect.xRight);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync Rect.yBottom = RT_MIN(pCompositor->Rect.yBottom, pEntry->Rect.yBottom);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = CrVrScrCompositorEntryRegionsIntersect(pCompositor, pEntry, 1, &Rect, &fChanged);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("CrVrScrCompositorEntryRegionsIntersect failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChanged = fChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRegionsAdd(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTPOINT pPos, uint32_t cRegions, PCRTRECT paRegions,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync bool fPosRelated, VBOXVR_SCR_COMPOSITOR_ENTRY **ppReplacedScrEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync uint32_t *pfChangeFlags)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t fChangeFlags = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fPosChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTRECT *paTranslatedRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pPos)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = crVrScrCompositorEntryPositionSet(pCompositor, pEntry, pPos, &fPosChanged);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RegionsAdd: crVrScrCompositorEntryPositionSet failed rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (fPosRelated)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!pEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("Entry is expected to be specified for pos-related regions"));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VERR_INVALID_PARAMETER;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync if (cRegions && (pEntry->Rect.xLeft || pEntry->Rect.yTop))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync paTranslatedRects = (RTRECT*)RTMemAlloc(sizeof(RTRECT) * cRegions);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!paTranslatedRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RTMemAlloc failed"));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VERR_NO_MEMORY;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync memcpy (paTranslatedRects, paRegions, sizeof(RTRECT) * cRegions);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync for (uint32_t i = 0; i < cRegions; ++i)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync VBoxRectTranslate(&paTranslatedRects[i], pEntry->Rect.xLeft, pEntry->Rect.yTop);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync paRegions = paTranslatedRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = crVrScrCompositorEntryRegionsAdd(pCompositor, pEntry, cRegions, paRegions, ppReplacedScrEntry, &fChangeFlags);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("crVrScrCompositorEntryRegionsAdd failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync goto done;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if ((fPosChanged || (fChangeFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED)) && pEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fAdjusted = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = crVrScrCompositorEntryEnsureRegionsBounds(pCompositor, pEntry, &fAdjusted);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("crVrScrCompositorEntryEnsureRegionsBounds failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync goto done;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (fAdjusted)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
a0bf15018685abecfef7c843595aadc6ad969d20vboxsync if (CrVrScrCompositorEntryIsUsed(pEntry))
a0bf15018685abecfef7c843595aadc6ad969d20vboxsync {
a0bf15018685abecfef7c843595aadc6ad969d20vboxsync fChangeFlags &= ~VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED;
a0bf15018685abecfef7c843595aadc6ad969d20vboxsync fChangeFlags |= VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED;
a0bf15018685abecfef7c843595aadc6ad969d20vboxsync }
a0bf15018685abecfef7c843595aadc6ad969d20vboxsync else
a0bf15018685abecfef7c843595aadc6ad969d20vboxsync {
a0bf15018685abecfef7c843595aadc6ad969d20vboxsync fChangeFlags = 0;
a0bf15018685abecfef7c843595aadc6ad969d20vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (fChangeFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync fPosChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else if (ppReplacedScrEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *ppReplacedScrEntry = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChangeFlags)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (fPosChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync /* means entry was in list and was moved, so regions changed */
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync *pfChangeFlags = VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync | VBOXVR_COMPOSITOR_CF_OTHER_ENTRIES_REGIONS_CHANGED;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChangeFlags = fChangeFlags;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncdone:
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (paTranslatedRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTMemFree(paTranslatedRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRectSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTRECT pRect)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (!memcmp(&pEntry->Rect, pRect, sizeof(*pRect)))
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync {
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync return VINF_SUCCESS;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTPOINT Point = {pRect->xLeft, pRect->yTop};
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = crVrScrCompositorEntryPositionSet(pCompositor, pEntry, &Point, &fChanged);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("crVrScrCompositorEntryPositionSet failed %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->Rect = *pRect;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!CrVrScrCompositorEntryIsUsed(pEntry))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = crVrScrCompositorEntryEnsureRegionsBounds(pCompositor, pEntry, NULL);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("crVrScrCompositorEntryEnsureRegionsBounds failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryTexAssign(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync CR_TEXDATA *pTex)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pEntry->pTex == pTex)
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pEntry->pTex)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrTdRelease(pEntry->pTex);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pTex)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrTdAddRef(pTex);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->pTex = pTex;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRegionsSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTPOINT pPos, uint32_t cRegions, PCRTRECT paRegions,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync bool fPosRelated, bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync /* @todo: the fChanged sate calculation is really rough now, this is enough for now though */
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fChanged = false, fPosChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fWasInList = CrVrScrCompositorEntryIsInList(pEntry);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTRECT *paTranslatedRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = CrVrScrCompositorEntryRemove(pCompositor, pEntry);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RegionsSet: CrVrScrCompositorEntryRemove failed rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pPos)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = crVrScrCompositorEntryPositionSet(pCompositor, pEntry, pPos, &fPosChanged);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RegionsSet: crVrScrCompositorEntryPositionSet failed rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (fPosRelated)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!pEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("Entry is expected to be specified for pos-related regions"));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VERR_INVALID_PARAMETER;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync if (cRegions && (pEntry->Rect.xLeft || pEntry->Rect.yTop))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync paTranslatedRects = (RTRECT*)RTMemAlloc(sizeof(RTRECT) * cRegions);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!paTranslatedRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RTMemAlloc failed"));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VERR_NO_MEMORY;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync memcpy (paTranslatedRects, paRegions, sizeof(RTRECT) * cRegions);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync for (uint32_t i = 0; i < cRegions; ++i)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync VBoxRectTranslate(&paTranslatedRects[i], pEntry->Rect.xLeft, pEntry->Rect.yTop);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync paRegions = paTranslatedRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = crVrScrCompositorEntryRegionsSet(pCompositor, pEntry, cRegions, paRegions, &fChanged);
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync if (RT_SUCCESS(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync if (fChanged && CrVrScrCompositorEntryIsUsed(pEntry))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync rc = crVrScrCompositorEntryEnsureRegionsBounds(pCompositor, pEntry, NULL);
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync if (RT_SUCCESS(rc))
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync {
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync if (pfChanged)
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync *pfChanged = fPosChanged || fChanged || fWasInList;
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync }
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync else
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync WARN(("crVrScrCompositorEntryEnsureRegionsBounds failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync else
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync WARN(("crVrScrCompositorEntryRegionsSet failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync if (paTranslatedRects)
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync RTMemFree(paTranslatedRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
c07b9510df777ae6a6ea49e13915aebcc65e9f73vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryListIntersect(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCVBOXVR_LIST pList2, bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = VBoxVrCompositorEntryListIntersect(&pCompositor->Compositor, &pEntry->Ce, pList2, &fChanged);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RegionsIntersect: VBoxVrCompositorEntryRegionsIntersect failed rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (fChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChanged = fChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRegionsIntersect(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync uint32_t cRegions, PCRTRECT paRegions, bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = VBoxVrCompositorEntryRegionsIntersect(&pCompositor->Compositor, &pEntry->Ce, cRegions, paRegions, &fChanged);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RegionsIntersect: VBoxVrCompositorEntryRegionsIntersect failed rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (fChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChanged = fChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryListIntersectAll(PVBOXVR_SCR_COMPOSITOR pCompositor, PCVBOXVR_LIST pList2, bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR Iter;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorIterInit(pCompositor, &Iter);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync while ((pEntry = CrVrScrCompositorIterNext(&Iter)) != NULL)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fTmpChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int tmpRc = CrVrScrCompositorEntryListIntersect(pCompositor, pEntry, pList2, &fTmpChanged);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (RT_SUCCESS(tmpRc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync fChanged |= fTmpChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("CrVrScrCompositorEntryRegionsIntersect failed, rc %d", tmpRc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = tmpRc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChanged = fChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRegionsIntersectAll(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t cRegions,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTRECT paRegions, bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR Iter;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorIterInit(pCompositor, &Iter);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync while ((pEntry = CrVrScrCompositorIterNext(&Iter)) != NULL)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fTmpChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int tmpRc = CrVrScrCompositorEntryRegionsIntersect(pCompositor, pEntry, cRegions, paRegions, &fTmpChanged);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (RT_SUCCESS(tmpRc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync fChanged |= fTmpChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync else
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("CrVrScrCompositorEntryRegionsIntersect failed, rc %d", tmpRc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = tmpRc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChanged = fChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryPosSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTPOINT pPos)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = crVrScrCompositorEntryPositionSet(pCompositor, pEntry, pPos, NULL);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RegionsSet: crVrScrCompositorEntryPositionSet failed rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = crVrScrCompositorEntryEnsureRegionsBounds(pCompositor, pEntry, NULL);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("RegionsSet: crVrScrCompositorEntryEnsureRegionsBounds failed rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync/* regions are valid until the next CrVrScrCompositor call */
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRegionsGet(PCVBOXVR_SCR_COMPOSITOR pCompositor,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t *pcRegions,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTRECT *ppaSrcRegions, PCRTRECT *ppaDstRegions,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTRECT *ppaDstUnstretchedRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
61fb705dd5d91756a31e55dd400e8e6569098278vboxsync if (CrVrScrCompositorEntryIsUsed(pEntry))
61fb705dd5d91756a31e55dd400e8e6569098278vboxsync {
61fb705dd5d91756a31e55dd400e8e6569098278vboxsync int rc = crVrScrCompositorRectsCheckInit(pCompositor);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
61fb705dd5d91756a31e55dd400e8e6569098278vboxsync {
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync WARN(("crVrScrCompositorRectsCheckInit failed, rc %d", rc));
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync return rc;
61fb705dd5d91756a31e55dd400e8e6569098278vboxsync }
61fb705dd5d91756a31e55dd400e8e6569098278vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(pCompositor->cRects != VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pcRegions = pEntry->cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (ppaSrcRegions)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *ppaSrcRegions = pEntry->paSrcRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (ppaDstRegions)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *ppaDstRegions = pEntry->paDstRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (ppaDstUnstretchedRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *ppaDstUnstretchedRects = pEntry->paDstUnstretchedRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(uint32_t) CrVrScrCompositorEntryFlagsCombinedGet(PCVBOXVR_SCR_COMPOSITOR pCompositor,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCVBOXVR_SCR_COMPOSITOR_ENTRY pEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return CRBLT_FOP_COMBINE(pCompositor->fFlags, pEntry->fFlags);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXVREGDECL(void) CrVrScrCompositorEntryFlagsSet(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t fFlags)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pEntry->fFlags == fFlags)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->fFlags = fFlags;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncstatic void crVrScrCompositorEntryDataCleanup(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->cRects = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paSrcRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paDstRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pEntry->paDstUnstretchedRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncstatic void crVrScrCompositorEntryDataCopy(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, PVBOXVR_SCR_COMPOSITOR_ENTRY pToEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pToEntry->cRects = pEntry->cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pToEntry->paSrcRects = pEntry->paSrcRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pToEntry->paDstRects = pEntry->paDstRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pToEntry->paDstUnstretchedRects = pEntry->paDstUnstretchedRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorEntryDataCleanup(pEntry);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXVREGDECL(int) CrVrScrCompositorEntryRemove(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!VBoxVrCompositorEntryRemove(&pCompositor->Compositor, &pEntry->Ce))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorEntryDataCleanup(pEntry);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(bool) CrVrScrCompositorEntryReplace(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pNewEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(!CrVrScrCompositorEntryIsUsed(pNewEntry));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!VBoxVrCompositorEntryReplace(&pCompositor->Compositor, &pEntry->Ce, &pNewEntry->Ce))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetChanged(pEntry, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorEntryDataCopy(pEntry, pNewEntry);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetChanged(pNewEntry, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return true;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncstatic DECLCALLBACK(void) crVrScrCompositorEntryReleasedCB(PCVBOXVR_COMPOSITOR pCompositor,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PVBOXVR_COMPOSITOR_ENTRY pEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PVBOXVR_COMPOSITOR_ENTRY pReplacingEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pCEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pEntry);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetChanged(pCEntry, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync Assert(!CrVrScrCompositorEntryIsInList(pCEntry));
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync if (pReplacingEntry)
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync {
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pCReplacingEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pReplacingEntry);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync Assert(CrVrScrCompositorEntryIsInList(pCReplacingEntry));
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pCReplacingEntry->cRects = pCEntry->cRects;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pCReplacingEntry->paSrcRects = pCEntry->paSrcRects;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pCReplacingEntry->paDstRects = pCEntry->paDstRects;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pCReplacingEntry->paDstUnstretchedRects = pCEntry->paDstUnstretchedRects;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync }
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCEntry->pfnEntryReleased)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pCReplacingEntry = pReplacingEntry
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync ? VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pReplacingEntry) : NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR pCConpositor = VBOXVR_SCR_COMPOSITOR_FROM_COMPOSITOR(pCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCEntry->pfnEntryReleased(pCConpositor, pCEntry, pCReplacingEntry);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorRectSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PCRTRECT pRect, bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (!memcmp(&pCompositor->Rect, pRect, sizeof(pCompositor->Rect)))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync *pfChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->Rect = *pRect;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR Iter;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorIterInit(pCompositor, &Iter);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync while ((pEntry = CrVrScrCompositorIterNext(&Iter)) != NULL)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = crVrScrCompositorEntryEnsureRegionsBounds(pCompositor, pEntry, NULL);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("crVrScrCompositorEntryEnsureRegionsBounds failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(void) CrVrScrCompositorInit(PVBOXVR_SCR_COMPOSITOR pCompositor, PCRTRECT pRect)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync memset(pCompositor, 0, sizeof(*pCompositor));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBoxVrCompositorInit(&pCompositor->Compositor, crVrScrCompositorEntryReleasedCB);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->fFlags = CRBLT_F_LINEAR | CRBLT_F_INVERT_YCOORDS;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync if (pRect)
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pCompositor->Rect = *pRect;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#ifndef IN_RING0
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->StretchX = 1.0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->StretchY = 1.0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#endif
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXVREGDECL(void) CrVrScrCompositorRegionsClear(PVBOXVR_SCR_COMPOSITOR pCompositor, bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync /* set changed flag first, while entries are in the list and we have them */
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetAllChanged(pCompositor, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBoxVrCompositorRegionsClear(&pCompositor->Compositor, pfChanged);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXVREGDECL(void) CrVrScrCompositorClear(PVBOXVR_SCR_COMPOSITOR pCompositor)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorRegionsClear(pCompositor, NULL);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->paDstRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTMemFree(pCompositor->paDstRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->paDstRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->paSrcRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTMemFree(pCompositor->paSrcRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->paSrcRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->paDstUnstretchedRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync RTMemFree(pCompositor->paDstUnstretchedRects);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->paDstUnstretchedRects = NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->cRects = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->cRectsBuffer = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXVREGDECL(void) CrVrScrCompositorEntrySetAllChanged(PVBOXVR_SCR_COMPOSITOR pCompositor, bool fChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR CIter;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pCurEntry;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorIterInit(pCompositor, &CIter);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync while ((pCurEntry = CrVrScrCompositorIterNext(&CIter)) != NULL)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetChanged(pCurEntry, fChanged);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#ifndef IN_RING0
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXVREGDECL(void) CrVrScrCompositorSetStretching(PVBOXVR_SCR_COMPOSITOR pCompositor, float StretchX, float StretchY)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pCompositor->StretchX == StretchX && pCompositor->StretchY == StretchY)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->StretchX = StretchX;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pCompositor->StretchY = StretchY;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync crVrScrCompositorRectsInvalidate(pCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorEntrySetAllChanged(pCompositor, true);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#endif
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync/* regions are valid until the next CrVrScrCompositor call */
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorRegionsGet(PCVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t *pcRegions,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTRECT *ppaSrcRegions, PCRTRECT *ppaDstRegions,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTRECT *ppaDstUnstretchedRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = crVrScrCompositorRectsCheckInit(pCompositor);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("crVrScrCompositorRectsCheckInit failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Assert(pCompositor->cRects != VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pcRegions = pCompositor->cRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (ppaSrcRegions)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *ppaSrcRegions = pCompositor->paSrcRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (ppaDstRegions)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *ppaDstRegions = pCompositor->paDstRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (ppaDstUnstretchedRects)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *ppaDstUnstretchedRects = pCompositor->paDstUnstretchedRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsynctypedef struct VBOXVR_SCR_COMPOSITOR_VISITOR_CB
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PFNVBOXVRSCRCOMPOSITOR_VISITOR pfnVisitor;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync void *pvVisitor;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync} VBOXVR_SCR_COMPOSITOR_VISITOR_CB, *PVBOXVR_SCR_COMPOSITOR_VISITOR_CB;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncstatic DECLCALLBACK(bool) crVrScrCompositorVisitCb(PVBOXVR_COMPOSITOR pCCompositor, PVBOXVR_COMPOSITOR_ENTRY pCEntry,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync void *pvVisitor)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_VISITOR_CB pData = (PVBOXVR_SCR_COMPOSITOR_VISITOR_CB)pvVisitor;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR pCompositor = VBOXVR_SCR_COMPOSITOR_FROM_COMPOSITOR(pCCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pCEntry);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return pData->pfnVisitor(pCompositor, pEntry, pData->pvVisitor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(void) CrVrScrCompositorVisit(PVBOXVR_SCR_COMPOSITOR pCompositor, PFNVBOXVRSCRCOMPOSITOR_VISITOR pfnVisitor,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync void *pvVisitor)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBOXVR_SCR_COMPOSITOR_VISITOR_CB Data;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Data.pfnVisitor = pfnVisitor;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync Data.pvVisitor = pvVisitor;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorVisitCb, &Data);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorClone(PCVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR pDstCompositor,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void *pvEntryFor)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync /* for simplicity just copy from one to another */
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync CrVrScrCompositorInit(pDstCompositor, CrVrScrCompositorRectGet(pCompositor));
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR CIter;
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync CrVrScrCompositorConstIterInit(pCompositor, &CIter);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t cRects;
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PCRTRECT paRects;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync while ((pEntry = CrVrScrCompositorConstIterNext(&CIter)) != NULL)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync /* get source rects, that will be non-stretched and entry pos - pased */
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync rc = CrVrScrCompositorEntryRegionsGet(pCompositor, pEntry, &cRects, NULL, NULL, &paRects);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("CrVrScrCompositorEntryRegionsGet failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pDstEntry = pfnEntryFor(pEntry, pvEntryFor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!pDstEntry)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("pfnEntryFor failed"));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VERR_INVALID_STATE;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync rc = CrVrScrCompositorEntryRegionsSet(pDstCompositor, pDstEntry, NULL, cRects, paRects, false, NULL);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("CrVrScrCompositorEntryRegionsSet failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorIntersectList(PVBOXVR_SCR_COMPOSITOR pCompositor, PCVBOXVR_LIST pVr, bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR CIter;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorIterInit(pCompositor, &CIter);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync int rc = VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync while ((pEntry = CrVrScrCompositorIterNext(&CIter)) != NULL)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync bool fCurChanged = false;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = CrVrScrCompositorEntryListIntersect(pCompositor, pEntry, pVr, &fCurChanged);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("CrVrScrCompositorEntryRegionsSet failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync break;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync fChanged |= fCurChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pfChanged = fChanged;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsyncVBOXVREGDECL(int) CrVrScrCompositorIntersectedList(PCVBOXVR_SCR_COMPOSITOR pCompositor, PCVBOXVR_LIST pVr,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PVBOXVR_SCR_COMPOSITOR pDstCompositor,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void *pvEntryFor,
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync bool *pfChanged)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync int rc = CrVrScrCompositorClone(pCompositor, pDstCompositor, pfnEntryFor, pvEntryFor);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("CrVrScrCompositorClone failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync rc = CrVrScrCompositorIntersectList(pDstCompositor, pVr, pfChanged);
e485351f0ba5b94967f4ae9eb5b43f5afa08605dvboxsync if (RT_FAILURE(rc))
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync WARN(("CrVrScrCompositorIntersectList failed, rc %d", rc));
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync CrVrScrCompositorClear(pDstCompositor);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return rc;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return VINF_SUCCESS;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync