VBoxMPVbva.cpp revision b82914bc22e128708efefbaf9c93540dbc1711da
/* $Id$ */
/** @file
* VBox WDDM Miniport driver
*/
/*
* Copyright (C) 2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "VBoxMPWddm.h"
#include "common/VBoxMPCommon.h"
{
int rc = VERR_NO_MEMORY;
sizeof (VBVAENABLE_EX),
Assert(p);
if (!p)
{
LOGREL(("HGSMIHeapAlloc failed"));
rc = VERR_NO_MEMORY;
}
else
{
if (bEnable)
{
}
else
rc = VINF_SUCCESS;
}
return rc;
}
/*
* Public hardware buffer methods.
*/
{
// DISPDBG((1, "VBoxDisp::vboxVbvaEnable screen %p vbva off 0x%x\n", ppdev->pjScreen, ppdev->layout.offVBVABuffer));
pVBVA->indexRecordFirst = 0;
pVBVA->indexRecordFree = 0;
if (!RT_SUCCESS(rc))
return rc;
}
{
// DISPDBG((1, "VBoxDisp::vbvaDisable called.\n"));
// ppdev->pVBVA = NULL;
}
int vboxVbvaCreate(PVBOXMP_DEVEXT pDevExt, VBOXVBVAINFO *pVbva, ULONG offBuffer, ULONG cbBuffer, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
{
cbBuffer);
if (RT_SUCCESS(rc))
{
}
return rc;
}
{
int rc = VINF_SUCCESS;
return rc;
}
/*
* Private operations.
*/
{
}
{
/* Issue the flush command. */
sizeof (VBVAFLUSH),
Assert(p);
if (!p)
{
LOGREL(("HGSMIHeapAlloc failed"));
}
else
{
pFlush->u32Reserved = 0;
}
return;
}
static void vboxHwBufferPlaceDataAt (VBVABUFFER *pVBVA, const void *p, uint32_t cb, uint32_t offset)
{
if (i32Diff <= 0)
{
/* Chunk will not cross buffer boundary. */
}
else
{
/* Chunk crosses buffer boundary. */
}
return;
}
{
// DISPDBG((1, "VBoxDisp::vboxHwBufferBeginUpdate called flags = 0x%08X\n",
// ppdev->pVBVA? ppdev->pVBVA->u32HostEvents: -1));
{
{
/* All slots in the records queue are used. */
}
{
// /* Even after flush there is no place. Fail the request. */
// LOG(("no space in the queue of records!!! first %d, last %d",
// ppdev->pVBVA->indexRecordFirst, ppdev->pVBVA->indexRecordFree));
}
else
{
/* Initialize the record. */
// LOG(("indexRecordNext = %d\n", indexRecordNext));
/* Remember which record we are using. */
}
}
return bRc;
}
{
// LOG(("VBoxDisp::vboxHwBufferEndUpdate called"));
/* Mark the record completed. */
return;
}
static int vboxHwBufferWrite (PVBOXMP_DEVEXT pDevExt, VBOXVBVAINFO *pVbva, const void *p, uint32_t cb)
{
{
return VERR_INVALID_STATE;
}
// LOGF(("VW %d", cb));
while (cb > 0)
{
// LOG(("pVBVA->off32Free %d, pRecord->cbRecord 0x%08X, cbHwBufferAvail %d, cb %d, cbWritten %d\n",
// pVBVA->off32Free, pRecord->cbRecord, cbHwBufferAvail, cb, cbWritten));
if (cbChunk >= cbHwBufferAvail)
{
if (cbChunk >= cbHwBufferAvail)
{
LOG(("no place for %d bytes. Only %d bytes available after flush. Going to partial writes.",
cb, cbHwBufferAvail));
{
LOGREL(("Buffer overflow!!!"));
return VERR_NO_MEMORY;
}
}
}
}
return VINF_SUCCESS;
}
/*
* Public writer to the hardware buffer.
*/
{
}
{
// if (rect.left < 0) rect.left = 0;
// if (rect.right > (int)ppdev->cxScreen) rect.right = ppdev->cxScreen;
// if (rect.bottom > (int)ppdev->cyScreen) rect.bottom = ppdev->cyScreen;
}
#ifdef VBOXVDMA_WITH_VBVA
{
}
#endif