2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync/* $Id$ */
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync/** @file
9a4f89c56bc26398c787321ef37ef676c542ec25vboxsync * Presenter API: CrFbDisplayWindowRootVr class implementation -- display seamless content (visible regions).
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync */
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync/*
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync * Copyright (C) 2014 Oracle Corporation
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync *
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync * available from http://www.virtualbox.org. This file is free software;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync * you can redistribute it and/or modify it under the terms of the GNU
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync * General Public License (GPL) as published by the Free Software
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync */
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync#include "server_presenter.h"
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
5a96feeef6545e3b78a0e84669406a9ee2c8da2fvboxsyncCrFbDisplayWindowRootVr::CrFbDisplayWindowRootVr(const RTRECT *pViewportRect, uint64_t parentId) :
5a96feeef6545e3b78a0e84669406a9ee2c8da2fvboxsync CrFbDisplayWindow(pViewportRect, parentId)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrVrScrCompositorInit(&mCompositor, NULL);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::EntryCreated(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = CrFbDisplayWindow::EntryCreated(pFb, hEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync Assert(!CrFbDDataEntryGet(hEntry, slotGet()));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync const VBOXVR_SCR_COMPOSITOR_ENTRY* pSrcEntry = CrFbEntryGetCompositorEntry(hEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = entryAlloc();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrVrScrCompositorEntryInit(pMyEntry, CrVrScrCompositorEntryRectGet(pSrcEntry), CrVrScrCompositorEntryTexGet(pSrcEntry), NULL);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrVrScrCompositorEntryFlagsSet(pMyEntry, CrVrScrCompositorEntryFlagsGet(pSrcEntry));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync rc = CrFbDDataEntryPut(hEntry, slotGet(), pMyEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("CrFbDDataEntryPut failed rc %d", rc));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync entryFree(pMyEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return VINF_SUCCESS;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::EntryAdded(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = CrFbDisplayWindow::EntryAdded(pFb, hEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync const VBOXVR_SCR_COMPOSITOR_ENTRY* pSrcEntry = CrFbEntryGetCompositorEntry(hEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hEntry, slotGet());
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync Assert(pMyEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrVrScrCompositorEntryTexSet(pMyEntry, CrVrScrCompositorEntryTexGet(pSrcEntry));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return VINF_SUCCESS;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::EntryReplaced(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hNewEntry, HCR_FRAMEBUFFER_ENTRY hReplacedEntry)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = CrFbDisplayWindow::EntryReplaced(pFb, hNewEntry, hReplacedEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync const VBOXVR_SCR_COMPOSITOR_ENTRY* pSrcNewEntry = CrFbEntryGetCompositorEntry(hNewEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hNewEntry, slotGet());
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrVrScrCompositorEntryTexSet(pMyEntry, CrVrScrCompositorEntryTexGet(pSrcNewEntry));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return VINF_SUCCESS;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::EntryTexChanged(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = CrFbDisplayWindow::EntryTexChanged(pFb, hEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync const VBOXVR_SCR_COMPOSITOR_ENTRY* pSrcEntry = CrFbEntryGetCompositorEntry(hEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hEntry, slotGet());
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrVrScrCompositorEntryTexSet(pMyEntry, CrVrScrCompositorEntryTexGet(pSrcEntry));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return VINF_SUCCESS;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::EntryRemoved(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = CrFbDisplayWindow::EntryRemoved(pFb, hEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hEntry, slotGet());
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync rc = CrVrScrCompositorEntryRegionsSet(&mCompositor, pMyEntry, NULL, 0, NULL, false, NULL);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return VINF_SUCCESS;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::EntryDestroyed(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = CrFbDisplayWindow::EntryDestroyed(pFb, hEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync const VBOXVR_SCR_COMPOSITOR_ENTRY* pSrcEntry = CrFbEntryGetCompositorEntry(hEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hEntry, slotGet());
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrVrScrCompositorEntryCleanup(pMyEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync entryFree(pMyEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return VINF_SUCCESS;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::setViewportRect(const RTRECT *pViewportRect)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = CrFbDisplayWindow::setViewportRect(pViewportRect);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync rc = setRegionsChanged();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return VINF_SUCCESS;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::windowSetCompositor(bool fSet)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (fSet)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return getWindow()->SetCompositor(&mCompositor);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return getWindow()->SetCompositor(NULL);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncvoid CrFbDisplayWindowRootVr::ueRegions()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync synchCompositorRegions();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::compositorMarkUpdated()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrVrScrCompositorClear(&mCompositor);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = CrVrScrCompositorRectSet(&mCompositor, CrVrScrCompositorRectGet(CrFbGetCompositor(getFramebuffer())), NULL);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync rc = setRegionsChanged();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("screenChanged failed %d", rc));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return VINF_SUCCESS;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::screenChanged()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = compositorMarkUpdated();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync rc = CrFbDisplayWindow::screenChanged();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("screenChanged failed %d", rc));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return VINF_SUCCESS;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncconst struct RTRECT* CrFbDisplayWindowRootVr::getRect()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return CrVrScrCompositorRectGet(&mCompositor);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::fbCleanup()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = clearCompositor();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return CrFbDisplayWindow::fbCleanup();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::fbSync()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = synchCompositor();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("err"));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return CrFbDisplayWindow::fbSync();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncVBOXVR_SCR_COMPOSITOR_ENTRY* CrFbDisplayWindowRootVr::entryAlloc()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync#ifndef VBOXVDBG_MEMCACHE_DISABLE
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return (VBOXVR_SCR_COMPOSITOR_ENTRY*)RTMemCacheAlloc(g_CrPresenter.CEntryLookasideList);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync#else
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return (VBOXVR_SCR_COMPOSITOR_ENTRY*)RTMemAlloc(sizeof (VBOXVR_SCR_COMPOSITOR_ENTRY));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync#endif
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncvoid CrFbDisplayWindowRootVr::entryFree(VBOXVR_SCR_COMPOSITOR_ENTRY* pEntry)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync Assert(!CrVrScrCompositorEntryIsUsed(pEntry));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync#ifndef VBOXVDBG_MEMCACHE_DISABLE
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync RTMemCacheFree(g_CrPresenter.CEntryLookasideList, pEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync#else
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync RTMemFree(pEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync#endif
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::synchCompositorRegions()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync rootVrTranslateForPos();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync /* ensure the rootvr compositor does not hold any data,
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync * i.e. cleanup all rootvr entries data */
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrVrScrCompositorClear(&mCompositor);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync rc = CrVrScrCompositorIntersectedList(CrFbGetCompositor(getFramebuffer()), &cr_server.RootVr, &mCompositor, rootVrGetCEntry, this, NULL);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("CrVrScrCompositorIntersectedList failed, rc %d", rc));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return getWindow()->SetVisibleRegionsChanged();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::synchCompositor()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int rc = compositorMarkUpdated();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("compositorMarkUpdated failed, rc %d", rc));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync rc = fbSynchAddAllEntries();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync if (!RT_SUCCESS(rc))
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync {
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync WARN(("fbSynchAddAllEntries failed, rc %d", rc));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync }
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return rc;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncint CrFbDisplayWindowRootVr::clearCompositor()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return fbCleanupRemoveAllEntries();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncvoid CrFbDisplayWindowRootVr::rootVrTranslateForPos()
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync const RTRECT *pRect = getViewportRect();
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync const struct VBVAINFOSCREEN* pScreen = CrFbGetScreenInfo(getFramebuffer());
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int32_t x = pScreen->i32OriginX;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int32_t y = pScreen->i32OriginY;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int32_t dx = cr_server.RootVrCurPoint.x - x;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync int32_t dy = cr_server.RootVrCurPoint.y - y;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync cr_server.RootVrCurPoint.x = x;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync cr_server.RootVrCurPoint.y = y;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync VBoxVrListTranslate(&cr_server.RootVr, dx, dy);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsyncDECLCALLBACK(VBOXVR_SCR_COMPOSITOR_ENTRY*) CrFbDisplayWindowRootVr::rootVrGetCEntry(const VBOXVR_SCR_COMPOSITOR_ENTRY*pEntry, void *pvContext)
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync{
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrFbDisplayWindowRootVr *pThis = (CrFbDisplayWindowRootVr*)pvContext;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync HCR_FRAMEBUFFER_ENTRY hEntry = CrFbEntryFromCompositorEntry(pEntry);
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hEntry, pThis->slotGet());
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync Assert(!CrVrScrCompositorEntryIsUsed(pMyEntry));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync CrVrScrCompositorEntryRectSet(&pThis->mCompositor, pMyEntry, CrVrScrCompositorEntryRectGet(pEntry));
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync return pMyEntry;
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync}
2c58a3c1c159c2fe32fdc0c82f1d30604fda0755vboxsync