dxva2: Implement DXVA2CreateVideoService().
[wine.git] / dlls / dxva2 / main.c
blobbbee697674f9ee2533d69347701ac5ac23657fd4
1 /*
2 * Copyright 2014 Michael Müller for Pipelight
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 #define COBJMACROS
21 #include <stdarg.h>
22 #include "windef.h"
23 #include "winbase.h"
24 #include "d3d9.h"
25 #include "physicalmonitorenumerationapi.h"
26 #include "lowlevelmonitorconfigurationapi.h"
27 #include "highlevelmonitorconfigurationapi.h"
28 #include "initguid.h"
29 #include "dxva2api.h"
31 #include "wine/debug.h"
32 #include "wine/heap.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(dxva2);
36 enum device_handle_flags
38 HANDLE_FLAG_OPEN = 0x1,
39 HANDLE_FLAG_INVALID = 0x2,
42 struct device_handle
44 unsigned int flags;
47 struct device_manager
49 IDirect3DDeviceManager9 IDirect3DDeviceManager9_iface;
50 IDirectXVideoProcessorService IDirectXVideoProcessorService_iface;
51 LONG refcount;
53 IDirect3DDevice9 *device;
54 UINT token;
56 struct device_handle *handles;
57 size_t count;
58 size_t capacity;
60 CRITICAL_SECTION cs;
63 static BOOL dxva_array_reserve(void **elements, size_t *capacity, size_t count, size_t size)
65 size_t new_capacity, max_capacity;
66 void *new_elements;
68 if (count <= *capacity)
69 return TRUE;
71 max_capacity = ~(SIZE_T)0 / size;
72 if (count > max_capacity)
73 return FALSE;
75 new_capacity = max(4, *capacity);
76 while (new_capacity < count && new_capacity <= max_capacity / 2)
77 new_capacity *= 2;
78 if (new_capacity < count)
79 new_capacity = max_capacity;
81 if (!(new_elements = heap_realloc(*elements, new_capacity * size)))
82 return FALSE;
84 *elements = new_elements;
85 *capacity = new_capacity;
87 return TRUE;
90 static struct device_manager *impl_from_IDirect3DDeviceManager9(IDirect3DDeviceManager9 *iface)
92 return CONTAINING_RECORD(iface, struct device_manager, IDirect3DDeviceManager9_iface);
95 static struct device_manager *impl_from_IDirectXVideoProcessorService(IDirectXVideoProcessorService *iface)
97 return CONTAINING_RECORD(iface, struct device_manager, IDirectXVideoProcessorService_iface);
100 static HRESULT WINAPI device_manager_processor_service_QueryInterface(IDirectXVideoProcessorService *iface,
101 REFIID riid, void **obj)
103 if (IsEqualIID(riid, &IID_IDirectXVideoProcessorService) ||
104 IsEqualIID(riid, &IID_IDirectXVideoAccelerationService) ||
105 IsEqualIID(riid, &IID_IUnknown))
107 *obj = iface;
108 IDirectXVideoProcessorService_AddRef(iface);
109 return S_OK;
112 WARN("Unsupported interface %s.\n", debugstr_guid(riid));
113 *obj = NULL;
114 return E_NOINTERFACE;
117 static ULONG WINAPI device_manager_processor_service_AddRef(IDirectXVideoProcessorService *iface)
119 struct device_manager *manager = impl_from_IDirectXVideoProcessorService(iface);
120 return IDirect3DDeviceManager9_AddRef(&manager->IDirect3DDeviceManager9_iface);
123 static ULONG WINAPI device_manager_processor_service_Release(IDirectXVideoProcessorService *iface)
125 struct device_manager *manager = impl_from_IDirectXVideoProcessorService(iface);
126 return IDirect3DDeviceManager9_Release(&manager->IDirect3DDeviceManager9_iface);
129 static HRESULT WINAPI device_manager_processor_service_CreateSurface(IDirectXVideoProcessorService *iface,
130 UINT width, UINT height, UINT backbuffers, D3DFORMAT format, D3DPOOL pool, DWORD usage, DWORD dxvaType,
131 IDirect3DSurface9 **surface, HANDLE *shared_handle)
133 FIXME("%p, %u, %u, %u, %u, %u, %u, %u, %p, %p.\n", iface, width, height, backbuffers, format, pool, usage, dxvaType,
134 surface, shared_handle);
136 return E_NOTIMPL;
139 static HRESULT WINAPI device_manager_processor_service_RegisterVideoProcessorSoftwareDevice(
140 IDirectXVideoProcessorService *iface, void *callbacks)
142 FIXME("%p, %p.\n", iface, callbacks);
144 return E_NOTIMPL;
147 static HRESULT WINAPI device_manager_processor_service_GetVideoProcessorDeviceGuids(
148 IDirectXVideoProcessorService *iface, const DXVA2_VideoDesc *video_desc, UINT *count, GUID **guids)
150 FIXME("%p, %p, %p, %p.\n", iface, video_desc, count, guids);
152 return E_NOTIMPL;
155 static HRESULT WINAPI device_manager_processor_service_GetVideoProcessorRenderTargets(
156 IDirectXVideoProcessorService *iface, REFGUID deviceguid, const DXVA2_VideoDesc *video_desc, UINT *count,
157 D3DFORMAT **formats)
159 FIXME("%p, %s, %p, %p, %p.\n", iface, debugstr_guid(deviceguid), video_desc, count, formats);
161 return E_NOTIMPL;
164 static HRESULT WINAPI device_manager_processor_service_GetVideoProcessorSubStreamFormats(
165 IDirectXVideoProcessorService *iface, REFGUID deviceguid, const DXVA2_VideoDesc *video_desc,
166 D3DFORMAT rt_format, UINT *count, D3DFORMAT **formats)
168 FIXME("%p, %s, %p, %u, %p, %p.\n", iface, debugstr_guid(deviceguid), video_desc, rt_format, count, formats);
170 return E_NOTIMPL;
173 static HRESULT WINAPI device_manager_processor_service_GetVideoProcessorCaps(
174 IDirectXVideoProcessorService *iface, REFGUID deviceguid, const DXVA2_VideoDesc *video_desc,
175 D3DFORMAT rt_format, DXVA2_VideoProcessorCaps *caps)
177 FIXME("%p, %s, %p, %u, %p.\n", iface, debugstr_guid(deviceguid), video_desc, rt_format, caps);
179 return E_NOTIMPL;
182 static HRESULT WINAPI device_manager_processor_service_GetProcAmpRange(
183 IDirectXVideoProcessorService *iface, REFGUID deviceguid, const DXVA2_VideoDesc *video_desc,
184 D3DFORMAT rt_format, UINT ProcAmpCap, DXVA2_ValueRange *range)
186 FIXME("%p, %s, %p, %u, %u, %p.\n", iface, debugstr_guid(deviceguid), video_desc, rt_format, ProcAmpCap, range);
188 return E_NOTIMPL;
191 static const IDirectXVideoProcessorServiceVtbl device_manager_processor_service_vtbl =
193 device_manager_processor_service_QueryInterface,
194 device_manager_processor_service_AddRef,
195 device_manager_processor_service_Release,
196 device_manager_processor_service_CreateSurface,
197 device_manager_processor_service_RegisterVideoProcessorSoftwareDevice,
198 device_manager_processor_service_GetVideoProcessorDeviceGuids,
199 device_manager_processor_service_GetVideoProcessorRenderTargets,
200 device_manager_processor_service_GetVideoProcessorSubStreamFormats,
201 device_manager_processor_service_GetVideoProcessorCaps,
202 device_manager_processor_service_GetProcAmpRange,
205 static HRESULT WINAPI device_manager_QueryInterface(IDirect3DDeviceManager9 *iface, REFIID riid, void **obj)
207 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
209 if (IsEqualIID(&IID_IDirect3DDeviceManager9, riid) ||
210 IsEqualIID(&IID_IUnknown, riid))
212 *obj = iface;
213 IDirect3DDeviceManager9_AddRef(iface);
214 return S_OK;
217 WARN("Unsupported interface %s.\n", debugstr_guid(riid));
218 *obj = NULL;
219 return E_NOINTERFACE;
222 static ULONG WINAPI device_manager_AddRef(IDirect3DDeviceManager9 *iface)
224 struct device_manager *manager = impl_from_IDirect3DDeviceManager9(iface);
225 ULONG refcount = InterlockedIncrement(&manager->refcount);
227 TRACE("%p, refcount %u.\n", iface, refcount);
229 return refcount;
232 static ULONG WINAPI device_manager_Release(IDirect3DDeviceManager9 *iface)
234 struct device_manager *manager = impl_from_IDirect3DDeviceManager9(iface);
235 ULONG refcount = InterlockedDecrement(&manager->refcount);
237 TRACE("%p, refcount %u.\n", iface, refcount);
239 if (!refcount)
241 if (manager->device)
242 IDirect3DDevice9_Release(manager->device);
243 DeleteCriticalSection(&manager->cs);
244 heap_free(manager->handles);
245 heap_free(manager);
248 return refcount;
251 static HRESULT WINAPI device_manager_ResetDevice(IDirect3DDeviceManager9 *iface, IDirect3DDevice9 *device,
252 UINT token)
254 struct device_manager *manager = impl_from_IDirect3DDeviceManager9(iface);
255 size_t i;
257 TRACE("%p, %p, %#x.\n", iface, device, token);
259 if (token != manager->token)
260 return E_INVALIDARG;
262 EnterCriticalSection(&manager->cs);
263 if (manager->device)
265 for (i = 0; i < manager->count; ++i)
266 manager->handles[i].flags |= HANDLE_FLAG_INVALID;
267 IDirect3DDevice9_Release(manager->device);
269 manager->device = device;
270 IDirect3DDevice9_AddRef(manager->device);
271 LeaveCriticalSection(&manager->cs);
273 return S_OK;
276 static HRESULT WINAPI device_manager_OpenDeviceHandle(IDirect3DDeviceManager9 *iface, HANDLE *hdevice)
278 struct device_manager *manager = impl_from_IDirect3DDeviceManager9(iface);
279 HRESULT hr = S_OK;
280 size_t i;
282 TRACE("%p, %p.\n", iface, hdevice);
284 *hdevice = NULL;
286 EnterCriticalSection(&manager->cs);
287 if (!manager->device)
288 hr = DXVA2_E_NOT_INITIALIZED;
289 else
291 for (i = 0; i < manager->count; ++i)
293 if (!(manager->handles[i].flags & HANDLE_FLAG_OPEN))
295 manager->handles[i].flags |= HANDLE_FLAG_OPEN;
296 *hdevice = ULongToHandle(i + 1);
297 break;
301 if (dxva_array_reserve((void **)&manager->handles, &manager->capacity, manager->count + 1,
302 sizeof(*manager->handles)))
304 *hdevice = ULongToHandle(manager->count + 1);
305 manager->handles[manager->count].flags |= HANDLE_FLAG_OPEN;
306 manager->count++;
308 else
309 hr = E_OUTOFMEMORY;
311 LeaveCriticalSection(&manager->cs);
313 return hr;
316 static HRESULT device_manager_get_handle_index(struct device_manager *manager, HANDLE hdevice, size_t *idx)
318 if (hdevice > ULongToHandle(manager->count))
319 return E_HANDLE;
320 *idx = (ULONG_PTR)hdevice - 1;
321 return S_OK;
324 static HRESULT WINAPI device_manager_CloseDeviceHandle(IDirect3DDeviceManager9 *iface, HANDLE hdevice)
326 struct device_manager *manager = impl_from_IDirect3DDeviceManager9(iface);
327 HRESULT hr;
328 size_t idx;
330 TRACE("%p, %p.\n", iface, hdevice);
332 EnterCriticalSection(&manager->cs);
333 if (SUCCEEDED(hr = device_manager_get_handle_index(manager, hdevice, &idx)))
335 if (manager->handles[idx].flags & HANDLE_FLAG_OPEN)
337 manager->handles[idx].flags = 0;
338 if (idx == manager->count - 1)
339 manager->count--;
341 else
342 hr = E_HANDLE;
344 LeaveCriticalSection(&manager->cs);
346 return hr;
349 static HRESULT WINAPI device_manager_TestDevice(IDirect3DDeviceManager9 *iface, HANDLE hdevice)
351 struct device_manager *manager = impl_from_IDirect3DDeviceManager9(iface);
352 HRESULT hr;
353 size_t idx;
355 TRACE("%p, %p.\n", iface, hdevice);
357 EnterCriticalSection(&manager->cs);
358 if (SUCCEEDED(hr = device_manager_get_handle_index(manager, hdevice, &idx)))
360 unsigned int flags = manager->handles[idx].flags;
362 if (flags & HANDLE_FLAG_INVALID)
363 hr = DXVA2_E_NEW_VIDEO_DEVICE;
364 else if (!(flags & HANDLE_FLAG_OPEN))
365 hr = E_HANDLE;
367 LeaveCriticalSection(&manager->cs);
369 return hr;
372 static HRESULT WINAPI device_manager_LockDevice(IDirect3DDeviceManager9 *iface, HANDLE hdevice,
373 IDirect3DDevice9 **device, BOOL block)
375 FIXME("%p, %p, %p, %d.\n", iface, hdevice, device, block);
377 return E_NOTIMPL;
380 static HRESULT WINAPI device_manager_UnlockDevice(IDirect3DDeviceManager9 *iface, HANDLE hdevice, BOOL savestate)
382 FIXME("%p, %p, %d.\n", iface, hdevice, savestate);
384 return E_NOTIMPL;
387 static HRESULT WINAPI device_manager_GetVideoService(IDirect3DDeviceManager9 *iface, HANDLE hdevice, REFIID riid,
388 void **obj)
390 struct device_manager *manager = impl_from_IDirect3DDeviceManager9(iface);
391 HRESULT hr;
392 size_t idx;
394 TRACE("%p, %p, %s, %p.\n", iface, hdevice, debugstr_guid(riid), obj);
396 EnterCriticalSection(&manager->cs);
397 if (SUCCEEDED(hr = device_manager_get_handle_index(manager, hdevice, &idx)))
399 unsigned int flags = manager->handles[idx].flags;
401 if (flags & HANDLE_FLAG_INVALID)
402 hr = DXVA2_E_NEW_VIDEO_DEVICE;
403 else if (!(flags & HANDLE_FLAG_OPEN))
404 hr = E_HANDLE;
405 else
406 hr = IDirectXVideoProcessorService_QueryInterface(&manager->IDirectXVideoProcessorService_iface,
407 riid, obj);
409 LeaveCriticalSection(&manager->cs);
411 return hr;
414 static const IDirect3DDeviceManager9Vtbl device_manager_vtbl =
416 device_manager_QueryInterface,
417 device_manager_AddRef,
418 device_manager_Release,
419 device_manager_ResetDevice,
420 device_manager_OpenDeviceHandle,
421 device_manager_CloseDeviceHandle,
422 device_manager_TestDevice,
423 device_manager_LockDevice,
424 device_manager_UnlockDevice,
425 device_manager_GetVideoService,
428 BOOL WINAPI CapabilitiesRequestAndCapabilitiesReply( HMONITOR monitor, LPSTR buffer, DWORD length )
430 FIXME("(%p, %p, %d): stub\n", monitor, buffer, length);
432 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
433 return FALSE;
436 HRESULT WINAPI DXVA2CreateDirect3DDeviceManager9(UINT *token, IDirect3DDeviceManager9 **manager)
438 struct device_manager *object;
440 TRACE("%p, %p.\n", token, manager);
442 *manager = NULL;
444 if (!(object = heap_alloc_zero(sizeof(*object))))
445 return E_OUTOFMEMORY;
447 object->IDirect3DDeviceManager9_iface.lpVtbl = &device_manager_vtbl;
448 object->IDirectXVideoProcessorService_iface.lpVtbl = &device_manager_processor_service_vtbl;
449 object->refcount = 1;
450 object->token = GetTickCount();
451 InitializeCriticalSection(&object->cs);
453 *token = object->token;
454 *manager = &object->IDirect3DDeviceManager9_iface;
456 return S_OK;
459 HRESULT WINAPI DXVA2CreateVideoService(IDirect3DDevice9 *device, REFIID riid, void **obj)
461 IDirect3DDeviceManager9 *manager;
462 HANDLE handle;
463 HRESULT hr;
464 UINT token;
466 TRACE("%p, %s, %p.\n", device, debugstr_guid(riid), obj);
468 if (FAILED(hr = DXVA2CreateDirect3DDeviceManager9(&token, &manager)))
469 return hr;
471 if (FAILED(hr = IDirect3DDeviceManager9_ResetDevice(manager, device, token)))
472 goto done;
474 if (FAILED(hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle)))
475 goto done;
477 hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, riid, obj);
478 IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
480 done:
481 IDirect3DDeviceManager9_Release(manager);
483 return hr;
486 BOOL WINAPI DegaussMonitor( HMONITOR monitor )
488 FIXME("(%p): stub\n", monitor);
490 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
491 return FALSE;
494 BOOL WINAPI DestroyPhysicalMonitor( HMONITOR monitor )
496 FIXME("(%p): stub\n", monitor);
498 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
499 return FALSE;
502 BOOL WINAPI DestroyPhysicalMonitors( DWORD arraySize, LPPHYSICAL_MONITOR array )
504 FIXME("(0x%x, %p): stub\n", arraySize, array);
506 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
507 return FALSE;
510 BOOL WINAPI GetCapabilitiesStringLength( HMONITOR monitor, LPDWORD length )
512 FIXME("(%p, %p): stub\n", monitor, length);
514 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
515 return FALSE;
518 BOOL WINAPI GetMonitorBrightness( HMONITOR monitor, LPDWORD minimum, LPDWORD current, LPDWORD maximum )
520 FIXME("(%p, %p, %p, %p): stub\n", monitor, minimum, current, maximum);
522 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
523 return FALSE;
526 BOOL WINAPI GetMonitorCapabilities( HMONITOR monitor, LPDWORD capabilities, LPDWORD temperatures )
528 FIXME("(%p, %p, %p): stub\n", monitor, capabilities, temperatures);
530 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
531 return FALSE;
535 BOOL WINAPI GetMonitorColorTemperature( HMONITOR monitor, LPMC_COLOR_TEMPERATURE temperature )
537 FIXME("(%p, %p): stub\n", monitor, temperature);
539 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
540 return FALSE;
543 BOOL WINAPI GetMonitorContrast( HMONITOR monitor, LPDWORD minimum, LPDWORD current, LPDWORD maximum )
545 FIXME("(%p, %p, %p, %p): stub\n", monitor, minimum, current, maximum);
547 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
548 return FALSE;
551 BOOL WINAPI GetMonitorDisplayAreaPosition( HMONITOR monitor, MC_POSITION_TYPE type, LPDWORD minimum,
552 LPDWORD current, LPDWORD maximum )
554 FIXME("(%p, 0x%x, %p, %p, %p): stub\n", monitor, type, minimum, current, maximum);
556 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
557 return FALSE;
560 BOOL WINAPI GetMonitorDisplayAreaSize( HMONITOR monitor, MC_SIZE_TYPE type, LPDWORD minimum,
561 LPDWORD current, LPDWORD maximum )
563 FIXME("(%p, 0x%x, %p, %p, %p): stub\n", monitor, type, minimum, current, maximum);
565 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
566 return FALSE;
569 BOOL WINAPI GetMonitorRedGreenOrBlueDrive( HMONITOR monitor, MC_DRIVE_TYPE type, LPDWORD minimum,
570 LPDWORD current, LPDWORD maximum )
572 FIXME("(%p, 0x%x, %p, %p, %p): stub\n", monitor, type, minimum, current, maximum);
574 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
575 return FALSE;
578 BOOL WINAPI GetMonitorRedGreenOrBlueGain( HMONITOR monitor, MC_GAIN_TYPE type, LPDWORD minimum,
579 LPDWORD current, LPDWORD maximum )
581 FIXME("(%p, 0x%x, %p, %p, %p): stub\n", monitor, type, minimum, current, maximum);
583 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
584 return FALSE;
587 BOOL WINAPI GetMonitorTechnologyType( HMONITOR monitor, LPMC_DISPLAY_TECHNOLOGY_TYPE type )
589 FIXME("(%p, %p): stub\n", monitor, type);
591 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
592 return FALSE;
595 BOOL WINAPI GetNumberOfPhysicalMonitorsFromHMONITOR( HMONITOR monitor, LPDWORD number )
597 FIXME("(%p, %p): stub\n", monitor, number);
599 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
600 return FALSE;
603 HRESULT WINAPI GetNumberOfPhysicalMonitorsFromIDirect3DDevice9( IDirect3DDevice9 *device, LPDWORD number )
605 FIXME("(%p, %p): stub\n", device, number);
607 return E_NOTIMPL;
610 BOOL WINAPI GetPhysicalMonitorsFromHMONITOR( HMONITOR monitor, DWORD arraySize, LPPHYSICAL_MONITOR array )
612 FIXME("(%p, 0x%x, %p): stub\n", monitor, arraySize, array);
614 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
615 return FALSE;
618 HRESULT WINAPI GetPhysicalMonitorsFromIDirect3DDevice9( IDirect3DDevice9 *device, DWORD arraySize, LPPHYSICAL_MONITOR array )
620 FIXME("(%p, 0x%x, %p): stub\n", device, arraySize, array);
622 return E_NOTIMPL;
625 BOOL WINAPI GetTimingReport( HMONITOR monitor, LPMC_TIMING_REPORT timingReport )
627 FIXME("(%p, %p): stub\n", monitor, timingReport);
629 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
630 return FALSE;
633 BOOL WINAPI GetVCPFeatureAndVCPFeatureReply( HMONITOR monitor, BYTE vcpCode, LPMC_VCP_CODE_TYPE pvct,
634 LPDWORD current, LPDWORD maximum )
636 FIXME("(%p, 0x%02x, %p, %p, %p): stub\n", monitor, vcpCode, pvct, current, maximum);
638 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
639 return FALSE;
642 HRESULT WINAPI OPMGetVideoOutputsFromHMONITOR( HMONITOR monitor, /* OPM_VIDEO_OUTPUT_SEMANTICS */ int vos,
643 ULONG *numVideoOutputs, /* IOPMVideoOutput */ void ***videoOutputs )
645 FIXME("(%p, 0x%x, %p, %p): stub\n", monitor, vos, numVideoOutputs, videoOutputs);
647 return E_NOTIMPL;
650 HRESULT WINAPI OPMGetVideoOutputsFromIDirect3DDevice9Object( IDirect3DDevice9 *device, /* OPM_VIDEO_OUTPUT_SEMANTICS */ int vos,
651 ULONG *numVideoOutputs, /* IOPMVideoOutput */ void ***videoOutputs )
653 FIXME("(%p, 0x%x, %p, %p): stub\n", device, vos, numVideoOutputs, videoOutputs);
655 return E_NOTIMPL;
658 BOOL WINAPI RestoreMonitorFactoryColorDefaults( HMONITOR monitor )
660 FIXME("(%p): stub\n", monitor);
662 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
663 return FALSE;
666 BOOL WINAPI RestoreMonitorFactoryDefaults( HMONITOR monitor )
668 FIXME("(%p): stub\n", monitor);
670 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
671 return FALSE;
674 BOOL WINAPI SaveCurrentMonitorSettings( HMONITOR monitor )
676 FIXME("(%p): stub\n", monitor);
678 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
679 return FALSE;
682 BOOL WINAPI SaveCurrentSettings( HMONITOR monitor )
684 FIXME("(%p): stub\n", monitor);
686 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
687 return FALSE;
690 BOOL WINAPI SetMonitorBrightness( HMONITOR monitor, DWORD brightness )
692 FIXME("(%p, 0x%x): stub\n", monitor, brightness);
694 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
695 return FALSE;
698 BOOL WINAPI SetMonitorColorTemperature( HMONITOR monitor, MC_COLOR_TEMPERATURE temperature )
700 FIXME("(%p, 0x%x): stub\n", monitor, temperature);
702 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
703 return FALSE;
706 BOOL WINAPI SetMonitorContrast( HMONITOR monitor, DWORD contrast )
708 FIXME("(%p, 0x%x): stub\n", monitor, contrast);
710 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
711 return FALSE;
714 BOOL WINAPI SetMonitorDisplayAreaPosition( HMONITOR monitor, MC_POSITION_TYPE type, DWORD position )
716 FIXME("(%p, 0x%x, 0x%x): stub\n", monitor, type, position);
718 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
719 return FALSE;
722 BOOL WINAPI SetMonitorDisplayAreaSize( HMONITOR monitor, MC_SIZE_TYPE type, DWORD size )
724 FIXME("(%p, 0x%x, 0x%x): stub\n", monitor, type, size);
726 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
727 return FALSE;
730 BOOL WINAPI SetMonitorRedGreenOrBlueDrive( HMONITOR monitor, MC_DRIVE_TYPE type, DWORD drive )
732 FIXME("(%p, 0x%x, 0x%x): stub\n", monitor, type, drive);
734 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
735 return FALSE;
738 BOOL WINAPI SetMonitorRedGreenOrBlueGain( HMONITOR monitor, MC_GAIN_TYPE type, DWORD gain )
740 FIXME("(%p, 0x%x, 0x%x): stub\n", monitor, type, gain);
742 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
743 return FALSE;
746 BOOL WINAPI SetVCPFeature( HMONITOR monitor, BYTE vcpCode, DWORD value )
748 FIXME("(%p, 0x%02x, 0x%x): stub\n", monitor, vcpCode, value);
750 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
751 return FALSE;
754 BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
756 TRACE("%p,%x,%p\n", hinstDLL, fdwReason, lpvReserved);
758 switch (fdwReason) {
759 case DLL_WINE_PREATTACH:
760 return FALSE; /* prefer native version */
761 case DLL_PROCESS_ATTACH:
762 DisableThreadLibraryCalls(hinstDLL);
763 break;
766 return TRUE;