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 //! Mappings for the contents of dxgi.h 7 use ctypes::c_void; 8 use shared::basetsd::{SIZE_T, UINT64}; 9 use shared::dxgiformat::DXGI_FORMAT; 10 use shared::dxgitype::{ 11 DXGI_GAMMA_CONTROL, DXGI_GAMMA_CONTROL_CAPABILITIES, DXGI_MODE_DESC, DXGI_MODE_ROTATION, 12 DXGI_SAMPLE_DESC, DXGI_USAGE, 13 }; 14 use shared::guiddef::{REFGUID, REFIID}; 15 use shared::minwindef::{BOOL, BYTE, DWORD, FLOAT, HMODULE, UINT}; 16 use shared::windef::{HDC, HMONITOR, HWND, RECT}; 17 use um::unknwnbase::{IUnknown, IUnknownVtbl}; 18 use um::winnt::{HANDLE, HRESULT, INT, LARGE_INTEGER, LUID, WCHAR}; 19 STRUCT!{struct DXGI_FRAME_STATISTICS { 20 PresentCount: UINT, 21 PresentRefreshCount: UINT, 22 SyncRefreshCount: UINT, 23 SyncQPCTime: LARGE_INTEGER, 24 SyncGPUTime: LARGE_INTEGER, 25 }} 26 STRUCT!{struct DXGI_MAPPED_RECT { 27 Pitch: INT, 28 pBits: *mut BYTE, 29 }} 30 STRUCT!{struct DXGI_ADAPTER_DESC { 31 Description: [WCHAR; 128], 32 VendorId: UINT, 33 DeviceId: UINT, 34 SubSysId: UINT, 35 Revision: UINT, 36 DedicatedVideoMemory: SIZE_T, 37 DedicatedSystemMemory: SIZE_T, 38 SharedSystemMemory: SIZE_T, 39 AdapterLuid: LUID, 40 }} 41 STRUCT!{struct DXGI_OUTPUT_DESC { 42 DeviceName: [WCHAR; 32], 43 DesktopCoordinates: RECT, 44 AttachedToDesktop: BOOL, 45 Rotation: DXGI_MODE_ROTATION, 46 Monitor: HMONITOR, 47 }} 48 STRUCT!{struct DXGI_SHARED_RESOURCE { 49 Handle: HANDLE, 50 }} 51 pub const DXGI_RESOURCE_PRIORITY_MINIMUM: DWORD = 0x28000000; 52 pub const DXGI_RESOURCE_PRIORITY_LOW: DWORD = 0x50000000; 53 pub const DXGI_RESOURCE_PRIORITY_NORMAL: DWORD = 0x78000000; 54 pub const DXGI_RESOURCE_PRIORITY_HIGH: DWORD = 0xa0000000; 55 pub const DXGI_RESOURCE_PRIORITY_MAXIMUM: DWORD = 0xc8000000; 56 ENUM!{enum DXGI_RESIDENCY { 57 DXGI_RESIDENCY_FULLY_RESIDENT = 1, 58 DXGI_RESIDENCY_RESIDENT_IN_SHARED_MEMORY = 2, 59 DXGI_RESIDENCY_EVICTED_TO_DISK = 3, 60 }} 61 STRUCT!{struct DXGI_SURFACE_DESC { 62 Width: UINT, 63 Height: UINT, 64 Format: DXGI_FORMAT, 65 SampleDesc: DXGI_SAMPLE_DESC, 66 }} 67 ENUM!{enum DXGI_SWAP_EFFECT { 68 DXGI_SWAP_EFFECT_DISCARD = 0, 69 DXGI_SWAP_EFFECT_SEQUENTIAL = 1, 70 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3, 71 DXGI_SWAP_EFFECT_FLIP_DISCARD = 4, 72 }} 73 ENUM!{enum DXGI_SWAP_CHAIN_FLAG { 74 DXGI_SWAP_CHAIN_FLAG_NONPREROTATED = 1, 75 DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH = 2, 76 DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE = 4, 77 DXGI_SWAP_CHAIN_FLAG_RESTRICTED_CONTENT = 8, 78 DXGI_SWAP_CHAIN_FLAG_RESTRICT_SHARED_RESOURCE_DRIVER = 16, 79 DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY = 32, 80 DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT = 64, 81 DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER = 128, 82 DXGI_SWAP_CHAIN_FLAG_FULLSCREEN_VIDEO = 256, 83 DXGI_SWAP_CHAIN_FLAG_YUV_VIDEO = 512, 84 DXGI_SWAP_CHAIN_FLAG_HW_PROTECTED = 1024, 85 DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING = 2048, 86 }} 87 STRUCT!{struct DXGI_SWAP_CHAIN_DESC { 88 BufferDesc: DXGI_MODE_DESC, 89 SampleDesc: DXGI_SAMPLE_DESC, 90 BufferUsage: DXGI_USAGE, 91 BufferCount: UINT, 92 OutputWindow: HWND, 93 Windowed: BOOL, 94 SwapEffect: DXGI_SWAP_EFFECT, 95 Flags: UINT, 96 }} 97 RIDL!{#[uuid(0xaec22fb8, 0x76f3, 0x4639, 0x9b, 0xe0, 0x28, 0xeb, 0x43, 0xa6, 0x7a, 0x2e)] 98 interface IDXGIObject(IDXGIObjectVtbl): IUnknown(IUnknownVtbl) { 99 fn SetPrivateData( 100 Name: REFGUID, 101 DataSize: UINT, 102 pData: *const c_void, 103 ) -> HRESULT, 104 fn SetPrivateDataInterface( 105 Name: REFGUID, 106 pUnknown: *const IUnknown, 107 ) -> HRESULT, 108 fn GetPrivateData( 109 Name: REFGUID, 110 pDataSize: *mut UINT, 111 pData: *mut c_void, 112 ) -> HRESULT, 113 fn GetParent( 114 riid: REFIID, 115 ppParent: *mut *mut c_void, 116 ) -> HRESULT, 117 }} 118 RIDL!{#[uuid(0x3d3e0379, 0xf9de, 0x4d58, 0xbb, 0x6c, 0x18, 0xd6, 0x29, 0x92, 0xf1, 0xa6)] 119 interface IDXGIDeviceSubObject(IDXGIDeviceSubObjectVtbl): IDXGIObject(IDXGIObjectVtbl) { 120 fn GetDevice( 121 riid: REFIID, 122 ppDevice: *mut *mut c_void, 123 ) -> HRESULT, 124 }} 125 RIDL!{#[uuid(0x035f3ab4, 0x482e, 0x4e50, 0xb4, 0x1f, 0x8a, 0x7f, 0x8b, 0xd8, 0x96, 0x0b)] 126 interface IDXGIResource(IDXGIResourceVtbl): IDXGIDeviceSubObject(IDXGIDeviceSubObjectVtbl) { 127 fn GetSharedHandle( 128 pSharedHandle: *mut HANDLE, 129 ) -> HRESULT, 130 fn GetUsage( 131 pUsage: *mut DXGI_USAGE, 132 ) -> HRESULT, 133 fn SetEvictionPriority( 134 EvictionPriority: UINT, 135 ) -> HRESULT, 136 fn GetEvictionPriority( 137 pEvictionPriority: *mut UINT, 138 ) -> HRESULT, 139 }} 140 RIDL!{#[uuid(0x9d8e1289, 0xd7b3, 0x465f, 0x81, 0x26, 0x25, 0x0e, 0x34, 0x9a, 0xf8, 0x5d)] 141 interface IDXGIKeyedMutex(IDXGIKeyedMutexVtbl): IDXGIDeviceSubObject(IDXGIDeviceSubObjectVtbl) { 142 fn AcquireSync( 143 Key: UINT64, 144 dwMilliseconds: DWORD, 145 ) -> HRESULT, 146 fn ReleaseSync( 147 Key: UINT64, 148 ) -> HRESULT, 149 }} 150 pub const DXGI_MAP_READ: UINT = 1; 151 pub const DXGI_MAP_WRITE: UINT = 2; 152 pub const DXGI_MAP_DISCARD: UINT = 4; 153 RIDL!{#[uuid(0xcafcb56c, 0x6ac3, 0x4889, 0xbf, 0x47, 0x9e, 0x23, 0xbb, 0xd2, 0x60, 0xec)] 154 interface IDXGISurface(IDXGISurfaceVtbl): IDXGIDeviceSubObject(IDXGIDeviceSubObjectVtbl) { 155 fn GetDesc( 156 pDesc: *mut DXGI_SURFACE_DESC, 157 ) -> HRESULT, 158 fn Map( 159 pLockedRect: *mut DXGI_MAPPED_RECT, 160 MapFlags: UINT, 161 ) -> HRESULT, 162 fn Unmap() -> HRESULT, 163 }} 164 RIDL!{#[uuid(0x4ae63092, 0x6327, 0x4c1b, 0x80, 0xae, 0xbf, 0xe1, 0x2e, 0xa3, 0x2b, 0x86)] 165 interface IDXGISurface1(IDXGISurface1Vtbl): IDXGISurface(IDXGISurfaceVtbl) { 166 fn GetDC( 167 Discard: BOOL, 168 phdc: *mut HDC, 169 ) -> HRESULT, 170 fn ReleaseDC( 171 pDirtyRect: *mut RECT, 172 ) -> HRESULT, 173 }} 174 RIDL!{#[uuid(0x2411e7e1, 0x12ac, 0x4ccf, 0xbd, 0x14, 0x97, 0x98, 0xe8, 0x53, 0x4d, 0xc0)] 175 interface IDXGIAdapter(IDXGIAdapterVtbl): IDXGIObject(IDXGIObjectVtbl) { 176 fn EnumOutputs( 177 Output: UINT, 178 ppOutput: *mut *mut IDXGIOutput, 179 ) -> HRESULT, 180 fn GetDesc( 181 pDesc: *mut DXGI_ADAPTER_DESC, 182 ) -> HRESULT, 183 fn CheckInterfaceSupport( 184 InterfaceName: REFGUID, 185 pUMDVersion: *mut LARGE_INTEGER, 186 ) -> HRESULT, 187 }} 188 RIDL!{#[uuid(0xae02eedb, 0xc735, 0x4690, 0x8d, 0x52, 0x5a, 0x8d, 0xc2, 0x02, 0x13, 0xaa)] 189 interface IDXGIOutput(IDXGIOutputVtbl): IDXGIObject(IDXGIObjectVtbl) { 190 fn GetDesc( 191 pDesc: *mut DXGI_OUTPUT_DESC, 192 ) -> HRESULT, 193 fn GetDisplayModeList( 194 EnumFormat: DXGI_FORMAT, 195 Flags: UINT, 196 pNumModes: *mut UINT, 197 pDesc: *mut DXGI_MODE_DESC, 198 ) -> HRESULT, 199 fn FindClosestMatchingMode( 200 pModeToMatch: *const DXGI_MODE_DESC, 201 pClosestMatch: *mut DXGI_MODE_DESC, 202 pConcernedDevice: *mut IUnknown, 203 ) -> HRESULT, 204 fn WaitForVBlank() -> HRESULT, 205 fn TakeOwnership( 206 pDevice: *mut IUnknown, 207 Exclusive: BOOL, 208 ) -> HRESULT, 209 fn ReleaseOwnership() -> (), 210 fn GetGammaControlCapabilities( 211 pGammaCaps: *mut DXGI_GAMMA_CONTROL_CAPABILITIES, 212 ) -> HRESULT, 213 fn SetGammaControl( 214 pArray: *const DXGI_GAMMA_CONTROL, 215 ) -> HRESULT, 216 fn GetGammaControl( 217 pArray: *mut DXGI_GAMMA_CONTROL, 218 ) -> HRESULT, 219 fn SetDisplaySurface( 220 pScanoutSurface: *mut IDXGISurface, 221 ) -> HRESULT, 222 fn GetDisplaySurfaceData( 223 pDestination: *mut IDXGISurface, 224 ) -> HRESULT, 225 fn GetFrameStatistics( 226 pStats: *mut DXGI_FRAME_STATISTICS, 227 ) -> HRESULT, 228 }} 229 pub const DXGI_MAX_SWAP_CHAIN_BUFFERS: DWORD = 16; 230 pub const DXGI_PRESENT_TEST: DWORD = 0x00000001; 231 pub const DXGI_PRESENT_DO_NOT_SEQUENCE: DWORD = 0x00000002; 232 pub const DXGI_PRESENT_RESTART: DWORD = 0x00000004; 233 pub const DXGI_PRESENT_DO_NOT_WAIT: DWORD = 0x00000008; 234 pub const DXGI_PRESENT_STEREO_PREFER_RIGHT: DWORD = 0x00000010; 235 pub const DXGI_PRESENT_STEREO_TEMPORARY_MONO: DWORD = 0x00000020; 236 pub const DXGI_PRESENT_RESTRICT_TO_OUTPUT: DWORD = 0x00000040; 237 pub const DXGI_PRESENT_USE_DURATION: DWORD = 0x00000100; 238 pub const DXGI_PRESENT_ALLOW_TEARING: DWORD = 0x00000200; 239 pub const DXGI_ENUM_MODES_INTERLACED: UINT = 1; 240 pub const DXGI_ENUM_MODES_SCALING: UINT = 2; 241 RIDL!{#[uuid(0x310d36a0, 0xd2e7, 0x4c0a, 0xaa, 0x04, 0x6a, 0x9d, 0x23, 0xb8, 0x88, 0x6a)] 242 interface IDXGISwapChain(IDXGISwapChainVtbl): IDXGIDeviceSubObject(IDXGIDeviceSubObjectVtbl) { 243 fn Present( 244 SyncInterval: UINT, 245 Flags: UINT, 246 ) -> HRESULT, 247 fn GetBuffer( 248 Buffer: UINT, 249 riid: REFIID, 250 ppSurface: *mut *mut c_void, 251 ) -> HRESULT, 252 fn SetFullscreenState( 253 Fullscreen: BOOL, 254 pTarget: *mut IDXGIOutput, 255 ) -> HRESULT, 256 fn GetFullscreenState( 257 pFullscreen: *mut BOOL, 258 ppTarget: *mut *mut IDXGIOutput, 259 ) -> HRESULT, 260 fn GetDesc( 261 pDesc: *mut DXGI_SWAP_CHAIN_DESC, 262 ) -> HRESULT, 263 fn ResizeBuffers( 264 BufferCount: UINT, 265 Width: UINT, 266 Height: UINT, 267 NewFormat: DXGI_FORMAT, 268 SwapChainFlags: UINT, 269 ) -> HRESULT, 270 fn ResizeTarget( 271 pNewTargetParameters: *const DXGI_MODE_DESC, 272 ) -> HRESULT, 273 fn GetContainingOutput( 274 ppOutput: *mut *mut IDXGIOutput, 275 ) -> HRESULT, 276 fn GetFrameStatistics( 277 pStats: *mut DXGI_FRAME_STATISTICS, 278 ) -> HRESULT, 279 fn GetLastPresentCount( 280 pLastPresentCount: *mut UINT, 281 ) -> HRESULT, 282 }} 283 RIDL!{#[uuid(0x7b7166ec, 0x21c7, 0x44ae, 0xb2, 0x1a, 0xc9, 0xae, 0x32, 0x1a, 0xe3, 0x69)] 284 interface IDXGIFactory(IDXGIFactoryVtbl): IDXGIObject(IDXGIObjectVtbl) { 285 fn EnumAdapters( 286 Adapter: UINT, 287 ppAdapter: *mut *mut IDXGIAdapter, 288 ) -> HRESULT, 289 fn MakeWindowAssociation( 290 WindowHandle: HWND, 291 Flags: UINT, 292 ) -> HRESULT, 293 fn GetWindowAssociation( 294 pWindowHandle: *mut HWND, 295 ) -> HRESULT, 296 fn CreateSwapChain( 297 pDevice: *mut IUnknown, 298 pDesc: *mut DXGI_SWAP_CHAIN_DESC, 299 ppSwapChain: *mut *mut IDXGISwapChain, 300 ) -> HRESULT, 301 fn CreateSoftwareAdapter( 302 Module: HMODULE, 303 ppAdapter: *mut *mut IDXGIAdapter, 304 ) -> HRESULT, 305 }} 306 extern "system" { CreateDXGIFactory( riid: REFIID, ppFactory: *mut *mut c_void, ) -> HRESULT307 pub fn CreateDXGIFactory( 308 riid: REFIID, 309 ppFactory: *mut *mut c_void, 310 ) -> HRESULT; CreateDXGIFactory1( riid: REFIID, ppFactory: *mut *mut c_void, ) -> HRESULT311 pub fn CreateDXGIFactory1( 312 riid: REFIID, 313 ppFactory: *mut *mut c_void, 314 ) -> HRESULT; 315 } 316 RIDL!{#[uuid(0x54ec77fa, 0x1377, 0x44e6, 0x8c, 0x32, 0x88, 0xfd, 0x5f, 0x44, 0xc8, 0x4c)] 317 interface IDXGIDevice(IDXGIDeviceVtbl): IDXGIObject(IDXGIObjectVtbl) { 318 fn GetAdapter( 319 pAdapter: *mut *mut IDXGIAdapter, 320 ) -> HRESULT, 321 fn CreateSurface( 322 pDesc: *const DXGI_SURFACE_DESC, 323 NumSurfaces: UINT, 324 Usage: DXGI_USAGE, 325 pSharedResource: *const DXGI_SHARED_RESOURCE, 326 ppSurface: *mut *mut IDXGISurface, 327 ) -> HRESULT, 328 fn QueryResourceResidency( 329 ppResources: *const *mut IUnknown, 330 pResidencyStatus: *mut DXGI_RESIDENCY, 331 NumResources: UINT, 332 ) -> HRESULT, 333 fn SetGPUThreadPriority( 334 Priority: INT, 335 ) -> HRESULT, 336 fn GetGPUThreadPriority( 337 pPriority: *mut INT, 338 ) -> HRESULT, 339 }} 340 ENUM!{enum DXGI_ADAPTER_FLAG { 341 DXGI_ADAPTER_FLAG_NONE, 342 DXGI_ADAPTER_FLAG_REMOTE, 343 DXGI_ADAPTER_FLAG_SOFTWARE, 344 }} 345 STRUCT!{struct DXGI_ADAPTER_DESC1 { 346 Description: [WCHAR; 128], 347 VendorId: UINT, 348 DeviceId: UINT, 349 SubSysId: UINT, 350 Revision: UINT, 351 DedicatedVideoMemory: SIZE_T, 352 DedicatedSystemMemory: SIZE_T, 353 SharedSystemMemory: SIZE_T, 354 AdapterLuid: LUID, 355 Flags: UINT, 356 }} 357 STRUCT!{struct DXGI_DISPLAY_COLOR_SPACE { 358 PrimaryCoordinates: [[FLOAT; 2]; 8], 359 WhitePoints: [[FLOAT; 2]; 16], 360 }} 361 RIDL!{#[uuid(0x770aae78, 0xf26f, 0x4dba, 0xa8, 0x29, 0x25, 0x3c, 0x83, 0xd1, 0xb3, 0x87)] 362 interface IDXGIFactory1(IDXGIFactory1Vtbl): IDXGIFactory(IDXGIFactoryVtbl) { 363 fn EnumAdapters1( 364 Adapter: UINT, 365 ppAdapter: *mut *mut IDXGIAdapter1, 366 ) -> HRESULT, 367 fn IsCurrent() -> BOOL, 368 }} 369 RIDL!{#[uuid(0x29038f61, 0x3839, 0x4626, 0x91, 0xfd, 0x08, 0x68, 0x79, 0x01, 0x1a, 0x05)] 370 interface IDXGIAdapter1(IDXGIAdapter1Vtbl): IDXGIAdapter(IDXGIAdapterVtbl) { 371 fn GetDesc1( 372 pDesc: *mut DXGI_ADAPTER_DESC1, 373 ) -> HRESULT, 374 }} 375 RIDL!{#[uuid(0x77db970f, 0x6276, 0x48ba, 0xba, 0x28, 0x07, 0x01, 0x43, 0xb4, 0x39, 0x2c)] 376 interface IDXGIDevice1(IDXGIDevice1Vtbl): IDXGIDevice(IDXGIDeviceVtbl) { 377 fn SetMaximumFrameLatency( 378 MaxLatency: UINT, 379 ) -> HRESULT, 380 fn GetMaximumFrameLatency( 381 pMaxLatency: *mut UINT, 382 ) -> HRESULT, 383 }} 384 DEFINE_GUID!{IID_IDXGIObject, 385 0xaec22fb8, 0x76f3, 0x4639, 0x9b, 0xe0, 0x28, 0xeb, 0x43, 0xa6, 0x7a, 0x2e} 386 DEFINE_GUID!{IID_IDXGIDeviceSubObject, 387 0x3d3e0379, 0xf9de, 0x4d58, 0xbb, 0x6c, 0x18, 0xd6, 0x29, 0x92, 0xf1, 0xa6} 388 DEFINE_GUID!{IID_IDXGIResource, 389 0x035f3ab4, 0x482e, 0x4e50, 0xb4, 0x1f, 0x8a, 0x7f, 0x8b, 0xd8, 0x96, 0x0b} 390 DEFINE_GUID!{IID_IDXGIKeyedMutex, 391 0x9d8e1289, 0xd7b3, 0x465f, 0x81, 0x26, 0x25, 0x0e, 0x34, 0x9a, 0xf8, 0x5d} 392 DEFINE_GUID!{IID_IDXGISurface, 393 0xcafcb56c, 0x6ac3, 0x4889, 0xbf, 0x47, 0x9e, 0x23, 0xbb, 0xd2, 0x60, 0xec} 394 DEFINE_GUID!{IID_IDXGISurface1, 395 0x4ae63092, 0x6327, 0x4c1b, 0x80, 0xae, 0xbf, 0xe1, 0x2e, 0xa3, 0x2b, 0x86} 396 DEFINE_GUID!{IID_IDXGIAdapter, 397 0x2411e7e1, 0x12ac, 0x4ccf, 0xbd, 0x14, 0x97, 0x98, 0xe8, 0x53, 0x4d, 0xc0} 398 DEFINE_GUID!{IID_IDXGIOutput, 399 0xae02eedb, 0xc735, 0x4690, 0x8d, 0x52, 0x5a, 0x8d, 0xc2, 0x02, 0x13, 0xaa} 400 DEFINE_GUID!{IID_IDXGISwapChain, 401 0x310d36a0, 0xd2e7, 0x4c0a, 0xaa, 0x04, 0x6a, 0x9d, 0x23, 0xb8, 0x88, 0x6a} 402 DEFINE_GUID!{IID_IDXGIFactory, 403 0x7b7166ec, 0x21c7, 0x44ae, 0xb2, 0x1a, 0xc9, 0xae, 0x32, 0x1a, 0xe3, 0x69} 404 DEFINE_GUID!{IID_IDXGIDevice, 405 0x54ec77fa, 0x1377, 0x44e6, 0x8c, 0x32, 0x88, 0xfd, 0x5f, 0x44, 0xc8, 0x4c} 406 DEFINE_GUID!{IID_IDXGIFactory1, 407 0x770aae78, 0xf26f, 0x4dba, 0xa8, 0x29, 0x25, 0x3c, 0x83, 0xd1, 0xb3, 0x87} 408 DEFINE_GUID!{IID_IDXGIAdapter1, 409 0x29038f61, 0x3839, 0x4626, 0x91, 0xfd, 0x08, 0x68, 0x79, 0x01, 0x1a, 0x05} 410 DEFINE_GUID!{IID_IDXGIDevice1, 411 0x77db970f, 0x6276, 0x48ba, 0xba, 0x28, 0x07, 0x01, 0x43, 0xb4, 0x39, 0x2c} 412