1/*
2 * Copyright 2007 Andras Kovacs
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19import "oaidl.idl";
20import "ocidl.idl";
21import "dxgitype.h";
22
23const UINT _FACDXGI = 0x87a;
24
25cpp_quote("#define MAKE_DXGI_STATUS(x)                         MAKE_HRESULT(0, _FACDXGI, x)")
26cpp_quote("#define DXGI_STATUS_OCCLUDED                        MAKE_DXGI_STATUS(1)")
27cpp_quote("#define DXGI_STATUS_CLIPPED                         MAKE_DXGI_STATUS(2)")
28cpp_quote("#define DXGI_STATUS_NO_REDIRECTION                  MAKE_DXGI_STATUS(4)")
29cpp_quote("#define DXGI_STATUS_NO_DESKTOP_ACCESS               MAKE_DXGI_STATUS(5)")
30cpp_quote("#define DXGI_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE    MAKE_DXGI_STATUS(6)")
31cpp_quote("#define DXGI_STATUS_MODE_CHANGED                    MAKE_DXGI_STATUS(7)")
32cpp_quote("#define DXGI_STATUS_MODE_CHANGE_IN_PROGRESS         MAKE_DXGI_STATUS(8)")
33
34cpp_quote("#define MAKE_DXGI_HRESULT(x)                        MAKE_HRESULT(1, _FACDXGI, x)")
35cpp_quote("#define DXGI_ERROR_INVALID_CALL                     MAKE_DXGI_HRESULT(1)")
36cpp_quote("#define DXGI_ERROR_NOT_FOUND                        MAKE_DXGI_HRESULT(2)")
37cpp_quote("#define DXGI_ERROR_MORE_DATA                        MAKE_DXGI_HRESULT(3)")
38cpp_quote("#define DXGI_ERROR_UNSUPPORTED                      MAKE_DXGI_HRESULT(4)")
39cpp_quote("#define DXGI_ERROR_DEVICE_REMOVED                   MAKE_DXGI_HRESULT(5)")
40cpp_quote("#define DXGI_ERROR_DEVICE_HUNG                      MAKE_DXGI_HRESULT(6)")
41cpp_quote("#define DXGI_ERROR_DEVICE_RESET                     MAKE_DXGI_HRESULT(7)")
42cpp_quote("#define DXGI_ERROR_WAS_STILL_DRAWING                MAKE_DXGI_HRESULT(10)")
43cpp_quote("#define DXGI_ERROR_FRAME_STATISTICS_DISJOINT        MAKE_DXGI_HRESULT(11)")
44cpp_quote("#define DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE     MAKE_DXGI_HRESULT(12)")
45cpp_quote("#define DXGI_ERROR_DRIVER_INTERNAL_ERROR            MAKE_DXGI_HRESULT(32)")
46cpp_quote("#define DXGI_ERROR_NONEXCLUSIVE                     MAKE_DXGI_HRESULT(33)")
47cpp_quote("#define DXGI_ERROR_NOT_CURRENTLY_AVAILABLE          MAKE_DXGI_HRESULT(34)")
48
49cpp_quote("#if 0")
50typedef HANDLE HMONITOR;
51typedef struct _LUID {
52    DWORD LowPart;
53    LONG HighPart;
54} LUID, *PLUID;
55cpp_quote("#endif")
56
57typedef UINT DXGI_USAGE;
58const DXGI_USAGE DXGI_USAGE_SHADER_INPUT            = 0x10L;
59const DXGI_USAGE DXGI_USAGE_RENDER_TARGET_OUTPUT    = 0x20L;
60const DXGI_USAGE DXGI_USAGE_BACK_BUFFER             = 0x40L;
61const DXGI_USAGE DXGI_USAGE_SHARED                  = 0x80L;
62const DXGI_USAGE DXGI_USAGE_READ_ONLY               = 0x100L;
63
64const UINT DXGI_ENUM_MODES_INTERLACED               = 1;
65const UINT DXGI_ENUM_MODES_SCALING                  = 2;
66
67typedef enum DXGI_SWAP_EFFECT {
68    DXGI_SWAP_EFFECT_DISCARD    = 0,
69    DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
70} DXGI_SWAP_EFFECT;
71
72typedef enum DXGI_RESIDENCY {
73    DXGI_RESIDENCY_FULLY_RESIDENT               = 1,
74    DXGI_RESIDENCY_RESIDENT_IN_SHARED_MEMORY    = 2,
75    DXGI_RESIDENCY_EVICTED_TO_DISK              = 3,
76} DXGI_RESIDENCY;
77
78typedef struct DXGI_SURFACE_DESC {
79    UINT Width;
80    UINT Height;
81    DXGI_FORMAT Format;
82    DXGI_SAMPLE_DESC SampleDesc;
83} DXGI_SURFACE_DESC;
84
85typedef struct DXGI_MAPPED_RECT {
86    INT Pitch;
87    BYTE *pBits;
88} DXGI_MAPPED_RECT;
89
90typedef struct DXGI_OUTPUT_DESC {
91    WCHAR DeviceName[32];
92    RECT DesktopCoordinates;
93    BOOL AttachedToDesktop;
94    DXGI_MODE_ROTATION Rotation;
95    HMONITOR Monitor;
96} DXGI_OUTPUT_DESC;
97
98typedef struct DXGI_FRAME_STATISTICS {
99    UINT PresentCount;
100    UINT PresentRefreshCount;
101    UINT SyncRefreshCount;
102    LARGE_INTEGER SyncQPCTime;
103    LARGE_INTEGER SyncGPUTime;
104} DXGI_FRAME_STATISTICS;
105
106typedef struct DXGI_ADAPTER_DESC {
107    WCHAR Description[128];
108    UINT VendorId;
109    UINT DeviceId;
110    UINT SubSysId;
111    UINT Revision;
112    SIZE_T DedicatedVideoMemory;
113    SIZE_T DedicatedSystemMemory;
114    SIZE_T SharedSystemMemory;
115    LUID AdapterLuid;
116} DXGI_ADAPTER_DESC;
117
118typedef enum DXGI_SWAP_CHAIN_FLAG {
119    DXGI_SWAP_CHAIN_FLAG_NONPREROTATED      = 1,
120    DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH  = 2,
121    DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE     = 4
122} DXGI_SWAP_CHAIN_FLAG;
123
124typedef struct DXGI_SWAP_CHAIN_DESC {
125    DXGI_MODE_DESC BufferDesc;
126    DXGI_SAMPLE_DESC SampleDesc;
127    DXGI_USAGE BufferUsage;
128    UINT BufferCount;
129    HWND OutputWindow;
130    BOOL Windowed;
131    DXGI_SWAP_EFFECT SwapEffect;
132    UINT Flags;
133} DXGI_SWAP_CHAIN_DESC;
134
135typedef struct DXGI_SHARED_RESOURCE {
136    HANDLE Handle;
137} DXGI_SHARED_RESOURCE;
138
139[
140    object,
141    local,
142    uuid(aec22fb8-76f3-4639-9be0-28eb43a67a2e)
143]
144interface IDXGIObject : IUnknown
145{
146    HRESULT SetPrivateData(
147        [in] REFGUID guid,
148        [in] UINT data_size,
149        [in] const void *data
150    );
151    HRESULT SetPrivateDataInterface(
152        [in] REFGUID guid,
153        [in] const IUnknown *object
154    );
155    HRESULT GetPrivateData(
156        [in] REFGUID guid,
157        [in, out] UINT *data_size,
158        [out] void *data
159    );
160    HRESULT GetParent(
161        [in] REFIID riid,
162        [out] void **parent
163    );
164}
165
166[
167    object,
168    local,
169    uuid(3d3e0379-f9de-4d58-bb6c-18d62992f1a6)
170]
171interface IDXGIDeviceSubObject : IDXGIObject
172{
173    HRESULT GetDevice(
174        [in] REFIID riid,
175        [out] void **device
176    );
177}
178
179[
180    object,
181    uuid(035f3ab4-482e-4e50-b41f-8a7f8bd8960b),
182    local,
183    pointer_default(unique)
184]
185interface IDXGIResource : IDXGIDeviceSubObject
186{
187    HRESULT GetSharedHandle([out] HANDLE *pSharedHandle);
188    HRESULT GetUsage([out] DXGI_USAGE *pUsage);
189    HRESULT SetEvictionPriority([in] UINT EvictionPriority);
190    HRESULT GetEvictionPriority([out, retval] UINT *pEvictionPriority);
191}
192
193[
194    object,
195    uuid(9d8e1289-d7b3-465f-8126-250e349af85d),
196    local,
197    pointer_default(unique)
198]
199interface IDXGIKeyedMutex : IDXGIDeviceSubObject
200{
201    HRESULT AcquireSync([in] UINT64 Key, [in] DWORD dwMilliseconds);
202    HRESULT ReleaseSync([in] UINT64 Key);
203}
204
205[
206    object,
207    local,
208    uuid(cafcb56c-6ac3-4889-bf47-9e23bbd260ec)
209]
210interface IDXGISurface : IDXGIDeviceSubObject
211{
212    HRESULT GetDesc(
213        [out] DXGI_SURFACE_DESC *desc
214    );
215    HRESULT Map(
216        [out] DXGI_MAPPED_RECT *mapped_rect,
217        [in] UINT flags
218    );
219    HRESULT Unmap(
220    );
221}
222
223[
224    object,
225    local,
226    uuid(ae02eedb-c735-4690-8d52-5a8dc20213aa)
227]
228interface IDXGIOutput : IDXGIObject
229{
230    HRESULT GetDesc(
231        [out] DXGI_OUTPUT_DESC *desc
232    );
233    HRESULT GetDisplayModeList(
234        [in] DXGI_FORMAT format,
235        [in] UINT flags,
236        [in, out] UINT *mode_count,
237        [out] DXGI_MODE_DESC *desc
238    );
239    HRESULT FindClosestMatchingMode(
240        [in] const DXGI_MODE_DESC *mode,
241        [out] DXGI_MODE_DESC *closest_match,
242        [in] IUnknown *device
243    );
244    HRESULT WaitForVBlank(
245    );
246    HRESULT TakeOwnership(
247        [in] IUnknown *device,
248        [in] BOOL exclusive
249    );
250    void ReleaseOwnership(
251    );
252    HRESULT GetGammaControlCapabilities(
253        [out] DXGI_GAMMA_CONTROL_CAPABILITIES *gamma_caps
254    );
255    HRESULT SetGammaControl(
256        [in] const DXGI_GAMMA_CONTROL *gamma_control
257    );
258    HRESULT GetGammaControl(
259        [out] DXGI_GAMMA_CONTROL *gamma_control
260    );
261    HRESULT SetDisplaySurface(
262        [in] IDXGISurface *surface
263    );
264    HRESULT GetDisplaySurfaceData(
265        [in] IDXGISurface *surface
266    );
267    HRESULT GetFrameStatistics(
268        [out] DXGI_FRAME_STATISTICS *stats
269    );
270}
271
272[
273    object,
274    local,
275    uuid(2411e7e1-12ac-4ccf-bd14-9798e8534dc0)
276]
277interface IDXGIAdapter : IDXGIObject
278{
279    HRESULT EnumOutputs(
280        [in] UINT output_idx,
281        [in, out] IDXGIOutput **output
282    );
283    HRESULT GetDesc(
284        [out] DXGI_ADAPTER_DESC *desc
285    );
286    HRESULT CheckInterfaceSupport(
287        [in] REFGUID guid,
288        [out] LARGE_INTEGER *umd_version
289    );
290}
291
292[
293    object,
294    local,
295    uuid(310d36a0-d2e7-4c0a-aa04-6a9d23b8886a)
296]
297interface IDXGISwapChain : IDXGIDeviceSubObject
298{
299    HRESULT Present(
300        [in] UINT sync_interval,
301        [in] UINT flags
302    );
303    HRESULT GetBuffer(
304        [in] UINT buffer_idx,
305        [in] REFIID riid,
306        [in, out] void **surface
307    );
308    HRESULT SetFullscreenState(
309        [in] BOOL fullscreen,
310        [in] IDXGIOutput *target
311    );
312    HRESULT GetFullscreenState(
313        [out] BOOL *fullscreen,
314        [out] IDXGIOutput **target
315    );
316    HRESULT GetDesc(
317        [out] DXGI_SWAP_CHAIN_DESC *desc
318    );
319    HRESULT ResizeBuffers(
320        [in] UINT buffer_count,
321        [in] UINT width,
322        [in] UINT height,
323        [in] DXGI_FORMAT format,
324        [in] UINT flags
325    );
326    HRESULT ResizeTarget(
327        [in] const DXGI_MODE_DESC *target_mode_desc
328    );
329    HRESULT GetContainingOutput(
330        [out] IDXGIOutput **output
331    );
332    HRESULT GetFrameStatistics(
333        [out] DXGI_FRAME_STATISTICS *stats
334    );
335    HRESULT GetLastPresentCount(
336        [out] UINT *last_present_count
337    );
338}
339
340cpp_quote("#define DXGI_MWA_NO_WINDOW_CHANGES  0x1")
341cpp_quote("#define DXGI_MWA_NO_ALT_ENTER       0x2")
342cpp_quote("#define DXGI_MWA_NO_PRINT_SCREEN    0x4")
343cpp_quote("#define DXGI_MWA_VALID              0x7")
344
345[
346    object,
347    local,
348    uuid(7b7166ec-21c7-44ae-b21a-c9ae321ae369)
349]
350interface IDXGIFactory : IDXGIObject
351{
352    HRESULT EnumAdapters(
353        [in] UINT adapter_idx,
354        [out] IDXGIAdapter **adapter
355    );
356    HRESULT MakeWindowAssociation(
357        [in] HWND window,
358        [in] UINT flags
359    );
360    HRESULT GetWindowAssociation(
361        [in] HWND *window
362    );
363    HRESULT CreateSwapChain(
364        [in] IUnknown *device,
365        [in] DXGI_SWAP_CHAIN_DESC *desc,
366        [out] IDXGISwapChain **swapchain
367    );
368    HRESULT CreateSoftwareAdapter(
369        [in] HMODULE swrast,
370        [out] IDXGIAdapter **adapter
371    );
372}
373
374[local] HRESULT __stdcall CreateDXGIFactory(REFIID riid, void **factory);
375
376[
377    object,
378    local,
379    uuid(54ec77fa-1377-44e6-8c32-88fd5f44c84c)
380]
381interface IDXGIDevice : IDXGIObject
382{
383    HRESULT GetAdapter(
384        [out] IDXGIAdapter **adapter
385    );
386    HRESULT CreateSurface(
387        [in] const DXGI_SURFACE_DESC *desc,
388        [in] UINT surface_count,
389        [in] DXGI_USAGE usage,
390        [in] const DXGI_SHARED_RESOURCE *shared_resource,
391        [out] IDXGISurface **surface
392    );
393    HRESULT QueryResourceResidency(
394        [in] IUnknown *const *resources,
395        [out] DXGI_RESIDENCY *residency,
396        [in] UINT resource_count
397    );
398    HRESULT SetGPUThreadPriority(
399        [in] INT priority
400    );
401    HRESULT GetGPUThreadPriority(
402        [out] INT *priority
403    );
404}
405
406typedef enum DXGI_ADAPTER_FLAG {
407    DXGI_ADAPTER_FLAG_NONE         = 0,
408    DXGI_ADAPTER_FLAG_REMOTE       = 1,
409    DXGI_ADAPTER_FLAG_FORCE_DWORD  = 0xFFFFFFFF
410} DXGI_ADAPTER_FLAG;
411
412typedef struct DXGI_ADAPTER_DESC1 {
413    WCHAR  Description[128];
414    UINT   VendorId;
415    UINT   DeviceId;
416    UINT   SubSysId;
417    UINT   Revision;
418    SIZE_T DedicatedVideoMemory;
419    SIZE_T DedicatedSystemMemory;
420    SIZE_T SharedSystemMemory;
421    LUID   AdapterLuid;
422    UINT   Flags;
423} DXGI_ADAPTER_DESC1;
424
425[
426    object,
427    uuid(29038f61-3839-4626-91fd-086879011a05),
428    local,
429    pointer_default(unique)
430]
431interface IDXGIAdapter1 : IDXGIAdapter
432{
433    HRESULT GetDesc1([out] DXGI_ADAPTER_DESC1 *pDesc);
434}
435
436[
437    object,
438    uuid(770aae78-f26f-4dba-a829-253c83d1b387),
439    local,
440    pointer_default(unique)
441 ]
442interface IDXGIFactory1 : IDXGIFactory
443{
444    HRESULT EnumAdapters1([in] UINT Adapter, [out] IDXGIAdapter1 **ppAdapter);
445    BOOL IsCurrent();
446}
447