af062818b47340eef15700d2f0211576ba3506eevboxsync/*
af062818b47340eef15700d2f0211576ba3506eevboxsync * IDirect3D9 implementation
af062818b47340eef15700d2f0211576ba3506eevboxsync *
af062818b47340eef15700d2f0211576ba3506eevboxsync * Copyright 2002 Jason Edmeades
af062818b47340eef15700d2f0211576ba3506eevboxsync * Copyright 2005 Oliver Stieber
af062818b47340eef15700d2f0211576ba3506eevboxsync *
af062818b47340eef15700d2f0211576ba3506eevboxsync * This library is free software; you can redistribute it and/or
af062818b47340eef15700d2f0211576ba3506eevboxsync * modify it under the terms of the GNU Lesser General Public
af062818b47340eef15700d2f0211576ba3506eevboxsync * License as published by the Free Software Foundation; either
af062818b47340eef15700d2f0211576ba3506eevboxsync * version 2.1 of the License, or (at your option) any later version.
af062818b47340eef15700d2f0211576ba3506eevboxsync *
af062818b47340eef15700d2f0211576ba3506eevboxsync * This library is distributed in the hope that it will be useful,
af062818b47340eef15700d2f0211576ba3506eevboxsync * but WITHOUT ANY WARRANTY; without even the implied warranty of
af062818b47340eef15700d2f0211576ba3506eevboxsync * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
af062818b47340eef15700d2f0211576ba3506eevboxsync * Lesser General Public License for more details.
af062818b47340eef15700d2f0211576ba3506eevboxsync *
af062818b47340eef15700d2f0211576ba3506eevboxsync * You should have received a copy of the GNU Lesser General Public
af062818b47340eef15700d2f0211576ba3506eevboxsync * License along with this library; if not, write to the Free Software
af062818b47340eef15700d2f0211576ba3506eevboxsync * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
af062818b47340eef15700d2f0211576ba3506eevboxsync */
af062818b47340eef15700d2f0211576ba3506eevboxsync
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync/*
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * Oracle LGPL Disclaimer: For the avoidance of doubt, except that if any license choice
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync * the Lesser General Public License version 2.1 (LGPLv2) at this time for any software where
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync * a choice of LGPL license versions is made available with the language indicating
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync * that LGPLv2 or any later version may be used, or where a choice of which version
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync * of the LGPL is applied is otherwise unspecified.
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync */
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync#include "config.h"
af062818b47340eef15700d2f0211576ba3506eevboxsync#include "d3d9_private.h"
af062818b47340eef15700d2f0211576ba3506eevboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#include <iprt/cdefs.h>
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncWINE_DEFAULT_DEBUG_CHANNEL(d3d9);
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync/* IDirect3D9 IUnknown parts follow: */
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3D9Impl_QueryInterface(LPDIRECT3D9EX iface, REFIID riid, LPVOID* ppobj)
af062818b47340eef15700d2f0211576ba3506eevboxsync{
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync if (IsEqualGUID(riid, &IID_IUnknown)
af062818b47340eef15700d2f0211576ba3506eevboxsync || IsEqualGUID(riid, &IID_IDirect3D9)) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Ex_AddRef(iface);
af062818b47340eef15700d2f0211576ba3506eevboxsync *ppobj = This;
af062818b47340eef15700d2f0211576ba3506eevboxsync TRACE("Returning IDirect3D9 interface at %p\n", *ppobj);
af062818b47340eef15700d2f0211576ba3506eevboxsync return S_OK;
af062818b47340eef15700d2f0211576ba3506eevboxsync } else if(IsEqualGUID(riid, &IID_IDirect3D9Ex)) {
af062818b47340eef15700d2f0211576ba3506eevboxsync if(This->extended) {
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync *ppobj = This;
af062818b47340eef15700d2f0211576ba3506eevboxsync TRACE("Returning IDirect3D9Ex interface at %p\n", *ppobj);
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Ex_AddRef((IDirect3D9Ex *)*ppobj);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync return S_OK;
af062818b47340eef15700d2f0211576ba3506eevboxsync } else {
af062818b47340eef15700d2f0211576ba3506eevboxsync WARN("Application asks for IDirect3D9Ex, but this instance wasn't created with Direct3DCreate9Ex\n");
af062818b47340eef15700d2f0211576ba3506eevboxsync WARN("Returning E_NOINTERFACE\n");
af062818b47340eef15700d2f0211576ba3506eevboxsync *ppobj = NULL;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
af062818b47340eef15700d2f0211576ba3506eevboxsync return E_NOINTERFACE;
af062818b47340eef15700d2f0211576ba3506eevboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
af062818b47340eef15700d2f0211576ba3506eevboxsync *ppobj = NULL;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
af062818b47340eef15700d2f0211576ba3506eevboxsync return E_NOINTERFACE;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic ULONG WINAPI IDirect3D9Impl_AddRef(LPDIRECT3D9EX iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync ULONG ref = InterlockedIncrement(&This->ref);
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("%p increasing refcount to %u.\n", iface, ref);
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return ref;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic ULONG WINAPI IDirect3D9Impl_Release(LPDIRECT3D9EX iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync ULONG ref = InterlockedDecrement(&This->ref);
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("%p decreasing refcount to %u.\n", iface, ref);
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync if (ref == 0) {
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync IWineD3D_Release(This->WineD3D);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync HeapFree(GetProcessHeap(), 0, This);
af062818b47340eef15700d2f0211576ba3506eevboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return ref;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync/* IDirect3D9 Interface follow: */
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3D9Impl_RegisterSoftwareDevice(LPDIRECT3D9EX iface, void* pInitializeFunction) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, init_function %p.\n", iface, pInitializeFunction);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3D_RegisterSoftwareDevice(This->WineD3D, pInitializeFunction);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic UINT WINAPI IDirect3D9Impl_GetAdapterCount(LPDIRECT3D9EX iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p.\n", iface);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3D_GetAdapterCount(This->WineD3D);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
05f686c037f6621377f19bd88104138b2bf117dfvboxsync ASSERT_D3D(hr == 1);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3D9Impl_GetAdapterIdentifier(LPDIRECT3D9EX iface, UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9* pIdentifier) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync WINED3DADAPTER_IDENTIFIER adapter_id;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, flags %#x, identifier %p.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, Adapter, Flags, pIdentifier);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
040b4a09341f574825386333398110f4db3e1e51vboxsync adapter_id.driver = pIdentifier->Driver;
040b4a09341f574825386333398110f4db3e1e51vboxsync adapter_id.driver_size = sizeof(pIdentifier->Driver);
040b4a09341f574825386333398110f4db3e1e51vboxsync adapter_id.description = pIdentifier->Description;
040b4a09341f574825386333398110f4db3e1e51vboxsync adapter_id.description_size = sizeof(pIdentifier->Description);
040b4a09341f574825386333398110f4db3e1e51vboxsync adapter_id.device_name = pIdentifier->DeviceName;
040b4a09341f574825386333398110f4db3e1e51vboxsync adapter_id.device_name_size = sizeof(pIdentifier->DeviceName);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3D_GetAdapterIdentifier(This->WineD3D, Adapter, Flags, &adapter_id);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
040b4a09341f574825386333398110f4db3e1e51vboxsync
040b4a09341f574825386333398110f4db3e1e51vboxsync pIdentifier->DriverVersion = adapter_id.driver_version;
040b4a09341f574825386333398110f4db3e1e51vboxsync pIdentifier->VendorId = adapter_id.vendor_id;
040b4a09341f574825386333398110f4db3e1e51vboxsync pIdentifier->DeviceId = adapter_id.device_id;
040b4a09341f574825386333398110f4db3e1e51vboxsync pIdentifier->SubSysId = adapter_id.subsystem_id;
040b4a09341f574825386333398110f4db3e1e51vboxsync pIdentifier->Revision = adapter_id.revision;
040b4a09341f574825386333398110f4db3e1e51vboxsync memcpy(&pIdentifier->DeviceIdentifier, &adapter_id.device_identifier, sizeof(pIdentifier->DeviceIdentifier));
040b4a09341f574825386333398110f4db3e1e51vboxsync pIdentifier->WHQLLevel = adapter_id.whql_level;
040b4a09341f574825386333398110f4db3e1e51vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(LPDIRECT3D9EX iface, UINT Adapter, D3DFORMAT Format) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, format %#x.\n", iface, Adapter, Format);
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync /* Others than that not supported by d3d9, but reported by wined3d for ddraw. Filter them out */
af062818b47340eef15700d2f0211576ba3506eevboxsync if(Format != D3DFMT_X8R8G8B8 && Format != D3DFMT_R5G6B5) {
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
af062818b47340eef15700d2f0211576ba3506eevboxsync return 0;
af062818b47340eef15700d2f0211576ba3506eevboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync hr = IWineD3D_GetAdapterModeCount(This->WineD3D, Adapter, wined3dformat_from_d3dformat(Format));
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3D9Impl_EnumAdapterModes(LPDIRECT3D9EX iface, UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE* pMode) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, format %#x, mode_idx %u, mode %p.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, Adapter, Format, Mode, pMode);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync /* We can't pass this to WineD3D, otherwise it'll think it came from D3D8 or DDraw.
af062818b47340eef15700d2f0211576ba3506eevboxsync It's supposed to fail anyway, so no harm returning failure. */
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync if(Format != D3DFMT_X8R8G8B8 && Format != D3DFMT_R5G6B5)
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync {
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
af062818b47340eef15700d2f0211576ba3506eevboxsync return D3DERR_INVALIDCALL;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync hr = IWineD3D_EnumAdapterModes(This->WineD3D, Adapter, wined3dformat_from_d3dformat(Format),
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync Mode, (WINED3DDISPLAYMODE *) pMode);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3D9Impl_GetAdapterDisplayMode(LPDIRECT3D9EX iface, UINT Adapter, D3DDISPLAYMODE* pMode) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync HRESULT hr;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, mode %p.\n", iface, Adapter, pMode);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync hr = IWineD3D_GetAdapterDisplayMode(This->WineD3D, Adapter, (WINED3DDISPLAYMODE *) pMode);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsyncstatic HRESULT WINAPI IDirect3D9Impl_CheckDeviceType(IDirect3D9Ex *iface, UINT Adapter,
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync D3DDEVTYPE CheckType, D3DFORMAT DisplayFormat, D3DFORMAT BackBufferFormat, BOOL Windowed)
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync{
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, device_type %#x, display_format %#x, backbuffer_format %#x, windowed %#x.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, Adapter, CheckType, DisplayFormat, BackBufferFormat, Windowed);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync hr = IWineD3D_CheckDeviceType(This->WineD3D, Adapter, CheckType, wined3dformat_from_d3dformat(DisplayFormat),
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync wined3dformat_from_d3dformat(BackBufferFormat), Windowed);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsyncstatic HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormat(IDirect3D9Ex *iface, UINT Adapter, D3DDEVTYPE DeviceType,
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync D3DFORMAT AdapterFormat, DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat)
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync{
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync WINED3DRESOURCETYPE WineD3DRType;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, device_type %#x, adapter_format %#x, usage %#x, resource_type %#x, format %#x.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, Adapter, DeviceType, AdapterFormat, Usage, RType, CheckFormat);
af062818b47340eef15700d2f0211576ba3506eevboxsync
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync /* This format is nothing special and it is supported perfectly.
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync * However, ati and nvidia driver on windows do not mark this format as
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync * supported (tested with the dxCapsViewer) and pretending to
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync * support this format uncovers a bug in Battlefield 1942 (fonts are missing)
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync * So do the same as Windows drivers and pretend not to support it on dx8 and 9
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync */
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync if(CheckFormat == D3DFMT_R8G8B8)
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync {
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync WARN("D3DFMT_R8G8B8 is not available on windows, returning D3DERR_NOTAVAILABLE\n");
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync return D3DERR_NOTAVAILABLE;
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync }
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync switch(RType) {
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync case D3DRTYPE_VERTEXBUFFER:
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync case D3DRTYPE_INDEXBUFFER:
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync WineD3DRType = WINED3DRTYPE_BUFFER;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync break;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync default:
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync WineD3DRType = RType;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync break;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync }
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync hr = IWineD3D_CheckDeviceFormat(This->WineD3D, Adapter, DeviceType, wined3dformat_from_d3dformat(AdapterFormat),
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync Usage, WineD3DRType, wined3dformat_from_d3dformat(CheckFormat), SURFACE_OPENGL);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsyncstatic HRESULT WINAPI IDirect3D9Impl_CheckDeviceMultiSampleType(IDirect3D9Ex *iface, UINT Adapter,
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType,
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync DWORD *pQualityLevels)
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync{
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, device_type %#x, format %#x, windowed %#x, multisample_type %#x, levels %p.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, Adapter, DeviceType, SurfaceFormat, Windowed, MultiSampleType, pQualityLevels);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync hr = IWineD3D_CheckDeviceMultiSampleType(This->WineD3D, Adapter, DeviceType,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync wined3dformat_from_d3dformat(SurfaceFormat), Windowed, MultiSampleType, pQualityLevels);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsyncstatic HRESULT WINAPI IDirect3D9Impl_CheckDepthStencilMatch(IDirect3D9Ex *iface, UINT Adapter,
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat)
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync{
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, device_type %#x, adapter_format %#x, rt_format %#x, ds_format %#x.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, Adapter, DeviceType, AdapterFormat, RenderTargetFormat, DepthStencilFormat);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync hr = IWineD3D_CheckDepthStencilMatch(This->WineD3D, Adapter, DeviceType,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync wined3dformat_from_d3dformat(AdapterFormat), wined3dformat_from_d3dformat(RenderTargetFormat),
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync wined3dformat_from_d3dformat(DepthStencilFormat));
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormatConversion(LPDIRECT3D9EX iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SourceFormat, D3DFORMAT TargetFormat) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, device_type %#x, src_format %#x, dst_format %#x.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, Adapter, DeviceType, SourceFormat, TargetFormat);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync hr = IWineD3D_CheckDeviceFormatConversion(This->WineD3D, Adapter, DeviceType,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync wined3dformat_from_d3dformat(SourceFormat), wined3dformat_from_d3dformat(TargetFormat));
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncvoid filter_caps(D3DCAPS9* pCaps)
af062818b47340eef15700d2f0211576ba3506eevboxsync{
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync DWORD textureFilterCaps =
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTFILTERCAPS_MINFPOINT | D3DPTFILTERCAPS_MINFLINEAR | D3DPTFILTERCAPS_MINFANISOTROPIC |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTFILTERCAPS_MINFPYRAMIDALQUAD | D3DPTFILTERCAPS_MINFGAUSSIANQUAD|
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTFILTERCAPS_MIPFPOINT | D3DPTFILTERCAPS_MIPFLINEAR | D3DPTFILTERCAPS_MAGFPOINT |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTFILTERCAPS_MAGFLINEAR |D3DPTFILTERCAPS_MAGFANISOTROPIC|D3DPTFILTERCAPS_MAGFPYRAMIDALQUAD|
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTFILTERCAPS_MAGFGAUSSIANQUAD;
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->TextureFilterCaps &= textureFilterCaps;
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->CubeTextureFilterCaps &= textureFilterCaps;
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->VolumeTextureFilterCaps &= textureFilterCaps;
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->DevCaps &=
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DDEVCAPS_EXECUTESYSTEMMEMORY | D3DDEVCAPS_EXECUTEVIDEOMEMORY | D3DDEVCAPS_TLVERTEXSYSTEMMEMORY |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DDEVCAPS_TLVERTEXVIDEOMEMORY | D3DDEVCAPS_TEXTURESYSTEMMEMORY| D3DDEVCAPS_TEXTUREVIDEOMEMORY |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DDEVCAPS_DRAWPRIMTLVERTEX | D3DDEVCAPS_CANRENDERAFTERFLIP | D3DDEVCAPS_TEXTURENONLOCALVIDMEM|
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DDEVCAPS_DRAWPRIMITIVES2 | D3DDEVCAPS_SEPARATETEXTUREMEMORIES |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DDEVCAPS_DRAWPRIMITIVES2EX | D3DDEVCAPS_HWTRANSFORMANDLIGHT| D3DDEVCAPS_CANBLTSYSTONONLOCAL |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DDEVCAPS_HWRASTERIZATION | D3DDEVCAPS_PUREDEVICE | D3DDEVCAPS_QUINTICRTPATCHES |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DDEVCAPS_RTPATCHES | D3DDEVCAPS_RTPATCHHANDLEZERO | D3DDEVCAPS_NPATCHES;
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->ShadeCaps &=
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPSHADECAPS_COLORGOURAUDRGB | D3DPSHADECAPS_SPECULARGOURAUDRGB |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPSHADECAPS_ALPHAGOURAUDBLEND | D3DPSHADECAPS_FOGGOURAUD;
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->RasterCaps &=
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPRASTERCAPS_DITHER | D3DPRASTERCAPS_ZTEST | D3DPRASTERCAPS_FOGVERTEX |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPRASTERCAPS_FOGTABLE | D3DPRASTERCAPS_MIPMAPLODBIAS | D3DPRASTERCAPS_ZBUFFERLESSHSR |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPRASTERCAPS_FOGRANGE | D3DPRASTERCAPS_ANISOTROPY | D3DPRASTERCAPS_WBUFFER |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPRASTERCAPS_WFOG | D3DPRASTERCAPS_ZFOG | D3DPRASTERCAPS_COLORPERSPECTIVE |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPRASTERCAPS_SCISSORTEST | D3DPRASTERCAPS_SLOPESCALEDEPTHBIAS |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPRASTERCAPS_DEPTHBIAS | D3DPRASTERCAPS_MULTISAMPLE_TOGGLE;
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->DevCaps2 &=
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DDEVCAPS2_STREAMOFFSET | D3DDEVCAPS2_DMAPNPATCH | D3DDEVCAPS2_ADAPTIVETESSRTPATCH |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DDEVCAPS2_ADAPTIVETESSNPATCH | D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH| D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET;
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->Caps2 &=
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DCAPS2_FULLSCREENGAMMA | D3DCAPS2_CANCALIBRATEGAMMA | D3DCAPS2_RESERVED |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DCAPS2_CANMANAGERESOURCE | D3DCAPS2_DYNAMICTEXTURES | D3DCAPS2_CANAUTOGENMIPMAP;
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->VertexProcessingCaps &=
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DVTXPCAPS_TEXGEN | D3DVTXPCAPS_MATERIALSOURCE7 | D3DVTXPCAPS_DIRECTIONALLIGHTS |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DVTXPCAPS_POSITIONALLIGHTS | D3DVTXPCAPS_LOCALVIEWER | D3DVTXPCAPS_TWEENING |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DVTXPCAPS_TEXGEN_SPHEREMAP | D3DVTXPCAPS_NO_TEXGEN_NONLOCALVIEWER;
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->TextureCaps &=
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTEXTURECAPS_PERSPECTIVE | D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_ALPHA |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTEXTURECAPS_SQUAREONLY | D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTEXTURECAPS_ALPHAPALETTE | D3DPTEXTURECAPS_NONPOW2CONDITIONAL |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTEXTURECAPS_PROJECTED | D3DPTEXTURECAPS_CUBEMAP | D3DPTEXTURECAPS_VOLUMEMAP |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTEXTURECAPS_MIPMAP | D3DPTEXTURECAPS_MIPVOLUMEMAP | D3DPTEXTURECAPS_MIPCUBEMAP |
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DPTEXTURECAPS_CUBEMAP_POW2 | D3DPTEXTURECAPS_VOLUMEMAP_POW2| D3DPTEXTURECAPS_NOPROJECTEDBUMPENV;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync pCaps->MaxVertexShaderConst = min(D3D9_MAX_VERTEX_SHADER_CONSTANTF, pCaps->MaxVertexShaderConst);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync pCaps->NumSimultaneousRTs = min(D3D9_MAX_SIMULTANEOUS_RENDERTARGETS, pCaps->NumSimultaneousRTs);
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#ifndef VBOX_WINE_WITHOUT_LIBWINE
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#define D3DDEVCAPS_FLOATTLVERTEX 0x00000001
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#define D3DPMISCCAPS_FOGINFVF 0x00002000
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#define D3DPRASTERCAPS_SUBPIXEL 0x00000020
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#define D3DPRASTERCAPS_STIPPLE 0x00000200
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#define D3DPTEXTURECAPS_TRANSPARENCY 0x00000008
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#endif
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9EX iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hrc = D3D_OK;
af062818b47340eef15700d2f0211576ba3506eevboxsync WINED3DCAPS *pWineCaps;
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, device_type %#x, caps %p.\n", iface, Adapter, DeviceType, pCaps);
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync if(NULL == pCaps){
af062818b47340eef15700d2f0211576ba3506eevboxsync return D3DERR_INVALIDCALL;
af062818b47340eef15700d2f0211576ba3506eevboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync pWineCaps = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINED3DCAPS));
af062818b47340eef15700d2f0211576ba3506eevboxsync if(pWineCaps == NULL){
af062818b47340eef15700d2f0211576ba3506eevboxsync return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/
af062818b47340eef15700d2f0211576ba3506eevboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync memset(pCaps, 0, sizeof(*pCaps));
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hrc = IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, pWineCaps);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync WINECAPSTOD3D9CAPS(pCaps, pWineCaps)
af062818b47340eef15700d2f0211576ba3506eevboxsync HeapFree(GetProcessHeap(), 0, pWineCaps);
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync /* Some functionality is implemented in d3d9.dll, not wined3d.dll. Add the needed caps */
af062818b47340eef15700d2f0211576ba3506eevboxsync pCaps->DevCaps2 |= D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES;
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync filter_caps(pCaps);
af062818b47340eef15700d2f0211576ba3506eevboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync /* fixup caps */
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#ifdef VBOX_WITH_WDDM
6decafdf89f825b3af922ab6fa02345e08e5be7bvboxsync /* needed for Windows Media Player to work properly */
6decafdf89f825b3af922ab6fa02345e08e5be7bvboxsync pCaps->Caps |= D3DCAPS_READ_SCANLINE;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->Caps2 |= 0x00080000 /*D3DCAPS2_CANRENDERWINDOWED*/;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->Caps2 |= D3DCAPS2_CANSHARERESOURCE;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->DevCaps |= D3DDEVCAPS_FLOATTLVERTEX /* <- must be set according to the docs */
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync /*| D3DDEVCAPS_HWVERTEXBUFFER | D3DDEVCAPS_HWINDEXBUFFER | D3DDEVCAPS_SUBVOLUMELOCK */;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->PrimitiveMiscCaps |= D3DPMISCCAPS_INDEPENDENTWRITEMASKS
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync | D3DPMISCCAPS_FOGINFVF
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync | D3DPMISCCAPS_SEPARATEALPHABLEND | D3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->RasterCaps |= D3DPRASTERCAPS_SUBPIXEL | D3DPRASTERCAPS_STIPPLE | D3DPRASTERCAPS_ZBIAS | D3DPRASTERCAPS_COLORPERSPECTIVE /* keep */;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->TextureCaps |= D3DPTEXTURECAPS_TRANSPARENCY | D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE;
7c2799f00a5ed9ff074f8afdd0e6e5465b96732fvboxsync pCaps->TextureAddressCaps |= D3DPTADDRESSCAPS_MIRRORONCE;
7c2799f00a5ed9ff074f8afdd0e6e5465b96732fvboxsync pCaps->VolumeTextureAddressCaps |= D3DPTADDRESSCAPS_MIRRORONCE;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->StencilCaps |= D3DSTENCILCAPS_TWOSIDED;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->DeclTypes |= D3DDTCAPS_FLOAT16_2 | D3DDTCAPS_FLOAT16_4;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->VertexTextureFilterCaps |= D3DPTFILTERCAPS_MINFPOINT | D3DPTFILTERCAPS_MAGFPOINT;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->GuardBandLeft = -8192.;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->GuardBandTop = -8192.;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->GuardBandRight = 8192.;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->GuardBandBottom = 8192.;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->VS20Caps.DynamicFlowControlDepth = 24;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->VS20Caps.NumTemps = D3DVS20_MAX_NUMTEMPS;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->PS20Caps.DynamicFlowControlDepth = 24;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->PS20Caps.NumTemps = D3DVS20_MAX_NUMTEMPS;
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#endif
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync /* workaround for wine not returning InstructionSlots correctly for shaders v3.0 */
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync if ((pCaps->VertexShaderVersion & 0xff00) == 0x0300)
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync {
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->MaxVertexShader30InstructionSlots = RT_MIN(32768, pCaps->MaxVertexShader30InstructionSlots);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync pCaps->MaxPixelShader30InstructionSlots = RT_MIN(32768, pCaps->MaxPixelShader30InstructionSlots);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync }
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#if defined(DEBUG)
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync if ((pCaps->VertexShaderVersion & 0xff00) == 0x0300)
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync {
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(pCaps->MaxVertexShader30InstructionSlots >= 512);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(pCaps->MaxVertexShader30InstructionSlots <= 32768);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(pCaps->MaxPixelShader30InstructionSlots >= 512);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(pCaps->MaxPixelShader30InstructionSlots <= 32768);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync }
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync else if ((pCaps->VertexShaderVersion & 0xff00) == 0x0200)
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync {
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(pCaps->MaxVertexShader30InstructionSlots == 0);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(pCaps->MaxPixelShader30InstructionSlots == 0);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync }
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync else
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync {
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync }
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync#endif
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync TRACE("(%p) returning %p\n", This, pCaps);
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hrc == S_OK);
af062818b47340eef15700d2f0211576ba3506eevboxsync return hrc;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HMONITOR WINAPI IDirect3D9Impl_GetAdapterMonitor(LPDIRECT3D9EX iface, UINT Adapter) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HMONITOR ret;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u.\n", iface, Adapter);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync ret = IWineD3D_GetAdapterMonitor(This->WineD3D, Adapter);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
af062818b47340eef15700d2f0211576ba3506eevboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(ret);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync return ret;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsyncstatic HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9Impl_CreateDevice(IDirect3D9Ex *iface, UINT adapter,
5112e32d7072e280613921c982a6672f2c859cf3vboxsync D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters,
5112e32d7072e280613921c982a6672f2c859cf3vboxsync IDirect3DDevice9 **device)
5112e32d7072e280613921c982a6672f2c859cf3vboxsync{
5112e32d7072e280613921c982a6672f2c859cf3vboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync IDirect3DDevice9Impl *object;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, device_type %#x, focus_window %p, flags %#x, parameters %p, device %p.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, adapter, device_type, focus_window, flags, parameters, device);
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
5112e32d7072e280613921c982a6672f2c859cf3vboxsync if (!object)
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync {
5112e32d7072e280613921c982a6672f2c859cf3vboxsync ERR("Failed to allocate device memory.\n");
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
5112e32d7072e280613921c982a6672f2c859cf3vboxsync return E_OUTOFMEMORY;
af062818b47340eef15700d2f0211576ba3506eevboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync hr = device_init(object, This->WineD3D, adapter, device_type, focus_window, flags,
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync#ifdef VBOX_WITH_WDDM
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync (VBOXWINEEX_D3DPRESENT_PARAMETERS *)
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync#endif
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync parameters);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync if (FAILED(hr))
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync {
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
5112e32d7072e280613921c982a6672f2c859cf3vboxsync WARN("Failed to initialize device, hr %#x.\n", hr);
af062818b47340eef15700d2f0211576ba3506eevboxsync HeapFree(GetProcessHeap(), 0, object);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync return hr;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("Created device %p.\n", object);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync *device = (IDirect3DDevice9 *)object;
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync return D3D_OK;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsyncstatic UINT WINAPI IDirect3D9ExImpl_GetAdapterModeCountEx(IDirect3D9Ex *iface,
5112e32d7072e280613921c982a6672f2c859cf3vboxsync UINT adapter, const D3DDISPLAYMODEFILTER *filter)
5112e32d7072e280613921c982a6672f2c859cf3vboxsync{
5112e32d7072e280613921c982a6672f2c859cf3vboxsync FIXME("iface %p, adapter %u, filter %p stub!\n", iface, adapter, filter);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
af062818b47340eef15700d2f0211576ba3506eevboxsync return D3DERR_DRIVERINTERNALERROR;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsyncstatic HRESULT WINAPI IDirect3D9ExImpl_EnumAdapterModesEx(IDirect3D9Ex *iface,
5112e32d7072e280613921c982a6672f2c859cf3vboxsync UINT adapter, const D3DDISPLAYMODEFILTER *filter, UINT mode_idx, D3DDISPLAYMODEEX *mode)
5112e32d7072e280613921c982a6672f2c859cf3vboxsync{
5112e32d7072e280613921c982a6672f2c859cf3vboxsync FIXME("iface %p, adapter %u, filter %p, mode_idx %u, mode %p stub!\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, adapter, filter, mode_idx, mode);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
af062818b47340eef15700d2f0211576ba3506eevboxsync return D3DERR_DRIVERINTERNALERROR;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsyncstatic HRESULT WINAPI IDirect3D9ExImpl_GetAdapterDisplayModeEx(IDirect3D9Ex *iface,
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync UINT Adapter, D3DDISPLAYMODEEX *pMode, D3DDISPLAYROTATION *pRotation)
5112e32d7072e280613921c982a6672f2c859cf3vboxsync{
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync TRACE("iface %p, adapter %u, mode %p, rotation %p", iface, Adapter, pMode, pRotation);
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync wined3d_mutex_lock();
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync hr = IWineD3D_GetAdapterDisplayModeEx(This->WineD3D, Adapter, (WINED3DDISPLAYMODEEX *) pMode, (WINED3DDISPLAYROTATION *) pRotation);
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync wined3d_mutex_unlock();
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync if (SUCCEEDED(hr))
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync {
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync }
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync/*
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync if (mode)
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync {
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync D3DDISPLAYMODE* d3dmode;
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync if (mode->Size != sizeof(D3DDISPLAYMODEEX))
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync {
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync WARN("Invalid mode->Size %u expected %u", mode->Size, sizeof(D3DDISPLAYMODEEX));
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync return D3DERR_INVALIDCALL;
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync }
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync wined3d_mutex_lock();
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync hr = IWineD3D_GetAdapterDisplayMode(This->WineD3D, Adapter, (WINED3DDISPLAYMODE *) &d3dmode);
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync wined3d_mutex_unlock();
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync if (SUCCEEDED(hr))
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync {
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync mode->Width = d3dmode.Width;
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync mode->Height = d3dmode.Height;
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync mode->RefreshRate = d3dmode.RefreshRate;
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync mode->Format = d3dformat_from_wined3dformat(d3dmode.Format);
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync mode->ScanLineOrdering = D3DSCANLINEORDERING_PROGRESSIVE; //D3DSCANLINEORDERING_INTERLACED
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync }
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync }
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync else
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync {
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync hr = WINED3D_OK;
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync }
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync if (rotation)
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync {
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync *rotation = D3DDISPLAYROTATION_IDENTITY;
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync }
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync*/
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
6ad429d8a54ce8f85a6c040f15d1cdbdfba3dfabvboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsyncstatic HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9ExImpl_CreateDeviceEx(IDirect3D9Ex *iface,
5112e32d7072e280613921c982a6672f2c859cf3vboxsync UINT adapter, D3DDEVTYPE device_type, HWND focus_window, DWORD flags,
5112e32d7072e280613921c982a6672f2c859cf3vboxsync D3DPRESENT_PARAMETERS *parameters, D3DDISPLAYMODEEX *mode, IDirect3DDevice9Ex **device)
5112e32d7072e280613921c982a6672f2c859cf3vboxsync{
5112e32d7072e280613921c982a6672f2c859cf3vboxsync FIXME("iface %p, adapter %u, device_type %#x, focus_window %p, flags %#x,\n"
5112e32d7072e280613921c982a6672f2c859cf3vboxsync "parameters %p, mode %p, device %p stub!\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, adapter, device_type, focus_window, flags,
5112e32d7072e280613921c982a6672f2c859cf3vboxsync parameters, mode, device);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync *device = NULL;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ERR_D3D();
af062818b47340eef15700d2f0211576ba3506eevboxsync return D3DERR_DRIVERINTERNALERROR;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsyncstatic HRESULT WINAPI IDirect3D9ExImpl_GetAdapterLUID(IDirect3D9Ex *iface, UINT adapter, LUID *luid)
5112e32d7072e280613921c982a6672f2c859cf3vboxsync{
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync WINED3DADAPTER_IDENTIFIER adapter_id;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, adapter %u, luid %p.\n", iface, adapter, luid);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync adapter_id.driver_size = 0;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync adapter_id.description_size = 0;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync adapter_id.device_name_size = 0;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync wined3d_mutex_lock();
5112e32d7072e280613921c982a6672f2c859cf3vboxsync hr = IWineD3D_GetAdapterIdentifier(This->WineD3D, adapter, 0, &adapter_id);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync wined3d_mutex_unlock();
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync memcpy(luid, &adapter_id.adapter_luid, sizeof(*luid));
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
d2432596ad0325b8a9b42552ce4fcd251f37fcc3vboxsync ASSERT_D3D(hr == S_OK);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncconst IDirect3D9ExVtbl Direct3D9_Vtbl =
af062818b47340eef15700d2f0211576ba3506eevboxsync{
af062818b47340eef15700d2f0211576ba3506eevboxsync /* IUnknown */
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_QueryInterface,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_AddRef,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_Release,
af062818b47340eef15700d2f0211576ba3506eevboxsync /* IDirect3D9 */
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_RegisterSoftwareDevice,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_GetAdapterCount,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_GetAdapterIdentifier,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_GetAdapterModeCount,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_EnumAdapterModes,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_GetAdapterDisplayMode,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_CheckDeviceType,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_CheckDeviceFormat,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_CheckDeviceMultiSampleType,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_CheckDepthStencilMatch,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_CheckDeviceFormatConversion,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_GetDeviceCaps,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_GetAdapterMonitor,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9Impl_CreateDevice,
af062818b47340eef15700d2f0211576ba3506eevboxsync /* IDirect3D9Ex */
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9ExImpl_GetAdapterModeCountEx,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9ExImpl_EnumAdapterModesEx,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9ExImpl_GetAdapterDisplayModeEx,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9ExImpl_CreateDeviceEx,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3D9ExImpl_GetAdapterLUID
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync};