9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox WDDM Miniport driver
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2012 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxMPWddm.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "common/VBoxMPCommon.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxMPVdma.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxMPVhwa.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/asm.h>
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#include "VBoxMPCr.h"
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#include <iprt/mem.h>
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#ifdef VBOX_WITH_CROGL
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# include <packer.h>
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsyncstatic NTSTATUS vboxVdmaCrCtlGetDefaultClientId(PVBOXMP_DEVEXT pDevExt, uint32_t *pu32ClienID);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVdmaPipeConstruct(PVBOXVDMAPIPE pPipe)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeInitializeSpinLock(&pPipe->SinchLock);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeInitializeEvent(&pPipe->Event, SynchronizationEvent, FALSE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync InitializeListHead(&pPipe->CmdListHead);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->enmState = VBOXVDMAPIPE_STATE_CREATED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->bNeedNotify = true;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVdmaPipeSvrOpen(PVBOXVDMAPIPE pPipe)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KIRQL OldIrql;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeAcquireSpinLock(&pPipe->SinchLock, &OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pPipe->enmState == VBOXVDMAPIPE_STATE_CREATED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (pPipe->enmState)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VBOXVDMAPIPE_STATE_CREATED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->enmState = VBOXVDMAPIPE_STATE_OPENNED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->bNeedNotify = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VBOXVDMAPIPE_STATE_OPENNED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->bNeedNotify = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_INVALID_PIPE_STATE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pPipe->SinchLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVdmaPipeSvrClose(PVBOXVDMAPIPE pPipe)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KIRQL OldIrql;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeAcquireSpinLock(&pPipe->SinchLock, &OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pPipe->enmState == VBOXVDMAPIPE_STATE_CLOSED
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || pPipe->enmState == VBOXVDMAPIPE_STATE_CLOSING);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (pPipe->enmState)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VBOXVDMAPIPE_STATE_CLOSING:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->enmState = VBOXVDMAPIPE_STATE_CLOSED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VBOXVDMAPIPE_STATE_CLOSED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_INVALID_PIPE_STATE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pPipe->SinchLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVdmaPipeCltClose(PVBOXVDMAPIPE pPipe)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KIRQL OldIrql;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeAcquireSpinLock(&pPipe->SinchLock, &OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bool bNeedNotify = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pPipe->enmState == VBOXVDMAPIPE_STATE_OPENNED
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || pPipe->enmState == VBOXVDMAPIPE_STATE_CREATED
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || pPipe->enmState == VBOXVDMAPIPE_STATE_CLOSED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (pPipe->enmState)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VBOXVDMAPIPE_STATE_OPENNED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->enmState = VBOXVDMAPIPE_STATE_CLOSING;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bNeedNotify = pPipe->bNeedNotify;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->bNeedNotify = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VBOXVDMAPIPE_STATE_CREATED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->enmState = VBOXVDMAPIPE_STATE_CLOSED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->bNeedNotify = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VBOXVDMAPIPE_STATE_CLOSED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_INVALID_PIPE_STATE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pPipe->SinchLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bNeedNotify)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeSetEvent(&pPipe->Event, 0, FALSE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVdmaPipeDestruct(PVBOXVDMAPIPE pPipe)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pPipe->enmState == VBOXVDMAPIPE_STATE_CLOSED
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || pPipe->enmState == VBOXVDMAPIPE_STATE_CREATED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* ensure the pipe is closed */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = vboxVdmaPipeCltClose(pPipe);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pPipe->enmState == VBOXVDMAPIPE_STATE_CLOSED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVdmaPipeSvrCmdGetList(PVBOXVDMAPIPE pPipe, PLIST_ENTRY pDetachHead)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PLIST_ENTRY pEntry = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KIRQL OldIrql;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVDMAPIPE_STATE enmState = VBOXVDMAPIPE_STATE_CLOSED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bool bListEmpty = true;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeAcquireSpinLock(&pPipe->SinchLock, &OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pPipe->enmState == VBOXVDMAPIPE_STATE_OPENNED
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || pPipe->enmState == VBOXVDMAPIPE_STATE_CLOSING);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pPipe->enmState >= VBOXVDMAPIPE_STATE_OPENNED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync enmState = pPipe->enmState;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (enmState >= VBOXVDMAPIPE_STATE_OPENNED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVideoLeDetach(&pPipe->CmdListHead, pDetachHead);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bListEmpty = !!(IsListEmpty(pDetachHead));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->bNeedNotify = bListEmpty;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pPipe->SinchLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_INVALID_PIPE_STATE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pPipe->SinchLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!bListEmpty)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (enmState == VBOXVDMAPIPE_STATE_OPENNED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = KeWaitForSingleObject(&pPipe->Event, Executive, KernelMode, FALSE, NULL /* PLARGE_INTEGER Timeout */);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status != STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(enmState == VBOXVDMAPIPE_STATE_CLOSING);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_PIPE_CLOSING;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVdmaPipeCltCmdPut(PVBOXVDMAPIPE pPipe, PVBOXVDMAPIPE_CMD_HDR pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KIRQL OldIrql;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bool bNeedNotify = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeAcquireSpinLock(&pPipe->SinchLock, &OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pPipe->enmState == VBOXVDMAPIPE_STATE_OPENNED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pPipe->enmState == VBOXVDMAPIPE_STATE_OPENNED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bNeedNotify = pPipe->bNeedNotify;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync InsertHeadList(&pPipe->CmdListHead, &pCmd->ListEntry);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPipe->bNeedNotify = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_INVALID_PIPE_STATE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pPipe->SinchLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bNeedNotify)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeSetEvent(&pPipe->Event, 0, FALSE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncDECLINLINE(void) vboxVdmaDirtyRectsCalcIntersection(const RECT *pArea, const VBOXWDDM_RECTS_INFO *pRects, PVBOXWDDM_RECTS_INFO pResult)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cRects = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (uint32_t i = 0; i < pRects->cRects; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vboxWddmRectIntersection(pArea, &pRects->aRects[i], &pResult->aRects[cRects]))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++cRects;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pResult->cRects = cRects;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(bool) vboxVdmaDirtyRectsHasIntersections(const RECT *paRects1, uint32_t cRects1, const RECT *paRects2, uint32_t cRects2)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECT tmpRect;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (uint32_t i = 0; i < cRects1; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECT * pRect1 = &paRects1[i];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (uint32_t j = 0; j < cRects2; ++j)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECT * pRect2 = &paRects2[j];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vboxWddmRectIntersection(pRect1, pRect2, &tmpRect))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return true;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(bool) vboxVdmaDirtyRectsIsCover(const RECT *paRects, uint32_t cRects, const RECT *paRectsCovered, uint32_t cRectsCovered)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (uint32_t i = 0; i < cRectsCovered; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECT * pRectCovered = &paRectsCovered[i];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t j = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (; j < cRects; ++j)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECT * pRect = &paRects[j];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vboxWddmRectIsCoveres(pRect, pRectCovered))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (j == cRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return true;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#ifdef VBOX_WITH_CROGL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVdmaPostHideSwapchain(PVBOXWDDM_SWAPCHAIN pSwapchain)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cbCmdInternal = VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal =
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pSwapchain->pContext->CmContext, cbCmdInternal);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmdInternal);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmdInternal)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmdInternal->hSwapchainUm = pSwapchain->hSwapchainUm;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmdInternal->Cmd.fFlags.Value = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmdInternal->Cmd.fFlags.bAddHiddenRects = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmdInternal->Cmd.fFlags.bHide = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmdInternal->Cmd.RectsInfo.cRects = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVideoCmCmdSubmit(pCmdInternal, VBOXVIDEOCM_SUBMITSIZE_DEFAULT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_NO_MEMORY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncstatic VOID vboxWddmBltPipeRectsTranslate(VBOXVDMAPIPE_RECTS *pRects, int x, int y)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync vboxWddmRectTranslate(&pRects->ContextRect, x, y);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync for (UINT i = 0; i < pRects->UpdateRects.cRects; ++i)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync vboxWddmRectTranslate(&pRects->UpdateRects.aRects[i], x, y);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync}
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncstatic VBOXVDMAPIPE_RECTS * vboxWddmBltPipeRectsDup(const VBOXVDMAPIPE_RECTS *pRects)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync const size_t cbDup = RT_OFFSETOF(VBOXVDMAPIPE_RECTS, UpdateRects.aRects[pRects->UpdateRects.cRects]);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBOXVDMAPIPE_RECTS *pDup = (VBOXVDMAPIPE_RECTS*)vboxWddmMemAllocZero(cbDup);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!pDup)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("vboxWddmMemAllocZero failed"));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return NULL;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync memcpy(pDup, pRects, cbDup);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return pDup;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync}
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#ifdef VBOX_WITH_CROGL
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsynctypedef struct VBOXMP_VDMACR_WRITECOMPLETION
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync void *pvBufferToFree;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync} VBOXMP_VDMACR_WRITECOMPLETION, *PVBOXMP_VDMACR_WRITECOMPLETION;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncstatic DECLCALLBACK(void) vboxVdmaCrWriteCompletion(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvCtx)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXMP_VDMACR_WRITECOMPLETION pData = (PVBOXMP_VDMACR_WRITECOMPLETION)pvCtx;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync void* pvBufferToFree = pData->pvBufferToFree;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pvBufferToFree)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxMpCrShgsmiTransportBufFree(pCon, pvBufferToFree);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxMpCrShgsmiTransportCmdTermWriteAsync(pCon, pvCtx);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync}
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsynctypedef struct VBOXMP_VDMACR_WRITEREADCOMPLETION
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync{
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync void *pvBufferToFree;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync void *pvContext;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync} VBOXMP_VDMACR_WRITEREADCOMPLETION, *PVBOXMP_VDMACR_WRITEREADCOMPLETION;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsyncvoid vboxVdmaCrSubmitWriteReadAsyncGenericCompletion(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvCtx)
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync{
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync PVBOXMP_VDMACR_WRITEREADCOMPLETION pData = (PVBOXMP_VDMACR_WRITEREADCOMPLETION)pvCtx;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync void* pvBufferToFree = pData->pvBufferToFree;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync if (pvBufferToFree)
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync VBoxMpCrShgsmiTransportBufFree(pCon, pvBufferToFree);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync VBoxMpCrShgsmiTransportCmdTermWriteReadAsync(pCon, pvCtx);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync}
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsyncNTSTATUS vboxVdmaCrSubmitWriteReadAsync(PVBOXMP_DEVEXT pDevExt, VBOXMP_CRPACKER *pCrPacker, uint32_t u32CrConClientID, PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION pfnCompletion, void *pvCompletion)
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync{
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync Assert(u32CrConClientID);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync NTSTATUS Status = STATUS_SUCCESS;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync uint32_t cbBuffer;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync void * pvPackBuffer;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync void * pvBuffer = VBoxMpCrPackerTxBufferComplete(pCrPacker, &cbBuffer, &pvPackBuffer);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync if (pvBuffer)
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync PVBOXMP_VDMACR_WRITEREADCOMPLETION pvCompletionData = (PVBOXMP_VDMACR_WRITEREADCOMPLETION)VBoxMpCrShgsmiTransportCmdCreateWriteReadAsync(&pDevExt->CrHgsmiTransport, u32CrConClientID, pvBuffer, cbBuffer,
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync pfnCompletion, sizeof (*pvCompletionData));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync if (pvCompletionData)
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync pvCompletionData->pvBufferToFree = pvPackBuffer;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync pvCompletionData->pvContext = pvCompletion;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync int rc = VBoxMpCrShgsmiTransportCmdSubmitWriteReadAsync(&pDevExt->CrHgsmiTransport, pvCompletionData);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync if (RT_SUCCESS(rc))
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync return STATUS_SUCCESS;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
d9fec6d329252f6e5eb8f564690e582b2aea6624vboxsync WARN(("VBoxMpCrShgsmiTransportCmdSubmitWriteReadAsync failed, rc %d", rc));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync Status = STATUS_UNSUCCESSFUL;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync VBoxMpCrShgsmiTransportCmdTermWriteReadAsync(&pDevExt->CrHgsmiTransport, pvCompletionData);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync else
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
d9fec6d329252f6e5eb8f564690e582b2aea6624vboxsync WARN(("VBoxMpCrShgsmiTransportCmdCreateWriteReadAsync failed"));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync Status = STATUS_INSUFFICIENT_RESOURCES;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync return Status;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync}
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncNTSTATUS vboxVdmaCrSubmitWriteAsync(PVBOXMP_DEVEXT pDevExt, VBOXMP_CRPACKER *pCrPacker, uint32_t u32CrConClientID)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Assert(u32CrConClientID);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync NTSTATUS Status = STATUS_SUCCESS;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cbBuffer;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync void * pvPackBuffer;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync void * pvBuffer = VBoxMpCrPackerTxBufferComplete(pCrPacker, &cbBuffer, &pvPackBuffer);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pvBuffer)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXMP_VDMACR_WRITECOMPLETION pvCompletionData = (PVBOXMP_VDMACR_WRITECOMPLETION)VBoxMpCrShgsmiTransportCmdCreateWriteAsync(&pDevExt->CrHgsmiTransport, u32CrConClientID, pvBuffer, cbBuffer,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync vboxVdmaCrWriteCompletion, sizeof (*pvCompletionData));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pvCompletionData)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pvCompletionData->pvBufferToFree = pvPackBuffer;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync int rc = VBoxMpCrShgsmiTransportCmdSubmitWriteAsync(&pDevExt->CrHgsmiTransport, pvCompletionData);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync if (RT_SUCCESS(rc))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync return STATUS_SUCCESS;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync WARN(("VBoxMpCrShgsmiTransportCmdSubmitWriteAsync failed, rc %d", rc));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync Status = STATUS_UNSUCCESSFUL;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync VBoxMpCrShgsmiTransportCmdTermWriteAsync(&pDevExt->CrHgsmiTransport, pvCompletionData);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync else
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("VBoxMpCrShgsmiTransportCmdCreateWriteAsync failed"));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync Status = STATUS_INSUFFICIENT_RESOURCES;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return Status;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync}
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncstatic NTSTATUS vboxVdmaVRegGet(PVBOXWDDM_SWAPCHAIN pSwapchain, const RTRECT *pCtxRect, uint32_t *pcVRects, RTRECT **ppVRectsBuff, uint32_t *pcVRectsBuff)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync RTRECT *pVRectsBuff = *ppVRectsBuff;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cVRectsBuff = *pcVRectsBuff;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cVRects = VBoxVrListRectsCount(&pSwapchain->VisibleRegions);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (cVRectsBuff < cVRects)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pVRectsBuff)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync vboxWddmMemFree(pVRectsBuff);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pVRectsBuff = (RTRECT*)vboxWddmMemAlloc(cVRects * sizeof (pVRectsBuff[0]));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!pVRectsBuff)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("vboxWddmMemAlloc failed"));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync *pcVRectsBuff = 0;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync *ppVRectsBuff = NULL;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync *pcVRects = NULL;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return STATUS_NO_MEMORY;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync cVRectsBuff = cVRects;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync *pcVRectsBuff = cVRectsBuff;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync *ppVRectsBuff = pVRectsBuff;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync int rc = VBoxVrListRectsGet(&pSwapchain->VisibleRegions, cVRects, pVRectsBuff);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync AssertRC(rc);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pCtxRect->xLeft || pCtxRect->yTop)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync for (UINT i = 0; i < cVRects; ++i)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxRectTranslate(&pVRectsBuff[i], -pCtxRect->xLeft, -pCtxRect->yTop);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync *pcVRects = cVRects;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return STATUS_SUCCESS;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync}
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/**
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * @param pDevExt
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncstatic NTSTATUS vboxVdmaProcessVRegCmdLegacy(PVBOXMP_DEVEXT pDevExt,
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync VBOXMP_CRPACKER *pCrPacker,
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync uint32_t u32CrConClientID,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXWDDM_SOURCE pSource,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXWDDM_SWAPCHAIN pSwapchain,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync const RECT *pSrcRect,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync const VBOXVDMAPIPE_RECTS *pContextRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBOXVDMAPIPE_RECTS *pRectsToFree = NULL;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync POINT pos = pSource->VScreenPos;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pos.x || pos.y)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pRectsToFree = vboxWddmBltPipeRectsDup(pContextRects);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /* note: do NOT translate the src rect since it is used for screen pos calculation */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync vboxWddmBltPipeRectsTranslate(pRectsToFree, pos.x, pos.y);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pContextRects = pRectsToFree;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync const VBOXWDDM_RECTS_INFO *pRects = &pContextRects->UpdateRects;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = STATUS_SUCCESS;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync int rc;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync bool fCurChanged = FALSE, fCurRectChanged = FALSE;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync POINT CurPos;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync RTRECT *pVRectsBuff = NULL;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cVRectsBuff = 0;
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync VBOXWDDM_CTXLOCK_DATA
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync VBOXWDDM_CTXLOCK_LOCK(pDevExt);
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
e6ad2e18e663b076aeabfec994947514566a7accvboxsync if (pSwapchain)
e6ad2e18e663b076aeabfec994947514566a7accvboxsync {
e6ad2e18e663b076aeabfec994947514566a7accvboxsync CurPos.x = pContextRects->ContextRect.left - pSrcRect->left;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync CurPos.y = pContextRects->ContextRect.top - pSrcRect->top;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
e6ad2e18e663b076aeabfec994947514566a7accvboxsync if (CurPos.x != pSwapchain->Pos.x || CurPos.y != pSwapchain->Pos.y)
e6ad2e18e663b076aeabfec994947514566a7accvboxsync {
e6ad2e18e663b076aeabfec994947514566a7accvboxsync#if 0
e6ad2e18e663b076aeabfec994947514566a7accvboxsync if (pSwapchain->Pos.x != VBOXWDDM_INVALID_COORD)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxVrListTranslate(&pSwapchain->VisibleRegions, pSwapchain->Pos.x - CurPos.x, pSwapchain->Pos.y - CurPos.y);
e6ad2e18e663b076aeabfec994947514566a7accvboxsync else
e6ad2e18e663b076aeabfec994947514566a7accvboxsync#endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxVrListClear(&pSwapchain->VisibleRegions);
e6ad2e18e663b076aeabfec994947514566a7accvboxsync fCurRectChanged = TRUE;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync pSwapchain->Pos = CurPos;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync }
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync rc = VBoxVrListRectsAdd(&pSwapchain->VisibleRegions, pRects->cRects, (const RTRECT*)pRects->aRects, &fCurChanged);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!RT_SUCCESS(rc))
e6ad2e18e663b076aeabfec994947514566a7accvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("VBoxWddmVrListRectsAdd failed, rc %d!", rc));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Status = STATUS_UNSUCCESSFUL;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync goto done;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync }
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
e6ad2e18e663b076aeabfec994947514566a7accvboxsync /* visible rects of different windows do not intersect,
e6ad2e18e663b076aeabfec994947514566a7accvboxsync * so if the given window visible rects did not increase, others have not changed either */
e6ad2e18e663b076aeabfec994947514566a7accvboxsync if (!fCurChanged && !fCurRectChanged)
e6ad2e18e663b076aeabfec994947514566a7accvboxsync goto done;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync }
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
e6ad2e18e663b076aeabfec994947514566a7accvboxsync /* before posting the add visible rects diff, we need to first hide rects for other windows */
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (PLIST_ENTRY pCur = pDevExt->SwapchainList3D.Flink; pCur != &pDevExt->SwapchainList3D; pCur = pCur->Flink)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCur != &pSwapchain->DevExtListEntry)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SWAPCHAIN pCurSwapchain = VBOXWDDMENTRY_2_SWAPCHAIN(pCur);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXWDDM_CONTEXT pCurContext = pCurSwapchain->pContext;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXMP_CRPACKER pCurPacker = &pCurContext->CrPacker;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync bool fChanged = FALSE;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync rc = VBoxVrListRectsSubst(&pCurSwapchain->VisibleRegions, pRects->cRects, (const RTRECT*)pRects->aRects, &fChanged);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!RT_SUCCESS(rc))
e6ad2e18e663b076aeabfec994947514566a7accvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("VBoxWddmVrListRectsAdd failed, rc %d!", rc));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Status = STATUS_UNSUCCESSFUL;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync goto done;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync }
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
e6ad2e18e663b076aeabfec994947514566a7accvboxsync if (!fChanged)
e6ad2e18e663b076aeabfec994947514566a7accvboxsync continue;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cVRects;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync RTRECT CurCtxRect;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync CurCtxRect.xLeft = pCurSwapchain->Pos.x;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync CurCtxRect.yTop = pCurSwapchain->Pos.y;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync CurCtxRect.xRight = CurCtxRect.xLeft + pCurSwapchain->width;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync CurCtxRect.yBottom = CurCtxRect.yTop + pCurSwapchain->height;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Status = vboxVdmaVRegGet(pCurSwapchain, &CurCtxRect, &cVRects, &pVRectsBuff, &cVRectsBuff);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!NT_SUCCESS(Status))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("vboxVdmaVRegGet Status 0x%x", Status));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync goto done;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync void *pvCommandBuffer = NULL;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(cVRects);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!pvCommandBuffer)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!"));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Status = VERR_OUT_OF_RESOURCES;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync goto done;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxMpCrPackerTxBufferInit(pCurPacker, pvCommandBuffer, cbCommandBuffer, 1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Assert(pCurSwapchain->winHostID);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync crPackWindowVisibleRegion(&pCurPacker->CrPacker, pCurSwapchain->winHostID, cVRects, (GLint*)pVRectsBuff);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Status = vboxVdmaCrSubmitWriteAsync(pDevExt, pCurPacker, pCurContext->u32CrConClientID);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!NT_SUCCESS(Status))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pvCommandBuffer);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
e6ad2e18e663b076aeabfec994947514566a7accvboxsync }
e6ad2e18e663b076aeabfec994947514566a7accvboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
e6ad2e18e663b076aeabfec994947514566a7accvboxsync if (!pSwapchain)
e6ad2e18e663b076aeabfec994947514566a7accvboxsync goto done;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE, cCommands = 0;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cVRects;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Status = vboxVdmaVRegGet(pSwapchain, (const RTRECT *)&pContextRects->ContextRect, &cVRects, &pVRectsBuff, &cVRectsBuff);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!NT_SUCCESS(Status))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("vboxVdmaVRegGet Status 0x%x", Status));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync goto done;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync ++cCommands;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(cVRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
e6ad2e18e663b076aeabfec994947514566a7accvboxsync if (fCurRectChanged && fCurChanged)
e6ad2e18e663b076aeabfec994947514566a7accvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync ++cCommands;
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWPOSITION;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!pSwapchain->fExposed)
e6ad2e18e663b076aeabfec994947514566a7accvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync ++cCommands;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWSHOW;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync ++cCommands;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWSIZE;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync void *pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!pvCommandBuffer)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!"));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync Status = STATUS_INSUFFICIENT_RESOURCES;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync goto done;
e6ad2e18e663b076aeabfec994947514566a7accvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync VBoxMpCrPackerTxBufferInit(pCrPacker, pvCommandBuffer, cbCommandBuffer, cCommands);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Assert(pSwapchain->winHostID);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (fCurRectChanged && fCurChanged)
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync crPackWindowPosition(&pCrPacker->CrPacker, pSwapchain->winHostID, CurPos.x, CurPos.y);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!pSwapchain->fExposed)
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync {
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync crPackWindowSize(&pCrPacker->CrPacker, pSwapchain->winHostID, pSwapchain->width, pSwapchain->height);
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync crPackWindowShow(&pCrPacker->CrPacker, pSwapchain->winHostID, TRUE);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync pSwapchain->fExposed = TRUE;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync crPackWindowVisibleRegion(&pCrPacker->CrPacker, pSwapchain->winHostID, cVRects, (GLint*)pVRectsBuff);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync Status = vboxVdmaCrSubmitWriteAsync(pDevExt, pCrPacker, u32CrConClientID);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!NT_SUCCESS(Status))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pvCommandBuffer);
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
e6ad2e18e663b076aeabfec994947514566a7accvboxsyncdone:
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync VBOXWDDM_CTXLOCK_UNLOCK(pDevExt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pRectsToFree)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync vboxWddmMemFree(pRectsToFree);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pVRectsBuff)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync vboxWddmMemFree(pVRectsBuff);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncstatic NTSTATUS vboxVdmaGgDmaColorFill(PVBOXMP_DEVEXT pDevExt, VBOXVDMA_CLRFILL *pCF)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = STATUS_UNSUCCESSFUL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert (pDevExt->pvVisibleVram);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDevExt->pvVisibleVram)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXWDDM_ALLOCATION pAlloc = pCF->Alloc.pAlloc;
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync if (pAlloc->AllocData.Addr.SegmentId && pAlloc->AllocData.Addr.SegmentId != 1)
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync {
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync WARN(("request to collor fill invalid allocation"));
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync return STATUS_INVALID_PARAMETER;
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync }
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync VBOXVIDEOOFFSET offVram = vboxWddmAddrFramOffset(&pAlloc->AllocData.Addr);
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync if (offVram != VBOXVIDEOOFFSET_VOID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECT UnionRect = {0};
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync uint8_t *pvMem = pDevExt->pvVisibleVram + offVram;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync UINT bpp = pAlloc->AllocData.SurfDesc.bpp;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(bpp);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(((bpp * pAlloc->AllocData.SurfDesc.width) >> 3) == pAlloc->AllocData.SurfDesc.pitch);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (bpp)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case 32:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t bytestPP = bpp >> 3;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync for (UINT i = 0; i < pCF->Rects.cRects; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync RECT *pRect = &pCF->Rects.aRects[i];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (LONG ir = pRect->top; ir < pRect->bottom; ++ir)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync uint32_t * pvU32Mem = (uint32_t*)(pvMem + (ir * pAlloc->AllocData.SurfDesc.pitch) + (pRect->left * bytestPP));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cRaw = pRect->right - pRect->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pRect->left >= 0);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pRect->right <= (LONG)pAlloc->AllocData.SurfDesc.width);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pRect->top >= 0);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pRect->bottom <= (LONG)pAlloc->AllocData.SurfDesc.height);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (UINT j = 0; j < cRaw; ++j)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync *pvU32Mem = pCF->Color;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++pvU32Mem;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxWddmRectUnited(&UnionRect, &UnionRect, pRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case 16:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case 8:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync if (pAlloc->AllocData.SurfDesc.VidPnSourceId != D3DDDI_ID_UNINITIALIZED
70e6f03ca742e60292ae2d45811314790b16dab2vboxsync && VBOXWDDM_IS_FB_ALLOCATION(pDevExt, pAlloc)
70e6f03ca742e60292ae2d45811314790b16dab2vboxsync && pAlloc->bVisible
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!vboxWddmRectIsEmpty(&UnionRect))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pCF->Alloc.pAlloc->AllocData.SurfDesc.VidPnSourceId];
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync if (!cUnlockedVBVADisabled)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync {
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &UnionRect);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync }
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync else
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync {
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync VBOXVBVA_OP_WITHLOCK(ReportDirtyRect, pDevExt, pSource, &UnionRect);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync else
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync WARN(("invalid offVram"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsyncNTSTATUS vboxVdmaGgDmaBltPerform(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOC_DATA pSrcAlloc, RECT* pSrcRect,
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync PVBOXWDDM_ALLOC_DATA pDstAlloc, RECT* pDstRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t* pvVramBase = pDevExt->pvVisibleVram;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* we do not support stretching */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t srcWidth = pSrcRect->right - pSrcRect->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t srcHeight = pSrcRect->bottom - pSrcRect->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t dstWidth = pDstRect->right - pDstRect->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t dstHeight = pDstRect->bottom - pDstRect->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(srcHeight == dstHeight);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(dstWidth == srcWidth);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pDstAlloc->Addr.offVram != VBOXVIDEOOFFSET_VOID);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pSrcAlloc->Addr.offVram != VBOXVIDEOOFFSET_VOID);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync D3DDDIFORMAT enmSrcFormat, enmDstFormat;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync enmSrcFormat = pSrcAlloc->SurfDesc.format;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync enmDstFormat = pDstAlloc->SurfDesc.format;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync if (pDstAlloc->Addr.SegmentId && pDstAlloc->Addr.SegmentId != 1)
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync {
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync WARN(("request to collor blit invalid allocation"));
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync return STATUS_INVALID_PARAMETER;
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync }
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync if (pSrcAlloc->Addr.SegmentId && pSrcAlloc->Addr.SegmentId != 1)
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync {
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync WARN(("request to collor blit invalid allocation"));
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync return STATUS_INVALID_PARAMETER;
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync }
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync if (enmSrcFormat != enmDstFormat)
09f4b412099acda62997fd82c8608075c453b3ebvboxsync {
09f4b412099acda62997fd82c8608075c453b3ebvboxsync /* just ignore the alpha component
09f4b412099acda62997fd82c8608075c453b3ebvboxsync * this is ok since our software-based stuff can not handle alpha channel in any way */
09f4b412099acda62997fd82c8608075c453b3ebvboxsync enmSrcFormat = vboxWddmFmtNoAlphaFormat(enmSrcFormat);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync enmDstFormat = vboxWddmFmtNoAlphaFormat(enmDstFormat);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync if (enmSrcFormat != enmDstFormat)
09f4b412099acda62997fd82c8608075c453b3ebvboxsync {
09f4b412099acda62997fd82c8608075c453b3ebvboxsync WARN(("color conversion src(%d), dst(%d) not supported!", pSrcAlloc->SurfDesc.format, pDstAlloc->SurfDesc.format));
09f4b412099acda62997fd82c8608075c453b3ebvboxsync return STATUS_INVALID_PARAMETER;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync }
09f4b412099acda62997fd82c8608075c453b3ebvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (srcHeight != dstHeight)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (srcWidth != dstWidth)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_INVALID_PARAMETER;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync if (pDstAlloc->Addr.offVram == VBOXVIDEOOFFSET_VOID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_INVALID_PARAMETER;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync if (pSrcAlloc->Addr.offVram == VBOXVIDEOOFFSET_VOID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync uint8_t *pvDstSurf = pDstAlloc->Addr.SegmentId ? pvVramBase + pDstAlloc->Addr.offVram : (uint8_t*)pDstAlloc->Addr.pvMem;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync uint8_t *pvSrcSurf = pSrcAlloc->Addr.SegmentId ? pvVramBase + pSrcAlloc->Addr.offVram : (uint8_t*)pSrcAlloc->Addr.pvMem;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDstAlloc->SurfDesc.width == dstWidth
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && pSrcAlloc->SurfDesc.width == srcWidth
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && pSrcAlloc->SurfDesc.width == pDstAlloc->SurfDesc.width)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!pDstRect->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!pSrcRect->left);
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync uint32_t cbDstOff = vboxWddmCalcOffXYrd(0 /* x */, pDstRect->top, pDstAlloc->SurfDesc.pitch, pDstAlloc->SurfDesc.format);
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync uint32_t cbSrcOff = vboxWddmCalcOffXYrd(0 /* x */, pSrcRect->top, pSrcAlloc->SurfDesc.pitch, pSrcAlloc->SurfDesc.format);
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync uint32_t cbSize = vboxWddmCalcSize(pDstAlloc->SurfDesc.pitch, dstHeight, pDstAlloc->SurfDesc.format);
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync memcpy(pvDstSurf + cbDstOff, pvSrcSurf + cbSrcOff, cbSize);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync uint32_t cbDstLine = vboxWddmCalcRowSize(pDstRect->left, pDstRect->right, pDstAlloc->SurfDesc.format);
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync uint32_t offDstStart = vboxWddmCalcOffXYrd(pDstRect->left, pDstRect->top, pDstAlloc->SurfDesc.pitch, pDstAlloc->SurfDesc.format);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(cbDstLine <= pDstAlloc->SurfDesc.pitch);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cbDstSkip = pDstAlloc->SurfDesc.pitch;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t * pvDstStart = pvDstSurf + offDstStart;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync uint32_t cbSrcLine = vboxWddmCalcRowSize(pSrcRect->left, pSrcRect->right, pSrcAlloc->SurfDesc.format);
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync uint32_t offSrcStart = vboxWddmCalcOffXYrd(pSrcRect->left, pSrcRect->top, pSrcAlloc->SurfDesc.pitch, pSrcAlloc->SurfDesc.format);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(cbSrcLine <= pSrcAlloc->SurfDesc.pitch);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cbSrcSkip = pSrcAlloc->SurfDesc.pitch;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const uint8_t * pvSrcStart = pvSrcSurf + offSrcStart;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync uint32_t cRows = vboxWddmCalcNumRows(pDstRect->top, pDstRect->bottom, pDstAlloc->SurfDesc.format);
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(cbDstLine == cbSrcLine);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
d64aa881df34a86dd70ab0e1b7b94ffa41be9731vboxsync for (uint32_t i = 0; i < cRows; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
09f4b412099acda62997fd82c8608075c453b3ebvboxsync memcpy(pvDstStart, pvSrcStart, cbDstLine);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pvDstStart += cbDstSkip;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pvSrcStart += cbSrcSkip;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * @return on success the number of bytes the command contained, otherwise - VERR_xxx error code
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
09f4b412099acda62997fd82c8608075c453b3ebvboxsyncstatic NTSTATUS vboxVdmaGgDmaBlt(PVBOXMP_DEVEXT pDevExt, PVBOXVDMA_BLT pBlt)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* we do not support stretching for now */
09f4b412099acda62997fd82c8608075c453b3ebvboxsync Assert(pBlt->SrcRect.right - pBlt->SrcRect.left == pBlt->DstRects.ContextRect.right - pBlt->DstRects.ContextRect.left);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync Assert(pBlt->SrcRect.bottom - pBlt->SrcRect.top == pBlt->DstRects.ContextRect.bottom - pBlt->DstRects.ContextRect.top);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync if (pBlt->SrcRect.right - pBlt->SrcRect.left != pBlt->DstRects.ContextRect.right - pBlt->DstRects.ContextRect.left)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_INVALID_PARAMETER;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync if (pBlt->SrcRect.bottom - pBlt->SrcRect.top != pBlt->DstRects.ContextRect.bottom - pBlt->DstRects.ContextRect.top)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_INVALID_PARAMETER;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync Assert(pBlt->DstRects.UpdateRects.cRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync if (pBlt->DstRects.UpdateRects.cRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
09f4b412099acda62997fd82c8608075c453b3ebvboxsync for (uint32_t i = 0; i < pBlt->DstRects.UpdateRects.cRects; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECT SrcRect;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync vboxWddmRectTranslated(&SrcRect, &pBlt->DstRects.UpdateRects.aRects[i], -pBlt->DstRects.ContextRect.left, -pBlt->DstRects.ContextRect.top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Status = vboxVdmaGgDmaBltPerform(pDevExt, &pBlt->SrcAlloc.pAlloc->AllocData, &SrcRect,
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync &pBlt->DstAlloc.pAlloc->AllocData, &pBlt->DstRects.UpdateRects.aRects[i]);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status != STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Status = vboxVdmaGgDmaBltPerform(pDevExt, &pBlt->SrcAlloc.pAlloc->AllocData, &pBlt->SrcRect,
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync &pBlt->DstAlloc.pAlloc->AllocData, &pBlt->DstRects.ContextRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status != STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#ifdef VBOX_WITH_CROGL
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsynctypedef struct VBOXVDMA_CRRXGENERICSYNC
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync{
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync int rc;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync KEVENT Event;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync} VBOXVDMA_CRRXGENERICSYNC, *PVBOXVDMA_CRRXGENERICSYNC;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsyncstatic DECLCALLBACK(void) vboxVdmaCrRxGenericSyncCompletion(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvRx, uint32_t cbRx, void *pvCtx)
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync{
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync PVBOXMP_VDMACR_WRITEREADCOMPLETION pvCompletionData = (PVBOXMP_VDMACR_WRITEREADCOMPLETION)pvCtx;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync PVBOXVDMA_CRRXGENERICSYNC pData = (PVBOXVDMA_CRRXGENERICSYNC)pvCompletionData->pvContext;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync if (RT_SUCCESS(rc))
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync rc = VBoxMpCrCmdRxHandler((CRMessageHeader*)pvRx, cbRx);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync if (!RT_SUCCESS(rc))
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync WARN(("VBoxMpCrCmdRxHandler failed %d", rc));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync else
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync WARN(("rx failure %d", rc));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync pData->rc = rc;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync KeSetEvent(&pData->Event, 0, FALSE);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync vboxVdmaCrSubmitWriteReadAsyncGenericCompletion(pCon, pvCtx);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync}
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsyncNTSTATUS vboxVdmaCrRxGenericSync(PVBOXMP_DEVEXT pDevExt, VBOXMP_CRPACKER *pCrPacker, uint32_t u32CrConClientID)
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync{
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync VBOXVDMA_CRRXGENERICSYNC Data;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync Data.rc = VERR_NOT_SUPPORTED;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync KeInitializeEvent(&Data.Event, SynchronizationEvent, FALSE);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync NTSTATUS Status = vboxVdmaCrSubmitWriteReadAsync(pDevExt, pCrPacker, u32CrConClientID, vboxVdmaCrRxGenericSyncCompletion, &Data);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync if (!NT_SUCCESS(Status))
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync return Status;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync Status = KeWaitForSingleObject(&Data.Event, Executive, KernelMode, FALSE, NULL /* PLARGE_INTEGER Timeout */);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync if (!NT_SUCCESS(Status))
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync WARN(("KeWaitForSingleObject failed Status 0x%x", Status));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync return Status;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync return STATUS_SUCCESS;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync}
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsynctypedef struct VBOXMP_CRHGSMIMGR
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync{
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync VBOXMP_CRPACKER CrPacker;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync void *pvCommandBuffer;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync} VBOXMP_CRHGSMIMGR;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsyncDECLINLINE(CRPackContext*) vboxVdmaCrHmGetPackContext(VBOXMP_CRHGSMIMGR *pMgr)
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync{
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return &pMgr->CrPacker.CrPacker;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync}
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsyncNTSTATUS vboxVdmaCrHmCreate(PVBOXMP_DEVEXT pDevExt, VBOXMP_CRHGSMIMGR *pMgr, uint32_t cbCommandBuffer, uint32_t cCommands)
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync{
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync pMgr->pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!pMgr->pvCommandBuffer)
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!"));
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return VERR_OUT_OF_RESOURCES;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync }
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync VBoxMpCrPackerInit(&pMgr->CrPacker);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync VBoxMpCrPackerTxBufferInit(&pMgr->CrPacker, pMgr->pvCommandBuffer, cbCommandBuffer, cCommands);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return STATUS_SUCCESS;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync}
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsyncNTSTATUS vboxVdmaCrHmSubmitWrSync(PVBOXMP_DEVEXT pDevExt, VBOXMP_CRHGSMIMGR *pMgr, uint32_t u32CrConClientID)
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync{
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync NTSTATUS Status = vboxVdmaCrRxGenericSync(pDevExt, &pMgr->CrPacker, u32CrConClientID);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!NT_SUCCESS(Status))
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("vboxVdmaCrRxGenericSync failed Status 0x%x", Status));
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pMgr->pvCommandBuffer);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return Status;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync }
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return STATUS_SUCCESS;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync}
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync#if 0
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsyncNTSTATUS vboxVdmaCrCmdGetChromiumParametervCR(PVBOXMP_DEVEXT pDevExt, uint32_t u32CrConClientID, GLenum target, GLuint index, GLenum type, GLsizei count, GLvoid * values)
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync{
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE + VBOXMP_CRCMD_SIZE_GETCHROMIUMPARAMETERVCR;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync uint32_t cCommands = 1;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync VBOXMP_CRHGSMIMGR Mgr;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync NTSTATUS Status = vboxVdmaCrHmCreate(pDevExt, &Mgr, cbCommandBuffer, cCommands);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!NT_SUCCESS(Status))
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("vboxVdmaCrHmCreate failed Status 0x%x", Status));
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return Status;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync int dummy = 1;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync crPackGetChromiumParametervCR(vboxVdmaCrHmGetPackContext(&Mgr), target, index, type, count, values, &dummy);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync Status = vboxVdmaCrHmSubmitWrSync(pDevExt, &Mgr, u32CrConClientID);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!NT_SUCCESS(Status))
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("vboxVdmaCrHmSubmitWrSync failed Status 0x%x", Status));
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return Status;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync }
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return STATUS_SUCCESS;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync}
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsyncstatic NTSTATUS vboxVdmaCrCmdCreateContext(PVBOXMP_DEVEXT pDevExt, int32_t visualBits, int32_t *pi32CtxID)
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync{
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE + VBOXMP_CRCMD_SIZE_CREATECONTEXT;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync uint32_t cCommands = 1;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync VBOXMP_CRHGSMIMGR Mgr;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync NTSTATUS Status = vboxVdmaCrHmCreate(pDevExt, &Mgr, cbCommandBuffer, cCommands);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!NT_SUCCESS(Status))
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("vboxVdmaCrHmCreate failed Status 0x%x", Status));
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return Status;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync int dummy = 1;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync crPackCreateContext(&CrPacker.CrPacker, "", visualBits, 0, &pi32CtxID, &dummy);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync Status = vboxVdmaCrHmSubmitWrSync(pDevExt, &Mgr, u32CrConClientID);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!NT_SUCCESS(Status))
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("vboxVdmaCrHmSubmitWrSync failed Status 0x%x", Status));
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return Status;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync }
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return STATUS_SUCCESS;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync}
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsyncstatic NTSTATUS vboxVdmaCrCmdWindowCreate(PVBOXMP_DEVEXT pDevExt, int32_t visualBits, int32_t *pi32WinID)
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync{
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE + VBOXMP_CRCMD_SIZE_WINDOWCREATE;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync uint32_t cCommands = 1;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync VBOXMP_CRHGSMIMGR Mgr;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync NTSTATUS Status = vboxVdmaCrHmCreate(pDevExt, &Mgr, cbCommandBuffer, cCommands);
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync if (!NT_SUCCESS(Status))
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("vboxVdmaCrHmCreate failed Status 0x%x", Status));
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return Status;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync }
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync int dummy = 1;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync crPackWindowCreate(&CrPacker.CrPacker, "", visualBits, 0, &pi32CtxID, &dummy);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync Status = vboxVdmaCrHmSubmitWrSync(pDevExt, &Mgr, u32CrConClientID);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!NT_SUCCESS(Status))
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("vboxVdmaCrHmSubmitWrSync failed Status 0x%x", Status));
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync return Status;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return STATUS_SUCCESS;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync}
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsyncstatic NTSTATUS vboxVdmaCrCtlGetDefaultCtxId(PVBOXMP_DEVEXT pDevExt, int32_t *pi32CtxID)
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync{
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!pDevExt->i32CrConDefaultCtxID)
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!pDevExt->f3DEnabled)
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("3D disabled, should not be here!"));
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return STATUS_UNSUCCESSFUL;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync }
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync uint32_t u32ClienID;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync NTSTATUS Status = vboxVdmaCrCtlGetDefaultClientId(pDevExt, &u32ClienID);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!NT_SUCCESS(Status))
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("vboxVdmaCrCtlGetDefaultClientId failed, Status %#x", Status));
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return Status;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync }
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync Status = vboxVdmaCrCmdWindowCreate(PVBOXMP_DEVEXT pDevExt, int32_t visualBits, int32_t *pi32WinID)
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync VBOXMP_CRPACKER CrPacker;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync VBoxMpCrPackerInit(&CrPacker);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync
d9fec6d329252f6e5eb8f564690e582b2aea6624vboxsync int rc = VBoxMpCrCtlConConnect(pDevExt, &pDevExt->CrCtlCon, CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR, &pDevExt->u32CrConDefaultClientID);
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync if (!RT_SUCCESS(rc))
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync {
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync WARN(("VBoxMpCrCtlConConnect failed, rc %d", rc));
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync return STATUS_UNSUCCESSFUL;
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync }
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync }
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
1c0d3d017f9a45748b4839bf6622b53e83a4f1f8vboxsync *pi32CtxID = pDevExt->i32CrConDefaultCtxID;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync return STATUS_SUCCESS;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync}
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync#endif
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncstatic NTSTATUS vboxVdmaTexPresentSubmit(PVBOXMP_DEVEXT pDevExt,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBOXMP_CRPACKER *pCrPacker,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t u32CrConClientID,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t hostID,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cfg,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync int32_t posX,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync int32_t posY,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cRects,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync const RTRECT*paRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
7c939d999058f3fa53c27e453ea6e41de8a93fabvboxsync Assert(pDevExt->fTexPresentEnabled);
7c939d999058f3fa53c27e453ea6e41de8a93fabvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE + VBOXMP_CRCMD_SIZE_VBOXTEXPRESENT(cRects);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync uint32_t cCommands = 1;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync void *pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!pvCommandBuffer)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!"));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return VERR_OUT_OF_RESOURCES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxMpCrPackerTxBufferInit(pCrPacker, pvCommandBuffer, cbCommandBuffer, cCommands);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync crPackVBoxTexPresent(&pCrPacker->CrPacker, hostID, cfg, posX, posY, cRects, (int32_t*)paRects);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync NTSTATUS Status = vboxVdmaCrSubmitWriteAsync(pDevExt, pCrPacker, u32CrConClientID);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!NT_SUCCESS(Status))
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pvCommandBuffer);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync }
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return Status;
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync}
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsyncstatic NTSTATUS vboxVdmaChromiumParameteriCRSubmit(PVBOXMP_DEVEXT pDevExt,
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync VBOXMP_CRPACKER *pCrPacker,
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync uint32_t u32CrConClientID,
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync uint32_t target, uint32_t value)
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync{
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync Assert(pDevExt->fTexPresentEnabled);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE + VBOXMP_CRCMD_SIZE_CHROMIUMPARAMETERICR;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync uint32_t cCommands = 1;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync void *pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync if (!pvCommandBuffer)
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync {
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!"));
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync return VERR_OUT_OF_RESOURCES;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync }
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync VBoxMpCrPackerTxBufferInit(pCrPacker, pvCommandBuffer, cbCommandBuffer, cCommands);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync crPackChromiumParameteriCR(&pCrPacker->CrPacker, target, value);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync NTSTATUS Status = vboxVdmaCrSubmitWriteAsync(pDevExt, pCrPacker, u32CrConClientID);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync if (!NT_SUCCESS(Status))
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync {
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status));
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pvCommandBuffer);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync }
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync return Status;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync}
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsyncNTSTATUS VBoxVdmaChromiumParameteriCRSubmit(PVBOXMP_DEVEXT pDevExt, uint32_t target, uint32_t value)
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync{
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync uint32_t u32CrConClientID;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync NTSTATUS Status = vboxVdmaCrCtlGetDefaultClientId(pDevExt, &u32CrConClientID);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync if (!NT_SUCCESS(Status))
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync {
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync WARN(("vboxVdmaCrCtlGetDefaultClientId failed Status 0x%x", Status));
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync return Status;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync }
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync VBOXMP_CRPACKER *pCrPacker = (VBOXMP_CRPACKER *)RTMemTmpAlloc(sizeof(*pCrPacker));
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync if (!pCrPacker)
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync return STATUS_NO_MEMORY;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync VBoxMpCrPackerInit(pCrPacker);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync Status = vboxVdmaChromiumParameteriCRSubmit(pDevExt, pCrPacker, u32CrConClientID, target, value);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync if (!NT_SUCCESS(Status))
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync WARN(("vboxVdmaChromiumParameteriCRSubmit failed Status 0x%x", Status));
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync RTMemTmpFree(pCrPacker);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync return Status;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync}
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncstatic NTSTATUS vboxVdmaCrCtlGetDefaultClientId(PVBOXMP_DEVEXT pDevExt, uint32_t *pu32ClienID)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync{
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!pDevExt->u32CrConDefaultClientID)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync if (!pDevExt->f3DEnabled)
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync {
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync WARN(("3D disabled, should not be here!"));
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync return STATUS_UNSUCCESSFUL;
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync }
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync
d9fec6d329252f6e5eb8f564690e582b2aea6624vboxsync int rc = VBoxMpCrCtlConConnect(pDevExt, &pDevExt->CrCtlCon, CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR, &pDevExt->u32CrConDefaultClientID);
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync if (!RT_SUCCESS(rc))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync {
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync WARN(("VBoxMpCrCtlConConnect failed, rc %d", rc));
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return STATUS_UNSUCCESSFUL;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync }
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync *pu32ClienID = pDevExt->u32CrConDefaultClientID;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync return STATUS_SUCCESS;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync}
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncstatic NTSTATUS vboxVdmaProcessVRegTexPresent(PVBOXMP_DEVEXT pDevExt,
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync VBOXMP_CRPACKER *pCrPacker,
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync uint32_t u32CrConClientID,
359416647a711739d1b14addbf399178949a1a60vboxsync const VBOXWDDM_ALLOC_DATA *pSrcAllocData,
359416647a711739d1b14addbf399178949a1a60vboxsync const VBOXWDDM_ALLOC_DATA *pDstAllocData,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync const RECT *pSrcRect, const VBOXVDMAPIPE_RECTS *pDstRects)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId = pDstAllocData->SurfDesc.VidPnSourceId;
359416647a711739d1b14addbf399178949a1a60vboxsync if (srcId >= (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays)
359416647a711739d1b14addbf399178949a1a60vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync WARN(("invalid srcId"));
359416647a711739d1b14addbf399178949a1a60vboxsync return STATUS_NOT_SUPPORTED;
359416647a711739d1b14addbf399178949a1a60vboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[srcId];
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync bool fPrimary = vboxWddmAddrVramEqual(&pDstAllocData->Addr, &pSource->AllocData.Addr);
359416647a711739d1b14addbf399178949a1a60vboxsync /* we care only about screen regions */
359416647a711739d1b14addbf399178949a1a60vboxsync if (!fPrimary)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync WARN(("non-primary allocation passed to vboxWddmSubmitBltCmd!"));
359416647a711739d1b14addbf399178949a1a60vboxsync return STATUS_NOT_SUPPORTED;
359416647a711739d1b14addbf399178949a1a60vboxsync }
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync NTSTATUS Status = STATUS_SUCCESS;
359416647a711739d1b14addbf399178949a1a60vboxsync uint32_t hostID = pSrcAllocData->hostID;
359416647a711739d1b14addbf399178949a1a60vboxsync int rc;
359416647a711739d1b14addbf399178949a1a60vboxsync if (hostID)
359416647a711739d1b14addbf399178949a1a60vboxsync {
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync// Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D);
359416647a711739d1b14addbf399178949a1a60vboxsync int32_t posX = pDstRects->ContextRect.left - pSrcRect->left;
359416647a711739d1b14addbf399178949a1a60vboxsync int32_t posY = pDstRects->ContextRect.top - pSrcRect->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync Status = vboxVdmaTexPresentSubmit(pDevExt, pCrPacker, u32CrConClientID, hostID, srcId, posX, posY, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects);
359416647a711739d1b14addbf399178949a1a60vboxsync if (NT_SUCCESS(Status))
359416647a711739d1b14addbf399178949a1a60vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync rc = VBoxVrListRectsSubst(&pSource->VrList, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects, NULL);
359416647a711739d1b14addbf399178949a1a60vboxsync if (RT_SUCCESS(rc))
359416647a711739d1b14addbf399178949a1a60vboxsync pSource->fHas3DVrs = TRUE;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync else
359416647a711739d1b14addbf399178949a1a60vboxsync WARN(("VBoxVrListRectsSubst failed rc %d, ignoring..", rc));
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync else
359416647a711739d1b14addbf399178949a1a60vboxsync WARN(("vboxVdmaTexPresentSubmit failed Status 0x%x", Status));
359416647a711739d1b14addbf399178949a1a60vboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync else
359416647a711739d1b14addbf399178949a1a60vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync Assert(fPrimary);
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync bool fChanged = false;
359416647a711739d1b14addbf399178949a1a60vboxsync Assert(pSource->pPrimaryAllocation->bVisible);
359416647a711739d1b14addbf399178949a1a60vboxsync rc = VBoxVrListRectsAdd(&pSource->VrList, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects, &fChanged);
359416647a711739d1b14addbf399178949a1a60vboxsync if (RT_SUCCESS(rc))
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync if (fChanged)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync Status = vboxVdmaTexPresentSubmit(pDevExt, pCrPacker, u32CrConClientID, hostID, srcId, 0, 0, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects);
359416647a711739d1b14addbf399178949a1a60vboxsync if (NT_SUCCESS(Status))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync if (pSource->fHas3DVrs)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync if (VBoxVrListRectsCount(&pSource->VrList) == 1)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync RTRECT Rect;
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVrListRectsGet(&pSource->VrList, 1, &Rect);
359416647a711739d1b14addbf399178949a1a60vboxsync if (Rect.xLeft == 0
359416647a711739d1b14addbf399178949a1a60vboxsync && Rect.yTop == 0
359416647a711739d1b14addbf399178949a1a60vboxsync && Rect.xRight == pDstAllocData->SurfDesc.width
359416647a711739d1b14addbf399178949a1a60vboxsync && Rect.yBottom == pDstAllocData->SurfDesc.height)
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync pSource->fHas3DVrs = FALSE;
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync }
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync else
359416647a711739d1b14addbf399178949a1a60vboxsync WARN(("vboxVdmaTexPresentSubmit failed Status 0x%x", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync else
359416647a711739d1b14addbf399178949a1a60vboxsync WARN(("VBoxVrListRectsAdd failed rc %d, ignoring..", rc));
359416647a711739d1b14addbf399178949a1a60vboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync return Status;
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncstatic NTSTATUS vboxVdmaProcessVReg(PVBOXMP_DEVEXT pDevExt,
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXMP_CRPACKER *pCrPacker,
359416647a711739d1b14addbf399178949a1a60vboxsync uint32_t u32CrConClientID,
359416647a711739d1b14addbf399178949a1a60vboxsync const VBOXWDDM_ALLOCATION *pSrcAlloc,
359416647a711739d1b14addbf399178949a1a60vboxsync const VBOXWDDM_ALLOCATION *pDstAlloc,
359416647a711739d1b14addbf399178949a1a60vboxsync const RECT *pSrcRect, const VBOXVDMAPIPE_RECTS *pDstRects)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId = pDstAlloc->AllocData.SurfDesc.VidPnSourceId;
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[srcId];
359416647a711739d1b14addbf399178949a1a60vboxsync NTSTATUS Status = STATUS_SUCCESS;
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync if (pDevExt->fTexPresentEnabled)
359416647a711739d1b14addbf399178949a1a60vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync Status = vboxVdmaProcessVRegTexPresent(pDevExt, pCrPacker, u32CrConClientID,
359416647a711739d1b14addbf399178949a1a60vboxsync &pSrcAlloc->AllocData, &pDstAlloc->AllocData,
359416647a711739d1b14addbf399178949a1a60vboxsync pSrcRect, pDstRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync else
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
3ea1dbf096240fc221aea99352a74c17a367a9b6vboxsync PVBOXWDDM_SWAPCHAIN pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pSrcAlloc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pSwapchain)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
3ea1dbf096240fc221aea99352a74c17a367a9b6vboxsync Assert(pSrcAlloc->AllocData.SurfDesc.width == pSwapchain->width);
3ea1dbf096240fc221aea99352a74c17a367a9b6vboxsync Assert(pSrcAlloc->AllocData.SurfDesc.height == pSwapchain->height);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync Status = vboxVdmaProcessVRegCmdLegacy(pDevExt, pCrPacker, u32CrConClientID, pSource, pSwapchain, pSrcRect, pDstRects);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!NT_SUCCESS(Status))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("vboxVdmaProcessVRegCmdLegacy failed Status 0x%x", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pSwapchain)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync vboxWddmSwapchainRelease(pSwapchain);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncNTSTATUS vboxVdmaTexPresentSetAlloc(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData)
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync{
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync uint32_t u32CrConClientID;
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync NTSTATUS Status = vboxVdmaCrCtlGetDefaultClientId(pDevExt, &u32CrConClientID);
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync if (!NT_SUCCESS(Status))
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync {
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync WARN(("vboxVdmaCrCtlGetDefaultClientId failed Status 0x%x", Status));
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync return Status;
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync }
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync VBOXMP_CRPACKER *pCrPacker = (VBOXMP_CRPACKER *)RTMemTmpAlloc(sizeof(*pCrPacker));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if (!pCrPacker)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return STATUS_NO_MEMORY;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync VBoxMpCrPackerInit(pCrPacker);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync RECT Rect;
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync Rect.left = 0;
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync Rect.top = 0;
359416647a711739d1b14addbf399178949a1a60vboxsync Rect.right = pAllocData->SurfDesc.width;
359416647a711739d1b14addbf399178949a1a60vboxsync Rect.bottom = pAllocData->SurfDesc.height;
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync if (pDevExt->fCmdVbvaEnabled)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync Status = vboxVdmaTexPresentSubmit(pDevExt, pCrPacker, u32CrConClientID, pAllocData->hostID, pAllocData->SurfDesc.VidPnSourceId, 0, 0, 1, (RTRECT*)&Rect);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync else if (pDevExt->fTexPresentEnabled)
359416647a711739d1b14addbf399178949a1a60vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXVDMAPIPE_RECTS RectInfo;
359416647a711739d1b14addbf399178949a1a60vboxsync RectInfo.ContextRect = Rect;
359416647a711739d1b14addbf399178949a1a60vboxsync RectInfo.UpdateRects.cRects = 1;
359416647a711739d1b14addbf399178949a1a60vboxsync RectInfo.UpdateRects.aRects[0] = Rect;
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync Status = vboxVdmaProcessVRegTexPresent(pDevExt, pCrPacker, u32CrConClientID,
359416647a711739d1b14addbf399178949a1a60vboxsync pAllocData, pAllocData,
359416647a711739d1b14addbf399178949a1a60vboxsync &Rect, &RectInfo);
359416647a711739d1b14addbf399178949a1a60vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync else
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync Status = STATUS_NOT_IMPLEMENTED;
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTMemTmpFree(pCrPacker);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return Status;
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync}
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync
41fcf8465b641c7083d3b440451f17c1210fce33vboxsyncstatic NTSTATUS vboxVdmaProcessVRegCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext,
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync const VBOXWDDM_DMA_ALLOCINFO *pSrcAllocInfo,
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync const VBOXWDDM_DMA_ALLOCINFO *pDstAllocInfo,
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync const RECT *pSrcRect, const VBOXVDMAPIPE_RECTS *pDstRects)
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync{
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync return vboxVdmaProcessVReg(pDevExt, &pContext->CrPacker, pContext->u32CrConClientID,
3ea1dbf096240fc221aea99352a74c17a367a9b6vboxsync pSrcAllocInfo->pAlloc, pDstAllocInfo->pAlloc,
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync pSrcRect, pDstRects);
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync}
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync
3decc8a08d366ec11441c85d4e118c9448adc467vboxsyncstatic void vboxVdmaBltDirtyRectsUpdate(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_SOURCE *pSource, uint32_t cRects, const RECT *paRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync if (!cRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync WARN(("vboxVdmaBltDirtyRectsUpdate: no rects specified"));
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync return;
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync RECT rect;
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync rect = paRects[0];
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync for (UINT i = 1; i < cRects; ++i)
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync {
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync vboxWddmRectUnited(&rect, &rect, &paRects[i]);
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled);
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync if (!cUnlockedVBVADisabled)
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync {
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &rect);
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync }
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync else
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync {
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, pSource, &rect);
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync }
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync}
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
3decc8a08d366ec11441c85d4e118c9448adc467vboxsyncNTSTATUS vboxVdmaProcessBltCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, VBOXWDDM_DMA_PRIVATEDATA_BLT *pBlt)
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync{
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync NTSTATUS Status = STATUS_SUCCESS;
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync PVBOXWDDM_ALLOCATION pDstAlloc = pBlt->Blt.DstAlloc.pAlloc;
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc;
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync BOOLEAN fVRAMUpdated = FALSE;
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#ifdef VBOX_WITH_CROGL
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync if (!pDstAlloc->AllocData.hostID && !pSrcAlloc->AllocData.hostID)
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#endif
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync {
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync /* the allocations contain a real data in VRAM, do blitting */
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync vboxVdmaGgDmaBlt(pDevExt, &pBlt->Blt);
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync fVRAMUpdated = TRUE;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync }
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#ifdef VBOX_WITH_CROGL
359416647a711739d1b14addbf399178949a1a60vboxsync if (VBOXWDDM_IS_FB_ALLOCATION(pDevExt, pDstAlloc)
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync && pDstAlloc->bVisible)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync {
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->AllocData.SurfDesc.VidPnSourceId];
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync Assert(pDstAlloc->AllocData.SurfDesc.VidPnSourceId < VBOX_VIDEO_MAX_SCREENS);
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync Assert(pSource->pPrimaryAllocation == pDstAlloc);
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync if (fVRAMUpdated)
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync vboxVdmaBltDirtyRectsUpdate(pDevExt, pSource, pBlt->Blt.DstRects.UpdateRects.cRects, pBlt->Blt.DstRects.UpdateRects.aRects);
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync
8a33c8d4750c261fcee3537fb4d23abf313375cdvboxsync if (pSrcAlloc->AllocData.hostID || (pDevExt->fTexPresentEnabled ? pSource->fHas3DVrs : !!pDevExt->cContexts3D))
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync {
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync Status = vboxVdmaProcessVRegCmd(pDevExt, pContext, &pBlt->Blt.SrcAlloc, &pBlt->Blt.DstAlloc, &pBlt->Blt.SrcRect, &pBlt->Blt.DstRects);
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync if (!NT_SUCCESS(Status))
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync WARN(("vboxVdmaProcessVRegCmd failed Status 0x%x", Status));
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync }
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync }
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
3decc8a08d366ec11441c85d4e118c9448adc467vboxsyncNTSTATUS vboxVdmaProcessFlipCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip)
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync{
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync NTSTATUS Status = STATUS_SUCCESS;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId];
359416647a711739d1b14addbf399178949a1a60vboxsync vboxWddmAssignPrimary(pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId);
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#ifdef VBOX_WITH_CROGL
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync if (pAlloc->AllocData.hostID)
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync RECT SrcRect;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBOXVDMAPIPE_RECTS Rects;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync SrcRect.left = 0;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync SrcRect.top = 0;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync SrcRect.right = pAlloc->AllocData.SurfDesc.width;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync SrcRect.bottom = pAlloc->AllocData.SurfDesc.height;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Rects.ContextRect.left = 0;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Rects.ContextRect.top = 0;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Rects.ContextRect.right = pAlloc->AllocData.SurfDesc.width;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Rects.ContextRect.bottom = pAlloc->AllocData.SurfDesc.height;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Rects.UpdateRects.cRects = 1;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Rects.UpdateRects.aRects[0] = Rects.ContextRect;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Status = vboxVdmaProcessVRegCmd(pDevExt, pContext, &pFlip->Flip.Alloc, &pFlip->Flip.Alloc, &SrcRect, &Rects);
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync if (!NT_SUCCESS(Status))
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("vboxVdmaProcessVRegCmd failed Status 0x%x", Status));
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync }
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync else
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#endif
ad290511521ce8388a9926b165241ecf83c330a7vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("unexpected flip request"));
ad290511521ce8388a9926b165241ecf83c330a7vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync return Status;
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync}
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync
3decc8a08d366ec11441c85d4e118c9448adc467vboxsyncNTSTATUS vboxVdmaProcessClrFillCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, VBOXWDDM_DMA_PRIVATEDATA_CLRFILL *pCF)
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync{
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync NTSTATUS Status = STATUS_SUCCESS;
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync PVBOXWDDM_ALLOCATION pAlloc = pCF->ClrFill.Alloc.pAlloc;
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#ifdef VBOX_WITH_CROGL
3decc8a08d366ec11441c85d4e118c9448adc467vboxsync if (!pAlloc->AllocData.hostID)
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#endif
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Status = vboxVdmaGgDmaColorFill(pDevExt, &pCF->ClrFill);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (!NT_SUCCESS(Status))
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync WARN(("vboxVdmaGgDmaColorFill failed Status 0x%x", Status));
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync }
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#ifdef VBOX_WITH_CROGL
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync else
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync WARN(("unexpected clrfill request"));
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync return Status;
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync}
67b8a5a52c43a79ea7e159dbbeec99687fb9cd3bvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VDMA
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This is currently used by VDMA. It is invisible for Vdma API clients since
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Vdma transport may change if we choose to use another (e.g. more light-weight)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * transport for DMA commands submission
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOXVDMA_WITH_VBVA
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic int vboxWddmVdmaSubmitVbva(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, HGSMIOFFSET offDr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vboxVbvaBufferBeginUpdate (pDevExt, &pDevExt->u.primary.Vbva))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVbvaReportCmdOffset(pDevExt, &pDevExt->u.primary.Vbva, offDr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVbvaBufferEndUpdate (pDevExt, &pDevExt->u.primary.Vbva);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_STATE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define vboxWddmVdmaSubmit vboxWddmVdmaSubmitVbva
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic int vboxWddmVdmaSubmitHgsmi(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, HGSMIOFFSET offDr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxVideoCmnPortWriteUlong(VBoxCommonFromDeviceExt(pDevExt)->guestCtx.port, offDr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define vboxWddmVdmaSubmit vboxWddmVdmaSubmitHgsmi
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic int vboxVdmaInformHost(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, VBOXVDMA_CTL_TYPE enmCtl)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMA_CTL pCmd = (PVBOXVDMA_CTL)VBoxSHGSMICommandAlloc(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx, sizeof (VBOXVDMA_CTL), HGSMI_CH_VBVA, VBVA_VDMA_CTL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->enmCtl = enmCtl;
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsync pCmd->u32Offset = pInfo->CmdHeap.Heap.area.offBase;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->i32Result = VERR_NOT_SUPPORTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pHdr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(offCmd != HGSMIOFFSET_VOID);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (offCmd != HGSMIOFFSET_VOID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxWddmVdmaSubmit(pDevExt, pInfo, offCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VBoxSHGSMICommandDoneSynch(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pCmd->i32Result;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* fail to submit, cancel it */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxSHGSMICommandCancelSynch(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxSHGSMICommandFree (&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("HGSMIHeapAlloc failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_OUT_OF_RESOURCES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
32b1164f35483be483177be7b5235002a4a5afbevboxsyncstatic DECLCALLBACK(void *) hgsmiEnvAlloc(void *pvEnv, HGSMISIZE cb)
32b1164f35483be483177be7b5235002a4a5afbevboxsync{
32b1164f35483be483177be7b5235002a4a5afbevboxsync NOREF(pvEnv);
32b1164f35483be483177be7b5235002a4a5afbevboxsync return RTMemAlloc(cb);
32b1164f35483be483177be7b5235002a4a5afbevboxsync}
32b1164f35483be483177be7b5235002a4a5afbevboxsync
32b1164f35483be483177be7b5235002a4a5afbevboxsyncstatic DECLCALLBACK(void) hgsmiEnvFree(void *pvEnv, void *pv)
32b1164f35483be483177be7b5235002a4a5afbevboxsync{
32b1164f35483be483177be7b5235002a4a5afbevboxsync NOREF(pvEnv);
32b1164f35483be483177be7b5235002a4a5afbevboxsync RTMemFree(pv);
32b1164f35483be483177be7b5235002a4a5afbevboxsync}
32b1164f35483be483177be7b5235002a4a5afbevboxsync
32b1164f35483be483177be7b5235002a4a5afbevboxsyncstatic HGSMIENV g_hgsmiEnvVdma =
32b1164f35483be483177be7b5235002a4a5afbevboxsync{
32b1164f35483be483177be7b5235002a4a5afbevboxsync NULL,
32b1164f35483be483177be7b5235002a4a5afbevboxsync hgsmiEnvAlloc,
32b1164f35483be483177be7b5235002a4a5afbevboxsync hgsmiEnvFree
32b1164f35483be483177be7b5235002a4a5afbevboxsync};
32b1164f35483be483177be7b5235002a4a5afbevboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* create a DMACommand buffer */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVdmaCreate(PVBOXMP_DEVEXT pDevExt, VBOXVDMAINFO *pInfo
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VDMA
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync , ULONG offBuffer, ULONG cbBuffer
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->fEnabled = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VDMA
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert((offBuffer & 0xfff) == 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert((cbBuffer & 0xfff) == 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(offBuffer);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(cbBuffer);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if((offBuffer & 0xfff)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || (cbBuffer & 0xfff)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || !offBuffer
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || !cbBuffer)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("invalid parameters: offBuffer(0x%x), cbBuffer(0x%x)", offBuffer, cbBuffer));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVOID pvBuffer;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VBoxMPCmnMapAdapterMemory(VBoxCommonFromDeviceExt(pDevExt),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &pvBuffer,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync offBuffer,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cbBuffer);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(RT_SUCCESS(rc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Setup a HGSMI heap within the adapter information area. */
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsync rc = VBoxSHGSMIInit(&pInfo->CmdHeap,
6c28ed70192c3f2d1edf978697ff0ee0276bf0eevboxsync HGSMI_HEAP_TYPE_MA,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pvBuffer,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cbBuffer,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync offBuffer,
32b1164f35483be483177be7b5235002a4a5afbevboxsync &g_hgsmiEnvVdma);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(RT_SUCCESS(rc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VDMA
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("HGSMIHeapSetup failed rc = 0x%x", rc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxMPCmnUnmapAdapterMemory(VBoxCommonFromDeviceExt(pDevExt), &pvBuffer);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("VBoxMapAdapterMemory failed rc = 0x%x\n", rc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVdmaDisable (PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pInfo->fEnabled);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pInfo->fEnabled)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_ALREADY_INITIALIZED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* ensure nothing else is submitted */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->fEnabled = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VDMA
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = vboxVdmaInformHost (pDevExt, pInfo, VBOXVDMA_CTL_TYPE_DISABLE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVdmaEnable (PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!pInfo->fEnabled);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pInfo->fEnabled)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_ALREADY_INITIALIZED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VDMA
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = vboxVdmaInformHost (pDevExt, pInfo, VBOXVDMA_CTL_TYPE_ENABLE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(RT_SUCCESS(rc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->fEnabled = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VDMA
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVdmaFlush (PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pInfo->fEnabled);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pInfo->fEnabled)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_ALREADY_INITIALIZED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = vboxVdmaInformHost (pDevExt, pInfo, VBOXVDMA_CTL_TYPE_FLUSH);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(RT_SUCCESS(rc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVdmaDestroy (PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Assert(!pInfo->fEnabled);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (pInfo->fEnabled)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync rc = vboxVdmaDisable (pDevExt, pInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VDMA
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxSHGSMITerm(&pInfo->CmdHeap);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBoxMPCmnUnmapAdapterMemory(VBoxCommonFromDeviceExt(pDevExt), (void**)&pInfo->CmdHeap.Heap.area.pu8Base);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VDMA
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVdmaCBufDrFree (PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxSHGSMICommandFree (&pInfo->CmdHeap, pDr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncPVBOXVDMACBUF_DR vboxVdmaCBufDrCreate (PVBOXVDMAINFO pInfo, uint32_t cbTrailingData)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cbDr = VBOXVDMACBUF_DR_SIZE(cbTrailingData);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMACBUF_DR pDr = (PVBOXVDMACBUF_DR)VBoxSHGSMICommandAlloc (&pInfo->CmdHeap, cbDr, HGSMI_CH_VBVA, VBVA_VDMA_CMD);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pDr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset (pDr, 0, cbDr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("VBoxSHGSMICommandAlloc returned NULL"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return pDr;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncstatic DECLCALLBACK(void) vboxVdmaCBufDrCompletion(PVBOXSHGSMI pHeap, void *pvCmd, void *pvContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)pvContext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMAINFO pInfo = &pDevExt->u.primary.Vdma;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVdmaCBufDrFree (pInfo, (PVBOXVDMACBUF_DR)pvCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
d9fec6d329252f6e5eb8f564690e582b2aea6624vboxsyncstatic DECLCALLBACK(PFNVBOXSHGSMICMDCOMPLETION) vboxVdmaCBufDrCompletionIrq(PVBOXSHGSMI pHeap, void *pvCmd, void *pvContext, void **ppvCompletion)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)pvContext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMAINFO pVdma = &pDevExt->u.primary.Vdma;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMACBUF_DR pDr = (PVBOXVDMACBUF_DR)pvCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DXGK_INTERRUPT_TYPE enmComplType;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(pDr->rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync enmComplType = DXGK_INTERRUPT_DMA_COMPLETED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (pDr->rc == VERR_INTERRUPTED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync enmComplType = DXGK_INTERRUPT_DMA_PREEMPTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync enmComplType = DXGK_INTERRUPT_DMA_FAULTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync if (vboxVdmaDdiCmdCompletedIrq(pDevExt, VBOXVDMADDI_CMD_FROM_BUF_DR(pDr), enmComplType))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevExt->bNotifyDxDpc = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* inform SHGSMI we DO NOT want to be called at DPC later */
d9fec6d329252f6e5eb8f564690e582b2aea6624vboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// *ppvCompletion = pvContext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVdmaCBufDrSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepAsynchIrq (&pInfo->CmdHeap, pDr, vboxVdmaCBufDrCompletionIrq, pDevExt, VBOXSHGSMI_FLAG_GH_ASYNCH_FORCE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pHdr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pInfo->CmdHeap, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(offCmd != HGSMIOFFSET_VOID);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (offCmd != HGSMIOFFSET_VOID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxWddmVdmaSubmit(pDevExt, pInfo, offCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxSHGSMICommandDoneAsynch(&pInfo->CmdHeap, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* fail to submit, cancel it */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxSHGSMICommandCancelAsynch(&pInfo->CmdHeap, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVdmaCBufDrSubmitSynch(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepAsynch (&pInfo->CmdHeap, pDr, NULL, NULL, VBOXSHGSMI_FLAG_GH_SYNCH);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pHdr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pInfo->CmdHeap, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(offCmd != HGSMIOFFSET_VOID);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (offCmd != HGSMIOFFSET_VOID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxWddmVdmaSubmit(pDevExt, pInfo, offCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxSHGSMICommandDoneAsynch(&pInfo->CmdHeap, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* fail to submit, cancel it */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxSHGSMICommandCancelAsynch(&pInfo->CmdHeap, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* ddi dma command queue */
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncVOID vboxVdmaDdiCmdGetCompletedListIsr(PVBOXMP_DEVEXT pDevExt, LIST_ENTRY *pList)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync{
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVideoLeDetach(&pDevExt->DpcCmdQueue, pList);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync}
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncBOOLEAN vboxVdmaDdiCmdIsCompletedListEmptyIsr(PVBOXMP_DEVEXT pDevExt)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync{
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync return IsListEmpty(&pDevExt->DpcCmdQueue);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync}
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncDECLINLINE(BOOLEAN) vboxVdmaDdiCmdCanComplete(PVBOXMP_DEVEXT pDevExt, UINT u32NodeOrdinal)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync PVBOXVDMADDI_CMD_QUEUE pQueue = &pDevExt->aNodes[u32NodeOrdinal].CmdQueue;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return ASMAtomicUoReadU32(&pQueue->cQueuedCmds) == 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLCALLBACK(VOID) vboxVdmaDdiCmdCompletionCbFree(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxWddmMemFree(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncstatic VOID vboxVdmaDdiCmdNotifyCompletedIrq(PVBOXMP_DEVEXT pDevExt, UINT u32NodeOrdinal, UINT u32FenceId, DXGK_INTERRUPT_TYPE enmComplType)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync PVBOXVDMADDI_NODE pNode = &pDevExt->aNodes[u32NodeOrdinal];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DXGKARGCB_NOTIFY_INTERRUPT_DATA notify;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(&notify, 0, sizeof(DXGKARGCB_NOTIFY_INTERRUPT_DATA));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (enmComplType)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case DXGK_INTERRUPT_DMA_COMPLETED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync notify.InterruptType = DXGK_INTERRUPT_DMA_COMPLETED;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync notify.DmaCompleted.SubmissionFenceId = u32FenceId;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync notify.DmaCompleted.NodeOrdinal = u32NodeOrdinal;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync pNode->uLastCompletedFenceId = u32FenceId;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case DXGK_INTERRUPT_DMA_PREEMPTED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync notify.InterruptType = DXGK_INTERRUPT_DMA_PREEMPTED;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync notify.DmaPreempted.PreemptionFenceId = u32FenceId;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync notify.DmaPreempted.NodeOrdinal = u32NodeOrdinal;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync notify.DmaPreempted.LastCompletedFenceId = pNode->uLastCompletedFenceId;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case DXGK_INTERRUPT_DMA_FAULTED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync notify.InterruptType = DXGK_INTERRUPT_DMA_FAULTED;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync notify.DmaFaulted.FaultedFenceId = u32FenceId;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync notify.DmaFaulted.Status = STATUS_UNSUCCESSFUL; /* @todo: better status ? */
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync notify.DmaFaulted.NodeOrdinal = u32NodeOrdinal;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevExt->u.primary.DxgkInterface.DxgkCbNotifyInterrupt(pDevExt->u.primary.DxgkInterface.DeviceHandle, &notify);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncstatic VOID vboxVdmaDdiCmdProcessCompletedIrq(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, DXGK_INTERRUPT_TYPE enmComplType)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync{
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVdmaDdiCmdNotifyCompletedIrq(pDevExt, pCmd->u32NodeOrdinal, pCmd->u32FenceId, enmComplType);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync switch (enmComplType)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync {
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync case DXGK_INTERRUPT_DMA_COMPLETED:
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync InsertTailList(&pDevExt->DpcCmdQueue, &pCmd->QueueEntry);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync break;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync default:
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync AssertFailed();
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync break;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync }
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync}
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncDECLINLINE(VOID) vboxVdmaDdiCmdDequeueIrq(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync PVBOXVDMADDI_CMD_QUEUE pQueue = &pDevExt->aNodes[pCmd->u32NodeOrdinal].CmdQueue;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicDecU32(&pQueue->cQueuedCmds);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RemoveEntryList(&pCmd->QueueEntry);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncDECLINLINE(VOID) vboxVdmaDdiCmdEnqueueIrq(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync PVBOXVDMADDI_CMD_QUEUE pQueue = &pDevExt->aNodes[pCmd->u32NodeOrdinal].CmdQueue;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicIncU32(&pQueue->cQueuedCmds);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync InsertTailList(&pQueue->CmdQueue, &pCmd->QueueEntry);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncVOID vboxVdmaDdiNodesInit(PVBOXMP_DEVEXT pDevExt)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync for (UINT i = 0; i < RT_ELEMENTS(pDevExt->aNodes); ++i)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync {
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync pDevExt->aNodes[i].uLastCompletedFenceId = 0;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync PVBOXVDMADDI_CMD_QUEUE pQueue = &pDevExt->aNodes[i].CmdQueue;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync pQueue->cQueuedCmds = 0;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync InitializeListHead(&pQueue->CmdQueue);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync }
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync InitializeListHead(&pDevExt->DpcCmdQueue);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncBOOLEAN vboxVdmaDdiCmdCompletedIrq(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, DXGK_INTERRUPT_TYPE enmComplType)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBOXVDMADDI_STATE_NOT_DX_CMD == pCmd->enmState)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync InsertTailList(&pDevExt->DpcCmdQueue, &pCmd->QueueEntry);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync PVBOXVDMADDI_CMD_QUEUE pQueue = &pDevExt->aNodes[pCmd->u32NodeOrdinal].CmdQueue;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bQueued = pCmd->enmState > VBOXVDMADDI_STATE_NOT_QUEUED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bComplete = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!bQueued || pQueue->cQueuedCmds);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!bQueued || !IsListEmpty(&pQueue->CmdQueue));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->enmState = VBOXVDMADDI_STATE_COMPLETED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bQueued)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pQueue->CmdQueue.Flink == &pCmd->QueueEntry)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVdmaDdiCmdDequeueIrq(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bComplete = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (IsListEmpty(&pQueue->CmdQueue))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bComplete = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVdmaDdiCmdEnqueueIrq(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bComplete)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVdmaDdiCmdProcessCompletedIrq(pDevExt, pCmd, enmComplType);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync while (!IsListEmpty(&pQueue->CmdQueue))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd = VBOXVDMADDI_CMD_FROM_ENTRY(pQueue->CmdQueue.Flink);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmd->enmState == VBOXVDMADDI_STATE_COMPLETED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVdmaDdiCmdDequeueIrq(pDevExt, pCmd);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVdmaDdiCmdProcessCompletedIrq(pDevExt, pCmd, pCmd->enmComplType);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->enmState = VBOXVDMADDI_STATE_COMPLETED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->enmComplType = enmComplType;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bComplete;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncVOID vboxVdmaDdiCmdSubmittedIrq(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bQueued = pCmd->enmState >= VBOXVDMADDI_STATE_PENDING;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd->enmState < VBOXVDMADDI_STATE_SUBMITTED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->enmState = VBOXVDMADDI_STATE_SUBMITTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!bQueued)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVdmaDdiCmdEnqueueIrq(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXVDMADDI_CMD_COMPLETED_CB
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXMP_DEVEXT pDevExt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMADDI_CMD pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DXGK_INTERRUPT_TYPE enmComplType;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXVDMADDI_CMD_COMPLETED_CB, *PVBOXVDMADDI_CMD_COMPLETED_CB;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic BOOLEAN vboxVdmaDdiCmdCompletedCb(PVOID Context)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMADDI_CMD_COMPLETED_CB pdc = (PVBOXVDMADDI_CMD_COMPLETED_CB)Context;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync PVBOXMP_DEVEXT pDevExt = pdc->pDevExt;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync BOOLEAN bNeedDpc = vboxVdmaDdiCmdCompletedIrq(pDevExt, pdc->pCmd, pdc->enmComplType);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync pDevExt->bNotifyDxDpc |= bNeedDpc;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync if (bNeedDpc)
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync {
c58dc77ef4af214d7ae06910fa5ab18587d2ae08vboxsync pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bNeedDpc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncNTSTATUS vboxVdmaDdiCmdCompleted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, DXGK_INTERRUPT_TYPE enmComplType)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVDMADDI_CMD_COMPLETED_CB context;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync context.pDevExt = pDevExt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync context.pCmd = pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync context.enmComplType = enmComplType;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bNeedDps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbSynchronizeExecution(
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevExt->u.primary.DxgkInterface.DeviceHandle,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVdmaDdiCmdCompletedCb,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &context,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0, /* IN ULONG MessageNumber */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &bNeedDps);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXVDMADDI_CMD_SUBMITTED_CB
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync PVBOXMP_DEVEXT pDevExt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMADDI_CMD pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXVDMADDI_CMD_SUBMITTED_CB, *PVBOXVDMADDI_CMD_SUBMITTED_CB;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic BOOLEAN vboxVdmaDdiCmdSubmittedCb(PVOID Context)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMADDI_CMD_SUBMITTED_CB pdc = (PVBOXVDMADDI_CMD_SUBMITTED_CB)Context;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVdmaDdiCmdSubmittedIrq(pdc->pDevExt, pdc->pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncNTSTATUS vboxVdmaDdiCmdSubmitted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVDMADDI_CMD_SUBMITTED_CB context;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync context.pDevExt = pDevExt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync context.pCmd = pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbSynchronizeExecution(
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevExt->u.primary.DxgkInterface.DeviceHandle,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVdmaDdiCmdSubmittedCb,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &context,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0, /* IN ULONG MessageNumber */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &bRc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXVDMADDI_CMD_COMPLETE_CB
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXMP_DEVEXT pDevExt;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync UINT u32NodeOrdinal;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t u32FenceId;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXVDMADDI_CMD_COMPLETE_CB, *PVBOXVDMADDI_CMD_COMPLETE_CB;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic BOOLEAN vboxVdmaDdiCmdFenceCompleteCb(PVOID Context)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMADDI_CMD_COMPLETE_CB pdc = (PVBOXVDMADDI_CMD_COMPLETE_CB)Context;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXMP_DEVEXT pDevExt = pdc->pDevExt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVdmaDdiCmdNotifyCompletedIrq(pDevExt, pdc->u32NodeOrdinal, pdc->u32FenceId, DXGK_INTERRUPT_DMA_COMPLETED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevExt->bNotifyDxDpc = TRUE;
c58dc77ef4af214d7ae06910fa5ab18587d2ae08vboxsync pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
c58dc77ef4af214d7ae06910fa5ab18587d2ae08vboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncstatic NTSTATUS vboxVdmaDdiCmdFenceNotifyComplete(PVBOXMP_DEVEXT pDevExt, uint32_t u32NodeOrdinal, uint32_t u32FenceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVDMADDI_CMD_COMPLETE_CB context;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync context.pDevExt = pDevExt;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync context.u32NodeOrdinal = u32NodeOrdinal;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync context.u32FenceId = u32FenceId;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRet;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbSynchronizeExecution(
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevExt->u.primary.DxgkInterface.DeviceHandle,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVdmaDdiCmdFenceCompleteCb,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &context,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0, /* IN ULONG MessageNumber */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &bRet);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsyncNTSTATUS vboxVdmaDdiCmdFenceComplete(PVBOXMP_DEVEXT pDevExt, uint32_t u32NodeOrdinal, uint32_t u32FenceId, DXGK_INTERRUPT_TYPE enmComplType)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync if (vboxVdmaDdiCmdCanComplete(pDevExt, u32NodeOrdinal))
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync return vboxVdmaDdiCmdFenceNotifyComplete(pDevExt, u32NodeOrdinal, u32FenceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVDMADDI_CMD pCmd = (PVBOXVDMADDI_CMD)vboxWddmMemAlloc(sizeof (VBOXVDMADDI_CMD));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync vboxVdmaDdiCmdInit(pCmd, u32NodeOrdinal, u32FenceId, vboxVdmaDdiCmdCompletionCbFree, NULL);
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync NTSTATUS Status = vboxVdmaDdiCmdCompleted(pDevExt, pCmd, enmComplType);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxWddmMemFree(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_NO_MEMORY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}