1 module aurora.directx.dxgi.dxgi;
2 
3 import aurora.directx.com;
4 public import aurora.directx.dxgi.dxgitype;
5 public import aurora.directx.dxgi.dxgicommon;
6 public import aurora.directx.dxgi.dxgiformat;
7 
8 public:
9 
10 //
11 //	Constants
12 //
13 
14 //DXGI_ERROR
15 enum DXGI_ERROR_DEVICE_HUNG = 0x887A0006;
16 enum DXGI_ERROR_DEVICE_REMOVED = 0x887A0005;
17 enum DXGI_ERROR_DEVICE_RESET = 0x887A0007;
18 enum DXGI_ERROR_DRIVER_INTERNAL_ERROR = 0x887A0020;
19 enum DXGI_ERROR_FRAME_STATISTICS_DISJOINT = 0x887A000B;
20 enum DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE = 0x887A000C;
21 enum DXGI_ERROR_INVALID_CALL = 0x887A0001;
22 enum DXGI_ERROR_NONEXCLUSIVE = 0x887A0021;
23 enum DXGI_ERROR_NOT_CURRENTLY_AVAILABLE = 0x887A0022;
24 enum DXGI_ERROR_NOT_FOUND = 0x887A0002;
25 enum DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED = 0x887A0023;
26 enum DXGI_ERROR_REMOTE_OUTOFMEMORY = 0x887A0024;
27 enum DXGI_ERROR_WAS_STILL_DRAWING = 0x887A000A;
28 enum DXGI_ERROR_UNSUPPORTED = 0x887A0004;
29 enum DXGI_ERROR_ACCESS_LOST = 0x887A0026;
30 enum DXGI_ERROR_WAIT_TIMEOUT = 0x887A0027;
31 enum DXGI_ERROR_SESSION_DISCONNECTED = 0x887A0028;
32 enum DXGI_ERROR_RESTRICT_TO_OUTPUT_STALE = 0x887A0029;
33 enum DXGI_ERROR_CANNOT_PROTECT_CONTENT = 0x887A002A;
34 enum DXGI_ERROR_ACCESS_DENIED = 0x887A002B;
35 enum DXGI_ERROR_NAME_ALREADY_EXISTS = 0x887A002C;
36 
37 //DXGI_ENUM_MODES
38 enum DXGI_ENUM_MODES_INTERLACED = (1U);
39 enum DXGI_ENUM_MODES_SCALING    = (2U);
40 
41 //DXGI_PRESENT
42 enum DXGI_PRESENT_FRAME           = (0x00000000U);
43 enum DXGI_PRESENT_TEST            = (0x00000001U);
44 enum DXGI_PRESENT_DO_NOT_SEQUENCE = (0x00000002U);
45 enum DXGI_PRESENT_RESTART         = (0x00000004U);
46 
47 //DXGI_STATUS
48 enum DXGI_STATUS_OCCLUDED = 0x087A0001;
49 enum DXGI_STATUS_MODE_CHANGED = 0x087A0007;
50 enum DXGI_STATUS_MODE_CHANGE_IN_PROGRESS = 0x087A0008;
51 
52 //DXGI_USAGE
53 enum DXGI_USAGE_SHADER_INPUT         = (1L << (0 + 4));
54 enum DXGI_USAGE_RENDER_TARGET_OUTPUT = (1L << (1 + 4));
55 enum DXGI_USAGE_BACK_BUFFER          = (1L << (2 + 4));
56 enum DXGI_USAGE_SHARED               = (1L << (3 + 4));
57 enum DXGI_USAGE_READ_ONLY            = (1L << (4 + 4));
58 enum DXGI_USAGE_DISCARD_ON_PRESENT   = (1L << (5 + 4));
59 enum DXGI_USAGE_UNORDERED_ACCESS     = (1L << (6 + 4));
60 alias uint DXGI_USAGE;
61 
62 //DXGI_MAP
63 enum DXGI_MAP_READ    = (1U);
64 enum DXGI_MAP_WRITE   = (2U);
65 enum DXGI_MAP_DISCARD = (4U);
66 
67 //DXGI_RESOURCE_PRIORITY
68 enum DXGI_RESOURCE_PRIORITY_MINIMUM = (0x2800_0000U);
69 enum DXGI_RESOURCE_PRIORITY_LOW	    = (0x5000_0000U);
70 enum DXGI_RESOURCE_PRIORITY_NORMAL  = (0x7800_0000U);
71 enum DXGI_RESOURCE_PRIORITY_HIGH    = (0xa000_0000U);
72 enum DXGI_RESOURCE_PRIORITY_MAXIMUM = (0xc800_0000U);
73 
74 //DXGI_CPU_ACCESS
75 enum DXGI_CPU_ACCESS_NONE       = ( 0U);
76 enum DXGI_CPU_ACCESS_DYNAMIC    = ( 1U);
77 enum DXGI_CPU_ACCESS_READ_WRITE = ( 2U);
78 enum DXGI_CPU_ACCESS_SCRATCH    = ( 3U);
79 enum DXGI_CPU_ACCESS_FIELD      = (15U);
80 
81 //DXGI_SWAP_CHAIN_FLAG
82 enum DXGI_SWAP_CHAIN_FLAG_NONPREROTATED                    = (1U);
83 enum DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH                = (2U);
84 enum DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE                   = (4U);
85 enum DXGI_SWAP_CHAIN_FLAG_RESTRICTED_CONTENT               = (8U);
86 enum DXGI_SWAP_CHAIN_FLAG_RESTRICT_SHARED_RESOURCE_DRIVER  = (16U);
87 enum DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY                     = (32U);
88 enum DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT    = (64U);
89 enum DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER                 = (128U);
90 
91 //DXGI_MWA
92 enum DXGI_MWA_NO_WINDOW_CHANGES = (1 << 0);
93 enum DXGI_MWA_NO_ALT_ENTER      = (1 << 1);
94 enum DXGI_MWA_NO_PRINT_SCREEN   = (1 << 2);
95 enum DXGI_MWA_VALID             = (0x7);
96 
97 //DXGI_DEBUG
98 //const IID DXGI_DEBUG_ALL = { 0xe48ae283, 0xda80, 0x490b, 0x87, 0xe6, 0x43, 0xe9, 0xa9, 0xcf, 0xda, 0x8 };
99 //const IID DXGI_DEBUG_DX = { 0x35cdd7fc, 0x13b2, 0x421d, 0xa5, 0xd7, 0x7e, 0x44, 0x51, 0x28, 0x7d, 0x64 };
100 //const IID DXGI_DEBUG_DXGI = { 0x25cddaa4, 0xb1c6, 0x47e1, 0xac, 0x3e, 0x98, 0x87, 0x5b, 0x5a, 0x2e, 0x2a };
101 //const IID DXGI_DEBUG_APP = { 0x6cd6e01, 0x4219, 0x4ebd, 0x87, 0x9, 0x27, 0xed, 0x23, 0x36, 0xc, 0x62 };
102 //const IID DXGI_DEBUG_D3D11 = { 0x4b99317b, 0xac39, 0x4aa6, 0xbb, 0xb, 0xba, 0xa0, 0x47, 0x84, 0x79, 0x8f };
103 
104 //
105 //	Enumerations
106 //
107 
108 public enum DXGI_ADAPTER_FLAG : int { 
109 	NONE         = 0,
110 	REMOTE       = 1,
111 	SOFTWARE     = 2,
112 	FORCE_DWORD  = 0xffffffff
113 }
114 
115 public enum DXGI_FRAME_PRESENTATION_MODE : int { 
116 	COMPOSED  = 0,
117 	OVERLAY   = 1,
118 	NONE      = 2
119 }
120 
121 public enum DXGI_MULTIPLANE_OVERLAY_YCbCr_FLAGS : int { 
122 	NOMINAL_RANGE  = 0x1,
123 	BT709          = 0x2,
124 	xvYCC          = 0x4
125 }
126 
127 public enum DXGI_RESIDENCY : int { 
128 	FULLY_RESIDENT             = 1,
129 	RESIDENT_IN_SHARED_MEMORY  = 2,
130 	EVICTED_TO_DISK            = 3
131 }
132 
133 public enum DXGI_SWAP_CHAIN_FLAG : int { 
134 	NONPREROTATED                    = 1,
135 	ALLOW_MODE_SWITCH                = 2,
136 	GDI_COMPATIBLE                   = 4,
137 	RESTRICTED_CONTENT               = 8,
138 	RESTRICT_SHARED_RESOURCE_DRIVER  = 16,
139 	DISPLAY_ONLY                     = 32,
140 	FRAME_LATENCY_WAITABLE_OBJECT    = 64,
141 	FOREGROUND_LAYER                 = 128
142 }
143 
144 enum DXGI_SWAP_EFFECT : int { 
145 	DISCARD          = 0,
146 	SEQUENTIAL       = 1,
147 	FLIP_SEQUENTIAL  = 3
148 }
149 
150 //
151 //	Structures
152 //
153 
154 public struct DXGI_ADAPTER_DESC {
155 	wchar[128] Description;
156 	uint VendorId;
157 	uint DeviceId;
158 	uint SubSysId;
159 	uint Revision;
160 	size_t DedicatedVideoMemory;
161 	size_t DedicatedSystemMemory;
162 	size_t SharedSystemMemory;
163 	LUID AdapterLuid;
164 }
165 
166 public struct DXGI_ADAPTER_DESC1 {
167 	wchar[128] Description;
168 	uint VendorId;
169 	uint DeviceId;
170 	uint SubSysId;
171 	uint Revision;
172 	size_t DedicatedVideoMemory;
173 	size_t DedicatedSystemMemory;
174 	size_t SharedSystemMemory;
175 	LUID AdapterLuid;
176 	uint Flags;
177 }
178 
179 public struct DXGI_FRAME_STATISTICS {
180 	uint PresentCount;
181 	uint PresentRefreshCount;
182 	uint SyncRefreshCount;
183 	LARGE_INTEGER SyncQPCTime;
184 	LARGE_INTEGER SyncGPUTime;
185 }
186 
187 public struct DXGI_GAMMA_CONTROL {
188 	DXGI_RGB               Scale;
189 	DXGI_RGB               Offset;
190 	DXGI_RGB[1025]         GammaCurve;
191 }
192 
193 public struct DXGI_GAMMA_CONTROL_CAPABILITIES {
194 	BOOL                   ScaleAndOffsetSupported;
195 	float                  MaxConvertedValue;
196 	float                  MinConvertedValue;
197 	uint                   NumGammaControlPoints;
198 	float[1025]           ControlPointPosition;
199 }
200 
201 public struct DXGI_MAPPED_RECT {
202 	int Pitch;
203 	ubyte *pBits;
204 }
205 
206 public struct DXGI_MODE_DESC {
207 	uint                     Width;
208 	uint                     Height;
209 	DXGI_RATIONAL            RefreshRate;
210 	DXGI_FORMAT              Format;
211 	DXGI_MODE_SCANLINE_ORDER ScanlineOrdering;
212 	DXGI_MODE_SCALING        Scaling;
213 }
214 
215 public struct DXGI_OUTPUT_DESC {
216 	wchar[32]          DeviceName;
217 	RECT               DesktopCoordinates;
218 	BOOL               AttachedToDesktop;
219 	DXGI_MODE_ROTATION Rotation;
220 	long               Monitor;
221 }
222 
223 public struct DXGI_OUTDUPL_DESC {
224 	DXGI_MODE_DESC     ModeDesc;
225 	DXGI_MODE_ROTATION Rotation;
226 	BOOL               DesktopImageInSystemMemory;
227 }
228 
229 public struct DXGI_SHARED_RESOURCE {
230 	HANDLE Handle;
231 }
232 
233 public struct DXGI_SURFACE_DESC {
234 	uint             Width;
235 	uint             Height;
236 	DXGI_FORMAT      Format;
237 	DXGI_SAMPLE_DESC SampleDesc;
238 }
239 
240 public struct DXGI_SWAP_CHAIN_DESC {
241 	DXGI_MODE_DESC   BufferDesc;
242 	DXGI_SAMPLE_DESC SampleDesc;
243 	uint             BufferUsage;
244 	uint             BufferCount;
245 	HWND             OutputWindow;
246 	BOOL             Windowed;
247 	DXGI_SWAP_EFFECT SwapEffect;
248 	uint             Flags;
249 }
250 
251 //
252 //	Interfaces
253 //
254 
255 mixin(uuid!(IDXGIObject, "aec22fb8-76f3-4639-9be0-28eb43a67a2e"));
256 interface IDXGIObject : IUnknown
257 {
258 extern(Windows):
259 	HRESULT GetParent(GUID* IID, void** Parent);
260 	HRESULT GetPrivateData(GUID* IID, uint* DataSize, void* Data);
261 	HRESULT SetPrivateData(GUID* IID, uint DataSize, const void* Data);
262 	HRESULT SetPrivateDataInterface(GUID* IID, const(IUnknown) Unknown);
263 }
264 
265 mixin(uuid!(IDXGIAdapter, "2411e7e1-12ac-4ccf-bd14-9798e8534dc0"));
266 interface IDXGIAdapter : IDXGIObject
267 {
268 extern(Windows):
269 	HRESULT CheckInterfaceSupport(GUID* InterfaceName, LARGE_INTEGER *UMDVersion);
270 	HRESULT EnumOutputs(uint Output, IDXGIOutput *Output);
271 	HRESULT GetDesc(DXGI_ADAPTER_DESC *Desc);
272 }
273 
274 mixin(uuid!(IDXGIAdapter1, "29038f61-3839-4626-91fd-086879011a05"));
275 interface IDXGIAdapter1 : IDXGIAdapter
276 {
277 extern(Windows):
278 	HRESULT GetDesc1(DXGI_ADAPTER_DESC1 *Desc);
279 }
280 
281 mixin(uuid!(IDXGIDevice, "54ec77fa-1377-44e6-8c32-88fd5f44c84c"));
282 interface IDXGIDevice : IDXGIObject
283 {
284 extern(Windows):
285 	HRESULT CreateSurface(const DXGI_SURFACE_DESC *Desc, uint NumSurfaces, DXGI_USAGE Usage, const DXGI_SHARED_RESOURCE *SharedResource, IDXGISurface *Surface);
286 	HRESULT GetAdapter(IDXGIAdapter *Adapter);
287 	HRESULT GetGPUThreadPriority(int *Priority);
288 	HRESULT QueryResourceResidency(const(IUnknown) *Resources, DXGI_RESIDENCY *ResidencyStatus, uint NumResources);
289 	HRESULT SetGPUThreadPriority(int Priority);
290 }
291 
292 mixin(uuid!(IDXGIDevice1, "77db970f-6276-48ba-ba28-070143b4392c"));
293 interface IDXGIDevice1 : IDXGIDevice
294 {
295 extern(Windows):
296 	HRESULT GetMaximumFrameLatency(uint *MaxLatency);
297 	HRESULT SetMaximumFrameLatency(uint MaxLatency);
298 }
299 
300 mixin(uuid!(IDXGIDeviceSubObject, "3d3e0379-f9de-4d58-bb6c-18d62992f1a6"));
301 interface IDXGIDeviceSubObject : IDXGIObject
302 {
303 extern(Windows):
304 	HRESULT GetDevice(GUID RIID, void **Device);
305 }
306 
307 mixin(uuid!(IDXGIFactory, "7b7166ec-21c7-44ae-b21a-c9ae321ae369"));
308 interface IDXGIFactory : IDXGIObject
309 {
310 extern(Windows):
311 	HRESULT CreateSoftwareAdapter(HMODULE Module, IDXGIAdapter *Adapter);
312 	HRESULT CreateSwapChain(IUnknown Device, DXGI_SWAP_CHAIN_DESC *Desc, IDXGISwapChain *SwapChain);
313 	HRESULT EnumAdapters(uint Adapter,IDXGIAdapter *Adapter);
314 	HRESULT GetWindowAssociation(HWND *WindowHandle);
315 	HRESULT MakeWindowAssociation(HWND WindowHandle, uint Flags);
316 }
317 
318 mixin(uuid!(IDXGIFactory1, "770aae78-f26f-4dba-a829-253c83d1b387"));
319 interface IDXGIFactory1 : IDXGIFactory
320 {
321 extern(Windows):
322 	HRESULT EnumAdapters1(uint Adapter, IDXGIAdapter1 *Adapter);
323 	BOOL IsCurrent();
324 }
325 
326 mixin(uuid!(IDXGIKeyedMutex, "9d8e1289-d7b3-465f-8126-250e349af85d"));
327 interface IDXGIKeyedMutex : IDXGIDeviceSubObject
328 {
329 extern(Windows):
330 	HRESULT AcquireSync(ulong Key, DWORD Milliseconds);
331 	HRESULT ReleaseSync(ulong Key);
332 }
333 
334 mixin(uuid!(IDXGIOutput, "ae02eedb-c735-4690-8d52-5a8dc20213aa"));
335 interface IDXGIOutput : IDXGIObject
336 {
337 extern(Windows):
338 	HRESULT FindClosestMatchingMode(const DXGI_MODE_DESC *ModeToMatch, DXGI_MODE_DESC *ClosestMatch, IUnknown ConcernedDevice);
339 	HRESULT GetDesc(DXGI_OUTPUT_DESC *Desc);
340 	HRESULT GetDisplayModeList(DXGI_FORMAT EnumFormat, uint Flags, uint *NumModes, DXGI_MODE_DESC *Desc);
341 	HRESULT GetDisplaySurfaceData(IDXGISurface Destination);
342 	HRESULT GetFrameStatistics(DXGI_FRAME_STATISTICS *Stats);
343 	HRESULT GetGammaControl(DXGI_GAMMA_CONTROL *Array);
344 	HRESULT GetGammaControlCapabilities(DXGI_GAMMA_CONTROL_CAPABILITIES *GammaCaps);
345 	void ReleaseOwnership();
346 	HRESULT SetDisplaySurface(IDXGISurface ScanoutSurface);
347 	HRESULT SetGammaControl(const DXGI_GAMMA_CONTROL *Array);
348 	HRESULT TakeOwnership(IUnknown Device, BOOL Exclusive);
349 	HRESULT WaitForVBlank();
350 }
351 
352 mixin(uuid!(IDXGIResource, "035f3ab4-482e-4e50-b41f-8a7f8bd8960b"));
353 interface IDXGIResource : IDXGIDeviceSubObject
354 {
355 extern(Windows):
356 	HRESULT GetEvictionPriority(uint *EvictionPriority);
357 	HRESULT GetSharedHandle(HANDLE *SharedHandle);
358 	HRESULT GetUsage(DXGI_USAGE *Usage);
359 	HRESULT SetEvictionPriority(uint EvictionPriority);
360 }
361 
362 mixin(uuid!(IDXGISurface, "cafcb56c-6ac3-4889-bf47-9e23bbd260ec"));
363 interface IDXGISurface : IDXGIDeviceSubObject
364 {
365 extern(Windows):
366 	HRESULT GetDesc(DXGI_SURFACE_DESC *Desc);
367 	HRESULT Map(DXGI_MAPPED_RECT *LockedRect, uint MapFlags);
368 	HRESULT Unmap();
369 }
370 
371 mixin(uuid!(IDXGISurface1, "4AE63092-6327-4c1b-80AE-BFE12EA32B86"));
372 interface IDXGISurface1 : IDXGISurface
373 {
374 extern(Windows):
375 	HRESULT GetDC(BOOL Discard, HDC *hdc);
376 	HRESULT ReleaseDC(RECT *DirtyRect);
377 }
378 
379 mixin(uuid!(IDXGISwapChain, "310d36a0-d2e7-4c0a-aa04-6a9d23b8886a"));
380 interface IDXGISwapChain : IDXGIDeviceSubObject
381 {
382 extern(Windows):
383 	HRESULT GetBuffer(uint Buffer, GUID *RIID, void **Surface);
384 	HRESULT GetContainingOutput(IDXGIOutput *Output);
385 	HRESULT GetDesc(DXGI_SWAP_CHAIN_DESC *Desc);
386 	HRESULT GetFrameStatistics(DXGI_FRAME_STATISTICS *Stats);
387 	HRESULT GetFullscreenState(BOOL *Fullscreen, IDXGIOutput *Target);
388 	HRESULT GetLastPresentCount(uint *LastPresentCount);
389 	HRESULT Present(uint SyncInterval, uint Flags);
390 	HRESULT ResizeBuffers(uint BufferCount, uint Width, uint Height, DXGI_FORMAT NewFormat, uint SwapChainFlags);
391 	HRESULT ResizeTarget(const DXGI_MODE_DESC *NewTargetParameters);
392 	HRESULT SetFullscreenState(BOOL Fullscreen, IDXGIOutput Target);
393 }
394 
395 //
396 //	Functions
397 //
398 extern(Windows) public HRESULT CreateDXGIFactory(const(GUID)* RIID, void **Factory);
399 extern(Windows) public HRESULT CreateDXGIFactory1(const(GUID)* RIID, void **Factory);
400 extern(Windows) public HRESULT DXGIGetDebugInterface(const(GUID)* RIID, void **Debug);