hidclass.sys: Remove old reports from WINE_HIDP_PREPARSED_DATA.
[wine.git] / dlls / dxgi / output.c
blobf341388766caf56169584a5d4e3add2b412dfb41
1 /*
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
19 #include "config.h"
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)
62 HRESULT hr;
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");
73 return E_NOTIMPL;
76 wined3d_mutex_lock();
77 hr = wined3d_output_find_closest_matching_mode(output->wined3d_output, mode);
78 wined3d_mutex_unlock();
80 return hr;
83 static int dxgi_mode_desc_compare(const void *l, const void *r)
85 const DXGI_MODE_DESC *left = l, *right = r;
86 int a, b;
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;
96 if (a != b)
97 return a - b;
99 return 0;
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;
115 HRESULT hr;
117 if (!mode_count)
118 return DXGI_ERROR_INVALID_CALL;
120 if (format == DXGI_FORMAT_UNKNOWN)
122 *mode_count = 0;
123 return S_OK;
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);
132 if (!modes)
134 wined3d_mutex_unlock();
135 *mode_count = max_count;
136 return S_OK;
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();
154 return hr;
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);
163 break;
166 case DXGI_MODE_STRUCT_VERSION_1:
168 DXGI_MODE_DESC1 *desc = modes;
169 dxgi_mode1_from_wined3d(&desc[i], &mode);
170 break;
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);
180 break;
181 case DXGI_MODE_STRUCT_VERSION_1:
182 qsort(modes, *mode_count, sizeof(DXGI_MODE_DESC1), dxgi_mode_desc_compare);
183 break;
186 return S_OK;
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);
211 *object = iface;
212 return S_OK;
215 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
217 *object = NULL;
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);
228 return 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);
238 if (!refcount)
240 wined3d_private_store_cleanup(&output->private_store);
241 IWineDXGIAdapter_Release(&output->adapter->IWineDXGIAdapter_iface);
242 heap_free(output);
245 return refcount;
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;
298 HRESULT hr;
300 TRACE("iface %p, desc %p.\n", iface, desc);
302 if (!desc)
303 return E_INVALIDARG;
305 wined3d_mutex_lock();
306 hr = wined3d_output_get_desc(output->wined3d_output, &wined3d_desc);
307 if (FAILED(hr))
309 WARN("Failed to get output desc, hr %#x.\n", hr);
310 wined3d_mutex_unlock();
311 return hr;
314 hr = wined3d_output_get_display_mode(output->wined3d_output, &mode, &rotation);
315 if (FAILED(hr))
317 WARN("Failed to get output display mode, hr %#x.\n", hr);
318 wined3d_mutex_unlock();
319 return hr;
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;
329 return S_OK;
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;
349 HRESULT hr;
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);
358 if (SUCCEEDED(hr))
360 dxgi_mode_from_wined3d(closest_match, &wined3d_mode);
361 TRACE("Returning %s.\n", debug_dxgi_mode(closest_match));
364 return hr;
367 static HRESULT STDMETHODCALLTYPE dxgi_output_WaitForVBlank(IDXGIOutput6 *iface)
369 static BOOL once = FALSE;
371 if (!once++)
372 FIXME("iface %p stub!\n", iface);
373 else
374 TRACE("iface %p stub!\n", iface);
376 return E_NOTIMPL;
379 static HRESULT STDMETHODCALLTYPE dxgi_output_TakeOwnership(IDXGIOutput6 *iface, IUnknown *device, BOOL exclusive)
381 struct dxgi_output *output = impl_from_IDXGIOutput6(iface);
382 HRESULT hr;
384 TRACE("iface %p, device %p, exclusive %d.\n", iface, device, exclusive);
386 if (!device)
387 return DXGI_ERROR_INVALID_CALL;
389 wined3d_mutex_lock();
390 hr = wined3d_output_take_ownership(output->wined3d_output, exclusive);
391 wined3d_mutex_unlock();
393 return hr;
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)
410 unsigned int i;
412 TRACE("iface %p, gamma_caps %p.\n", iface, gamma_caps);
414 if (!gamma_caps)
415 return E_INVALIDARG;
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;
425 return S_OK;
428 static WORD uint16_from_float(float f)
430 f *= 65535.0f;
431 if (f < 0.0f)
432 f = 0.0f;
433 else if (f > 65535.0f)
434 f = 65535.0f;
436 return f + 0.5f;
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;
444 const DXGI_RGB *p;
445 unsigned int i;
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();
468 return S_OK;
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);
476 return E_NOTIMPL;
479 static HRESULT STDMETHODCALLTYPE dxgi_output_SetDisplaySurface(IDXGIOutput6 *iface, IDXGISurface *surface)
481 FIXME("iface %p, surface %p stub!\n", iface, surface);
483 return E_NOTIMPL;
486 static HRESULT STDMETHODCALLTYPE dxgi_output_GetDisplaySurfaceData(IDXGIOutput6 *iface, IDXGISurface *surface)
488 FIXME("iface %p, surface %p stub!\n", iface, surface);
490 return E_NOTIMPL;
493 static HRESULT STDMETHODCALLTYPE dxgi_output_GetFrameStatistics(IDXGIOutput6 *iface, DXGI_FRAME_STATISTICS *stats)
495 FIXME("iface %p, stats %p stub!\n", iface, stats);
497 return E_NOTIMPL;
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;
519 HRESULT hr;
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);
528 if (SUCCEEDED(hr))
530 dxgi_mode1_from_wined3d(closest_match, &wined3d_mode);
531 TRACE("Returning %s.\n", debug_dxgi_mode1(closest_match));
534 return hr;
537 static HRESULT STDMETHODCALLTYPE dxgi_output_GetDisplaySurfaceData1(IDXGIOutput6 *iface,
538 IDXGIResource *resource)
540 FIXME("iface %p, resource %p stub!\n", iface, resource);
542 return E_NOTIMPL;
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);
550 return E_NOTIMPL;
553 /* IDXGIOutput2 methods */
555 static BOOL STDMETHODCALLTYPE dxgi_output_SupportsOverlays(IDXGIOutput6 *iface)
557 FIXME("iface %p stub!\n", iface);
559 return FALSE;
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);
569 return E_NOTIMPL;
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);
580 return E_NOTIMPL;
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);
593 return E_NOTIMPL;
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;
605 HRESULT hr;
607 FIXME("iface %p, desc %p semi-stub!\n", iface, desc);
609 if (!desc)
610 return E_INVALIDARG;
612 wined3d_mutex_lock();
613 hr = wined3d_output_get_desc(output->wined3d_output, &wined3d_desc);
614 if (FAILED(hr))
616 WARN("Failed to get output desc, hr %#x.\n", hr);
617 wined3d_mutex_unlock();
618 return hr;
621 hr = wined3d_output_get_display_mode(output->wined3d_output, &mode, &rotation);
622 if (FAILED(hr))
624 WARN("Failed to get output display mode, hr %#x.\n", hr);
625 wined3d_mutex_unlock();
626 return hr;
628 wined3d_mutex_unlock();
630 if (FAILED(hr))
632 WARN("Failed to get output desc, hr %#x.\n", hr);
633 return 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;
657 return S_OK;
660 static HRESULT STDMETHODCALLTYPE dxgi_output_CheckHardwareCompositionSupport(IDXGIOutput6 *iface,
661 UINT *flags)
663 FIXME("iface %p, flags %p stub!\n", iface, flags);
665 return E_NOTIMPL;
668 static const struct IDXGIOutput6Vtbl dxgi_output_vtbl =
670 dxgi_output_QueryInterface,
671 dxgi_output_AddRef,
672 dxgi_output_Release,
673 /* IDXGIObject methods */
674 dxgi_output_SetPrivateData,
675 dxgi_output_SetPrivateDataInterface,
676 dxgi_output_GetPrivateData,
677 dxgi_output_GetParent,
678 /* IDXGIOutput methods */
679 dxgi_output_GetDesc,
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)
711 if (!iface)
712 return NULL;
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);
735 return S_OK;