1 /******************************Module*Header************************************\
2 *
3 * Module Name: d3dukmdt.h
4 *
5 * Content: Windows Display Driver Model (WDDM) user/kernel mode
6 *          shared data type definitions.
7 *
8 * Copyright (c) Microsoft Corporation.
9 * Licensed under the MIT License.
10 *
11 \*******************************************************************************/
12 #ifndef _D3DUKMDT_H_
13 #define _D3DUKMDT_H_
14 #include <winapifamily.h>
15 
16 #pragma region Desktop Family
17 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
18 
19 #if !defined(_D3DKMDT_H)       && \
20     !defined(_D3DKMTHK_H_)     && \
21     !defined(_D3DUMDDI_H_)     && \
22     !defined(__DXGKRNLETW_H__)
23    #error This header should not be included directly!
24 #endif
25 
26 #pragma warning(push)
27 #pragma warning(disable:4201) // anonymous unions warning
28 #pragma warning(disable:4214)   // nonstandard extension used: bit field types other than int
29 
30 
31 //
32 // WDDM DDI Interface Version
33 //
34 
35 #define DXGKDDI_INTERFACE_VERSION_VISTA      0x1052
36 #define DXGKDDI_INTERFACE_VERSION_VISTA_SP1  0x1053
37 #define DXGKDDI_INTERFACE_VERSION_WIN7       0x2005
38 #define DXGKDDI_INTERFACE_VERSION_WIN8       0x300E
39 #define DXGKDDI_INTERFACE_VERSION_WDDM1_3    0x4002
40 #define DXGKDDI_INTERFACE_VERSION_WDDM1_3_PATH_INDEPENDENT_ROTATION  0x4003
41 #define DXGKDDI_INTERFACE_VERSION_WDDM2_0    0x5023
42 #define DXGKDDI_INTERFACE_VERSION_WDDM2_1    0x6003
43 #define DXGKDDI_INTERFACE_VERSION_WDDM2_1_5  0x6010     // Used in RS1.7 for GPU-P
44 #define DXGKDDI_INTERFACE_VERSION_WDDM2_1_6  0x6011     // Used in RS1.8 for GPU-P
45 #define DXGKDDI_INTERFACE_VERSION_WDDM2_2    0x700A
46 #define DXGKDDI_INTERFACE_VERSION_WDDM2_3    0x8001
47 #define DXGKDDI_INTERFACE_VERSION_WDDM2_4    0x9006
48 #define DXGKDDI_INTERFACE_VERSION_WDDM2_5    0xA00B
49 #define DXGKDDI_INTERFACE_VERSION_WDDM2_6    0xB004
50 #define DXGKDDI_INTERFACE_VERSION_WDDM2_7    0xC004
51 #define DXGKDDI_INTERFACE_VERSION_WDDM2_8    0xD001
52 #define DXGKDDI_INTERFACE_VERSION_WDDM2_9    0xE003
53 #define DXGKDDI_INTERFACE_VERSION_WDDM3_0    0xF003
54 
55 
56 #define IS_OFFICIAL_DDI_INTERFACE_VERSION(version)                 \
57             (((version) == DXGKDDI_INTERFACE_VERSION_VISTA) ||     \
58              ((version) == DXGKDDI_INTERFACE_VERSION_VISTA_SP1) || \
59              ((version) == DXGKDDI_INTERFACE_VERSION_WIN7) ||      \
60              ((version) == DXGKDDI_INTERFACE_VERSION_WIN8) ||      \
61              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM1_3) ||   \
62              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM1_3_PATH_INDEPENDENT_ROTATION) || \
63              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_0) ||   \
64              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_1) ||   \
65              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_1_5) || \
66              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_1_6) || \
67              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_2) ||   \
68              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_3) ||   \
69              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_4) ||   \
70              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_5) ||   \
71              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_6) ||   \
72              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_7) ||   \
73              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_8) ||   \
74              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM2_9) ||   \
75              ((version) == DXGKDDI_INTERFACE_VERSION_WDDM3_0)      \
76             )
77 
78 #if !defined(DXGKDDI_INTERFACE_VERSION)
79 #define DXGKDDI_INTERFACE_VERSION           DXGKDDI_INTERFACE_VERSION_WDDM3_0
80 #endif // !defined(DXGKDDI_INTERFACE_VERSION)
81 
82 #define D3D_UMD_INTERFACE_VERSION_VISTA      0x000C
83 #define D3D_UMD_INTERFACE_VERSION_WIN7       0x2003
84 #define D3D_UMD_INTERFACE_VERSION_WIN8_M3    0x3001
85 #define D3D_UMD_INTERFACE_VERSION_WIN8_CP    0x3002
86 #define D3D_UMD_INTERFACE_VERSION_WIN8_RC    0x3003
87 #define D3D_UMD_INTERFACE_VERSION_WIN8       0x3004
88 #define D3D_UMD_INTERFACE_VERSION_WDDM1_3    0x4002
89 
90 #define D3D_UMD_INTERFACE_VERSION_WDDM2_0_M1    0x5000
91 #define D3D_UMD_INTERFACE_VERSION_WDDM2_0_M1_3  0x5001
92 #define D3D_UMD_INTERFACE_VERSION_WDDM2_0_M2_2  0x5002
93 #define D3D_UMD_INTERFACE_VERSION_WDDM2_0       0x5002
94 
95 #define D3D_UMD_INTERFACE_VERSION_WDDM2_1_1     0x6000
96 #define D3D_UMD_INTERFACE_VERSION_WDDM2_1_2     0x6001
97 #define D3D_UMD_INTERFACE_VERSION_WDDM2_1_3     0x6002
98 #define D3D_UMD_INTERFACE_VERSION_WDDM2_1_4     0x6003
99 #define D3D_UMD_INTERFACE_VERSION_WDDM2_1       D3D_UMD_INTERFACE_VERSION_WDDM2_1_4
100 
101 #define D3D_UMD_INTERFACE_VERSION_WDDM2_2_1     0x7000
102 #define D3D_UMD_INTERFACE_VERSION_WDDM2_2_2     0x7001
103 #define D3D_UMD_INTERFACE_VERSION_WDDM2_2       D3D_UMD_INTERFACE_VERSION_WDDM2_2_2
104 
105 #define D3D_UMD_INTERFACE_VERSION_WDDM2_3_1     0x8000
106 #define D3D_UMD_INTERFACE_VERSION_WDDM2_3_2     0x8001
107 #define D3D_UMD_INTERFACE_VERSION_WDDM2_3       D3D_UMD_INTERFACE_VERSION_WDDM2_3_2
108 
109 #define D3D_UMD_INTERFACE_VERSION_WDDM2_4_1     0x9000
110 #define D3D_UMD_INTERFACE_VERSION_WDDM2_4_2     0x9001
111 #define D3D_UMD_INTERFACE_VERSION_WDDM2_4       D3D_UMD_INTERFACE_VERSION_WDDM2_4_2
112 
113 #define D3D_UMD_INTERFACE_VERSION_WDDM2_5_1     0xA000
114 #define D3D_UMD_INTERFACE_VERSION_WDDM2_5_2     0xA001
115 #define D3D_UMD_INTERFACE_VERSION_WDDM2_5_3     0xA002
116 #define D3D_UMD_INTERFACE_VERSION_WDDM2_5       D3D_UMD_INTERFACE_VERSION_WDDM2_5_3
117 
118 #define D3D_UMD_INTERFACE_VERSION_WDDM2_6_1     0xB000
119 #define D3D_UMD_INTERFACE_VERSION_WDDM2_6_2     0xB001
120 #define D3D_UMD_INTERFACE_VERSION_WDDM2_6_3     0xB002
121 #define D3D_UMD_INTERFACE_VERSION_WDDM2_6_4     0xB003
122 #define D3D_UMD_INTERFACE_VERSION_WDDM2_6       D3D_UMD_INTERFACE_VERSION_WDDM2_6_4
123 
124 #define D3D_UMD_INTERFACE_VERSION_WDDM2_7_1     0xC000
125 #define D3D_UMD_INTERFACE_VERSION_WDDM2_7_2     0xC001
126 #define D3D_UMD_INTERFACE_VERSION_WDDM2_7       D3D_UMD_INTERFACE_VERSION_WDDM2_7_2
127 
128 #define D3D_UMD_INTERFACE_VERSION_WDDM2_8_1     0xD000
129 #define D3D_UMD_INTERFACE_VERSION_WDDM2_8       D3D_UMD_INTERFACE_VERSION_WDDM2_8_1
130 
131 #define D3D_UMD_INTERFACE_VERSION_WDDM2_9_1     0xE000
132 #define D3D_UMD_INTERFACE_VERSION_WDDM2_9       D3D_UMD_INTERFACE_VERSION_WDDM2_9_1
133 
134 #define D3D_UMD_INTERFACE_VERSION_WDDM3_0_1     0xF000
135 #define D3D_UMD_INTERFACE_VERSION_WDDM3_0       D3D_UMD_INTERFACE_VERSION_WDDM3_0_1
136 
137 // Components which depend on D3D_UMD_INTERFACE_VERSION need to be updated, static assert validation present.
138 // Search for D3D_UMD_INTERFACE_VERSION across all depots to ensure all dependencies are updated.
139 
140 #if !defined(D3D_UMD_INTERFACE_VERSION)
141 #define D3D_UMD_INTERFACE_VERSION           D3D_UMD_INTERFACE_VERSION_WDDM3_0
142 #endif // !defined(D3D_UMD_INTERFACE_VERSION)
143 
144 //
145 // These macros are used to enable non-Windows 32-bit usermode to fill out a fixed-size
146 // structure for D3DKMT structures, so that they can be sent to a 64-bit kernel
147 // without a thunking layer for translation.
148 //
149 // Note that a thunking layer is still used for wchar_t translation, where Windows uses
150 // 16-bit characters and non-Windows uses 32-bit characters.
151 //
152 // If brace initialization is used (e.g. D3DKMT_FOO foo = { a, b, c }), be aware that for
153 // non-Windows, pointers will be unioned such that a 64-bit integer is the member that is
154 // initialized. It is not possible to achieve both type safety and proper zero-initialization
155 // of the high bits of pointers with brace initialization in this model. Use D3DKMT_PTR_INIT(ptr)
156 // to appropriately cast to a 64-bit integer for non-Windows, or to pass the pointer unchanged for
157 // Windows. To maintain type safety, manually assign the fields after zero-initializing the struct.
158 //
159 #ifdef _WIN32
160 // For Windows, don't enforce any unnatural alignment or data sizes/types.
161 // The WOW64 thunking layer will handle translation.
162 #define D3DKMT_ALIGN64
163 #define D3DKMT_PTR_HELPER(Name)
164 #define D3DKMT_PTR(Type, Name) Type Name
165 #define D3DKMT_PTR_INIT(x) (x)
166 typedef SIZE_T D3DKMT_SIZE_T;
167 typedef UINT_PTR D3DKMT_UINT_PTR;
168 typedef ULONG_PTR D3DKMT_ULONG_PTR;
169 typedef HANDLE D3DKMT_PTR_TYPE;
170 #else
171 // For other platforms, struct layout should be fixed-size, x64-compatible
172 #if __cplusplus >= 201103L
173  #define D3DKMT_ALIGN64 alignas(8)
174 #else
175  #define D3DKMT_ALIGN64 __attribute__((aligned(8)))
176 #endif
177 #define D3DKMT_PTR_HELPER(Name) D3DKMT_ALIGN64 UINT64 Name;
178 #define D3DKMT_PTR(Type, Name)       \
179 union D3DKMT_ALIGN64                 \
180 {                                    \
181     D3DKMT_PTR_HELPER(Name##_Align)  \
182     Type Name;                       \
183 }
184 #define D3DKMT_PTR_INIT(x) { (UINT64)(SIZE_T)(x) }
185 typedef UINT64 D3DKMT_SIZE_T, D3DKMT_UINT_PTR, D3DKMT_ULONG_PTR;
186 typedef union _D3DKMT_PTR_TYPE
187 {
188     D3DKMT_PTR_HELPER(Ptr_Align);
189     HANDLE Ptr;
190 } D3DKMT_PTR_TYPE;
191 #endif
192 
193 //
194 // Available only for Vista (LONGHORN) and later and for
195 // multiplatform tools such as debugger extensions
196 //
197 #if (NTDDI_VERSION >= NTDDI_LONGHORN) || defined(D3DKMDT_SPECIAL_MULTIPLATFORM_TOOL)
198 
199 typedef ULONGLONG D3DGPU_VIRTUAL_ADDRESS;
200 typedef ULONGLONG D3DGPU_SIZE_T;
201 #define D3DGPU_UNIQUE_DRIVER_PROTECTION 0x8000000000000000ULL
202 
203 #define DXGK_MAX_PAGE_TABLE_LEVEL_COUNT 6
204 #define DXGK_MIN_PAGE_TABLE_LEVEL_COUNT 2
205 
206 //
207 // IOCTL_GPUP_DRIVER_ESCAPE - The user mode emulation DLL calls this IOCTL
208 // to exchange information with the kernel mode driver.
209 //
210 #define IOCTL_GPUP_DRIVER_ESCAPE CTL_CODE(FILE_DEVICE_UNKNOWN, (8 + 0x910), METHOD_BUFFERED, FILE_READ_DATA)
211 typedef struct _GPUP_DRIVER_ESCAPE_INPUT
212 {
213    LUID        vfLUID; //LUID that was returned from SET_PARTITION_DETAILS
214 } GPUP_DRIVER_ESCAPE_INPUT, *PGPUP_DRIVER_ESCAPE_INPUT;
215 
216 typedef enum _DXGKVGPU_ESCAPE_TYPE
217 {
218     DXGKVGPU_ESCAPE_TYPE_READ_PCI_CONFIG            = 0,
219     DXGKVGPU_ESCAPE_TYPE_WRITE_PCI_CONFIG           = 1,
220     DXGKVGPU_ESCAPE_TYPE_INITIALIZE                 = 2,
221     DXGKVGPU_ESCAPE_TYPE_RELEASE                    = 3,
222     DXGKVGPU_ESCAPE_TYPE_GET_VGPU_TYPE              = 4,
223     DXGKVGPU_ESCAPE_TYPE_POWERTRANSITIONCOMPLETE    = 5,
224 } DXGKVGPU_ESCAPE_TYPE;
225 
226 typedef struct _DXGKVGPU_ESCAPE_HEAD
227 {
228     GPUP_DRIVER_ESCAPE_INPUT    Luid;
229     DXGKVGPU_ESCAPE_TYPE        Type;
230 } DXGKVGPU_ESCAPE_HEAD;
231 
232 typedef struct _DXGKVGPU_ESCAPE_READ_PCI_CONFIG
233 {
234     DXGKVGPU_ESCAPE_HEAD Header;
235 
236     UINT  Offset;           // Offset in bytes in the PCI config space
237     UINT  Size;             // Size in bytes to read
238 } DXGKVGPU_ESCAPE_READ_PCI_CONFIG;
239 
240 typedef struct _DXGKVGPU_ESCAPE_WRITE_PCI_CONFIG
241 {
242     DXGKVGPU_ESCAPE_HEAD Header;
243 
244     UINT  Offset;           // Offset in bytes in the PCI config space
245     UINT  Size;             // Size in bytes to write
246     // "Size" number of bytes follow
247 } DXGKVGPU_ESCAPE_WRITE_PCI_CONFIG;
248 
249 typedef struct _DXGKVGPU_ESCAPE_READ_VGPU_TYPE
250 {
251     DXGKVGPU_ESCAPE_HEAD Header;
252 } DXGKVGPU_ESCAPE_READ_VGPU_TYPE;
253 
254 typedef struct _DXGKVGPU_ESCAPE_POWERTRANSITIONCOMPLETE
255 {
256     DXGKVGPU_ESCAPE_HEAD Header;
257     UINT PowerState;
258 } DXGKVGPU_ESCAPE_POWERTRANSITIONCOMPLETE;
259 
260 typedef struct _DXGKVGPU_ESCAPE_INITIALIZE
261 {
262     DXGKVGPU_ESCAPE_HEAD    Header;
263     GUID                    VmGuid;
264 } DXGKVGPU_ESCAPE_INITIALIZE;
265 
266 typedef struct _DXGKVGPU_ESCAPE_RELEASE
267 {
268     DXGKVGPU_ESCAPE_HEAD Header;
269 } DXGKVGPU_ESCAPE_RELEASE;
270 
271 
272 typedef enum _DXGK_PTE_PAGE_SIZE
273 {
274     DXGK_PTE_PAGE_TABLE_PAGE_4KB       = 0,
275     DXGK_PTE_PAGE_TABLE_PAGE_64KB      = 1,
276 } DXGK_PTE_PAGE_SIZE;
277 
278 //
279 //  Page Table Entry structure. Contains segment/physical address pointing to a page
280 //
281 
282 typedef struct _DXGK_PTE
283 {
284     union
285     {
286         struct
287         {
288             ULONGLONG Valid                 :  1;
289             ULONGLONG Zero                  :  1;
290             ULONGLONG CacheCoherent         :  1;
291             ULONGLONG ReadOnly              :  1;
292             ULONGLONG NoExecute             :  1;
293             ULONGLONG Segment               :  5;
294             ULONGLONG LargePage             :  1;
295             ULONGLONG PhysicalAdapterIndex  :  6;
296             ULONGLONG PageTablePageSize     :  2;       // DXGK_PTE_PAGE_SIZE
297             ULONGLONG SystemReserved0       :  1;
298             ULONGLONG Reserved              :  44;
299         };
300         ULONGLONG Flags;
301     };
302     union
303     {
304         ULONGLONG PageAddress;      // High 52 bits of 64 bit physical address. Low 12 bits are zero.
305         ULONGLONG PageTableAddress; // High 52 bits of 64 bit physical address. Low 12 bits are zero.
306     };
307 } DXGK_PTE;
308 
309 #define D3DGPU_NULL 0
310 #define D3DDDI_MAX_WRITTEN_PRIMARIES 16
311 #define D3DDDI_MAX_MPO_PRESENT_DIRTY_RECTS  0xFFF
312 
313 typedef struct _D3DGPU_PHYSICAL_ADDRESS
314 {
315     UINT    SegmentId;
316     UINT    Padding;
317     UINT64  SegmentOffset;
318 } D3DGPU_PHYSICAL_ADDRESS;
319 
320 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
321 // Purpose: Video present source unique identification number descriptor type
322 //
323 
324 typedef UINT  D3DDDI_VIDEO_PRESENT_SOURCE_ID;
325 
326 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
327 // Purpose: Video present source unique identification number descriptor type.
328 //
329 typedef UINT  D3DDDI_VIDEO_PRESENT_TARGET_ID;
330 
331 //
332 // DDI level handle that represents a kernel mode object (allocation, device, etc)
333 //
334 typedef UINT D3DKMT_HANDLE;
335 
336 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
337 // Purpose: Video present target mode fractional frequency descriptor type.
338 //
339 // Remarks: Fractional value used to represent vertical and horizontal frequencies of a video mode
340 //          (i.e. VSync and HSync). Vertical frequencies are stored in Hz. Horizontal frequencies
341 //          are stored in Hz.
342 //          The dynamic range of this encoding format, given 10^-7 resolution is {0..(2^32 - 1) / 10^7},
343 //          which translates to {0..428.4967296} [Hz] for vertical frequencies and {0..428.4967296} [Hz]
344 //          for horizontal frequencies. This sub-microseconds precision range should be acceptable even
345 //          for a pro-video application (error in one microsecond for video signal synchronization would
346 //          imply a time drift with a cycle of 10^7/(60*60*24) = 115.741 days.
347 //
348 //          If rational number with a finite fractional sequence, use denominator of form 10^(length of fractional sequence).
349 //          If rational number without a finite fractional sequence, or a sequence exceeding the precision allowed by the
350 //          dynamic range of the denominator, or an irrational number, use an appropriate ratio of integers which best
351 //          represents the value.
352 //
353 typedef struct _D3DDDI_RATIONAL
354 {
355     UINT    Numerator;
356     UINT    Denominator;
357 } D3DDDI_RATIONAL;
358 
359 typedef struct _D3DDDI_ALLOCATIONINFO
360 {
361     D3DKMT_HANDLE                   hAllocation;           // out: Private driver data for allocation
362     D3DKMT_PTR(CONST VOID*,         pSystemMem);           // in: Pointer to pre-allocated sysmem
363     D3DKMT_PTR(VOID*,               pPrivateDriverData);   // in(out optional): Private data for each allocation
364     UINT                            PrivateDriverDataSize; // in: Size of the private data
365     D3DDDI_VIDEO_PRESENT_SOURCE_ID  VidPnSourceId;         // in: VidPN source ID if this is a primary
366     union
367     {
368         struct
369         {
370             UINT    Primary         : 1;    // 0x00000001
371 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN8) || \
372      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WIN8))
373             UINT    Stereo          : 1;    // 0x00000002
374             UINT    Reserved        :30;    // 0xFFFFFFFC
375 #else
376             UINT    Reserved        :31;    // 0xFFFFFFFE
377 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN8)
378         };
379         UINT        Value;
380     } Flags;
381 } D3DDDI_ALLOCATIONINFO;
382 
383 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN7) || \
384      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WIN7))
385 
386 typedef struct _D3DDDI_ALLOCATIONINFO2
387 {
388     D3DKMT_HANDLE                   hAllocation;           // out: Private driver data for allocation
389     union D3DKMT_ALIGN64
390     {
391         D3DKMT_PTR_HELPER(pSystemMem_hSection_Align)
392         HANDLE                      hSection;              // in: Handle to valid section object
393         CONST VOID*                 pSystemMem;            // in: Pointer to pre-allocated sysmem
394     };
395     D3DKMT_PTR(VOID*,               pPrivateDriverData);   // in(out optional): Private data for each allocation
396     UINT                            PrivateDriverDataSize; // in: Size of the private data
397     D3DDDI_VIDEO_PRESENT_SOURCE_ID  VidPnSourceId;         // in: VidPN source ID if this is a primary
398     union
399     {
400         struct
401         {
402             UINT    Primary          : 1;    // 0x00000001
403 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN8) || \
404      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WIN8))
405             UINT    Stereo           : 1;    // 0x00000002
406 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_2) || \
407      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_2))
408             UINT    OverridePriority : 1;    // 0x00000004
409             UINT    Reserved         : 29;   // 0xFFFFFFF8
410 #else
411             UINT    Reserved         : 30;    // 0xFFFFFFFC
412 #endif
413 #else
414             UINT    Reserved          :31;    // 0xFFFFFFFE
415 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN8)
416         };
417         UINT        Value;
418     } Flags;
419     D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS GpuVirtualAddress;    // out: GPU Virtual address of the allocation created.
420 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_2) || \
421      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_2))
422     union
423     {
424         UINT                        Priority;             // in: priority of allocation
425         D3DKMT_ALIGN64 ULONG_PTR    Unused;
426     };
427     D3DKMT_ALIGN64 ULONG_PTR        Reserved[5];          // Reserved
428 #else
429     D3DKMT_ALIGN64 ULONG_PTR        Reserved[6];          // Reserved
430 #endif
431 } D3DDDI_ALLOCATIONINFO2;
432 
433 #endif
434 
435 typedef struct _D3DDDI_OPENALLOCATIONINFO
436 {
437     D3DKMT_HANDLE   hAllocation;                // in: Handle for this allocation in this process
438     D3DKMT_PTR(CONST VOID*, pPrivateDriverData);         // in: Ptr to driver private buffer for this allocations
439     UINT            PrivateDriverDataSize;      // in: Size in bytes of driver private buffer for this allocations
440 
441 } D3DDDI_OPENALLOCATIONINFO;
442 
443 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN7) || \
444      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WIN7))
445 
446 typedef struct _D3DDDI_OPENALLOCATIONINFO2
447 {
448     D3DKMT_HANDLE   hAllocation;                // in: Handle for this allocation in this process
449     D3DKMT_PTR(CONST VOID*, pPrivateDriverData);// in: Ptr to driver private buffer for this allocations
450     UINT            PrivateDriverDataSize;      // in: Size in bytes of driver private buffer for this allocations
451     D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS GpuVirtualAddress;   // out: GPU Virtual address of the allocation opened.
452     D3DKMT_ALIGN64 ULONG_PTR Reserved[6];       // Reserved
453 } D3DDDI_OPENALLOCATIONINFO2;
454 
455 #endif
456 
457 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN8) || \
458      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WIN8))
459 
460 typedef enum _D3DDDI_OFFER_PRIORITY
461 {
462     D3DDDI_OFFER_PRIORITY_NONE=0,               // Do not offer
463     D3DDDI_OFFER_PRIORITY_LOW=1,                // Content is not useful
464     D3DDDI_OFFER_PRIORITY_NORMAL,               // Content is useful but easy to regenerate
465     D3DDDI_OFFER_PRIORITY_HIGH,                 // Content is useful and difficult to regenerate
466     D3DDDI_OFFER_PRIORITY_AUTO,                 // Let VidMm decide offer priority based on eviction priority
467 } D3DDDI_OFFER_PRIORITY;
468 
469 #endif
470 
471 typedef struct _D3DDDI_ALLOCATIONLIST
472 {
473     D3DKMT_HANDLE       hAllocation;
474     union
475     {
476         struct
477         {
478             UINT                  WriteOperation      : 1; // 0x00000001
479             UINT                  DoNotRetireInstance : 1; // 0x00000002
480 
481 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN8) || \
482      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WIN8))
483             UINT                  OfferPriority       : 3; // 0x0000001C D3DDDI_OFFER_PRIORITY
484             UINT                  Reserved            :27; // 0xFFFFFFE0
485 #else
486             UINT                  Reserved            :30; // 0xFFFFFFFC
487 #endif
488         };
489         UINT                Value;
490     };
491 } D3DDDI_ALLOCATIONLIST;
492 
493 typedef struct _D3DDDI_PATCHLOCATIONLIST
494 {
495     UINT                AllocationIndex;
496     union
497     {
498         struct
499         {
500             UINT            SlotId          : 24;   // 0x00FFFFFF
501             UINT            Reserved        : 8;    // 0xFF000000
502         };
503         UINT                Value;
504     };
505     UINT                DriverId;
506     UINT                AllocationOffset;
507     UINT                PatchOffset;
508     UINT                SplitOffset;
509 } D3DDDI_PATCHLOCATIONLIST;
510 
511 typedef struct _D3DDDICB_LOCKFLAGS
512 {
513     union
514     {
515         struct
516         {
517             UINT    ReadOnly            : 1;    // 0x00000001
518             UINT    WriteOnly           : 1;    // 0x00000002
519             UINT    DonotWait           : 1;    // 0x00000004
520             UINT    IgnoreSync          : 1;    // 0x00000008
521             UINT    LockEntire          : 1;    // 0x00000010
522             UINT    DonotEvict          : 1;    // 0x00000020
523             UINT    AcquireAperture     : 1;    // 0x00000040
524             UINT    Discard             : 1;    // 0x00000080
525             UINT    NoExistingReference : 1;    // 0x00000100
526             UINT    UseAlternateVA      : 1;    // 0x00000200
527             UINT    IgnoreReadSync      : 1;    // 0x00000400
528             UINT    Reserved            :21;    // 0xFFFFF800
529         };
530         UINT        Value;
531     };
532 } D3DDDICB_LOCKFLAGS;
533 
534 typedef struct _D3DDDICB_LOCK2FLAGS
535 {
536     union
537     {
538         struct
539         {
540             UINT    Reserved            : 32;    // 0xFFFFFFFF
541         };
542         UINT        Value;
543     };
544 } D3DDDICB_LOCK2FLAGS;
545 
546 typedef struct _D3DDDICB_DESTROYALLOCATION2FLAGS
547 {
548     union
549     {
550         struct
551         {
552             UINT    AssumeNotInUse      :  1;    // 0x00000001
553             UINT    SynchronousDestroy  :  1;    // 0x00000002
554             UINT    Reserved            : 29;    // 0x7FFFFFFC
555             UINT    SystemUseOnly       :  1;    // 0x80000000  // Should not be set by the UMD
556         };
557         UINT        Value;
558     };
559 } D3DDDICB_DESTROYALLOCATION2FLAGS;
560 
561 typedef struct _D3DDDI_ESCAPEFLAGS
562 {
563     union
564     {
565         struct
566         {
567             UINT    HardwareAccess      : 1;    // 0x00000001
568 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM1_3) || \
569      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM1_3))
570             UINT    DeviceStatusQuery   : 1;    // 0x00000002
571             UINT    ChangeFrameLatency  : 1;    // 0x00000004
572 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0)
573             UINT    NoAdapterSynchronization    : 1; // 0x00000008
574 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_2)
575             UINT    Reserved            : 1;    // 0x00000010   Used internally by DisplayOnly present
576             UINT    VirtualMachineData  : 1;    // 0x00000020   Cannot be set from user mode
577 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_5)
578             UINT    DriverKnownEscape   : 1;    // 0x00000040       // Driver private data points to a well known structure
579             UINT    DriverCommonEscape  : 1;    // 0x00000080       // Private data points runtime defined structure
580             UINT    Reserved2           :24;    // 0xFFFFFF00
581 #else  // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_5)
582             UINT    Reserved2           :26;    // 0xFFFFFFC0
583 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_5)
584 #else
585             UINT    Reserved            :28;    // 0xFFFFFFF0
586 #endif //  (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_2)
587 #else
588             UINT    Reserved            :29;    // 0xFFFFFFF8
589 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0)
590 #else
591             UINT    Reserved            :31;    // 0xFFFFFFFE
592 #endif // WDDM1_3
593         };
594         UINT        Value;
595     };
596 } D3DDDI_ESCAPEFLAGS;
597 
598 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_5)
599 
600 typedef enum _D3DDDI_DRIVERESCAPETYPE
601 {
602     D3DDDI_DRIVERESCAPETYPE_TRANSLATEALLOCATIONHANDLE   = 0,
603     D3DDDI_DRIVERESCAPETYPE_TRANSLATERESOURCEHANDLE     = 1,
604 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM3_0)
605     D3DDDI_DRIVERESCAPETYPE_CPUEVENTUSAGE               = 2,
606 #endif
607     D3DDDI_DRIVERESCAPETYPE_MAX,
608 } D3DDDI_DRIVERESCAPETYPE;
609 
610 typedef struct _D3DDDI_DRIVERESCAPE_TRANSLATEALLOCATIONEHANDLE
611 {
612      D3DDDI_DRIVERESCAPETYPE  EscapeType;
613      D3DKMT_HANDLE            hAllocation;
614 } D3DDDI_DRIVERESCAPE_TRANSLATEALLOCATIONEHANDLE;
615 
616 typedef struct _D3DDDI_DRIVERESCAPE_TRANSLATERESOURCEHANDLE
617 {
618     D3DDDI_DRIVERESCAPETYPE  EscapeType;
619     D3DKMT_HANDLE            hResource;
620 } D3DDDI_DRIVERESCAPE_TRANSLATERESOURCEHANDLE;
621 
622 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_5)
623 
624 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM3_0)
625 
626 typedef struct _D3DDDI_DRIVERESCAPE_CPUEVENTUSAGE
627 {
628     D3DDDI_DRIVERESCAPETYPE EscapeType;
629     D3DKMT_HANDLE           hSyncObject;
630     D3DKMT_ALIGN64 UINT64   hKmdCpuEvent;
631     UINT                    Usage[8];
632 } D3DDDI_DRIVERESCAPE_CPUEVENTUSAGE;
633 
634 #endif
635 
636 typedef struct _D3DDDI_CREATECONTEXTFLAGS
637 {
638     union
639     {
640         struct
641         {
642             UINT    NullRendering       : 1;      // 0x00000001
643             UINT    InitialData         : 1;      // 0x00000002
644 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0) || \
645      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_0))
646             UINT    DisableGpuTimeout   : 1;      // 0x00000004
647             UINT    SynchronizationOnly : 1;      // 0x00000008
648 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_3) || \
649      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_3_1))
650             UINT    HwQueueSupported    : 1;      // 0x00000010
651             UINT    NoKmdAccess         : 1;      // 0x00000020
652             UINT    Reserved            :26;      // 0xFFFFFFC0
653 #else
654             UINT    Reserved            :28;      // 0xFFFFFFF0
655 #endif // DXGKDDI_INTERFACE_VERSION
656 
657 #else
658             UINT    Reserved            :30;      // 0xFFFFFFFC
659 #endif // DXGKDDI_INTERFACE_VERSION
660         };
661         UINT Value;
662     };
663 } D3DDDI_CREATECONTEXTFLAGS;
664 
665 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_2) || \
666      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_2_1))
667 
668 typedef struct _D3DDDI_CREATEHWCONTEXTFLAGS
669 {
670     union
671     {
672         struct
673         {
674             UINT    Reserved            :32;      // 0xFFFFFFFF
675         };
676         UINT Value;
677     };
678 } D3DDDI_CREATEHWCONTEXTFLAGS;
679 
680 typedef struct _D3DDDI_CREATEHWQUEUEFLAGS
681 {
682     union
683     {
684         struct
685         {
686             UINT    DisableGpuTimeout   : 1;      // 0x00000001
687             UINT    NoBroadcastSignal   : 1;      // 0x00000002
688             UINT    NoBroadcastWait     : 1;      // 0x00000004
689             UINT    NoKmdAccess         : 1;      // 0x00000008
690             UINT    Reserved            :28;      // 0xFFFFFFF0
691         };
692         UINT Value;
693     };
694 } D3DDDI_CREATEHWQUEUEFLAGS;
695 
696 #endif // ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_2)
697 
698 typedef struct _D3DDDI_SEGMENTPREFERENCE
699 {
700     union
701     {
702         struct
703         {
704             UINT SegmentId0 : 5;                // 0x0000001F
705             UINT Direction0 : 1;                // 0x00000020
706             UINT SegmentId1 : 5;                // 0x000007C0
707             UINT Direction1 : 1;                // 0x00000800
708             UINT SegmentId2 : 5;                // 0x0001F000
709             UINT Direction2 : 1;                // 0x00020000
710             UINT SegmentId3 : 5;                // 0x007C0000
711             UINT Direction3 : 1;                // 0x00800000
712             UINT SegmentId4 : 5;                // 0x1F000000
713             UINT Direction4 : 1;                // 0x20000000
714             UINT Reserved   : 2;                // 0xC0000000
715         };
716         UINT Value;
717     };
718 } D3DDDI_SEGMENTPREFERENCE;
719 
720 /* Formats
721  * Most of these names have the following convention:
722  *      A = Alpha
723  *      R = Red
724  *      G = Green
725  *      B = Blue
726  *      X = Unused Bits
727  *      P = Palette
728  *      L = Luminance
729  *      U = dU coordinate for BumpMap
730  *      V = dV coordinate for BumpMap
731  *      S = Stencil
732  *      D = Depth (e.g. Z or W buffer)
733  *      C = Computed from other channels (typically on certain read operations)
734  *
735  *      Further, the order of the pieces are from MSB first; hence
736  *      D3DFMT_A8L8 indicates that the high byte of this two byte
737  *      format is alpha.
738  *
739  *      D16 indicates:
740  *           - An integer 16-bit value.
741  *           - An app-lockable surface.
742  *
743  *      All Depth/Stencil formats except D3DFMT_D16_LOCKABLE indicate:
744  *          - no particular bit ordering per pixel, and
745  *          - are not app lockable, and
746  *          - the driver is allowed to consume more than the indicated
747  *            number of bits per Depth channel (but not Stencil channel).
748  */
749 #ifndef MAKEFOURCC
750     #define MAKEFOURCC(ch0, ch1, ch2, ch3)                              \
751                 ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |       \
752                 ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
753 #endif /* defined(MAKEFOURCC) */
754 
755 
756 typedef enum _D3DDDIFORMAT
757 {
758 
759     D3DDDIFMT_UNKNOWN           =  0,
760 
761     D3DDDIFMT_R8G8B8            = 20,
762     D3DDDIFMT_A8R8G8B8          = 21,
763     D3DDDIFMT_X8R8G8B8          = 22,
764     D3DDDIFMT_R5G6B5            = 23,
765     D3DDDIFMT_X1R5G5B5          = 24,
766     D3DDDIFMT_A1R5G5B5          = 25,
767     D3DDDIFMT_A4R4G4B4          = 26,
768     D3DDDIFMT_R3G3B2            = 27,
769     D3DDDIFMT_A8                = 28,
770     D3DDDIFMT_A8R3G3B2          = 29,
771     D3DDDIFMT_X4R4G4B4          = 30,
772     D3DDDIFMT_A2B10G10R10       = 31,
773     D3DDDIFMT_A8B8G8R8          = 32,
774     D3DDDIFMT_X8B8G8R8          = 33,
775     D3DDDIFMT_G16R16            = 34,
776     D3DDDIFMT_A2R10G10B10       = 35,
777     D3DDDIFMT_A16B16G16R16      = 36,
778 
779     D3DDDIFMT_A8P8              = 40,
780     D3DDDIFMT_P8                = 41,
781 
782     D3DDDIFMT_L8                = 50,
783     D3DDDIFMT_A8L8              = 51,
784     D3DDDIFMT_A4L4              = 52,
785 
786     D3DDDIFMT_V8U8              = 60,
787     D3DDDIFMT_L6V5U5            = 61,
788     D3DDDIFMT_X8L8V8U8          = 62,
789     D3DDDIFMT_Q8W8V8U8          = 63,
790     D3DDDIFMT_V16U16            = 64,
791     D3DDDIFMT_W11V11U10         = 65,
792     D3DDDIFMT_A2W10V10U10       = 67,
793 
794     D3DDDIFMT_UYVY              = MAKEFOURCC('U', 'Y', 'V', 'Y'),
795     D3DDDIFMT_R8G8_B8G8         = MAKEFOURCC('R', 'G', 'B', 'G'),
796     D3DDDIFMT_YUY2              = MAKEFOURCC('Y', 'U', 'Y', '2'),
797     D3DDDIFMT_G8R8_G8B8         = MAKEFOURCC('G', 'R', 'G', 'B'),
798     D3DDDIFMT_DXT1              = MAKEFOURCC('D', 'X', 'T', '1'),
799     D3DDDIFMT_DXT2              = MAKEFOURCC('D', 'X', 'T', '2'),
800     D3DDDIFMT_DXT3              = MAKEFOURCC('D', 'X', 'T', '3'),
801     D3DDDIFMT_DXT4              = MAKEFOURCC('D', 'X', 'T', '4'),
802     D3DDDIFMT_DXT5              = MAKEFOURCC('D', 'X', 'T', '5'),
803 
804     D3DDDIFMT_D16_LOCKABLE      = 70,
805     D3DDDIFMT_D32               = 71,
806     D3DDDIFMT_D15S1             = 73,
807     D3DDDIFMT_D24S8             = 75,
808     D3DDDIFMT_D24X8             = 77,
809     D3DDDIFMT_D24X4S4           = 79,
810     D3DDDIFMT_D16               = 80,
811 
812     D3DDDIFMT_D32F_LOCKABLE     = 82,
813     D3DDDIFMT_D24FS8            = 83,
814 
815     D3DDDIFMT_D32_LOCKABLE      = 84,
816     D3DDDIFMT_S8_LOCKABLE       = 85,
817 
818     D3DDDIFMT_S1D15             = 72,
819     D3DDDIFMT_S8D24             = 74,
820     D3DDDIFMT_X8D24             = 76,
821     D3DDDIFMT_X4S4D24           = 78,
822 
823     D3DDDIFMT_L16               = 81,
824 #if (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM1_3) // M1
825     D3DDDIFMT_G8R8              = 91,
826     D3DDDIFMT_R8                = 92,
827 #endif
828 
829     D3DDDIFMT_VERTEXDATA        =100,
830     D3DDDIFMT_INDEX16           =101,
831     D3DDDIFMT_INDEX32           =102,
832 
833     D3DDDIFMT_Q16W16V16U16      =110,
834 
835     D3DDDIFMT_MULTI2_ARGB8      = MAKEFOURCC('M','E','T','1'),
836 
837     // Floating point surface formats
838 
839     // s10e5 formats (16-bits per channel)
840     D3DDDIFMT_R16F              = 111,
841     D3DDDIFMT_G16R16F           = 112,
842     D3DDDIFMT_A16B16G16R16F     = 113,
843 
844     // IEEE s23e8 formats (32-bits per channel)
845     D3DDDIFMT_R32F              = 114,
846     D3DDDIFMT_G32R32F           = 115,
847     D3DDDIFMT_A32B32G32R32F     = 116,
848 
849     D3DDDIFMT_CxV8U8            = 117,
850 
851     // Monochrome 1 bit per pixel format
852     D3DDDIFMT_A1                = 118,
853 
854     // 2.8 biased fixed point
855     D3DDDIFMT_A2B10G10R10_XR_BIAS = 119,
856 
857     // Decode compressed buffer formats
858     D3DDDIFMT_DXVACOMPBUFFER_BASE     = 150,
859     D3DDDIFMT_PICTUREPARAMSDATA       = D3DDDIFMT_DXVACOMPBUFFER_BASE+0,    // 150
860     D3DDDIFMT_MACROBLOCKDATA          = D3DDDIFMT_DXVACOMPBUFFER_BASE+1,    // 151
861     D3DDDIFMT_RESIDUALDIFFERENCEDATA  = D3DDDIFMT_DXVACOMPBUFFER_BASE+2,    // 152
862     D3DDDIFMT_DEBLOCKINGDATA          = D3DDDIFMT_DXVACOMPBUFFER_BASE+3,    // 153
863     D3DDDIFMT_INVERSEQUANTIZATIONDATA = D3DDDIFMT_DXVACOMPBUFFER_BASE+4,    // 154
864     D3DDDIFMT_SLICECONTROLDATA        = D3DDDIFMT_DXVACOMPBUFFER_BASE+5,    // 155
865     D3DDDIFMT_BITSTREAMDATA           = D3DDDIFMT_DXVACOMPBUFFER_BASE+6,    // 156
866     D3DDDIFMT_MOTIONVECTORBUFFER      = D3DDDIFMT_DXVACOMPBUFFER_BASE+7,    // 157
867     D3DDDIFMT_FILMGRAINBUFFER         = D3DDDIFMT_DXVACOMPBUFFER_BASE+8,    // 158
868     D3DDDIFMT_DXVA_RESERVED9          = D3DDDIFMT_DXVACOMPBUFFER_BASE+9,    // 159
869     D3DDDIFMT_DXVA_RESERVED10         = D3DDDIFMT_DXVACOMPBUFFER_BASE+10,   // 160
870     D3DDDIFMT_DXVA_RESERVED11         = D3DDDIFMT_DXVACOMPBUFFER_BASE+11,   // 161
871     D3DDDIFMT_DXVA_RESERVED12         = D3DDDIFMT_DXVACOMPBUFFER_BASE+12,   // 162
872     D3DDDIFMT_DXVA_RESERVED13         = D3DDDIFMT_DXVACOMPBUFFER_BASE+13,   // 163
873     D3DDDIFMT_DXVA_RESERVED14         = D3DDDIFMT_DXVACOMPBUFFER_BASE+14,   // 164
874     D3DDDIFMT_DXVA_RESERVED15         = D3DDDIFMT_DXVACOMPBUFFER_BASE+15,   // 165
875     D3DDDIFMT_DXVA_RESERVED16         = D3DDDIFMT_DXVACOMPBUFFER_BASE+16,   // 166
876     D3DDDIFMT_DXVA_RESERVED17         = D3DDDIFMT_DXVACOMPBUFFER_BASE+17,   // 167
877     D3DDDIFMT_DXVA_RESERVED18         = D3DDDIFMT_DXVACOMPBUFFER_BASE+18,   // 168
878     D3DDDIFMT_DXVA_RESERVED19         = D3DDDIFMT_DXVACOMPBUFFER_BASE+19,   // 169
879     D3DDDIFMT_DXVA_RESERVED20         = D3DDDIFMT_DXVACOMPBUFFER_BASE+20,   // 170
880     D3DDDIFMT_DXVA_RESERVED21         = D3DDDIFMT_DXVACOMPBUFFER_BASE+21,   // 171
881     D3DDDIFMT_DXVA_RESERVED22         = D3DDDIFMT_DXVACOMPBUFFER_BASE+22,   // 172
882     D3DDDIFMT_DXVA_RESERVED23         = D3DDDIFMT_DXVACOMPBUFFER_BASE+23,   // 173
883     D3DDDIFMT_DXVA_RESERVED24         = D3DDDIFMT_DXVACOMPBUFFER_BASE+24,   // 174
884     D3DDDIFMT_DXVA_RESERVED25         = D3DDDIFMT_DXVACOMPBUFFER_BASE+25,   // 175
885     D3DDDIFMT_DXVA_RESERVED26         = D3DDDIFMT_DXVACOMPBUFFER_BASE+26,   // 176
886     D3DDDIFMT_DXVA_RESERVED27         = D3DDDIFMT_DXVACOMPBUFFER_BASE+27,   // 177
887     D3DDDIFMT_DXVA_RESERVED28         = D3DDDIFMT_DXVACOMPBUFFER_BASE+28,   // 178
888     D3DDDIFMT_DXVA_RESERVED29         = D3DDDIFMT_DXVACOMPBUFFER_BASE+29,   // 179
889     D3DDDIFMT_DXVA_RESERVED30         = D3DDDIFMT_DXVACOMPBUFFER_BASE+30,   // 180
890     D3DDDIFMT_DXVA_RESERVED31         = D3DDDIFMT_DXVACOMPBUFFER_BASE+31,   // 181
891     D3DDDIFMT_DXVACOMPBUFFER_MAX      = D3DDDIFMT_DXVA_RESERVED31,
892 
893     D3DDDIFMT_BINARYBUFFER            = 199,
894 
895     D3DDDIFMT_FORCE_UINT        =0x7fffffff
896 } D3DDDIFORMAT;
897 
898 typedef enum D3DDDI_COLOR_SPACE_TYPE
899 {
900     D3DDDI_COLOR_SPACE_RGB_FULL_G22_NONE_P709             = 0,
901     D3DDDI_COLOR_SPACE_RGB_FULL_G10_NONE_P709             = 1,
902     D3DDDI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709           = 2,
903     D3DDDI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020          = 3,
904     D3DDDI_COLOR_SPACE_RESERVED                           = 4,
905     D3DDDI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601      = 5,
906     D3DDDI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601         = 6,
907     D3DDDI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601           = 7,
908     D3DDDI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709         = 8,
909     D3DDDI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709           = 9,
910     D3DDDI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020        = 10,
911     D3DDDI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020          = 11,
912     D3DDDI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020          = 12,
913     D3DDDI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020      = 13,
914     D3DDDI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020        = 14,
915     D3DDDI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020     = 15,
916     D3DDDI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020   = 16,
917     D3DDDI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020            = 17,
918     D3DDDI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020    = 18,
919     D3DDDI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020      = 19,
920     D3DDDI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709           = 20,
921     D3DDDI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020          = 21,
922     D3DDDI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709         = 22,
923     D3DDDI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020        = 23,
924     D3DDDI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020     = 24,
925     D3DDDI_COLOR_SPACE_CUSTOM                             = 0xFFFFFFFF
926 } D3DDDI_COLOR_SPACE_TYPE;
927 
928 //
929 // Note: This enum is intended to specify the final wire signaling
930 // colorspace values. Do not mix it with enum values defined in
931 // D3DDDI_COLOR_SPACE_TYPE which are used to specify
932 // input colorspace for MPOs and other surfaces.
933 //
934 typedef enum _D3DDDI_OUTPUT_WIRE_COLOR_SPACE_TYPE
935 {
936     // We are using the same values for these first two enums for
937     // backward compatibility to WDDM2.2 drivers which used
938     // to get these 2 values from D3DDDI_COLOR_SPACE_TYPE
939     D3DDDI_OUTPUT_WIRE_COLOR_SPACE_G22_P709               = 0,
940     D3DDDI_OUTPUT_WIRE_COLOR_SPACE_RESERVED               = 4,
941     D3DDDI_OUTPUT_WIRE_COLOR_SPACE_G2084_P2020            = 12,
942 
943     // We are starting the new enum value at 30 just to make sure it
944     // is not confused with the existing D3DDDI_COLOR_SPACE_TYPE
945     // in the short term
946     D3DDDI_OUTPUT_WIRE_COLOR_SPACE_G22_P709_WCG           = 30,
947 
948     // OS only intend to use the _G22_P2020 value in future,
949     // for now graphics drivers should not expect it.
950     D3DDDI_OUTPUT_WIRE_COLOR_SPACE_G22_P2020              = 31,
951 
952     // OS only intend to use the _G2084_P2020_HDR10PLUS value in future,
953     // for now graphics drivers should not expect it.
954     D3DDDI_OUTPUT_WIRE_COLOR_SPACE_G2084_P2020_HDR10PLUS  = 32,
955 
956     // OS only intend to use the _G2084_P2020_DVLL value in future,
957     // for now graphics drivers should not expect it.
958     D3DDDI_OUTPUT_WIRE_COLOR_SPACE_G2084_P2020_DVLL       = 33,
959 } D3DDDI_OUTPUT_WIRE_COLOR_SPACE_TYPE;
960 
961 typedef struct _D3DDDIRECT
962 {
963     LONG left;
964     LONG top;
965     LONG right;
966     LONG bottom;
967 } D3DDDIRECT;
968 
969 typedef struct _D3DDDI_KERNELOVERLAYINFO
970 {
971     D3DKMT_HANDLE        hAllocation;           // in: Allocation to be displayed
972     D3DDDIRECT           DstRect;               // in: Dest rect
973     D3DDDIRECT           SrcRect;               // in: Source rect
974     D3DKMT_PTR(VOID*,    pPrivateDriverData);   // in: Private driver data
975     UINT                 PrivateDriverDataSize; // in: Size of private driver data
976 } D3DDDI_KERNELOVERLAYINFO;
977 
978 typedef enum _D3DDDI_GAMMARAMP_TYPE
979 {
980     D3DDDI_GAMMARAMP_UNINITIALIZED = 0,
981     D3DDDI_GAMMARAMP_DEFAULT       = 1,
982     D3DDDI_GAMMARAMP_RGB256x3x16   = 2,
983     D3DDDI_GAMMARAMP_DXGI_1        = 3,
984 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_3)
985     D3DDDI_GAMMARAMP_MATRIX_3x4    = 4,
986 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_3)
987 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_6)
988     D3DDDI_GAMMARAMP_MATRIX_V2     = 5,
989 #endif // DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_6
990 } D3DDDI_GAMMARAMP_TYPE;
991 
992 typedef struct _D3DDDI_GAMMA_RAMP_RGB256x3x16
993 {
994     USHORT  Red[256];
995     USHORT  Green[256];
996     USHORT  Blue[256];
997 } D3DDDI_GAMMA_RAMP_RGB256x3x16;
998 
999 typedef struct D3DDDI_DXGI_RGB
1000 {
1001     float   Red;
1002     float   Green;
1003     float   Blue;
1004 } D3DDDI_DXGI_RGB;
1005 
1006 typedef struct _D3DDDI_GAMMA_RAMP_DXGI_1
1007 {
1008     D3DDDI_DXGI_RGB    Scale;
1009     D3DDDI_DXGI_RGB    Offset;
1010     D3DDDI_DXGI_RGB    GammaCurve[1025];
1011 } D3DDDI_GAMMA_RAMP_DXGI_1;
1012 
1013 typedef struct _D3DKMDT_3X4_COLORSPACE_TRANSFORM
1014 {
1015     float               ColorMatrix3x4[3][4];
1016     float               ScalarMultiplier;
1017     D3DDDI_DXGI_RGB     LookupTable1D[4096];
1018 } D3DKMDT_3x4_COLORSPACE_TRANSFORM, *PD3DDDI_3x4_COLORSPACE_TRANSFORM;
1019 
1020 typedef enum _D3DKMDT_COLORSPACE_TRANSFORM_STAGE_CONTROL
1021 {
1022     D3DKMDT_COLORSPACE_TRANSFORM_STAGE_CONTROL_NO_CHANGE = 0,
1023     D3DKMDT_COLORSPACE_TRANSFORM_STAGE_CONTROL_ENABLE    = 1,
1024     D3DKMDT_COLORSPACE_TRANSFORM_STAGE_CONTROL_BYPASS    = 2,
1025 }D3DKMDT_COLORSPACE_TRANSFORM_STAGE_CONTROL, *PD3DKMDT_COLORSPACE_TRANSFORM_STAGE_CONTROL;
1026 
1027 typedef struct _D3DKMDT_COLORSPACE_TRANSFORM_MATRIX_V2
1028 {
1029     // stage of 1D Degamma.
1030     D3DKMDT_COLORSPACE_TRANSFORM_STAGE_CONTROL  StageControlLookupTable1DDegamma;
1031     D3DDDI_DXGI_RGB                             LookupTable1DDegamma[4096];
1032 
1033     // stage of 3x3 matrix
1034     D3DKMDT_COLORSPACE_TRANSFORM_STAGE_CONTROL  StageControlColorMatrix3x3;
1035     float                                       ColorMatrix3x3[3][3];
1036 
1037     // stage of 1D Regamma.
1038     D3DKMDT_COLORSPACE_TRANSFORM_STAGE_CONTROL  StageControlLookupTable1DRegamma;
1039     D3DDDI_DXGI_RGB                             LookupTable1DRegamma[4096];
1040 } D3DKMDT_COLORSPACE_TRANSFORM_MATRIX_V2, *PD3DKMDT_COLORSPACE_TRANSFORM_MATRIX_V2;
1041 
1042 typedef enum _D3DDDI_HDR_METADATA_TYPE
1043 {
1044     D3DDDI_HDR_METADATA_TYPE_NONE               = 0,
1045     D3DDDI_HDR_METADATA_TYPE_HDR10              = 1,
1046     D3DDDI_HDR_METADATA_TYPE_HDR10PLUS         = 2,
1047 } D3DDDI_HDR_METADATA_TYPE;
1048 
1049 typedef struct _D3DDDI_HDR_METADATA_HDR10
1050 {
1051     // Color gamut
1052     UINT16 RedPrimary[2];
1053     UINT16 GreenPrimary[2];
1054     UINT16 BluePrimary[2];
1055     UINT16 WhitePoint[2];
1056 
1057     // Luminance
1058     UINT   MaxMasteringLuminance;
1059     UINT   MinMasteringLuminance;
1060     UINT16 MaxContentLightLevel;
1061     UINT16 MaxFrameAverageLightLevel;
1062 } D3DDDI_HDR_METADATA_HDR10;
1063 
1064 typedef struct D3DDDI_HDR_METADATA_HDR10PLUS
1065 {
1066     BYTE Data[72];
1067 } D3DDDI_HDR_METADATA_HDR10PLUS;
1068 
1069 // Used as a value for D3DDDI_VIDEO_PRESENT_SOURCE_ID and D3DDDI_VIDEO_PRESENT_TARGET_ID types to specify
1070 // that the respective video present source/target ID hasn't been initialized.
1071 #define D3DDDI_ID_UNINITIALIZED (UINT)(~0)
1072 
1073 // TODO:[mmilirud] Define this as (UINT)(~1) to avoid collision with valid source ID equal to 0.
1074 //
1075 // Used as a value for D3DDDI_VIDEO_PRESENT_SOURCE_ID and D3DDDI_VIDEO_PRESENT_TARGET_ID types to specify
1076 // that the respective video present source/target ID isn't applicable for the given execution context.
1077 #define D3DDDI_ID_NOTAPPLICABLE (UINT)(0)
1078 
1079 // Indicates that a resource can be associated with "any" VidPn source, even none at all.
1080 #define D3DDDI_ID_ANY (UINT)(~1)
1081 
1082 // Used as a value for D3DDDI_VIDEO_PRESENT_SOURCE_ID and D3DDDI_VIDEO_PRESENT_TARGET_ID types to specify
1083 // that the respective video present source/target ID describes every VidPN source/target in question.
1084 #define D3DDDI_ID_ALL (UINT)(~2)
1085 
1086 //
1087 // Hardcoded VidPnSource count
1088 //
1089 #define D3DKMDT_MAX_VIDPN_SOURCES_BITCOUNT      4
1090 #define D3DKMDT_MAX_VIDPN_SOURCES               (1 << D3DKMDT_MAX_VIDPN_SOURCES_BITCOUNT)
1091 
1092 
1093 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
1094 // Purpose: Multi-sampling method descriptor type.
1095 //
1096 // Remarks: Driver is free to partition its quality levels for a given multi-sampling method into as many
1097 //          increments as it likes, with the condition that each incremental step does noticably improve
1098 //          quality of the presented image.
1099 //
1100 typedef struct _D3DDDI_MULTISAMPLINGMETHOD
1101 {
1102     // Number of sub-pixels employed in this multi-sampling method (e.g. 2 for 2x and 8 for 8x multi-sampling)
1103     UINT  NumSamples;
1104 
1105     // Upper bound on the quality range supported for this multi-sampling method. The range starts from 0
1106     // and goes upto and including the reported maximum quality setting.
1107     UINT  NumQualityLevels;
1108 }
1109 D3DDDI_MULTISAMPLINGMETHOD;
1110 
1111 
1112 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
1113 // Purpose: Video signal scan line ordering descriptor type.
1114 //
1115 // Remarks: Scan-line ordering of the video mode, specifies whether each field contains the entire
1116 //          content of a frame, or only half of it (i.e. even/odd lines interchangeably).
1117 //          Note that while for standard interlaced modes, what field comes first can be inferred
1118 //          from the mode, specifying this characteristic explicitly with an enum both frees up the
1119 //          client from having to maintain mode-based look-up tables and is extensible for future
1120 //          standard modes not listed in the D3DKMDT_VIDEO_SIGNAL_STANDARD enum.
1121 //
1122 typedef enum _D3DDDI_VIDEO_SIGNAL_SCANLINE_ORDERING
1123 {
1124     D3DDDI_VSSLO_UNINITIALIZED              = 0,
1125     D3DDDI_VSSLO_PROGRESSIVE                = 1,
1126     D3DDDI_VSSLO_INTERLACED_UPPERFIELDFIRST = 2,
1127     D3DDDI_VSSLO_INTERLACED_LOWERFIELDFIRST = 3,
1128     D3DDDI_VSSLO_OTHER                      = 255
1129 }
1130 D3DDDI_VIDEO_SIGNAL_SCANLINE_ORDERING;
1131 
1132 
1133 typedef enum D3DDDI_FLIPINTERVAL_TYPE
1134 {
1135     D3DDDI_FLIPINTERVAL_IMMEDIATE = 0,
1136     D3DDDI_FLIPINTERVAL_ONE       = 1,
1137     D3DDDI_FLIPINTERVAL_TWO       = 2,
1138     D3DDDI_FLIPINTERVAL_THREE     = 3,
1139     D3DDDI_FLIPINTERVAL_FOUR      = 4,
1140 
1141     // This value is only valid for the D3D9 runtime PresentCb SyncIntervalOverride field.
1142     // For this field, IMMEDIATE means the API semantic of sync interval 0, where
1143     // IMMEDIATE_ALLOW_TEARING is equivalent to the addition of the DXGI ALLOW_TEARING API flags.
1144     D3DDDI_FLIPINTERVAL_IMMEDIATE_ALLOW_TEARING = 5,
1145 } D3DDDI_FLIPINTERVAL_TYPE;
1146 
1147 
1148 typedef enum _D3DDDI_POOL
1149 {
1150      D3DDDIPOOL_SYSTEMMEM      = 1,
1151      D3DDDIPOOL_VIDEOMEMORY    = 2,
1152      D3DDDIPOOL_LOCALVIDMEM    = 3,
1153      D3DDDIPOOL_NONLOCALVIDMEM = 4,
1154 #if (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM1_3) // M1
1155      D3DDDIPOOL_STAGINGMEM     = 5,
1156 #endif
1157 } D3DDDI_POOL;
1158 
1159 
1160 typedef enum _D3DDDIMULTISAMPLE_TYPE
1161 {
1162     D3DDDIMULTISAMPLE_NONE         =  0,
1163     D3DDDIMULTISAMPLE_NONMASKABLE  =  1,
1164     D3DDDIMULTISAMPLE_2_SAMPLES    =  2,
1165     D3DDDIMULTISAMPLE_3_SAMPLES    =  3,
1166     D3DDDIMULTISAMPLE_4_SAMPLES    =  4,
1167     D3DDDIMULTISAMPLE_5_SAMPLES    =  5,
1168     D3DDDIMULTISAMPLE_6_SAMPLES    =  6,
1169     D3DDDIMULTISAMPLE_7_SAMPLES    =  7,
1170     D3DDDIMULTISAMPLE_8_SAMPLES    =  8,
1171     D3DDDIMULTISAMPLE_9_SAMPLES    =  9,
1172     D3DDDIMULTISAMPLE_10_SAMPLES   = 10,
1173     D3DDDIMULTISAMPLE_11_SAMPLES   = 11,
1174     D3DDDIMULTISAMPLE_12_SAMPLES   = 12,
1175     D3DDDIMULTISAMPLE_13_SAMPLES   = 13,
1176     D3DDDIMULTISAMPLE_14_SAMPLES   = 14,
1177     D3DDDIMULTISAMPLE_15_SAMPLES   = 15,
1178     D3DDDIMULTISAMPLE_16_SAMPLES   = 16,
1179 
1180     D3DDDIMULTISAMPLE_FORCE_UINT   = 0x7fffffff
1181 } D3DDDIMULTISAMPLE_TYPE;
1182 
1183 typedef struct _D3DDDI_RESOURCEFLAGS
1184 {
1185     union
1186     {
1187         struct
1188         {
1189             UINT    RenderTarget            : 1;    // 0x00000001
1190             UINT    ZBuffer                 : 1;    // 0x00000002
1191             UINT    Dynamic                 : 1;    // 0x00000004
1192             UINT    HintStatic              : 1;    // 0x00000008
1193             UINT    AutogenMipmap           : 1;    // 0x00000010
1194             UINT    DMap                    : 1;    // 0x00000020
1195             UINT    WriteOnly               : 1;    // 0x00000040
1196             UINT    NotLockable             : 1;    // 0x00000080
1197             UINT    Points                  : 1;    // 0x00000100
1198             UINT    RtPatches               : 1;    // 0x00000200
1199             UINT    NPatches                : 1;    // 0x00000400
1200             UINT    SharedResource          : 1;    // 0x00000800
1201             UINT    DiscardRenderTarget     : 1;    // 0x00001000
1202             UINT    Video                   : 1;    // 0x00002000
1203             UINT    CaptureBuffer           : 1;    // 0x00004000
1204             UINT    Primary                 : 1;    // 0x00008000
1205             UINT    Texture                 : 1;    // 0x00010000
1206             UINT    CubeMap                 : 1;    // 0x00020000
1207             UINT    Volume                  : 1;    // 0x00040000
1208             UINT    VertexBuffer            : 1;    // 0x00080000
1209             UINT    IndexBuffer             : 1;    // 0x00100000
1210             UINT    DecodeRenderTarget      : 1;    // 0x00200000
1211             UINT    DecodeCompressedBuffer  : 1;    // 0x00400000
1212             UINT    VideoProcessRenderTarget: 1;    // 0x00800000
1213             UINT    CpuOptimized            : 1;    // 0x01000000
1214             UINT    MightDrawFromLocked     : 1;    // 0x02000000
1215             UINT    Overlay                 : 1;    // 0x04000000
1216             UINT    MatchGdiPrimary         : 1;    // 0x08000000
1217             UINT    InterlacedRefresh       : 1;    // 0x10000000
1218             UINT    TextApi                 : 1;    // 0x20000000
1219             UINT    RestrictedContent       : 1;    // 0x40000000
1220             UINT    RestrictSharedAccess    : 1;    // 0x80000000
1221         };
1222         UINT        Value;
1223     };
1224 } D3DDDI_RESOURCEFLAGS;
1225 
1226 typedef struct _D3DDDI_SURFACEINFO
1227 {
1228     UINT                Width;              // in: For linear, surface and volume
1229     UINT                Height;             // in: For surface and volume
1230     UINT                Depth;              // in: For volume
1231     CONST VOID*         pSysMem;
1232     UINT                SysMemPitch;
1233     UINT                SysMemSlicePitch;
1234 } D3DDDI_SURFACEINFO;
1235 
1236 typedef enum _D3DDDI_ROTATION
1237 {
1238     D3DDDI_ROTATION_IDENTITY        = 1,    // No rotation.
1239     D3DDDI_ROTATION_90              = 2,    // Rotated 90 degrees.
1240     D3DDDI_ROTATION_180             = 3,    // Rotated 180 degrees.
1241     D3DDDI_ROTATION_270             = 4     // Rotated 270 degrees.
1242 } D3DDDI_ROTATION;
1243 
1244 typedef enum D3DDDI_SCANLINEORDERING
1245 {
1246     D3DDDI_SCANLINEORDERING_UNKNOWN                    = 0,
1247     D3DDDI_SCANLINEORDERING_PROGRESSIVE                = 1,
1248     D3DDDI_SCANLINEORDERING_INTERLACED                 = 2,
1249 } D3DDDI_SCANLINEORDERING;
1250 
1251 typedef struct _D3DDDIARG_CREATERESOURCE
1252 {
1253     D3DDDIFORMAT                    Format;
1254     D3DDDI_POOL                     Pool;
1255     D3DDDIMULTISAMPLE_TYPE          MultisampleType;
1256     UINT                            MultisampleQuality;
1257     CONST D3DDDI_SURFACEINFO*       pSurfList;          // in: List of sub resource objects to create
1258     UINT                            SurfCount;          // in: Number of sub resource objects
1259     UINT                            MipLevels;
1260     UINT                            Fvf;                // in: FVF format for vertex buffers
1261     D3DDDI_VIDEO_PRESENT_SOURCE_ID  VidPnSourceId;      // in: VidPnSourceId on which the primary surface is created
1262     D3DDDI_RATIONAL                 RefreshRate;        // in: RefreshRate that this primary surface is to be used with
1263     HANDLE                          hResource;          // in/out: D3D runtime handle/UM driver handle
1264     D3DDDI_RESOURCEFLAGS            Flags;
1265     D3DDDI_ROTATION                 Rotation;           // in: The orientation of the resource. (0, 90, 180, 270)
1266 } D3DDDIARG_CREATERESOURCE;
1267 
1268 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN8) || \
1269      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WIN8))
1270 
1271 typedef struct _D3DDDI_RESOURCEFLAGS2
1272 {
1273     union
1274     {
1275         struct
1276         {
1277             UINT    VideoEncoder            : 1;    // 0x00000001
1278             UINT    UserMemory              : 1;    // 0x00000002
1279 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM1_3) || \
1280      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM1_3)) // M1
1281             UINT    CrossAdapter            : 1;    // 0x00000004
1282 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0) || \
1283         (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_0))
1284             UINT    IsDisplayable           : 1;    // 0x00000008
1285             UINT    Reserved                : 28;
1286 #else
1287             UINT    Reserved                : 29;
1288 #endif
1289 #else
1290             UINT    Reserved                : 30;
1291 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM1_3)
1292          };
1293         UINT        Value;
1294     };
1295 } D3DDDI_RESOURCEFLAGS2;
1296 
1297 
1298 typedef struct _D3DDDIARG_CREATERESOURCE2
1299 {
1300     D3DDDIFORMAT                    Format;
1301     D3DDDI_POOL                     Pool;
1302     D3DDDIMULTISAMPLE_TYPE          MultisampleType;
1303     UINT                            MultisampleQuality;
1304     CONST D3DDDI_SURFACEINFO*       pSurfList;          // in: List of sub resource objects to create
1305     UINT                            SurfCount;          // in: Number of sub resource objects
1306     UINT                            MipLevels;
1307     UINT                            Fvf;                // in: FVF format for vertex buffers
1308     D3DDDI_VIDEO_PRESENT_SOURCE_ID  VidPnSourceId;      // in: VidPnSourceId on which the primary surface is created
1309     D3DDDI_RATIONAL                 RefreshRate;        // in: RefreshRate that this primary surface is to be used with
1310     HANDLE                          hResource;          // in/out: D3D runtime handle/UM driver handle
1311     D3DDDI_RESOURCEFLAGS            Flags;
1312     D3DDDI_ROTATION                 Rotation;           // in: The orientation of the resource. (0, 90, 180, 270)
1313     D3DDDI_RESOURCEFLAGS2           Flags2;
1314 } D3DDDIARG_CREATERESOURCE2;
1315 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN8)
1316 
1317 typedef struct _D3DDDICB_SIGNALFLAGS
1318 {
1319     union
1320     {
1321         struct
1322         {
1323             UINT SignalAtSubmission : 1;
1324 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN8)
1325             UINT EnqueueCpuEvent    : 1;
1326 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0)
1327             UINT AllowFenceRewind   : 1;
1328             UINT Reserved           : 28;
1329             UINT DXGK_SIGNAL_FLAG_INTERNAL0 : 1;
1330 #else
1331             UINT Reserved           : 30;
1332 #endif
1333 #else
1334             UINT Reserved           : 31;
1335 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN8)
1336         };
1337         UINT Value;
1338     };
1339 } D3DDDICB_SIGNALFLAGS;
1340 
1341 #define D3DDDI_MAX_OBJECT_WAITED_ON 32
1342 #define D3DDDI_MAX_OBJECT_SIGNALED  32
1343 
1344 typedef enum _D3DDDI_SYNCHRONIZATIONOBJECT_TYPE
1345 {
1346     D3DDDI_SYNCHRONIZATION_MUTEX    = 1,
1347     D3DDDI_SEMAPHORE                = 2,
1348     D3DDDI_FENCE                    = 3,
1349     D3DDDI_CPU_NOTIFICATION         = 4,
1350 
1351 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0) || \
1352      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_0))
1353     D3DDDI_MONITORED_FENCE          = 5,
1354 #endif // DXGKDDI_INTERFACE_VERSION
1355 
1356 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_2) || \
1357      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_2))
1358     D3DDDI_PERIODIC_MONITORED_FENCE = 6,
1359 #endif // DXGKDDI_INTERFACE_VERSION
1360 
1361     D3DDDI_SYNCHRONIZATION_TYPE_LIMIT
1362 
1363 } D3DDDI_SYNCHRONIZATIONOBJECT_TYPE;
1364 
1365 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0) || \
1366      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_0))
1367 
1368 #define D3DDDI_SYNC_OBJECT_WAIT    0x1
1369 #define D3DDDI_SYNC_OBJECT_SIGNAL  0x2
1370 #define D3DDDI_SYNC_OBJECT_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | D3DDDI_SYNC_OBJECT_WAIT | D3DDDI_SYNC_OBJECT_SIGNAL)
1371 
1372 #endif // DXGKDDI_INTERFACE_VERSION
1373 
1374 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM1_3)
1375 
1376 typedef union
1377 {
1378     struct
1379     {
1380         UINT64 FrameNumber : 40;
1381         UINT64 PartNumber  : 24;
1382     };
1383     UINT64 Value;
1384 }DXGK_MIRACAST_CHUNK_ID;
1385 
1386 typedef enum _DXGK_MIRACAST_CHUNK_TYPE
1387 {
1388     DXGK_MIRACAST_CHUNK_TYPE_UNKNOWN = 0,
1389     DXGK_MIRACAST_CHUNK_TYPE_COLOR_CONVERT_COMPLETE = 1,
1390     DXGK_MIRACAST_CHUNK_TYPE_ENCODE_COMPLETE = 2,
1391     DXGK_MIRACAST_CHUNK_TYPE_FRAME_START = 3,
1392     DXGK_MIRACAST_CHUNK_TYPE_FRAME_DROPPED = 4,
1393     DXGK_MIRACAST_CHUNK_TYPE_ENCODE_DRIVER_DEFINED_1 = 0x80000000,
1394     DXGK_MIRACAST_CHUNK_TYPE_ENCODE_DRIVER_DEFINED_2 = 0x80000001,
1395 } DXGK_MIRACAST_CHUNK_TYPE;
1396 
1397 typedef struct
1398 {
1399     DXGK_MIRACAST_CHUNK_TYPE ChunkType; // Type of chunk info
1400     DXGK_MIRACAST_CHUNK_ID ChunkId;     // Identifier for this chunk
1401     UINT  ProcessingTime;               // Time the process took to complete in microsecond
1402     UINT  EncodeRate;                   // Encode bitrate driver reported for the chunk, kilobits per second
1403 } DXGK_MIRACAST_CHUNK_INFO;
1404 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM1_3)
1405 
1406 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0) || \
1407      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_0))
1408 
1409 typedef enum D3DDDI_PAGINGQUEUE_PRIORITY
1410 {
1411     D3DDDI_PAGINGQUEUE_PRIORITY_BELOW_NORMAL = -1,
1412     D3DDDI_PAGINGQUEUE_PRIORITY_NORMAL = 0,
1413     D3DDDI_PAGINGQUEUE_PRIORITY_ABOVE_NORMAL = 1,
1414 } D3DDDI_PAGINGQUEUE_PRIORITY;
1415 
1416 typedef struct D3DDDI_MAKERESIDENT_FLAGS
1417 {
1418     union
1419     {
1420         struct
1421         {
1422             UINT CantTrimFurther    : 1;    // When set, MakeResidentCb will succeed even if the request puts the application over the current budget.
1423                                             // MakeResidentCb will still fail if the request puts the application over the maximum budget.
1424             UINT MustSucceed        : 1;    // When set, instructs MakeResidentCb to put the device in error if the resource cannot be made resident.
1425             UINT Reserved           : 30;
1426         };
1427         UINT Value;
1428     };
1429 } D3DDDI_MAKERESIDENT_FLAGS;
1430 
1431 typedef struct D3DDDI_MAKERESIDENT
1432 {
1433     D3DKMT_HANDLE               hPagingQueue;       // [in] Handle to the paging queue used to synchronize paging operations for this call.
1434     UINT                        NumAllocations;     // [in/out] On input, the number of allocation handles om the AllocationList array. On output,
1435                                                     //          the number of allocations successfully made resident.
1436     D3DKMT_PTR(_Field_size_(NumAllocations)
1437     CONST D3DKMT_HANDLE*,       AllocationList);    // [in] An array of NumAllocations allocation handles
1438     D3DKMT_PTR(CONST UINT*,     PriorityList);      // [in] Residency priority array for each of the allocations in the resource or allocation list
1439     D3DDDI_MAKERESIDENT_FLAGS   Flags;              // [in] Residency flags
1440     D3DKMT_ALIGN64 UINT64       PagingFenceValue;   // [out] Paging fence value to synchronize on before submitting the command
1441                                                     //      that uses above resources to the GPU. This value applies to the monitored fence
1442                                                     //      synchronization object associated with hPagingQueue.
1443     D3DKMT_ALIGN64 UINT64       NumBytesToTrim;     // [out] When MakeResident fails due to being over budget, this value
1444                                                     //      indicates how much to trim in order for the call to succeed on a retry.
1445 } D3DDDI_MAKERESIDENT;
1446 
1447 typedef struct D3DDDI_EVICT_FLAGS
1448 {
1449     union
1450     {
1451         struct
1452         {
1453             UINT EvictOnlyIfNecessary   : 1;
1454             UINT NotWrittenTo           : 1;
1455             UINT Reserved               : 30;
1456         };
1457         UINT Value;
1458     };
1459 } D3DDDI_EVICT_FLAGS;
1460 
1461 typedef struct D3DDDI_TRIMRESIDENCYSET_FLAGS
1462 {
1463     union
1464     {
1465         struct
1466         {
1467             UINT PeriodicTrim           : 1;    // When PeriodicTrim flag is set, the driver is required to performed the following operations:
1468                                                 // a) trim all allocations that were not referenced since the previous periodic trim request
1469                                                 // by comparing the allocation last referenced fence with the last periodic trim context fence
1470                                                 // b) Refresh the last periodic trim context fence with the last completed context fence.
1471             UINT RestartPeriodicTrim    : 1;    // May not be set together with PeriodicTrim flag.
1472                                                 // Reset the last periodic trim context fence to the last completed context fence.
1473             UINT TrimToBudget           : 1;    // Indicates that the application usage is over the memory budget,
1474                                                 // and NumBytesToTrim bytes should be trimmed to fit in the new memory budget.
1475             UINT Reserved               : 29;
1476         };
1477         UINT Value;
1478     };
1479 } D3DDDI_TRIMRESIDENCYSET_FLAGS;
1480 
1481 typedef struct _D3DDDIGPUVIRTUALADDRESS_PROTECTION_TYPE
1482 {
1483     union
1484     {
1485         struct
1486         {
1487             UINT64 Write            : 1;
1488             UINT64 Execute          : 1;
1489             UINT64 Zero             : 1;
1490             UINT64 NoAccess         : 1;
1491             UINT64 SystemUseOnly    : 1;    // Should not be set by the UMD
1492             UINT64 Reserved         : 59;
1493         };
1494         D3DKMT_ALIGN64 UINT64 Value;
1495     };
1496 } D3DDDIGPUVIRTUALADDRESS_PROTECTION_TYPE;
1497 
1498 typedef enum _D3DDDI_UPDATEGPUVIRTUALADDRESS_OPERATION_TYPE
1499 {
1500    D3DDDI_UPDATEGPUVIRTUALADDRESS_MAP               = 0,
1501    D3DDDI_UPDATEGPUVIRTUALADDRESS_UNMAP             = 1,
1502    D3DDDI_UPDATEGPUVIRTUALADDRESS_COPY              = 2,
1503    D3DDDI_UPDATEGPUVIRTUALADDRESS_MAP_PROTECT       = 3,
1504 } D3DDDI_UPDATEGPUVIRTUALADDRESS_OPERATION_TYPE;
1505 
1506 typedef struct _D3DDDI_UPDATEGPUVIRTUALADDRESS_OPERATION
1507 {
1508     D3DDDI_UPDATEGPUVIRTUALADDRESS_OPERATION_TYPE OperationType;
1509     union
1510     {
1511         struct
1512         {
1513             D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS  BaseAddress;
1514             D3DKMT_ALIGN64 D3DGPU_SIZE_T           SizeInBytes;
1515             D3DKMT_HANDLE                          hAllocation;
1516             D3DKMT_ALIGN64 D3DGPU_SIZE_T           AllocationOffsetInBytes;
1517             D3DKMT_ALIGN64 D3DGPU_SIZE_T           AllocationSizeInBytes;
1518         } Map;
1519         struct
1520         {
1521             D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS  BaseAddress;
1522             D3DKMT_ALIGN64 D3DGPU_SIZE_T           SizeInBytes;
1523             D3DKMT_HANDLE                          hAllocation;
1524             D3DKMT_ALIGN64 D3DGPU_SIZE_T           AllocationOffsetInBytes;
1525             D3DKMT_ALIGN64 D3DGPU_SIZE_T           AllocationSizeInBytes;
1526             D3DDDIGPUVIRTUALADDRESS_PROTECTION_TYPE Protection;
1527             D3DKMT_ALIGN64 UINT64                  DriverProtection;
1528         } MapProtect;
1529         struct
1530         {
1531             D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS  BaseAddress;
1532             D3DKMT_ALIGN64 D3DGPU_SIZE_T           SizeInBytes;
1533             D3DDDIGPUVIRTUALADDRESS_PROTECTION_TYPE Protection;
1534         } Unmap;    // Used for UNMAP_NOACCESS as well
1535         struct
1536         {
1537             D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS  SourceAddress;
1538             D3DKMT_ALIGN64 D3DGPU_SIZE_T           SizeInBytes;
1539             D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS  DestAddress;
1540         } Copy;
1541     };
1542 } D3DDDI_UPDATEGPUVIRTUALADDRESS_OPERATION;
1543 
1544 typedef enum _D3DDDIGPUVIRTUALADDRESS_RESERVATION_TYPE
1545 {
1546     D3DDDIGPUVIRTUALADDRESS_RESERVE_NO_ACCESS  = 0,
1547     D3DDDIGPUVIRTUALADDRESS_RESERVE_ZERO       = 1,
1548     D3DDDIGPUVIRTUALADDRESS_RESERVE_NO_COMMIT  = 2      // Reserved for system use
1549 } D3DDDIGPUVIRTUALADDRESS_RESERVATION_TYPE;
1550 
1551 typedef struct D3DDDI_MAPGPUVIRTUALADDRESS
1552 {
1553     D3DKMT_HANDLE                   hPagingQueue;                   // in: Paging queue to synchronize the operation on.
1554     D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS BaseAddress;              // in_opt: Base virtual address to map
1555     D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS MinimumAddress;           // in_opt: Minimum virtual address
1556     D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS MaximumAddress;           // in_opt: Maximum virtual address
1557     D3DKMT_HANDLE                   hAllocation;                    // in: Allocation handle to map
1558     D3DKMT_ALIGN64 D3DGPU_SIZE_T    OffsetInPages;                  // in: Offset in 4 KB pages from the start of the allocation
1559     D3DKMT_ALIGN64 D3DGPU_SIZE_T    SizeInPages;                    // in: Size in 4 KB pages to map
1560     D3DDDIGPUVIRTUALADDRESS_PROTECTION_TYPE    Protection;          // in: Virtual address protection
1561     D3DKMT_ALIGN64 UINT64           DriverProtection;               // in: Driver specific protection
1562     UINT                            Reserved0;                      // in:
1563     D3DKMT_ALIGN64 UINT64           Reserved1;                      // in:
1564     D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS VirtualAddress;           // out: Virtual address
1565     D3DKMT_ALIGN64 UINT64           PagingFenceValue;               // out: Paging fence Id for synchronization
1566 } D3DDDI_MAPGPUVIRTUALADDRESS;
1567 
1568 typedef struct D3DDDI_RESERVEGPUVIRTUALADDRESS
1569 {
1570     union
1571     {
1572         D3DKMT_HANDLE               hPagingQueue;                   // in: Paging queue to synchronize the operation on.
1573         D3DKMT_HANDLE               hAdapter;                       // in: DXG adapter handle. (M2)
1574     };
1575     D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS          BaseAddress;     // in_opt: Base virtual address to map
1576     D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS          MinimumAddress;  // in_opt: Minimum virtual address
1577     D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS          MaximumAddress;  // in_opt: Maximum virtual address
1578     D3DKMT_ALIGN64 D3DGPU_SIZE_T                   Size;            // in: Size to reserve in bytes
1579     union
1580     {
1581         D3DDDIGPUVIRTUALADDRESS_RESERVATION_TYPE   ReservationType; // in: Reservation type
1582         UINT                        Reserved0;                      // M2
1583     };
1584     union
1585     {
1586         D3DKMT_ALIGN64 UINT64                      DriverProtection;// in: Driver specific protection
1587         D3DKMT_ALIGN64 UINT64                      Reserved1;       // M2
1588     };
1589     D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS          VirtualAddress;  // out: Virtual address
1590     union
1591     {
1592         D3DKMT_ALIGN64 UINT64                      PagingFenceValue;// out: Paging fence Id for synchronization
1593         D3DKMT_ALIGN64 UINT64                      Reserved2;       // M2
1594     };
1595 } D3DDDI_RESERVEGPUVIRTUALADDRESS;
1596 
1597 typedef struct _D3DDDI_GETRESOURCEPRESENTPRIVATEDRIVERDATA
1598 {
1599     D3DKMT_HANDLE    hResource;
1600     UINT             PrivateDriverDataSize;
1601     D3DKMT_PTR(PVOID, pPrivateDriverData);
1602 } D3DDDI_GETRESOURCEPRESENTPRIVATEDRIVERDATA;
1603 
1604 typedef struct D3DDDI_DESTROYPAGINGQUEUE
1605 {
1606     D3DKMT_HANDLE           hPagingQueue;   // in: handle to the paging queue to destroy
1607 } D3DDDI_DESTROYPAGINGQUEUE;
1608 
1609 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0)
1610 
1611 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_1) || \
1612      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_1_1))
1613 
1614 typedef struct D3DDDI_UPDATEALLOCPROPERTY_FLAGS
1615 {
1616     union
1617     {
1618         struct
1619         {
1620             UINT AccessedPhysically :  1; // The new value for AccessedPhysically on an allocation
1621             UINT Unmoveable         :  1; // Indicates an allocation cannot be moved while pinned in a memory segment
1622             UINT Reserved           : 30;
1623         };
1624         UINT Value;
1625     };
1626 } D3DDDI_UPDATEALLOCPROPERTY_FLAGS;
1627 
1628 typedef struct D3DDDI_UPDATEALLOCPROPERTY
1629 {
1630     D3DKMT_HANDLE                       hPagingQueue;           // [in] Handle to the paging queue used to synchronize paging operations for this call.
1631     D3DKMT_HANDLE                       hAllocation;            // [in] Handle to the allocation to be updated.
1632     UINT                                SupportedSegmentSet;    // [in] New supported segment set, ignored if the same.
1633     D3DDDI_SEGMENTPREFERENCE            PreferredSegment;       // [in] New preferred segment set, ignored if the same.
1634     D3DDDI_UPDATEALLOCPROPERTY_FLAGS    Flags;                  // [in] Flags to set on the allocation, ignored if the same.
1635     D3DKMT_ALIGN64 UINT64               PagingFenceValue;       // [out] Paging fence value to synchronize on before using the above allocation.
1636                                                                 //       This value applies to the monitored fence synchronization
1637                                                                 //       object associated with hPagingQueue.
1638     union
1639     {
1640         struct
1641         {
1642             UINT SetAccessedPhysically  :  1; // [in] When set to 1, will set AccessedPhysically to new value
1643             UINT SetSupportedSegmentSet :  1; // [in] When set to 1, will set SupportedSegmentSet to new value
1644             UINT SetPreferredSegment    :  1; // [in] When set to 1, will set PreferredSegment to new value
1645             UINT SetUnmoveable          :  1; // [in] When set to 1, will set Unmoveable to new value
1646             UINT Reserved               : 28;
1647         };
1648         UINT PropertyMaskValue;
1649     };
1650 } D3DDDI_UPDATEALLOCPROPERTY;
1651 
1652 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_1)
1653 
1654 #if(D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_1_1)
1655 
1656 typedef struct D3DDDI_OFFER_FLAGS
1657 {
1658     union
1659     {
1660         struct
1661         {
1662             UINT AllowDecommit :  1;
1663             UINT Reserved      : 31;
1664         };
1665         UINT Value;
1666     };
1667 } D3DDDI_OFFER_FLAGS;
1668 
1669 #endif // (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_1_1)
1670 
1671 #if(DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_1 || \
1672     D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_1)
1673 
1674 typedef enum _D3DDDI_RECLAIM_RESULT
1675 {
1676     D3DDDI_RECLAIM_RESULT_OK = 0,
1677     D3DDDI_RECLAIM_RESULT_DISCARDED = 1,
1678     D3DDDI_RECLAIM_RESULT_NOT_COMMITTED = 2,
1679 } D3DDDI_RECLAIM_RESULT;
1680 
1681 #endif
1682 
1683 typedef struct _D3DDDI_SYNCHRONIZATIONOBJECTINFO
1684 {
1685     D3DDDI_SYNCHRONIZATIONOBJECT_TYPE    Type;      // in: Type of synchronization object to create.
1686     union
1687     {
1688         struct
1689         {
1690             BOOL InitialState;                      // in: Initial state of a synchronization mutex.
1691         } SynchronizationMutex;
1692 
1693         struct
1694         {
1695             UINT MaxCount;                          // in: Max count of the semaphore.
1696             UINT InitialCount;                      // in: Initial count of the semaphore.
1697         } Semaphore;
1698 
1699 
1700         struct
1701         {
1702             UINT Reserved[16];                      // Reserved for future use.
1703         } Reserved;
1704     };
1705 } D3DDDI_SYNCHRONIZATIONOBJECTINFO;
1706 
1707 #ifndef D3DDDI_SYNCHRONIZATIONOBJECT_FLAGS_EXT
1708 #define D3DDDI_SYNCHRONIZATIONOBJECT_FLAGS_EXT
1709 #define D3DDDI_SYNCHRONIZATIONOBJECT_FLAGS_RESERVED0        Reserved0
1710 #endif
1711 
1712 typedef struct _D3DDDI_SYNCHRONIZATIONOBJECT_FLAGS
1713 {
1714     union
1715     {
1716         struct
1717         {
1718             UINT Shared                                         :  1;
1719             UINT NtSecuritySharing                              :  1;
1720 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM1_3) || \
1721      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM1_3)) // M1
1722 
1723             UINT CrossAdapter                                   :  1;
1724 
1725 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0) || \
1726      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_0))
1727 
1728             // When set, the sync object is signaled as soon as the contents of command buffers preceding it
1729             // is entirely copied to the GPU pipeline, but not necessarily completed execution.
1730             // This flag can be set in order to start reusing command buffers as soon as possible.
1731             UINT TopOfPipeline                                  :  1;
1732 
1733             // When set, the device this sync object is created or opened on
1734             // can only submit wait commands for it.
1735             UINT NoSignal                                       :  1;
1736 
1737             // When set, the device this sync object is created or opened on
1738             // can only submit signal commands for it. This flag cannot be set
1739             // simultaneously with NoSignal.
1740             UINT NoWait                                         :  1;
1741 
1742             // When set, instructs the GPU scheduler to bypass signaling of the monitored fence
1743             // to the maximum value when the device is affected by the GPU reset.
1744             UINT NoSignalMaxValueOnTdr                          :  1;
1745 
1746             // When set, the fence will not be mapped into the GPU virtual address space.
1747             // Only packet-based signal/wait operations are supported
1748             // When this is set, the fence is always stored as a 64-bit value (regardless of adapter caps)
1749             UINT NoGPUAccess                                    :  1;
1750 
1751 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM3_0)
1752             // When set, the fence can be signaled by KMD.
1753             // The flag can be used only with D3DDDI_CPU_NOTIFICATION objects.
1754             UINT SignalByKmd                                    :  1;
1755             UINT Reserved                                       : 22;
1756 #else
1757             UINT Reserved                                       : 23;
1758 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM3_0)
1759 
1760 #else
1761             UINT Reserved                                       : 28;
1762 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0)
1763 
1764 #else
1765             UINT Reserved                                       : 29;
1766 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM1_3)
1767             UINT D3DDDI_SYNCHRONIZATIONOBJECT_FLAGS_RESERVED0   :  1;
1768         };
1769         UINT Value;
1770     };
1771 } D3DDDI_SYNCHRONIZATIONOBJECT_FLAGS;
1772 
1773 typedef struct _D3DDDI_SYNCHRONIZATIONOBJECTINFO2
1774 {
1775     D3DDDI_SYNCHRONIZATIONOBJECT_TYPE    Type;      // in: Type of synchronization object to create.
1776     D3DDDI_SYNCHRONIZATIONOBJECT_FLAGS   Flags;     // in: flags.
1777     union
1778     {
1779         struct
1780         {
1781             BOOL InitialState;                      // in: Initial state of a synchronization mutex.
1782         } SynchronizationMutex;
1783 
1784         struct
1785         {
1786             UINT MaxCount;                          // in: Max count of the semaphore.
1787             UINT InitialCount;                      // in: Initial count of the semaphore.
1788         } Semaphore;
1789 
1790         struct
1791         {
1792             D3DKMT_ALIGN64 UINT64 FenceValue;       // in: inital fence value.
1793         } Fence;
1794 
1795         struct
1796         {
1797             D3DKMT_PTR(HANDLE, Event);                           // in: Handle to the event
1798         } CPUNotification;
1799 
1800 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0) || \
1801      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_0))
1802         struct
1803         {
1804             D3DKMT_ALIGN64 UINT64   InitialFenceValue;                      // in: inital fence value.
1805             D3DKMT_PTR(VOID*,       FenceValueCPUVirtualAddress);           // out: Read-only mapping of the fence value for the CPU
1806             D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS FenceValueGPUVirtualAddress; // out: Read/write mapping of the fence value for the GPU
1807             UINT                    EngineAffinity;                         // in: Defines physical adapters where the GPU VA will be mapped
1808             UINT                    Padding;
1809         } MonitoredFence;
1810 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0)
1811 
1812 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_2) || \
1813      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_2))
1814         struct
1815         {
1816             D3DKMT_HANDLE                   hAdapter;                               // in: A handle to the adapter associated with VidPnTargetId
1817             D3DDDI_VIDEO_PRESENT_TARGET_ID  VidPnTargetId;                          // in: The output that the compositor wishes to receive notifications for
1818             D3DKMT_ALIGN64 UINT64           Time;                                   // in: Represents an offset before the VSync.
1819                                                                                     // The Time value may not be longer than a VSync interval. In units of 100ns.
1820             D3DKMT_PTR(VOID*,               FenceValueCPUVirtualAddress);           // out: Read-only mapping of the fence value for the CPU
1821             D3DKMT_ALIGN64 D3DGPU_VIRTUAL_ADDRESS FenceValueGPUVirtualAddress;      // out: Read-only mapping of the fence value for the GPU
1822             UINT                            EngineAffinity;                         // in: Defines physical adapters where the GPU VA will be mapped
1823             UINT                            Padding;
1824         } PeriodicMonitoredFence;
1825 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_2)
1826 
1827 
1828         struct
1829         {
1830             D3DKMT_ALIGN64 UINT64 Reserved[8];                     // Reserved for future use.
1831         } Reserved;
1832     };
1833 
1834     D3DKMT_HANDLE  SharedHandle;                    // out: global shared handle (when requested to be shared)
1835 
1836 } D3DDDI_SYNCHRONIZATIONOBJECTINFO2;
1837 
1838 #if ((DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0) || \
1839      (D3D_UMD_INTERFACE_VERSION >= D3D_UMD_INTERFACE_VERSION_WDDM2_0))
1840 
1841 typedef struct _D3DDDI_WAITFORSYNCHRONIZATIONOBJECTFROMCPU_FLAGS
1842 {
1843     union
1844     {
1845         struct
1846         {
1847             UINT WaitAny        : 1;    // when waiting for multiple objects, signal the wait event if any
1848                                         // of the wait array conditions is satisfied as opposed to all conditions.
1849             UINT Reserved       : 31;
1850         };
1851         UINT Value;
1852     };
1853 } D3DDDI_WAITFORSYNCHRONIZATIONOBJECTFROMCPU_FLAGS;
1854 
1855 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_0)
1856 
1857 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_4)
1858 
1859 typedef struct _D3DDDI_QUERYREGISTRY_FLAGS
1860 {
1861     union
1862     {
1863         struct
1864         {
1865             UINT   TranslatePath    :  1;
1866             UINT   MutableValue     :  1;
1867             UINT   Reserved         : 30;
1868         };
1869         UINT Value;
1870     };
1871 } D3DDDI_QUERYREGISTRY_FLAGS;
1872 
1873 typedef enum _D3DDDI_QUERYREGISTRY_TYPE
1874 {
1875    D3DDDI_QUERYREGISTRY_SERVICEKEY      = 0,
1876    D3DDDI_QUERYREGISTRY_ADAPTERKEY      = 1,
1877    D3DDDI_QUERYREGISTRY_DRIVERSTOREPATH = 2,
1878    D3DDDI_QUERYREGISTRY_DRIVERIMAGEPATH = 3,
1879    D3DDDI_QUERYREGISTRY_MAX,
1880 } D3DDDI_QUERYREGISTRY_TYPE;
1881 
1882 typedef enum _D3DDDI_QUERYREGISTRY_STATUS
1883 {
1884    D3DDDI_QUERYREGISTRY_STATUS_SUCCESS              = 0,
1885    D3DDDI_QUERYREGISTRY_STATUS_BUFFER_OVERFLOW      = 1,
1886    D3DDDI_QUERYREGISTRY_STATUS_FAIL                 = 2,
1887    D3DDDI_QUERYREGISTRY_STATUS_MAX,
1888 } D3DDDI_QUERYREGISTRY_STATUS;
1889 
1890 //
1891 // Output data value follows this structure.
1892 // PrivateDriverSize must be sizeof(D3DDDI_QUERYREGISTRY_INFO) + (size of the the key value in bytes)
1893 //
1894 typedef struct _D3DDDI_QUERYREGISTRY_INFO
1895 {
1896    D3DDDI_QUERYREGISTRY_TYPE    QueryType;              // In
1897    D3DDDI_QUERYREGISTRY_FLAGS   QueryFlags;             // In
1898    WCHAR                        ValueName[MAX_PATH];    // In
1899    ULONG                        ValueType;              // In
1900    ULONG                        PhysicalAdapterIndex;   // In
1901    ULONG                        OutputValueSize;        // Out. Number of bytes written to the output value or required in case of D3DDDI_QUERYREGISTRY_STATUS_BUFFER_OVERFLOW.
1902    D3DDDI_QUERYREGISTRY_STATUS  Status;                 // Out
1903    union {
1904         DWORD   OutputDword;                            // Out
1905         D3DKMT_ALIGN64 UINT64  OutputQword;             // Out
1906         WCHAR   OutputString[1];                        // Out. Dynamic array
1907         BYTE    OutputBinary[1];                        // Out. Dynamic array
1908    };
1909  } D3DDDI_QUERYREGISTRY_INFO;
1910 
1911 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_4)
1912 
1913 //
1914 // Defines the maximum number of context a particular command buffer can
1915 // be broadcast to.
1916 //
1917 #define D3DDDI_MAX_BROADCAST_CONTEXT        64
1918 
1919 //
1920 // Allocation priorities.
1921 //
1922 #define D3DDDI_ALLOCATIONPRIORITY_MINIMUM       0x28000000
1923 #define D3DDDI_ALLOCATIONPRIORITY_LOW           0x50000000
1924 #define D3DDDI_ALLOCATIONPRIORITY_NORMAL        0x78000000
1925 #define D3DDDI_ALLOCATIONPRIORITY_HIGH          0xa0000000
1926 #define D3DDDI_ALLOCATIONPRIORITY_MAXIMUM       0xc8000000
1927 
1928 #if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM1_3)
1929 
1930 // Cross adapter resource pitch alignment in bytes.
1931 // Must be power of 2.
1932 //
1933 #define D3DKMT_CROSS_ADAPTER_RESOURCE_PITCH_ALIGNMENT 128
1934 
1935 // Cross adapter resource height alignment in rows.
1936 //
1937 #define D3DKMT_CROSS_ADAPTER_RESOURCE_HEIGHT_ALIGNMENT 4
1938 
1939 #endif // (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM1_3)
1940 
1941 #endif // (NTDDI_VERSION >= NTDDI_LONGHORN) || defined(D3DKMDT_SPECIAL_MULTIPLATFORM_TOOL)
1942 
1943 #pragma warning(pop)
1944 
1945 
1946 #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
1947 #pragma endregion
1948 
1949 #endif /* _D3DUKMDT_H_ */
1950 
1951