1 // Copyright © 2015; Dmitry Roschin
2 // Licensed under the MIT License <LICENSE.md>
3 //! Mappings for the contents of dxgi1_2.h
4 
5 ENUM!{ enum DXGI_ALPHA_MODE {
6     DXGI_ALPHA_MODE_UNSPECIFIED = 0,
7     DXGI_ALPHA_MODE_PREMULTIPLIED = 1,
8     DXGI_ALPHA_MODE_STRAIGHT = 2,
9     DXGI_ALPHA_MODE_IGNORE = 3,
10     DXGI_ALPHA_MODE_FORCE_DWORD = 0xFFFFFFFF,
11 }}
12 
13 ENUM!{ enum DXGI_COMPUTE_PREEMPTION_GRANULARITY {
14     DXGI_COMPUTE_PREEMPTION_DMA_BUFFER_BOUNDARY = 0,
15     DXGI_COMPUTE_PREEMPTION_DISPATCH_BOUNDARY = 1,
16     DXGI_COMPUTE_PREEMPTION_THREAD_GROUP_BOUNDARY = 2,
17     DXGI_COMPUTE_PREEMPTION_THREAD_BOUNDARY = 3,
18     DXGI_COMPUTE_PREEMPTION_INSTRUCTION_BOUNDARY = 4,
19 }}
20 
21 ENUM!{ enum DXGI_GRAPHICS_PREEMPTION_GRANULARITY {
22     DXGI_GRAPHICS_PREEMPTION_DMA_BUFFER_BOUNDARY = 0,
23     DXGI_GRAPHICS_PREEMPTION_PRIMITIVE_BOUNDARY = 1,
24     DXGI_GRAPHICS_PREEMPTION_TRIANGLE_BOUNDARY = 2,
25     DXGI_GRAPHICS_PREEMPTION_PIXEL_BOUNDARY = 3,
26     DXGI_GRAPHICS_PREEMPTION_INSTRUCTION_BOUNDARY = 4,
27 }}
28 
29 ENUM!{ enum DXGI_OUTDUPL_POINTER_SHAPE_TYPE {
30     DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME = 1,
31     DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR = 2,
32     DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR = 4,
33 }}
34 
35 ENUM!{ enum DXGI_SCALING {
36     DXGI_SCALING_STRETCH = 0,
37     DXGI_SCALING_NONE = 1,
38     DXGI_SCALING_ASPECT_RATIO_STRETCH = 2,
39 }}
40 
41 ENUM!{ enum _DXGI_OFFER_RESOURCE_PRIORITY {
42     DXGI_OFFER_RESOURCE_PRIORITY_LOW = 1,
43     DXGI_OFFER_RESOURCE_PRIORITY_NORMAL = 2,
44     DXGI_OFFER_RESOURCE_PRIORITY_HIGH = 3,
45 }}
46 
47 STRUCT!{nodebug struct DXGI_ADAPTER_DESC2 {
48     Description: [::WCHAR; 128],
49     VendorId: ::UINT,
50     DeviceId: ::UINT,
51     SubSysId: ::UINT,
52     Revision: ::UINT,
53     DedicatedVideoMemory: ::SIZE_T,
54     DedicatedSystemMemory: ::SIZE_T,
55     SharedSystemMemory: ::SIZE_T,
56     AdapterLuid: ::LUID,
57     Flags: ::UINT,
58     GraphicsPreemptionGranularity: ::DXGI_GRAPHICS_PREEMPTION_GRANULARITY,
59     ComputePreemptionGranularity: ::DXGI_COMPUTE_PREEMPTION_GRANULARITY,
60 }}
61 
62 STRUCT!{struct DXGI_MODE_DESC1 {
63     Width: ::UINT,
64     Height: ::UINT,
65     RefreshRate: ::DXGI_RATIONAL,
66     Format: ::DXGI_FORMAT,
67     ScanlineOrdering: ::DXGI_MODE_SCANLINE_ORDER,
68     Scaling: ::DXGI_MODE_SCALING,
69     Stereo: ::BOOL,
70 }}
71 
72 STRUCT!{struct DXGI_OUTDUPL_DESC {
73     ModeDesc: ::DXGI_MODE_DESC,
74     Rotation: ::DXGI_MODE_ROTATION,
75     DesktopImageInSystemMemory: ::BOOL,
76 }}
77 
78 STRUCT!{struct DXGI_OUTDUPL_FRAME_INFO {
79     LastPresentTime: ::LARGE_INTEGER,
80     LastMouseUpdateTime: ::LARGE_INTEGER,
81     AccumulatedFrames: ::UINT,
82     RectsCoalesced: ::BOOL,
83     ProtectedContentMaskedOut: ::BOOL,
84     PointerPosition: ::DXGI_OUTDUPL_POINTER_POSITION,
85     TotalMetadataBufferSize: ::UINT,
86     PointerShapeBufferSize: ::UINT,
87 }}
88 
89 STRUCT!{struct DXGI_OUTDUPL_MOVE_RECT {
90     SourcePoint: ::POINT,
91     DestinationRect: ::RECT,
92 }}
93 
94 STRUCT!{struct DXGI_OUTDUPL_POINTER_POSITION {
95     Position: ::POINT,
96     Visible: ::BOOL,
97 }}
98 
99 STRUCT!{struct DXGI_OUTDUPL_POINTER_SHAPE_INFO {
100     Type: ::UINT,
101     Width: ::UINT,
102     Height: ::UINT,
103     Pitch: ::UINT,
104     HotSpot: ::POINT,
105 }}
106 
107 STRUCT!{struct DXGI_PRESENT_PARAMETERS {
108     DirtyRectsCount: ::UINT,
109     pDirtyRects: *mut ::RECT,
110     pScrollRect: *mut ::RECT,
111     pScrollOffset: *mut ::POINT,
112 }}
113 
114 STRUCT!{struct DXGI_SWAP_CHAIN_DESC1 {
115     Width: ::UINT,
116     Height: ::UINT,
117     Format: ::DXGI_FORMAT,
118     Stereo: ::BOOL,
119     SampleDesc: ::DXGI_SAMPLE_DESC,
120     BufferUsage: ::DXGI_USAGE,
121     BufferCount: ::UINT,
122     Scaling: ::DXGI_SCALING,
123     SwapEffect: ::DXGI_SWAP_EFFECT,
124     AlphaMode: ::DXGI_ALPHA_MODE,
125     Flags: ::UINT,
126 }}
127 
128 STRUCT!{struct DXGI_SWAP_CHAIN_FULLSCREEN_DESC {
129     RefreshRate: ::DXGI_RATIONAL,
130     ScanlineOrdering: ::DXGI_MODE_SCANLINE_ORDER,
131     Scaling: ::DXGI_MODE_SCALING,
132     Windowed: ::BOOL,
133 }}
134 
135 RIDL!(
136 interface IDXGIAdapter2(IDXGIAdapter2Vtbl): IDXGIAdapter1(IDXGIAdapter1Vtbl) {
137     fn GetDesc2(&mut self, pDesc: *mut ::DXGI_ADAPTER_DESC2) -> ::HRESULT
138 });
139 
140 RIDL!(
141 interface IDXGIDevice2(IDXGIDevice2Vtbl): IDXGIDevice1(IDXGIDevice1Vtbl) {
142     fn OfferResources(
143         &mut self, NumResources: ::UINT, ppResources: *mut *mut ::IDXGIResource,
144         Priority: ::DXGI_OFFER_RESOURCE_PRIORITY
145     ) -> ::HRESULT,
146     fn ReclaimResources(
147         &mut self, NumResources: ::UINT, ppResources: *mut *mut ::IDXGIResource,
148         pDiscarded: *mut ::BOOL
149     ) -> ::HRESULT,
150     fn EnqueueSetEvent(&mut self, hEvent: ::HANDLE) -> ::HRESULT
151 });
152 
153 RIDL!(
154 interface IDXGIDisplayControl(IDXGIDisplayControlVtbl): IUnknown(IUnknownVtbl) {
155     fn IsStereoEnabled(&mut self) -> ::BOOL,
156     fn SetStereoEnabled(&mut self, enabled: ::BOOL) -> ()
157 });
158 
159 RIDL!(
160 interface IDXGIFactory2(IDXGIFactory2Vtbl): IDXGIFactory1(IDXGIFactory1Vtbl) {
161     fn IsWindowedStereoEnabled(&mut self) -> ::BOOL,
162     fn CreateSwapChainForHwnd(
163         &mut self, pDevice: *mut ::IUnknown, hWnd: ::HWND, pDesc: *const ::DXGI_SWAP_CHAIN_DESC1,
164         pFullscreenDesc: *const ::DXGI_SWAP_CHAIN_FULLSCREEN_DESC,
165         pRestrictToOutput: *mut ::IDXGIOutput, ppSwapChain: *mut *mut ::IDXGISwapChain1
166     ) -> ::HRESULT,
167     fn CreateSwapChainForCoreWindow(
168         &mut self, pDevice: *mut ::IUnknown, pWindow: *mut ::IUnknown,
169         pDesc: *const ::DXGI_SWAP_CHAIN_DESC1, pRestrictToOutput: *mut ::IDXGIOutput,
170         ppSwapChain: *mut *mut ::IDXGISwapChain1
171     ) -> ::HRESULT,
172     fn GetSharedResourceAdapterLuid(
173         &mut self, hResource: ::HANDLE, pLuid: *mut ::LUID
174     ) -> ::HRESULT,
175     fn RegisterStereoStatusWindow(
176         &mut self, WindowHandle: ::HWND, wMsg: ::UINT, pdwCookie: *mut ::DWORD
177     ) -> ::HRESULT,
178     fn RegisterStereoStatusEvent(
179         &mut self, hEvent: ::HANDLE, pdwCookie: *mut ::DWORD
180     ) -> ::HRESULT,
181     fn UnregisterStereoStatus(&mut self, dwCookie: ::DWORD) -> (),
182     fn RegisterOcclusionStatusWindow(
183         &mut self, WindowHandle: ::HWND, wMsg: ::UINT, pdwCookie: *mut ::DWORD
184     ) -> ::HRESULT,
185     fn RegisterOcclusionStatusEvent(
186         &mut self, hEvent: ::HANDLE, pdwCookie: *mut ::DWORD
187     ) -> ::HRESULT,
188     fn UnregisterOcclusionStatus(&mut self, dwCookie: ::DWORD) -> (),
189     fn CreateSwapChainForComposition(
190         &mut self, pDevice: *mut ::IUnknown, pDesc: *const ::DXGI_SWAP_CHAIN_DESC1,
191         pRestrictToOutput: *mut ::IDXGIOutput, ppSwapChain: *mut *mut ::IDXGISwapChain1
192     ) -> ::HRESULT
193 });
194 
195 RIDL!(
196 interface IDXGIOutput1(IDXGIOutput1Vtbl): IDXGIOutput(IDXGIOutputVtbl) {
197     fn GetDisplayModeList1(
198         &mut self, EnumFormat: ::DXGI_FORMAT, Flags: ::UINT, pNumModes: *mut ::UINT,
199         pDesc: *mut ::DXGI_MODE_DESC1
200     ) -> ::HRESULT,
201     fn FindClosestMatchingMode1(
202         &mut self, pModeToMatch: *const ::DXGI_MODE_DESC1, pClosestMatch: *mut ::DXGI_MODE_DESC1,
203         pConcernedDevice: *mut ::IUnknown
204     ) -> ::HRESULT,
205     fn GetDisplaySurfaceData1(
206         &mut self, pDestination: *mut ::IDXGIResource
207     ) -> ::HRESULT,
208     fn DuplicateOutput(
209         &mut self, pDevice: *mut ::IUnknown,
210         ppOutputDuplication: *mut *mut ::IDXGIOutputDuplication
211     ) -> ::HRESULT
212 });
213 
214 RIDL!(
215 interface IDXGIOutputDuplication(IDXGIOutputDuplicationVtbl): IDXGIObject(IDXGIObjectVtbl) {
216     fn GetDesc(&mut self, pDesc: *mut ::DXGI_OUTDUPL_DESC) -> (),
217     fn AcquireNextFrame(
218         &mut self, TimeoutInMilliseconds: ::UINT, pFrameInfo: *mut ::DXGI_OUTDUPL_FRAME_INFO,
219         ppDesktopResource: *mut *mut ::IDXGIResource
220     ) -> ::HRESULT,
221     fn GetFrameDirtyRects(
222         &mut self, DirtyRectsBufferSize: ::UINT, pDirtyRectsBuffer: *mut ::RECT,
223         pDirtyRectsBufferSizeRequired: *mut ::UINT
224     ) -> ::HRESULT,
225     fn GetFrameMoveRects(
226         &mut self, MoveRectsBufferSize: ::UINT, pMoveRectBuffer: *mut ::DXGI_OUTDUPL_MOVE_RECT,
227         pMoveRectsBufferSizeRequired: *mut ::UINT
228     ) -> ::HRESULT,
229     fn GetFramePointerShape(
230         &mut self, PointerShapeBufferSize: ::UINT, pPointerShapeBuffer: *mut ::c_void,
231         pPointerShapeBufferSizeRequired: *mut ::UINT,
232         pPointerShapeInfo: *mut ::DXGI_OUTDUPL_POINTER_SHAPE_INFO
233     ) -> ::HRESULT,
234     fn MapDesktopSurface(
235         &mut self, pLockedRect: *mut ::DXGI_MAPPED_RECT
236     ) -> ::HRESULT,
237     fn UnMapDesktopSurface(&mut self) -> ::HRESULT,
238     fn ReleaseFrame(&mut self) -> ::HRESULT
239 });
240 
241 RIDL!(
242 interface IDXGIResource1(IDXGIResource1Vtbl): IDXGIResource(IDXGIResourceVtbl) {
243     fn CreateSubresourceSurface(
244         &mut self, index: ::UINT, ppSurface: *mut *mut ::IDXGISurface2
245     ) -> ::HRESULT,
246     fn CreateSharedHandle(
247         &mut self, pAttributes: *const ::SECURITY_ATTRIBUTES, dwAccess: ::DWORD, lpName: ::LPCWSTR,
248         pHandle: *mut ::HANDLE
249     ) -> ::HRESULT
250 });
251 
252 RIDL!(
253 interface IDXGISurface2(IDXGISurface2Vtbl): IDXGISurface1(IDXGISurface1Vtbl) {
254     fn GetResource(
255         &mut self, riid: ::REFGUID, ppParentResource: *mut *mut ::c_void,
256         pSubresourceIndex: *mut ::UINT
257     ) -> ::HRESULT
258 });
259 
260 RIDL!(
261 interface IDXGISwapChain1(IDXGISwapChain1Vtbl): IDXGISwapChain(IDXGISwapChainVtbl) {
262     fn GetDesc1(&mut self, pDesc: *mut ::DXGI_SWAP_CHAIN_DESC1) -> ::HRESULT,
263     fn GetFullscreenDesc(
264         &mut self, pDesc: *mut ::DXGI_SWAP_CHAIN_FULLSCREEN_DESC
265     ) -> ::HRESULT,
266     fn GetHwnd(&mut self, pHwnd: *mut ::HWND) -> ::HRESULT,
267     fn GetCoreWindow(
268         &mut self, refiid: ::REFGUID, ppUnk: *mut *mut ::c_void
269     ) -> ::HRESULT,
270     fn Present1(
271         &mut self, SyncInterval: ::UINT, PresentFlags: ::UINT,
272         pPresentParameters: *const ::DXGI_PRESENT_PARAMETERS
273     ) -> ::HRESULT,
274     fn IsTemporaryMonoSupported(&mut self) -> ::BOOL,
275     fn GetRestrictToOutput(
276         &mut self, ppRestrictToOutput: *mut *mut ::IDXGIOutput
277     ) -> ::HRESULT,
278     fn SetBackgroundColor(&mut self, pColor: *const ::DXGI_RGBA) -> ::HRESULT,
279     fn GetBackgroundColor(&mut self, pColor: *mut ::DXGI_RGBA) -> ::HRESULT,
280     fn SetRotation(&mut self, Rotation: ::DXGI_MODE_ROTATION) -> ::HRESULT,
281     fn GetRotation(&mut self, pRotation: *mut ::DXGI_MODE_ROTATION) -> ::HRESULT
282 });
283 
284 pub type DXGI_OFFER_RESOURCE_PRIORITY = ::_DXGI_OFFER_RESOURCE_PRIORITY;
285 pub const DXGI_ENUM_MODES_DISABLED_STEREO: ::UINT = 8;
286 pub const DXGI_ENUM_MODES_STEREO: ::UINT = 4;
287 pub const DXGI_SHARED_RESOURCE_READ: ::UINT = 0x80000000;
288 pub const DXGI_SHARED_RESOURCE_WRITE: ::UINT = 1;
289