VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h@ 71596

Last change on this file since 71596 was 71596, checked in by vboxsync, 7 years ago

DevVGA,VBoxVideo: Code cleanup in progress. bugref:9094

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.1 KB
Line 
1/* $Id: VBoxMPVdma.h 71596 2018-03-31 21:23:46Z vboxsync $ */
2/** @file
3 * VBox WDDM Miniport driver
4 */
5
6/*
7 * Copyright (C) 2011-2017 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ___VBoxMPVdma_h___
19#define ___VBoxMPVdma_h___
20
21#include <iprt/cdefs.h>
22#include <iprt/asm.h>
23#include <VBoxVideo.h>
24#include <HGSMI.h>
25
26typedef struct _VBOXMP_DEVEXT *PVBOXMP_DEVEXT;
27
28/* ddi dma command queue handling */
29typedef enum
30{
31 VBOXVDMADDI_STATE_UNCKNOWN = 0,
32 VBOXVDMADDI_STATE_NOT_DX_CMD,
33 VBOXVDMADDI_STATE_NOT_QUEUED,
34 VBOXVDMADDI_STATE_PENDING,
35 VBOXVDMADDI_STATE_SUBMITTED,
36 VBOXVDMADDI_STATE_COMPLETED
37} VBOXVDMADDI_STATE;
38
39typedef struct VBOXVDMADDI_CMD *PVBOXVDMADDI_CMD;
40typedef DECLCALLBACK(VOID) FNVBOXVDMADDICMDCOMPLETE_DPC(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext);
41typedef FNVBOXVDMADDICMDCOMPLETE_DPC *PFNVBOXVDMADDICMDCOMPLETE_DPC;
42
43typedef struct VBOXVDMADDI_CMD
44{
45 LIST_ENTRY QueueEntry;
46 VBOXVDMADDI_STATE enmState;
47 uint32_t u32NodeOrdinal;
48 uint32_t u32FenceId;
49 DXGK_INTERRUPT_TYPE enmComplType;
50 PFNVBOXVDMADDICMDCOMPLETE_DPC pfnComplete;
51 PVOID pvComplete;
52} VBOXVDMADDI_CMD, *PVBOXVDMADDI_CMD;
53
54typedef struct VBOXVDMADDI_CMD_QUEUE
55{
56 volatile uint32_t cQueuedCmds;
57 LIST_ENTRY CmdQueue;
58} VBOXVDMADDI_CMD_QUEUE, *PVBOXVDMADDI_CMD_QUEUE;
59
60typedef struct VBOXVDMADDI_NODE
61{
62 VBOXVDMADDI_CMD_QUEUE CmdQueue;
63 UINT uLastCompletedFenceId;
64} VBOXVDMADDI_NODE, *PVBOXVDMADDI_NODE;
65
66VOID vboxVdmaDdiNodesInit(PVBOXMP_DEVEXT pDevExt);
67BOOLEAN vboxVdmaDdiCmdCompletedIrq(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, DXGK_INTERRUPT_TYPE enmComplType);
68VOID vboxVdmaDdiCmdSubmittedIrq(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd);
69
70NTSTATUS vboxVdmaDdiCmdCompleted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, DXGK_INTERRUPT_TYPE enmComplType);
71NTSTATUS vboxVdmaDdiCmdSubmitted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd);
72
73DECLINLINE(VOID) vboxVdmaDdiCmdInit(PVBOXVDMADDI_CMD pCmd, uint32_t u32NodeOrdinal, uint32_t u32FenceId,
74 PFNVBOXVDMADDICMDCOMPLETE_DPC pfnComplete, PVOID pvComplete)
75{
76 pCmd->QueueEntry.Blink = NULL;
77 pCmd->QueueEntry.Flink = NULL;
78 pCmd->enmState = VBOXVDMADDI_STATE_NOT_QUEUED;
79 pCmd->u32NodeOrdinal = u32NodeOrdinal;
80 pCmd->u32FenceId = u32FenceId;
81 pCmd->pfnComplete = pfnComplete;
82 pCmd->pvComplete = pvComplete;
83}
84
85/* marks the command a submitted in a way that it is invisible for dx runtime,
86 * i.e. the dx runtime won't be notified about the command completion
87 * this is used to submit commands initiated by the driver, but not by the dx runtime */
88DECLINLINE(VOID) vboxVdmaDdiCmdSubmittedNotDx(PVBOXVDMADDI_CMD pCmd)
89{
90 Assert(pCmd->enmState == VBOXVDMADDI_STATE_NOT_QUEUED);
91 pCmd->enmState = VBOXVDMADDI_STATE_NOT_DX_CMD;
92}
93
94NTSTATUS vboxVdmaDdiCmdFenceComplete(PVBOXMP_DEVEXT pDevExt, uint32_t u32NodeOrdinal, uint32_t u32FenceId, DXGK_INTERRUPT_TYPE enmComplType);
95
96DECLCALLBACK(VOID) vboxVdmaDdiCmdCompletionCbFree(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext);
97
98VOID vboxVdmaDdiCmdGetCompletedListIsr(PVBOXMP_DEVEXT pDevExt, LIST_ENTRY *pList);
99
100BOOLEAN vboxVdmaDdiCmdIsCompletedListEmptyIsr(PVBOXMP_DEVEXT pDevExt);
101
102#define VBOXVDMADDI_CMD_FROM_ENTRY(_pEntry) ((PVBOXVDMADDI_CMD)(((uint8_t*)(_pEntry)) - RT_OFFSETOF(VBOXVDMADDI_CMD, QueueEntry)))
103
104DECLINLINE(VOID) vboxVdmaDdiCmdHandleCompletedList(PVBOXMP_DEVEXT pDevExt, LIST_ENTRY *pList)
105{
106 LIST_ENTRY *pEntry = pList->Flink;
107 while (pEntry != pList)
108 {
109 PVBOXVDMADDI_CMD pCmd = VBOXVDMADDI_CMD_FROM_ENTRY(pEntry);
110 pEntry = pEntry->Flink;
111 if (pCmd->pfnComplete)
112 pCmd->pfnComplete(pDevExt, pCmd, pCmd->pvComplete);
113 }
114}
115
116#if 0
117typedef DECLCALLBACK(int) FNVBOXVDMASUBMIT(struct _DEVICE_EXTENSION* pDevExt, struct VBOXVDMAINFO * pInfo, HGSMIOFFSET offDr, PVOID pvContext);
118typedef FNVBOXVDMASUBMIT *PFNVBOXVDMASUBMIT;
119
120typedef struct VBOXVDMASUBMIT
121{
122 PFNVBOXVDMASUBMIT pfnSubmit;
123 PVOID pvContext;
124} VBOXVDMASUBMIT, *PVBOXVDMASUBMIT;
125#endif
126
127/* start */
128typedef enum
129{
130 VBOXVDMAPIPE_STATE_CLOSED = 0,
131 VBOXVDMAPIPE_STATE_CREATED = 1,
132 VBOXVDMAPIPE_STATE_OPENNED = 2,
133 VBOXVDMAPIPE_STATE_CLOSING = 3
134} VBOXVDMAPIPE_STATE;
135
136typedef struct VBOXVDMAPIPE
137{
138 KSPIN_LOCK SinchLock;
139 KEVENT Event;
140 LIST_ENTRY CmdListHead;
141 VBOXVDMAPIPE_STATE enmState;
142 /* true iff the other end needs Event notification */
143 bool bNeedNotify;
144} VBOXVDMAPIPE, *PVBOXVDMAPIPE;
145
146typedef struct VBOXVDMAPIPE_CMD_HDR
147{
148 LIST_ENTRY ListEntry;
149} VBOXVDMAPIPE_CMD_HDR, *PVBOXVDMAPIPE_CMD_HDR;
150
151#define VBOXVDMAPIPE_CMD_HDR_FROM_ENTRY(_pE) ( (PVBOXVDMAPIPE_CMD_HDR)((uint8_t *)(_pE) - RT_OFFSETOF(VBOXVDMAPIPE_CMD_HDR, ListEntry)) )
152
153typedef enum
154{
155 VBOXVDMAPIPE_CMD_TYPE_UNDEFINED = 0,
156 VBOXVDMAPIPE_CMD_TYPE_RECTSINFO,
157 VBOXVDMAPIPE_CMD_TYPE_DMACMD,
158 VBOXVDMAPIPE_CMD_TYPE_FINISH, /* ensures all previously submitted commands are completed */
159 VBOXVDMAPIPE_CMD_TYPE_CANCEL
160} VBOXVDMAPIPE_CMD_TYPE;
161
162typedef struct VBOXVDMAPIPE_CMD_DR
163{
164 VBOXVDMAPIPE_CMD_HDR PipeHdr;
165 VBOXVDMAPIPE_CMD_TYPE enmType;
166 volatile uint32_t cRefs;
167} VBOXVDMAPIPE_CMD_DR, *PVBOXVDMAPIPE_CMD_DR;
168
169#define VBOXVDMAPIPE_CMD_DR_FROM_ENTRY(_pE) ( (PVBOXVDMAPIPE_CMD_DR)VBOXVDMAPIPE_CMD_HDR_FROM_ENTRY(_pE) )
170
171typedef struct VBOXWDDM_DMA_ALLOCINFO
172{
173 PVBOXWDDM_ALLOCATION pAlloc;
174 VBOXVIDEOOFFSET offAlloc;
175 UINT segmentIdAlloc : 31;
176 UINT fWriteOp : 1;
177 D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId;
178} VBOXWDDM_DMA_ALLOCINFO, *PVBOXWDDM_DMA_ALLOCINFO;
179
180typedef struct VBOXVDMAPIPE_RECTS
181{
182 RECT ContextRect;
183 VBOXWDDM_RECTS_INFO UpdateRects;
184} VBOXVDMAPIPE_RECTS, *PVBOXVDMAPIPE_RECTS;
185
186typedef struct VBOXVDMAPIPE_CMD_RECTSINFO
187{
188 VBOXVDMAPIPE_CMD_DR Hdr;
189 PVBOXWDDM_CONTEXT pContext;
190 struct VBOXWDDM_SWAPCHAIN *pSwapchain;
191 VBOXVDMAPIPE_RECTS ContextsRects;
192} VBOXVDMAPIPE_CMD_RECTSINFO, *PVBOXVDMAPIPE_CMD_RECTSINFO;
193
194typedef struct VBOXVDMAPIPE_CMD_DMACMD
195{
196 VBOXVDMAPIPE_CMD_DR Hdr;
197#ifndef VBOX_WDDM_IRQ_COMPLETION
198 VBOXVDMADDI_CMD DdiCmd;
199#endif
200 PVBOXWDDM_CONTEXT pContext;
201 VBOXVDMACMD_TYPE enmCmd;
202// VBOXVDMAPIPE_FLAGS_DMACMD fFlags;
203} VBOXVDMAPIPE_CMD_DMACMD, *PVBOXVDMAPIPE_CMD_DMACMD;
204
205typedef struct VBOXVDMA_CLRFILL
206{
207 VBOXWDDM_DMA_ALLOCINFO Alloc;
208 UINT Color;
209 VBOXWDDM_RECTS_INFO Rects;
210} VBOXVDMA_CLRFILL, *PVBOXVDMA_CLRFILL;
211
212typedef struct VBOXVDMAPIPE_CMD_DMACMD_CLRFILL
213{
214 VBOXVDMAPIPE_CMD_DMACMD Hdr;
215 VBOXVDMA_CLRFILL ClrFill;
216} VBOXVDMAPIPE_CMD_DMACMD_CLRFILL, *PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL;
217
218typedef struct VBOXVDMA_BLT
219{
220 VBOXWDDM_DMA_ALLOCINFO SrcAlloc;
221 VBOXWDDM_DMA_ALLOCINFO DstAlloc;
222 RECT SrcRect;
223 VBOXVDMAPIPE_RECTS DstRects;
224} VBOXVDMA_BLT, *PVBOXVDMA_BLT;
225
226typedef struct VBOXVDMAPIPE_CMD_DMACMD_BLT
227{
228 VBOXVDMAPIPE_CMD_DMACMD Hdr;
229 VBOXVDMA_BLT Blt;
230} VBOXVDMAPIPE_CMD_DMACMD_BLT, *PVBOXVDMAPIPE_CMD_DMACMD_BLT;
231
232typedef struct VBOXVDMA_FLIP
233{
234 VBOXWDDM_DMA_ALLOCINFO Alloc;
235} VBOXVDMA_FLIP, *PVBOXVDMA_FLIP;
236
237typedef struct VBOXVDMAPIPE_CMD_DMACMD_FLIP
238{
239 VBOXVDMAPIPE_CMD_DMACMD Hdr;
240 VBOXVDMA_FLIP Flip;
241} VBOXVDMAPIPE_CMD_DMACMD_FLIP, *PVBOXVDMAPIPE_CMD_DMACMD_FLIP;
242
243typedef struct VBOXVDMA_SHADOW2PRIMARY
244{
245 VBOXWDDM_DMA_ALLOCINFO ShadowAlloc;
246 RECT SrcRect;
247 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
248} VBOXVDMA_SHADOW2PRIMARY, *PVBOXVDMA_SHADOW2PRIMARY;
249
250typedef struct VBOXVDMAGG
251{
252 VBOXVDMAPIPE CmdPipe;
253 PKTHREAD pThread;
254} VBOXVDMAGG, *PVBOXVDMAGG;
255
256/* DMA commands are currently submitted over HGSMI */
257typedef struct VBOXVDMAINFO
258{
259#ifdef VBOX_WITH_VDMA
260 VBOXSHGSMI CmdHeap;
261#endif
262 UINT uLastCompletedPagingBufferCmdFenceId;
263 BOOL fEnabled;
264} VBOXVDMAINFO, *PVBOXVDMAINFO;
265
266int vboxVdmaCreate (PVBOXMP_DEVEXT pDevExt, VBOXVDMAINFO *pInfo
267#ifdef VBOX_WITH_VDMA
268 , ULONG offBuffer, ULONG cbBuffer
269#endif
270#if 0
271 , PFNVBOXVDMASUBMIT pfnSubmit, PVOID pvContext
272#endif
273 );
274int vboxVdmaDisable(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo);
275int vboxVdmaEnable(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo);
276int vboxVdmaDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo);
277
278#ifdef VBOX_WITH_VDMA
279int vboxVdmaFlush(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo);
280DECLINLINE(HGSMIOFFSET) vboxVdmaCBufDrPtrOffset(const PVBOXVDMAINFO pInfo, const void RT_UNTRUSTED_VOLATILE_HOST *pvPtr)
281{
282 return VBoxSHGSMICommandPtrOffset(&pInfo->CmdHeap, pvPtr);
283}
284int vboxVdmaCBufDrSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, VBOXVDMACBUF_DR RT_UNTRUSTED_VOLATILE_HOST *pDr);
285int vboxVdmaCBufDrSubmitSynch(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, VBOXVDMACBUF_DR RT_UNTRUSTED_VOLATILE_HOST *pDr);
286struct VBOXVDMACBUF_DR RT_UNTRUSTED_VOLATILE_HOST *vboxVdmaCBufDrCreate(PVBOXVDMAINFO pInfo, uint32_t cbTrailingData);
287void vboxVdmaCBufDrFree(PVBOXVDMAINFO pInfo, struct VBOXVDMACBUF_DR RT_UNTRUSTED_VOLATILE_HOST *pDr);
288
289#define VBOXVDMACBUF_DR_DATA_OFFSET() (sizeof (VBOXVDMACBUF_DR))
290#define VBOXVDMACBUF_DR_SIZE(_cbData) (VBOXVDMACBUF_DR_DATA_OFFSET() + (_cbData))
291#define VBOXVDMACBUF_DR_DATA(_pDr) ( ((uint8_t*)(_pDr)) + VBOXVDMACBUF_DR_DATA_OFFSET() )
292
293AssertCompile(sizeof (VBOXVDMADDI_CMD) <= RT_SIZEOFMEMB(VBOXVDMACBUF_DR, aGuestData));
294#define VBOXVDMADDI_CMD_FROM_BUF_DR(_pDr) ((PVBOXVDMADDI_CMD)(_pDr)->aGuestData)
295#define VBOXVDMACBUF_DR_FROM_DDI_CMD(_pCmd) ((PVBOXVDMACBUF_DR)(((uint8_t*)(_pCmd)) - RT_OFFSETOF(VBOXVDMACBUF_DR, aGuestData)))
296
297#endif
298#ifdef VBOX_WITH_CROGL
299NTSTATUS vboxVdmaPostHideSwapchain(PVBOXWDDM_SWAPCHAIN pSwapchain);
300#endif
301
302NTSTATUS vboxVdmaGgCmdDmaNotifyCompleted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DMACMD pCmd, DXGK_INTERRUPT_TYPE enmComplType);
303NTSTATUS vboxVdmaGgCmdDmaNotifySubmitted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DMACMD pCmd);
304VOID vboxVdmaGgCmdDmaNotifyInit(PVBOXVDMAPIPE_CMD_DMACMD pCmd,
305 uint32_t u32NodeOrdinal, uint32_t u32FenceId,
306 PFNVBOXVDMADDICMDCOMPLETE_DPC pfnComplete, PVOID pvComplete);
307
308NTSTATUS vboxVdmaGgDmaBltPerform(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_ALLOC_DATA * pSrcAlloc, RECT* pSrcRect,
309 struct VBOXWDDM_ALLOC_DATA *pDstAlloc, RECT* pDstRect);
310
311#define VBOXVDMAPIPE_CMD_DR_FROM_DDI_CMD(_pCmd) ((PVBOXVDMAPIPE_CMD_DR)(((uint8_t*)(_pCmd)) - RT_OFFSETOF(VBOXVDMAPIPE_CMD_DR, DdiCmd)))
312
313NTSTATUS vboxVdmaProcessBltCmd(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, struct VBOXWDDM_DMA_PRIVATEDATA_BLT *pBlt);
314NTSTATUS vboxVdmaProcessFlipCmd(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, struct VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip);
315NTSTATUS vboxVdmaProcessClrFillCmd(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, struct VBOXWDDM_DMA_PRIVATEDATA_CLRFILL *pCF);
316#ifdef VBOX_WITH_CROGL
317NTSTATUS vboxVdmaTexPresentSetAlloc(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData);
318NTSTATUS VBoxVdmaChromiumParameteriCRSubmit(PVBOXMP_DEVEXT pDevExt, uint32_t target, uint32_t value);
319#endif
320
321#endif /* #ifndef ___VBoxMPVdma_h___ */
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette