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);