VBoxVideoVbva.cpp revision e64031e20c39650a7bc902a3e1aba613b9415dee
/** @file
*
* VirtualBox Windows Wddm guest video driver
*
* VBVA dirty rectangles calculations.
*
* Copyright (C) 2010 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 "../VBoxVideo.h"
#include "../Helper.h"
{
int rc = VERR_NO_MEMORY;
void *p = vboxHGSMIBufferAlloc (pDevExt,
sizeof (VBVAENABLE_EX),
Assert(p);
if (!p)
{
rc = VERR_NO_MEMORY;
}
else
{
vboxHGSMIBufferSubmit (pDevExt, p);
if (bEnable)
{
}
else
rc = VINF_SUCCESS;
vboxHGSMIBufferFree (pDevExt, p);
}
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(PDEVICE_EXTENSION pDevExt, VBOXVBVAINFO *pVbva, ULONG offBuffer, ULONG cbBuffer, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
{
cbBuffer);
if (RT_SUCCESS(rc))
{
}
return rc;
}
/*
* Private operations.
*/
{
}
{
/* Issue the flush command. */
void *p = vboxHGSMIBufferAlloc (pDevExt,
sizeof (VBVAFLUSH),
Assert(p);
if (!p)
{
}
else
{
pFlush->u32Reserved = 0;
vboxHGSMIBufferSubmit (pDevExt, p);
vboxHGSMIBufferFree (pDevExt, p);
}
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. */
// DISPDBG((1, "VBoxDisp::vboxHwBufferBeginUpdate no space in the queue of records!!! first %d, last %d\n",
// ppdev->pVBVA->indexRecordFirst, ppdev->pVBVA->indexRecordFree));
}
else
{
/* Initialize the record. */
// DISPDBG((1, "VBoxDisp::vboxHwBufferBeginUpdate indexRecordNext = %d\n", indexRecordNext));
/* Remember which record we are using. */
}
}
return bRc;
}
{
// DISPDBG((1, "VBoxDisp::vboxHwBufferEndUpdate called\n"));
/* Mark the record completed. */
return;
}
static int vboxHwBufferWrite (PDEVICE_EXTENSION pDevExt, VBOXVBVAINFO *pVbva, const void *p, uint32_t cb)
{
{
return VERR_INVALID_STATE;
}
while (cb > 0)
{
// DISPDBG((1, "VBoxDisp::vboxHwBufferWrite 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)
{
dprintf((__FUNCTION__": no place for %d bytes. Only %d bytes available after flush. Going to partial writes.\n",
cb, cbHwBufferAvail));
{
return VERR_NO_MEMORY;
}
}
}
}
return VINF_SUCCESS;
}
/*
* Public writer to the hardware buffer.
*/
{
}
{
// if (rect.right > (int)ppdev->cxScreen) rect.right = ppdev->cxScreen;
// if (rect.bottom > (int)ppdev->cyScreen) rect.bottom = ppdev->cyScreen;
// hdr.x += (int16_t)ppdev->ptlDevOrg.x;
// hdr.y += (int16_t)ppdev->ptlDevOrg.y;
}
#ifdef VBOXVDMA_WITH_VBVA
{
}
#endif