VBoxMPVdma.h revision 19c7039bc1a59c1680538d8459b2a09c3a7ae9fd
/* $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.
*/
#ifndef ___VBoxMPVdma_h___
#define ___VBoxMPVdma_h___
#include <VBox/VBoxVideo.h>
typedef struct _VBOXMP_DEVEXT *PVBOXMP_DEVEXT;
/* ddi dma command queue handling */
typedef enum
{
typedef struct VBOXVDMADDI_CMD *PVBOXVDMADDI_CMD;
typedef DECLCALLBACK(VOID) FNVBOXVDMADDICMDCOMPLETE_DPC(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext);
typedef struct VBOXVDMADDI_CMD
{
typedef struct VBOXVDMADDI_CMD_QUEUE
{
volatile uint32_t cQueuedCmds;
typedef struct VBOXVDMADDI_NODE
{
BOOLEAN vboxVdmaDdiCmdCompletedIrq(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, DXGK_INTERRUPT_TYPE enmComplType);
NTSTATUS vboxVdmaDdiCmdCompleted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, DXGK_INTERRUPT_TYPE enmComplType);
{
}
/* marks the command a submitted in a way that it is invisible for dx runtime,
* i.e. the dx runtime won't be notified about the command completion
* this is used to submit commands initiated by the driver, but not by the dx runtime */
{
}
NTSTATUS vboxVdmaDdiCmdFenceComplete(PVBOXMP_DEVEXT pDevExt, uint32_t u32NodeOrdinal, uint32_t u32FenceId, DXGK_INTERRUPT_TYPE enmComplType);
DECLCALLBACK(VOID) vboxVdmaDdiCmdCompletionCbFree(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext);
#define VBOXVDMADDI_CMD_FROM_ENTRY(_pEntry) ((PVBOXVDMADDI_CMD)(((uint8_t*)(_pEntry)) - RT_OFFSETOF(VBOXVDMADDI_CMD, QueueEntry)))
{
{
if (pCmd->pfnComplete)
}
}
#ifdef VBOXWDDM_RENDER_FROM_SHADOW
NTSTATUS vboxVdmaHlpUpdatePrimary(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, RECT* pRect);
#endif
#if 0
typedef DECLCALLBACK(int) FNVBOXVDMASUBMIT(struct _DEVICE_EXTENSION* pDevExt, struct VBOXVDMAINFO * pInfo, HGSMIOFFSET offDr, PVOID pvContext);
typedef FNVBOXVDMASUBMIT *PFNVBOXVDMASUBMIT;
typedef struct VBOXVDMASUBMIT
{
#endif
/* start */
typedef enum
{
typedef struct VBOXVDMAPIPE
{
/* true iff the other end needs Event notification */
bool bNeedNotify;
typedef struct VBOXVDMAPIPE_CMD_HDR
{
#define VBOXVDMAPIPE_CMD_HDR_FROM_ENTRY(_pE) ( (PVBOXVDMAPIPE_CMD_HDR)((uint8_t *)(_pE) - RT_OFFSETOF(VBOXVDMAPIPE_CMD_HDR, ListEntry)) )
typedef enum
{
VBOXVDMAPIPE_CMD_TYPE_FINISH, /* ensures all previously submitted commands are completed */
typedef struct VBOXVDMAPIPE_CMD_DR
{
#define VBOXVDMAPIPE_CMD_DR_FROM_ENTRY(_pE) ( (PVBOXVDMAPIPE_CMD_DR)VBOXVDMAPIPE_CMD_HDR_FROM_ENTRY(_pE) )
typedef struct VBOXWDDM_DMA_ALLOCINFO
{
typedef struct VBOXVDMAPIPE_RECTS
{
typedef struct VBOXVDMAPIPE_CMD_RECTSINFO
{
struct VBOXWDDM_SWAPCHAIN *pSwapchain;
typedef struct VBOXVDMAPIPE_CMD_FINISH
{
typedef struct VBOXVDMAPIPE_CMD_CANCEL
{
typedef struct VBOXVDMAPIPE_FLAGS_DMACMD
{
union
{
struct
{
};
};
typedef struct VBOXVDMAPIPE_CMD_DMACMD
{
#ifndef VBOX_WDDM_IRQ_COMPLETION
#endif
typedef struct VBOXVDMA_CLRFILL
{
typedef struct VBOXVDMAPIPE_CMD_DMACMD_CLRFILL
{
typedef struct VBOXVDMA_BLT
{
typedef struct VBOXVDMAPIPE_CMD_DMACMD_BLT
{
typedef struct VBOXVDMA_FLIP
{
typedef struct VBOXVDMAPIPE_CMD_DMACMD_FLIP
{
typedef struct VBOXVDMA_SHADOW2PRIMARY
{
typedef struct VBOXVDMAGG
{
} VBOXVDMAGG, *PVBOXVDMAGG;
/* DMA commands are currently submitted over HGSMI */
typedef struct VBOXVDMAINFO
{
#ifdef VBOX_WITH_VDMA
#endif
/* dma-related commands list processed on the guest w/o host part involvement (guest-guest commands) */
#ifdef VBOX_WITH_VDMA
#endif
#if 0
#endif
);
#ifdef VBOX_WITH_VDMA
#define VBOXVDMACBUF_DR_DATA_OFFSET() (sizeof (VBOXVDMACBUF_DR))
#define VBOXVDMACBUF_DR_FROM_DDI_CMD(_pCmd) ((PVBOXVDMACBUF_DR)(((uint_8*)(_pCmd)) - RT_OFFSETOF(VBOXVDMACBUF_DR, aGuestData)))
#endif
PVBOXVDMAPIPE_CMD_DR vboxVdmaGgCmdCreate(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_TYPE enmType, uint32_t cbCmd);
{
}
{
if (!cRefs)
}
NTSTATUS vboxVdmaGgCmdFinish(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, PKEVENT pEvent);
NTSTATUS vboxVdmaGgCmdCancel(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PVBOXWDDM_SWAPCHAIN pSwapchain);
NTSTATUS vboxVdmaGgCmdDmaNotifyCompleted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DMACMD pCmd, DXGK_INTERRUPT_TYPE enmComplType);
NTSTATUS vboxVdmaGgDmaBltPerform(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pSrcAlloc, RECT* pSrcRect,
#define VBOXVDMAPIPE_CMD_DR_FROM_DDI_CMD(_pCmd) ((PVBOXVDMAPIPE_CMD_DR)(((uint8_t*)(_pCmd)) - RT_OFFSETOF(VBOXVDMAPIPE_CMD_DR, DdiCmd)))
DECLCALLBACK(VOID) vboxVdmaGgDdiCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext);
#endif /* #ifndef ___VBoxMPVdma_h___ */