1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms.
6 //! longhorn display driver model kernel mode thunk interfaces
7 use shared::basetsd::{UINT32, UINT64};
8 use shared::d3dukmdt::{
9     D3DDDICB_SIGNALFLAGS, D3DDDI_ALLOCATIONLIST, D3DDDI_CREATECONTEXTFLAGS,
10     D3DDDI_MAX_BROADCAST_CONTEXT, D3DDDI_MAX_OBJECT_SIGNALED, D3DDDI_MAX_OBJECT_WAITED_ON,
11     D3DDDI_PATCHLOCATIONLIST, D3DDDI_SYNCHRONIZATIONOBJECTINFO,
12     D3DDDI_SYNCHRONIZATIONOBJECTINFO2, D3DDDI_VIDEO_PRESENT_SOURCE_ID, D3DGPU_VIRTUAL_ADDRESS,
13     D3DKMT_HANDLE,
14 };
15 use shared::minwindef::{BOOL, UCHAR, UINT, ULONG};
16 use shared::ntdef::{HANDLE, LUID, PCWSTR, ULONGLONG, VOID, WCHAR};
17 use shared::windef::HDC;
18 STRUCT!{struct D3DKMT_CREATEDEVICEFLAGS {
19     bitfield: UINT,
20 }}
21 BITFIELD!{D3DKMT_CREATEDEVICEFLAGS bitfield: UINT [
22     LegacyMode set_LegacyMode[0..1],
23     RequestVSync set_RequestVSync[1..2],
24     DisableGpuTimeout set_DisableGpuTimeout[2..3],
25     Reserved set_Reserved[3..32],
26 ]}
27 UNION!{union D3DKMT_CREATEDEVICE_u {
28     [usize; 1],
29     hAdapter hAdapter_mut: D3DKMT_HANDLE,
30     pAdapter pAdapter_mut: *mut VOID,
31 }}
32 STRUCT!{struct D3DKMT_CREATEDEVICE {
33     u: D3DKMT_CREATEDEVICE_u,
34     Flags: D3DKMT_CREATEDEVICEFLAGS,
35     hDevice: D3DKMT_HANDLE,
36     pCommandBuffer: *mut VOID,
37     CommandBufferSize: UINT,
38     pAllocationList: *mut D3DDDI_ALLOCATIONLIST,
39     AllocationListSize: UINT,
40     pPatchLocationList: *mut D3DDDI_PATCHLOCATIONLIST,
41     PatchLocationListSize: UINT,
42 }}
43 STRUCT!{struct D3DKMT_DESTROYDEVICE {
44     hDevice: D3DKMT_HANDLE,
45 }}
46 ENUM!{enum D3DKMT_CLIENTHINT {
47     D3DKMT_CLIENTHINT_UNKNOWN = 0,
48     D3DKMT_CLIENTHINT_OPENGL = 1,
49     D3DKMT_CLIENTHINT_CDD = 2,
50     D3DKMT_CLIENTHINT_DX7 = 7,
51     D3DKMT_CLIENTHINT_DX8 = 8,
52     D3DKMT_CLIENTHINT_DX9 = 9,
53     D3DKMT_CLIENTHINT_DX10 = 10,
54 }}
55 STRUCT!{struct D3DKMT_CREATECONTEXT {
56     hDevice: D3DKMT_HANDLE,
57     NodeOrdinal: UINT,
58     EngineAffinity: UINT,
59     Flags: D3DDDI_CREATECONTEXTFLAGS,
60     pPrivateDriverData: *mut VOID,
61     PrivateDriverDataSize: UINT,
62     ClientHint: D3DKMT_CLIENTHINT,
63     hContext: D3DKMT_HANDLE,
64     pCommandBuffer: *mut VOID,
65     CommandBufferSize: UINT,
66     pAllocationList: *mut D3DDDI_ALLOCATIONLIST,
67     AllocationListSize: UINT,
68     pPatchLocationList: *mut D3DDDI_PATCHLOCATIONLIST,
69     PatchLocationListSize: UINT,
70     CommandBuffer: D3DGPU_VIRTUAL_ADDRESS,
71 }}
72 STRUCT!{struct D3DKMT_DESTROYCONTEXT {
73     hContext: D3DKMT_HANDLE,
74 }}
75 STRUCT!{struct D3DKMT_CREATESYNCHRONIZATIONOBJECT {
76     hDevice: D3DKMT_HANDLE,
77     Info: D3DDDI_SYNCHRONIZATIONOBJECTINFO,
78     hSyncObject: D3DKMT_HANDLE,
79 }}
80 STRUCT!{struct D3DKMT_CREATESYNCHRONIZATIONOBJECT2 {
81     hDevice: D3DKMT_HANDLE,
82     Info: D3DDDI_SYNCHRONIZATIONOBJECTINFO2,
83     hSyncObject: D3DKMT_HANDLE,
84 }}
85 STRUCT!{struct D3DKMT_DESTROYSYNCHRONIZATIONOBJECT {
86     hSyncObject: D3DKMT_HANDLE,
87 }}
88 STRUCT!{struct D3DKMT_OPENSYNCHRONIZATIONOBJECT {
89     hSharedHandle: D3DKMT_HANDLE,
90     hSyncObject: D3DKMT_HANDLE,
91     Reserved: [UINT64; 8],
92 }}
93 STRUCT!{struct D3DKMT_WAITFORSYNCHRONIZATIONOBJECT {
94     hContext: D3DKMT_HANDLE,
95     ObjectCount: UINT,
96     ObjectHandleArray: [D3DKMT_HANDLE; D3DDDI_MAX_OBJECT_WAITED_ON],
97 }}
98 STRUCT!{struct D3DKMT_WAITFORSYNCHRONIZATIONOBJECT2_Fence {
99     FenceValue: UINT64,
100 }}
101 UNION!{union D3DKMT_WAITFORSYNCHRONIZATIONOBJECT2_u {
102     [u64; 8],
103     Fence Fence_mut: D3DKMT_WAITFORSYNCHRONIZATIONOBJECT2_Fence,
104     Reserved Reserved_mut: [UINT64; 8],
105 }}
106 STRUCT!{struct D3DKMT_WAITFORSYNCHRONIZATIONOBJECT2 {
107     hContext: D3DKMT_HANDLE,
108     ObjectCount: UINT,
109     ObjectHandleArray: [D3DKMT_HANDLE; D3DDDI_MAX_OBJECT_WAITED_ON],
110     u: D3DKMT_WAITFORSYNCHRONIZATIONOBJECT2_u,
111 }}
112 STRUCT!{struct D3DKMT_SIGNALSYNCHRONIZATIONOBJECT {
113     hContext: D3DKMT_HANDLE,
114     ObjectCount: UINT,
115     ObjectHandleArray: [D3DKMT_HANDLE; D3DDDI_MAX_OBJECT_SIGNALED],
116     Flags: D3DDDICB_SIGNALFLAGS,
117 }}
118 STRUCT!{struct D3DKMT_SIGNALSYNCHRONIZATIONOBJECT2_Fence {
119     FenceValue: UINT64,
120 }}
121 UNION!{union D3DKMT_SIGNALSYNCHRONIZATIONOBJECT2_u {
122     [u64; 8],
123     Fence Fence_mut: D3DKMT_SIGNALSYNCHRONIZATIONOBJECT2_Fence,
124     CpuEventHandle CpuEventHandle_mut: HANDLE,
125     Reserved Reserved_mut: [UINT64; 8],
126 }}
127 STRUCT!{struct D3DKMT_SIGNALSYNCHRONIZATIONOBJECT2 {
128     hContext: D3DKMT_HANDLE,
129     ObjectCount: UINT,
130     ObjectHandleArray: [D3DKMT_HANDLE; D3DDDI_MAX_OBJECT_SIGNALED],
131     Flags: D3DDDICB_SIGNALFLAGS,
132     BroadcastContextCount: ULONG,
133     BroadcastContext: [D3DKMT_HANDLE; D3DDDI_MAX_BROADCAST_CONTEXT],
134     u: D3DKMT_SIGNALSYNCHRONIZATIONOBJECT2_u,
135 }}
136 //1512
137 STRUCT!{struct D3DKMT_SEGMENTSIZEINFO {
138     DedicatedVideoMemorySize: ULONGLONG,
139     DedicatedSystemMemorySize: ULONGLONG,
140     SharedSystemMemorySize: ULONGLONG,
141 }}
142 //1617
143 STRUCT!{struct D3DKMT_ADAPTERTYPE {
144     Value: UINT,
145 }}
146 BITFIELD!{D3DKMT_ADAPTERTYPE Value: UINT [
147     RenderSupported set_RenderSupported[0..1],
148     DisplaySupported set_DisplaySupported[1..2],
149     SoftwareDevice set_SoftwareDevice[2..3],
150     PostDevice set_PostDevice[3..4],
151     HybridDiscrete set_HybridDiscrete[4..5],
152     HybridIntegrated set_HybridIntegrated[5..6],
153     IndirectDisplayDevice set_IndirectDisplayDevice[6..7],
154     Paravirtualized set_Paravirtualized[7..8],
155     ACGSupported set_ACGSupported[8..9],
156     SupportSetTimingsFromVidPn set_SupportSetTimingsFromVidPn[9..10],
157     Detachable set_Detachable[10..11],
158     Reserved set_Reserved[11..32],
159 ]}
160 //1852
161 STRUCT!{struct D3DKMT_NODE_PERFDATA {
162     NodeOrdinal: UINT32,
163     PhysicalAdapterIndex: UINT32,
164     Frequency: ULONGLONG,
165     MaxFrequency: ULONGLONG,
166     MaxFrequencyOC: ULONGLONG,
167     Voltage: ULONG,
168     VoltageMax: ULONG,
169     VoltageMaxOC: ULONG,
170     MaxTransitionLatency: ULONGLONG,
171 }}
172 STRUCT!{struct D3DKMT_ADAPTER_PERFDATA {
173     PhysicalAdapterIndex: UINT32,
174     MemoryFrequency: ULONGLONG,
175     MaxMemoryFrequency: ULONGLONG,
176     MaxMemoryFrequencyOC: ULONGLONG,
177     MemoryBandwidth: ULONGLONG,
178     PCIEBandwidth: ULONGLONG,
179     FanRPM: ULONG,
180     Power: ULONG,
181     Temperature: ULONG,
182     PowerStateOverride: UCHAR,
183 }}
184 STRUCT!{struct D3DKMT_ADAPTER_PERFDATACAPS {
185     PhysicalAdapterIndex: UINT32,
186     MaxMemoryBandwidth: ULONGLONG,
187     MaxPCIEBandwidth: ULONGLONG,
188     MaxFanRPM: ULONG,
189     TemperatureMax: ULONG,
190     TemperatureWarning: ULONG,
191 }}
192 pub const DXGK_MAX_GPUVERSION_NAME_LENGTH: usize = 32;
193 STRUCT!{struct D3DKMT_GPUVERSION {
194     PhysicalAdapterIndex: UINT32,
195     BiosVersion: [WCHAR; DXGK_MAX_GPUVERSION_NAME_LENGTH],
196     GpuArchitecture: [WCHAR; DXGK_MAX_GPUVERSION_NAME_LENGTH],
197 }}
198 ENUM!{enum KMTQUERYADAPTERINFOTYPE {
199     KMTQAITYPE_UMDRIVERPRIVATE = 0,
200     KMTQAITYPE_UMDRIVERNAME = 1,
201     KMTQAITYPE_UMOPENGLINFO = 2,
202     KMTQAITYPE_GETSEGMENTSIZE = 3,
203     KMTQAITYPE_ADAPTERGUID = 4,
204     KMTQAITYPE_FLIPQUEUEINFO = 5,
205     KMTQAITYPE_ADAPTERADDRESS = 6,
206     KMTQAITYPE_SETWORKINGSETINFO = 7,
207     KMTQAITYPE_ADAPTERREGISTRYINFO = 8,
208     KMTQAITYPE_CURRENTDISPLAYMODE = 9,
209     KMTQAITYPE_MODELIST = 10,
210     KMTQAITYPE_CHECKDRIVERUPDATESTATUS = 11,
211     KMTQAITYPE_VIRTUALADDRESSINFO = 12,
212     KMTQAITYPE_DRIVERVERSION = 13,
213     KMTQAITYPE_ADAPTERTYPE = 15,
214     KMTQAITYPE_OUTPUTDUPLCONTEXTSCOUNT = 16,
215     KMTQAITYPE_WDDM_1_2_CAPS = 17,
216     KMTQAITYPE_UMD_DRIVER_VERSION = 18,
217     KMTQAITYPE_DIRECTFLIP_SUPPORT = 19,
218     KMTQAITYPE_MULTIPLANEOVERLAY_SUPPORT = 20,
219     KMTQAITYPE_DLIST_DRIVER_NAME = 21,
220     KMTQAITYPE_WDDM_1_3_CAPS = 22,
221     KMTQAITYPE_MULTIPLANEOVERLAY_HUD_SUPPORT = 23,
222     KMTQAITYPE_WDDM_2_0_CAPS = 24,
223     KMTQAITYPE_NODEMETADATA = 25,
224     KMTQAITYPE_CPDRIVERNAME = 26,
225     KMTQAITYPE_XBOX = 27,
226     KMTQAITYPE_INDEPENDENTFLIP_SUPPORT = 28,
227     KMTQAITYPE_MIRACASTCOMPANIONDRIVERNAME = 29,
228     KMTQAITYPE_PHYSICALADAPTERCOUNT = 30,
229     KMTQAITYPE_PHYSICALADAPTERDEVICEIDS = 31,
230     KMTQAITYPE_DRIVERCAPS_EXT = 32,
231     KMTQAITYPE_QUERY_MIRACAST_DRIVER_TYPE = 33,
232     KMTQAITYPE_QUERY_GPUMMU_CAPS = 34,
233     KMTQAITYPE_QUERY_MULTIPLANEOVERLAY_DECODE_SUPPORT = 35,
234     KMTQAITYPE_QUERY_HW_PROTECTION_TEARDOWN_COUNT = 36,
235     KMTQAITYPE_QUERY_ISBADDRIVERFORHWPROTECTIONDISABLED = 37,
236     KMTQAITYPE_MULTIPLANEOVERLAY_SECONDARY_SUPPORT = 38,
237     KMTQAITYPE_INDEPENDENTFLIP_SECONDARY_SUPPORT = 39,
238     KMTQAITYPE_PANELFITTER_SUPPORT = 40,
239     KMTQAITYPE_PHYSICALADAPTERPNPKEY = 41,
240     KMTQAITYPE_GETSEGMENTGROUPSIZE = 42,
241     KMTQAITYPE_MPO3DDI_SUPPORT = 43,
242     KMTQAITYPE_HWDRM_SUPPORT = 44,
243     KMTQAITYPE_MPOKERNELCAPS_SUPPORT = 45,
244     KMTQAITYPE_MULTIPLANEOVERLAY_STRETCH_SUPPORT = 46,
245     KMTQAITYPE_GET_DEVICE_VIDPN_OWNERSHIP_INFO = 47,
246     KMTQAITYPE_QUERYREGISTRY = 48,
247     KMTQAITYPE_KMD_DRIVER_VERSION = 49,
248     KMTQAITYPE_BLOCKLIST_KERNEL = 50,
249     KMTQAITYPE_BLOCKLIST_RUNTIME = 51,
250     KMTQAITYPE_ADAPTERGUID_RENDER = 52,
251     KMTQAITYPE_ADAPTERADDRESS_RENDER = 53,
252     KMTQAITYPE_ADAPTERREGISTRYINFO_RENDER = 54,
253     KMTQAITYPE_CHECKDRIVERUPDATESTATUS_RENDER = 55,
254     KMTQAITYPE_DRIVERVERSION_RENDER = 56,
255     KMTQAITYPE_ADAPTERTYPE_RENDER = 57,
256     KMTQAITYPE_WDDM_1_2_CAPS_RENDER = 58,
257     KMTQAITYPE_WDDM_1_3_CAPS_RENDER = 59,
258     KMTQAITYPE_QUERY_ADAPTER_UNIQUE_GUID = 60,
259     KMTQAITYPE_NODEPERFDATA = 61,
260     KMTQAITYPE_ADAPTERPERFDATA = 62,
261     KMTQAITYPE_ADAPTERPERFDATA_CAPS = 63,
262     KMTQUITYPE_GPUVERSION = 64,
263 }}
264 STRUCT!{struct D3DKMT_QUERYADAPTERINFO {
265     hAdapter: D3DKMT_HANDLE,
266     Type: KMTQUERYADAPTERINFOTYPE,
267     pPrivateDriverData: *mut VOID,
268     PrivateDriverDataSize: UINT,
269 }}
270 STRUCT!{struct D3DKMT_OPENADAPTERFROMHDC {
271     hDc: HDC,
272     hAdapter: D3DKMT_HANDLE,
273     AdapterLuid: LUID,
274     VidPnSourceId: D3DDDI_VIDEO_PRESENT_SOURCE_ID,
275 }}
276 STRUCT!{struct D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME {
277     DeviceName: [WCHAR; 32],
278     hAdapter: D3DKMT_HANDLE,
279     AdapterLuid: LUID,
280     VidPnSourceId: D3DDDI_VIDEO_PRESENT_SOURCE_ID,
281 }}
282 STRUCT!{struct D3DKMT_OPENADAPTERFROMDEVICENAME {
283     pDeviceName: PCWSTR,
284     hAdapter: D3DKMT_HANDLE,
285     AdapterLuid: LUID,
286 }}
287 pub const MAX_ENUM_ADAPTERS: usize = 16;
288 STRUCT!{struct D3DKMT_ADAPTERINFO {
289     hAdapter: D3DKMT_HANDLE,
290     AdapterLuid: LUID,
291     NumOfSources: ULONG,
292     bPresentMoveRegionsPreferred: BOOL,
293 }}
294 STRUCT!{struct D3DKMT_ENUMADAPTERS {
295     NumAdapters: ULONG,
296     Adapters: [D3DKMT_ADAPTERINFO; MAX_ENUM_ADAPTERS],
297 }}
298 STRUCT!{struct D3DKMT_ENUMADAPTERS2 {
299     NumAdapters: ULONG,
300     pAdapters: *mut D3DKMT_ADAPTERINFO,
301 }}
302 STRUCT!{struct D3DKMT_OPENADAPTERFROMLUID {
303     AdapterLuid: LUID,
304     hAdapter: D3DKMT_HANDLE,
305 }}
306 STRUCT!{struct D3DKMT_QUERYREMOTEVIDPNSOURCEFROMGDIDISPLAYNAME {
307     DeviceName: [WCHAR; 32],
308     VidPnSourceId: D3DDDI_VIDEO_PRESENT_SOURCE_ID,
309 }}
310 STRUCT!{struct D3DKMT_CLOSEADAPTER {
311     hAdapter: D3DKMT_HANDLE,
312 }}
313