VirtualBox

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

Last change on this file since 80422 was 80422, checked in by vboxsync, 5 years ago

WDDM: remove old chromium based 3D code from the miniport driver. bugref:9529

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

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