2 * Copyright 2009 Henri Verbeet for CodeWeavers
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.
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.
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
20 #include "wine/port.h"
22 #include "dxgi_private.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(dxgi
);
26 static inline DXGI_MODE_SCANLINE_ORDER
dxgi_mode_scanline_order_from_wined3d(enum wined3d_scanline_ordering ordering
)
28 return (DXGI_MODE_SCANLINE_ORDER
)ordering
;
31 static inline DXGI_MODE_ROTATION
dxgi_mode_rotation_from_wined3d(enum wined3d_display_rotation rotation
)
33 return (DXGI_MODE_ROTATION
)rotation
;
36 static void dxgi_mode_from_wined3d(DXGI_MODE_DESC
*mode
, const struct wined3d_display_mode
*wined3d_mode
)
38 mode
->Width
= wined3d_mode
->width
;
39 mode
->Height
= wined3d_mode
->height
;
40 mode
->RefreshRate
.Numerator
= wined3d_mode
->refresh_rate
;
41 mode
->RefreshRate
.Denominator
= 1;
42 mode
->Format
= dxgi_format_from_wined3dformat(wined3d_mode
->format_id
);
43 mode
->ScanlineOrdering
= dxgi_mode_scanline_order_from_wined3d(wined3d_mode
->scanline_ordering
);
44 mode
->Scaling
= DXGI_MODE_SCALING_UNSPECIFIED
; /* FIXME */
47 static void dxgi_mode1_from_wined3d(DXGI_MODE_DESC1
*mode
, const struct wined3d_display_mode
*wined3d_mode
)
49 mode
->Width
= wined3d_mode
->width
;
50 mode
->Height
= wined3d_mode
->height
;
51 mode
->RefreshRate
.Numerator
= wined3d_mode
->refresh_rate
;
52 mode
->RefreshRate
.Denominator
= 1;
53 mode
->Format
= dxgi_format_from_wined3dformat(wined3d_mode
->format_id
);
54 mode
->ScanlineOrdering
= dxgi_mode_scanline_order_from_wined3d(wined3d_mode
->scanline_ordering
);
55 mode
->Scaling
= DXGI_MODE_SCALING_UNSPECIFIED
; /* FIXME */
56 mode
->Stereo
= FALSE
; /* FIXME */
59 static HRESULT
dxgi_output_find_closest_matching_mode(struct dxgi_output
*output
,
60 struct wined3d_display_mode
*mode
, IUnknown
*device
)
64 if (!mode
->width
!= !mode
->height
)
65 return DXGI_ERROR_INVALID_CALL
;
67 if (mode
->format_id
== WINED3DFMT_UNKNOWN
&& !device
)
68 return DXGI_ERROR_INVALID_CALL
;
70 if (mode
->format_id
== WINED3DFMT_UNKNOWN
)
72 FIXME("Matching formats to device not implemented.\n");
77 hr
= wined3d_output_find_closest_matching_mode(output
->wined3d_output
, mode
);
78 wined3d_mutex_unlock();
83 static int dxgi_mode_desc_compare(const void *l
, const void *r
)
85 const DXGI_MODE_DESC
*left
= l
, *right
= r
;
88 if (left
->Width
!= right
->Width
)
89 return left
->Width
- right
->Width
;
91 if (left
->Height
!= right
->Height
)
92 return left
->Height
- right
->Height
;
94 a
= left
->RefreshRate
.Numerator
* right
->RefreshRate
.Denominator
;
95 b
= right
->RefreshRate
.Numerator
* left
->RefreshRate
.Denominator
;
102 enum dxgi_mode_struct_version
104 DXGI_MODE_STRUCT_VERSION_0
,
105 DXGI_MODE_STRUCT_VERSION_1
,
108 static HRESULT
dxgi_output_get_display_mode_list(struct dxgi_output
*output
,
109 DXGI_FORMAT format
, unsigned int *mode_count
, void *modes
,
110 enum dxgi_mode_struct_version struct_version
)
112 enum wined3d_format_id wined3d_format
;
113 struct wined3d_display_mode mode
;
114 unsigned int i
, max_count
;
118 return DXGI_ERROR_INVALID_CALL
;
120 if (format
== DXGI_FORMAT_UNKNOWN
)
126 wined3d_format
= wined3dformat_from_dxgi_format(format
);
128 wined3d_mutex_lock();
129 max_count
= wined3d_output_get_mode_count(output
->wined3d_output
,
130 wined3d_format
, WINED3D_SCANLINE_ORDERING_UNKNOWN
);
134 wined3d_mutex_unlock();
135 *mode_count
= max_count
;
139 if (max_count
> *mode_count
)
141 wined3d_mutex_unlock();
142 return DXGI_ERROR_MORE_DATA
;
145 *mode_count
= max_count
;
147 for (i
= 0; i
< *mode_count
; ++i
)
149 if (FAILED(hr
= wined3d_output_get_mode(output
->wined3d_output
, wined3d_format
,
150 WINED3D_SCANLINE_ORDERING_UNKNOWN
, i
, &mode
)))
152 WARN("Failed to get output mode %u, hr %#x.\n", i
, hr
);
153 wined3d_mutex_unlock();
157 switch (struct_version
)
159 case DXGI_MODE_STRUCT_VERSION_0
:
161 DXGI_MODE_DESC
*desc
= modes
;
162 dxgi_mode_from_wined3d(&desc
[i
], &mode
);
166 case DXGI_MODE_STRUCT_VERSION_1
:
168 DXGI_MODE_DESC1
*desc
= modes
;
169 dxgi_mode1_from_wined3d(&desc
[i
], &mode
);
174 wined3d_mutex_unlock();
176 switch (struct_version
)
178 case DXGI_MODE_STRUCT_VERSION_0
:
179 qsort(modes
, *mode_count
, sizeof(DXGI_MODE_DESC
), dxgi_mode_desc_compare
);
181 case DXGI_MODE_STRUCT_VERSION_1
:
182 qsort(modes
, *mode_count
, sizeof(DXGI_MODE_DESC1
), dxgi_mode_desc_compare
);
189 static inline struct dxgi_output
*impl_from_IDXGIOutput6(IDXGIOutput6
*iface
)
191 return CONTAINING_RECORD(iface
, struct dxgi_output
, IDXGIOutput6_iface
);
194 /* IUnknown methods */
196 static HRESULT STDMETHODCALLTYPE
dxgi_output_QueryInterface(IDXGIOutput6
*iface
, REFIID iid
, void **object
)
198 TRACE("iface %p, iid %s, object %p.\n", iface
, debugstr_guid(iid
), object
);
200 if (IsEqualGUID(iid
, &IID_IDXGIOutput6
)
201 || IsEqualGUID(iid
, &IID_IDXGIOutput5
)
202 || IsEqualGUID(iid
, &IID_IDXGIOutput4
)
203 || IsEqualGUID(iid
, &IID_IDXGIOutput3
)
204 || IsEqualGUID(iid
, &IID_IDXGIOutput2
)
205 || IsEqualGUID(iid
, &IID_IDXGIOutput1
)
206 || IsEqualGUID(iid
, &IID_IDXGIOutput
)
207 || IsEqualGUID(iid
, &IID_IDXGIObject
)
208 || IsEqualGUID(iid
, &IID_IUnknown
))
210 IUnknown_AddRef(iface
);
215 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid
));
218 return E_NOINTERFACE
;
221 static ULONG STDMETHODCALLTYPE
dxgi_output_AddRef(IDXGIOutput6
*iface
)
223 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
224 ULONG refcount
= InterlockedIncrement(&output
->refcount
);
226 TRACE("%p increasing refcount to %u.\n", output
, refcount
);
231 static ULONG STDMETHODCALLTYPE
dxgi_output_Release(IDXGIOutput6
*iface
)
233 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
234 ULONG refcount
= InterlockedDecrement(&output
->refcount
);
236 TRACE("%p decreasing refcount to %u.\n", output
, refcount
);
240 wined3d_private_store_cleanup(&output
->private_store
);
241 IWineDXGIAdapter_Release(&output
->adapter
->IWineDXGIAdapter_iface
);
248 /* IDXGIObject methods */
250 static HRESULT STDMETHODCALLTYPE
dxgi_output_SetPrivateData(IDXGIOutput6
*iface
,
251 REFGUID guid
, UINT data_size
, const void *data
)
253 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
255 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
257 return dxgi_set_private_data(&output
->private_store
, guid
, data_size
, data
);
260 static HRESULT STDMETHODCALLTYPE
dxgi_output_SetPrivateDataInterface(IDXGIOutput6
*iface
,
261 REFGUID guid
, const IUnknown
*object
)
263 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
265 TRACE("iface %p, guid %s, object %p.\n", iface
, debugstr_guid(guid
), object
);
267 return dxgi_set_private_data_interface(&output
->private_store
, guid
, object
);
270 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetPrivateData(IDXGIOutput6
*iface
,
271 REFGUID guid
, UINT
*data_size
, void *data
)
273 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
275 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
277 return dxgi_get_private_data(&output
->private_store
, guid
, data_size
, data
);
280 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetParent(IDXGIOutput6
*iface
,
281 REFIID riid
, void **parent
)
283 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
285 TRACE("iface %p, riid %s, parent %p.\n", iface
, debugstr_guid(riid
), parent
);
287 return IWineDXGIAdapter_QueryInterface(&output
->adapter
->IWineDXGIAdapter_iface
, riid
, parent
);
290 /* IDXGIOutput methods */
292 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetDesc(IDXGIOutput6
*iface
, DXGI_OUTPUT_DESC
*desc
)
294 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
295 struct wined3d_output_desc wined3d_desc
;
296 enum wined3d_display_rotation rotation
;
297 struct wined3d_display_mode mode
;
300 TRACE("iface %p, desc %p.\n", iface
, desc
);
305 wined3d_mutex_lock();
306 hr
= wined3d_output_get_desc(output
->wined3d_output
, &wined3d_desc
);
309 WARN("Failed to get output desc, hr %#x.\n", hr
);
310 wined3d_mutex_unlock();
314 hr
= wined3d_output_get_display_mode(output
->wined3d_output
, &mode
, &rotation
);
317 WARN("Failed to get output display mode, hr %#x.\n", hr
);
318 wined3d_mutex_unlock();
321 wined3d_mutex_unlock();
323 memcpy(desc
->DeviceName
, wined3d_desc
.device_name
, sizeof(desc
->DeviceName
));
324 desc
->DesktopCoordinates
= wined3d_desc
.desktop_rect
;
325 desc
->AttachedToDesktop
= wined3d_desc
.attached_to_desktop
;
326 desc
->Rotation
= dxgi_mode_rotation_from_wined3d(rotation
);
327 desc
->Monitor
= wined3d_desc
.monitor
;
332 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetDisplayModeList(IDXGIOutput6
*iface
,
333 DXGI_FORMAT format
, UINT flags
, UINT
*mode_count
, DXGI_MODE_DESC
*modes
)
335 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
337 FIXME("iface %p, format %s, flags %#x, mode_count %p, modes %p partial stub!\n",
338 iface
, debug_dxgi_format(format
), flags
, mode_count
, modes
);
340 return dxgi_output_get_display_mode_list(output
,
341 format
, mode_count
, modes
, DXGI_MODE_STRUCT_VERSION_0
);
344 static HRESULT STDMETHODCALLTYPE
dxgi_output_FindClosestMatchingMode(IDXGIOutput6
*iface
,
345 const DXGI_MODE_DESC
*mode
, DXGI_MODE_DESC
*closest_match
, IUnknown
*device
)
347 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
348 struct wined3d_display_mode wined3d_mode
;
351 TRACE("iface %p, mode %p, closest_match %p, device %p.\n",
352 iface
, mode
, closest_match
, device
);
354 TRACE("Mode: %s.\n", debug_dxgi_mode(mode
));
356 wined3d_display_mode_from_dxgi(&wined3d_mode
, mode
);
357 hr
= dxgi_output_find_closest_matching_mode(output
, &wined3d_mode
, device
);
360 dxgi_mode_from_wined3d(closest_match
, &wined3d_mode
);
361 TRACE("Returning %s.\n", debug_dxgi_mode(closest_match
));
367 static HRESULT STDMETHODCALLTYPE
dxgi_output_WaitForVBlank(IDXGIOutput6
*iface
)
369 static BOOL once
= FALSE
;
372 FIXME("iface %p stub!\n", iface
);
374 TRACE("iface %p stub!\n", iface
);
379 static HRESULT STDMETHODCALLTYPE
dxgi_output_TakeOwnership(IDXGIOutput6
*iface
, IUnknown
*device
, BOOL exclusive
)
381 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
384 TRACE("iface %p, device %p, exclusive %d.\n", iface
, device
, exclusive
);
387 return DXGI_ERROR_INVALID_CALL
;
389 wined3d_mutex_lock();
390 hr
= wined3d_output_take_ownership(output
->wined3d_output
, exclusive
);
391 wined3d_mutex_unlock();
396 static void STDMETHODCALLTYPE
dxgi_output_ReleaseOwnership(IDXGIOutput6
*iface
)
398 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
400 TRACE("iface %p.\n", iface
);
402 wined3d_mutex_lock();
403 wined3d_output_release_ownership(output
->wined3d_output
);
404 wined3d_mutex_unlock();
407 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetGammaControlCapabilities(IDXGIOutput6
*iface
,
408 DXGI_GAMMA_CONTROL_CAPABILITIES
*gamma_caps
)
412 TRACE("iface %p, gamma_caps %p.\n", iface
, gamma_caps
);
417 gamma_caps
->ScaleAndOffsetSupported
= FALSE
;
418 gamma_caps
->MaxConvertedValue
= 1.0f
;
419 gamma_caps
->MinConvertedValue
= 0.0f
;
420 gamma_caps
->NumGammaControlPoints
= 256;
422 for (i
= 0; i
< gamma_caps
->NumGammaControlPoints
; ++i
)
423 gamma_caps
->ControlPointPositions
[i
] = i
/ 255.0f
;
428 static WORD
uint16_from_float(float f
)
433 else if (f
> 65535.0f
)
439 static HRESULT STDMETHODCALLTYPE
dxgi_output_SetGammaControl(IDXGIOutput6
*iface
,
440 const DXGI_GAMMA_CONTROL
*gamma_control
)
442 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
443 struct wined3d_gamma_ramp ramp
;
447 TRACE("iface %p, gamma_control %p.\n", iface
, gamma_control
);
449 if (gamma_control
->Scale
.Red
!= 1.0f
|| gamma_control
->Scale
.Green
!= 1.0f
|| gamma_control
->Scale
.Blue
!= 1.0f
)
450 FIXME("Ignoring unhandled scale {%.8e, %.8e, %.8e}.\n", gamma_control
->Scale
.Red
,
451 gamma_control
->Scale
.Green
, gamma_control
->Scale
.Blue
);
452 if (gamma_control
->Offset
.Red
!= 0.0f
|| gamma_control
->Offset
.Green
!= 0.0f
|| gamma_control
->Offset
.Blue
!= 0.0f
)
453 FIXME("Ignoring unhandled offset {%.8e, %.8e, %.8e}.\n", gamma_control
->Offset
.Red
,
454 gamma_control
->Offset
.Green
, gamma_control
->Offset
.Blue
);
456 for (i
= 0; i
< 256; ++i
)
458 p
= &gamma_control
->GammaCurve
[i
];
459 ramp
.red
[i
] = uint16_from_float(p
->Red
);
460 ramp
.green
[i
] = uint16_from_float(p
->Green
);
461 ramp
.blue
[i
] = uint16_from_float(p
->Blue
);
464 wined3d_mutex_lock();
465 wined3d_output_set_gamma_ramp(output
->wined3d_output
, &ramp
);
466 wined3d_mutex_unlock();
471 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetGammaControl(IDXGIOutput6
*iface
,
472 DXGI_GAMMA_CONTROL
*gamma_control
)
474 FIXME("iface %p, gamma_control %p stub!\n", iface
, gamma_control
);
479 static HRESULT STDMETHODCALLTYPE
dxgi_output_SetDisplaySurface(IDXGIOutput6
*iface
, IDXGISurface
*surface
)
481 FIXME("iface %p, surface %p stub!\n", iface
, surface
);
486 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetDisplaySurfaceData(IDXGIOutput6
*iface
, IDXGISurface
*surface
)
488 FIXME("iface %p, surface %p stub!\n", iface
, surface
);
493 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetFrameStatistics(IDXGIOutput6
*iface
, DXGI_FRAME_STATISTICS
*stats
)
495 FIXME("iface %p, stats %p stub!\n", iface
, stats
);
500 /* IDXGIOutput1 methods */
502 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetDisplayModeList1(IDXGIOutput6
*iface
,
503 DXGI_FORMAT format
, UINT flags
, UINT
*mode_count
, DXGI_MODE_DESC1
*modes
)
505 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
507 FIXME("iface %p, format %s, flags %#x, mode_count %p, modes %p partial stub!\n",
508 iface
, debug_dxgi_format(format
), flags
, mode_count
, modes
);
510 return dxgi_output_get_display_mode_list(output
,
511 format
, mode_count
, modes
, DXGI_MODE_STRUCT_VERSION_1
);
514 static HRESULT STDMETHODCALLTYPE
dxgi_output_FindClosestMatchingMode1(IDXGIOutput6
*iface
,
515 const DXGI_MODE_DESC1
*mode
, DXGI_MODE_DESC1
*closest_match
, IUnknown
*device
)
517 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
518 struct wined3d_display_mode wined3d_mode
;
521 TRACE("iface %p, mode %p, closest_match %p, device %p.\n",
522 iface
, mode
, closest_match
, device
);
524 TRACE("Mode: %s.\n", debug_dxgi_mode1(mode
));
526 wined3d_display_mode_from_dxgi1(&wined3d_mode
, mode
);
527 hr
= dxgi_output_find_closest_matching_mode(output
, &wined3d_mode
, device
);
530 dxgi_mode1_from_wined3d(closest_match
, &wined3d_mode
);
531 TRACE("Returning %s.\n", debug_dxgi_mode1(closest_match
));
537 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetDisplaySurfaceData1(IDXGIOutput6
*iface
,
538 IDXGIResource
*resource
)
540 FIXME("iface %p, resource %p stub!\n", iface
, resource
);
545 static HRESULT STDMETHODCALLTYPE
dxgi_output_DuplicateOutput(IDXGIOutput6
*iface
,
546 IUnknown
*device
, IDXGIOutputDuplication
**output_duplication
)
548 FIXME("iface %p, device %p, output_duplication %p stub!\n", iface
, device
, output_duplication
);
553 /* IDXGIOutput2 methods */
555 static BOOL STDMETHODCALLTYPE
dxgi_output_SupportsOverlays(IDXGIOutput6
*iface
)
557 FIXME("iface %p stub!\n", iface
);
562 /* IDXGIOutput3 methods */
564 static HRESULT STDMETHODCALLTYPE
dxgi_output_CheckOverlaySupport(IDXGIOutput6
*iface
,
565 DXGI_FORMAT format
, IUnknown
*device
, UINT
*flags
)
567 FIXME("iface %p, format %#x, device %p, flags %p stub!\n", iface
, format
, device
, flags
);
572 /* IDXGIOutput4 methods */
574 static HRESULT STDMETHODCALLTYPE
dxgi_output_CheckOverlayColorSpaceSupport(IDXGIOutput6
*iface
,
575 DXGI_FORMAT format
, DXGI_COLOR_SPACE_TYPE color_space
, IUnknown
*device
, UINT
*flags
)
577 FIXME("iface %p, format %#x, color_space %#x, device %p, flags %p stub!\n",
578 iface
, format
, color_space
, device
, flags
);
583 /* IDXGIOutput5 methods */
585 static HRESULT STDMETHODCALLTYPE
dxgi_output_DuplicateOutput1(IDXGIOutput6
*iface
,
586 IUnknown
*device
, UINT flags
, UINT format_count
, const DXGI_FORMAT
*formats
,
587 IDXGIOutputDuplication
**output_duplication
)
589 FIXME("iface %p, device %p, flags %#x, format_count %u, formats %p, "
590 "output_duplication %p stub!\n", iface
, device
, flags
, format_count
,
591 formats
, output_duplication
);
596 /* IDXGIOutput6 methods */
598 static HRESULT STDMETHODCALLTYPE
dxgi_output_GetDesc1(IDXGIOutput6
*iface
,
599 DXGI_OUTPUT_DESC1
*desc
)
601 struct dxgi_output
*output
= impl_from_IDXGIOutput6(iface
);
602 struct wined3d_output_desc wined3d_desc
;
603 enum wined3d_display_rotation rotation
;
604 struct wined3d_display_mode mode
;
607 FIXME("iface %p, desc %p semi-stub!\n", iface
, desc
);
612 wined3d_mutex_lock();
613 hr
= wined3d_output_get_desc(output
->wined3d_output
, &wined3d_desc
);
616 WARN("Failed to get output desc, hr %#x.\n", hr
);
617 wined3d_mutex_unlock();
621 hr
= wined3d_output_get_display_mode(output
->wined3d_output
, &mode
, &rotation
);
624 WARN("Failed to get output display mode, hr %#x.\n", hr
);
625 wined3d_mutex_unlock();
628 wined3d_mutex_unlock();
632 WARN("Failed to get output desc, hr %#x.\n", hr
);
636 memcpy(desc
->DeviceName
, wined3d_desc
.device_name
, sizeof(desc
->DeviceName
));
637 desc
->DesktopCoordinates
= wined3d_desc
.desktop_rect
;
638 desc
->AttachedToDesktop
= wined3d_desc
.attached_to_desktop
;
639 desc
->Rotation
= dxgi_mode_rotation_from_wined3d(rotation
);
640 desc
->Monitor
= wined3d_desc
.monitor
;
642 /* FIXME: fill this from monitor EDID */
643 desc
->BitsPerColor
= 0;
644 desc
->ColorSpace
= DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709
;
645 desc
->RedPrimary
[0] = 0.f
;
646 desc
->RedPrimary
[1] = 0.f
;
647 desc
->GreenPrimary
[0] = 0.f
;
648 desc
->GreenPrimary
[1] = 0.f
;
649 desc
->BluePrimary
[0] = 0.f
;
650 desc
->BluePrimary
[1] = 0.f
;
651 desc
->WhitePoint
[0] = 0.f
;
652 desc
->WhitePoint
[1] = 0.f
;
653 desc
->MinLuminance
= 0.f
;
654 desc
->MaxLuminance
= 0.f
;
655 desc
->MaxFullFrameLuminance
= 0.f
;
660 static HRESULT STDMETHODCALLTYPE
dxgi_output_CheckHardwareCompositionSupport(IDXGIOutput6
*iface
,
663 FIXME("iface %p, flags %p stub!\n", iface
, flags
);
668 static const struct IDXGIOutput6Vtbl dxgi_output_vtbl
=
670 dxgi_output_QueryInterface
,
673 /* IDXGIObject methods */
674 dxgi_output_SetPrivateData
,
675 dxgi_output_SetPrivateDataInterface
,
676 dxgi_output_GetPrivateData
,
677 dxgi_output_GetParent
,
678 /* IDXGIOutput methods */
680 dxgi_output_GetDisplayModeList
,
681 dxgi_output_FindClosestMatchingMode
,
682 dxgi_output_WaitForVBlank
,
683 dxgi_output_TakeOwnership
,
684 dxgi_output_ReleaseOwnership
,
685 dxgi_output_GetGammaControlCapabilities
,
686 dxgi_output_SetGammaControl
,
687 dxgi_output_GetGammaControl
,
688 dxgi_output_SetDisplaySurface
,
689 dxgi_output_GetDisplaySurfaceData
,
690 dxgi_output_GetFrameStatistics
,
691 /* IDXGIOutput1 methods */
692 dxgi_output_GetDisplayModeList1
,
693 dxgi_output_FindClosestMatchingMode1
,
694 dxgi_output_GetDisplaySurfaceData1
,
695 dxgi_output_DuplicateOutput
,
696 /* IDXGIOutput2 methods */
697 dxgi_output_SupportsOverlays
,
698 /* IDXGIOutput3 methods */
699 dxgi_output_CheckOverlaySupport
,
700 /* IDXGIOutput4 methods */
701 dxgi_output_CheckOverlayColorSpaceSupport
,
702 /* IDXGIOutput5 methods */
703 dxgi_output_DuplicateOutput1
,
704 /* IDXGIOutput6 methods */
705 dxgi_output_GetDesc1
,
706 dxgi_output_CheckHardwareCompositionSupport
,
709 struct dxgi_output
*unsafe_impl_from_IDXGIOutput(IDXGIOutput
*iface
)
713 assert(iface
->lpVtbl
== (IDXGIOutputVtbl
*)&dxgi_output_vtbl
);
714 return CONTAINING_RECORD(iface
, struct dxgi_output
, IDXGIOutput6_iface
);
717 static void dxgi_output_init(struct dxgi_output
*output
, unsigned int output_idx
,
718 struct dxgi_adapter
*adapter
)
720 output
->IDXGIOutput6_iface
.lpVtbl
= &dxgi_output_vtbl
;
721 output
->refcount
= 1;
722 output
->wined3d_output
= wined3d_adapter_get_output(adapter
->wined3d_adapter
, output_idx
);
723 wined3d_private_store_init(&output
->private_store
);
724 output
->adapter
= adapter
;
725 IWineDXGIAdapter_AddRef(&output
->adapter
->IWineDXGIAdapter_iface
);
728 HRESULT
dxgi_output_create(struct dxgi_adapter
*adapter
, unsigned int output_idx
,
729 struct dxgi_output
**output
)
731 if (!(*output
= heap_alloc_zero(sizeof(**output
))))
732 return E_OUTOFMEMORY
;
734 dxgi_output_init(*output
, output_idx
, adapter
);