From 4f91eb3fe125f80fe148ba2ad74deeeb6ccd78d9 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 3 Apr 2012 21:15:12 +0200 Subject: [PATCH] ddraw: Keep track of the ddraw version used to create a device. This also obsoletes the "from_surface" device field. --- dlls/ddraw/ddraw.c | 74 ++++++++++++++-------------------------------- dlls/ddraw/ddraw_private.h | 8 ++--- dlls/ddraw/device.c | 50 +++++++++++++++++++++++++++++-- dlls/ddraw/surface.c | 12 ++++---- 4 files changed, 80 insertions(+), 64 deletions(-) diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 0df790f20fd..9d68fc9d537 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -4426,50 +4426,17 @@ static HRESULT WINAPI d3d7_CreateDevice(IDirect3D7 *iface, REFCLSID riid, TRACE("iface %p, riid %s, surface %p, device %p.\n", iface, debugstr_guid(riid), surface, device); wined3d_mutex_lock(); - *device = NULL; - - /* Fail device creation if non-opengl surfaces are used. */ - if (DefaultSurfaceType != WINED3D_SURFACE_TYPE_OPENGL) - { - ERR("The application wants to create a Direct3D device, but non-opengl surfaces are set in the registry.\n"); - ERR("Please set the surface implementation to opengl or autodetection to allow 3D rendering.\n"); - - /* We only hit this path if a default surface is set in the registry. Incorrect autodetection - * is caught in CreateSurface or QueryInterface. */ - wined3d_mutex_unlock(); - return DDERR_NO3D; - } - - if (ddraw->d3ddevice) - { - FIXME("Only one Direct3D device per DirectDraw object supported.\n"); - wined3d_mutex_unlock(); - return DDERR_INVALIDPARAMS; - } - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (!object) + hr = d3d_device_create(ddraw, target, 7, &object); + if (SUCCEEDED(hr)) + *device = &object->IDirect3DDevice7_iface; + else { - ERR("Failed to allocate device memory.\n"); - wined3d_mutex_unlock(); - return DDERR_OUTOFMEMORY; + WARN("Failed to create device, hr %#x.\n", hr); + *device = NULL; } - - hr = d3d_device_init(object, ddraw, target); - if (FAILED(hr)) - { - WARN("Failed to initialize device, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, object); - wined3d_mutex_unlock(); - return hr; - } - - TRACE("Created device %p.\n", object); - *device = &object->IDirect3DDevice7_iface; - wined3d_mutex_unlock(); - return D3D_OK; + return hr; } static HRESULT WINAPI d3d3_CreateDevice(IDirect3D3 *iface, REFCLSID riid, @@ -4477,22 +4444,25 @@ static HRESULT WINAPI d3d3_CreateDevice(IDirect3D3 *iface, REFCLSID riid, { struct ddraw_surface *surface_impl = unsafe_impl_from_IDirectDrawSurface4(surface); struct ddraw *ddraw = impl_from_IDirect3D3(iface); - IDirect3DDevice7 *device7; IDirect3DDeviceImpl *device_impl; HRESULT hr; TRACE("iface %p, riid %s, surface %p, device %p, outer_unknown %p.\n", iface, debugstr_guid(riid), surface, device, outer_unknown); - if (outer_unknown) return CLASS_E_NOAGGREGATION; + if (outer_unknown) + return CLASS_E_NOAGGREGATION; - hr = d3d7_CreateDevice(&ddraw->IDirect3D7_iface, riid, - surface_impl ? &surface_impl->IDirectDrawSurface7_iface : NULL, device ? &device7 : NULL); + wined3d_mutex_lock(); + hr = d3d_device_create(ddraw, surface_impl, 3, &device_impl); if (SUCCEEDED(hr)) - { - device_impl = impl_from_IDirect3DDevice7(device7); *device = &device_impl->IDirect3DDevice3_iface; + else + { + WARN("Failed to create device, hr %#x.\n", hr); + *device = NULL; } + wined3d_mutex_unlock(); return hr; } @@ -4502,20 +4472,22 @@ static HRESULT WINAPI d3d2_CreateDevice(IDirect3D2 *iface, REFCLSID riid, { struct ddraw_surface *surface_impl = unsafe_impl_from_IDirectDrawSurface(surface); struct ddraw *ddraw = impl_from_IDirect3D2(iface); - IDirect3DDevice7 *device7; IDirect3DDeviceImpl *device_impl; HRESULT hr; TRACE("iface %p, riid %s, surface %p, device %p.\n", iface, debugstr_guid(riid), surface, device); - hr = d3d7_CreateDevice(&ddraw->IDirect3D7_iface, riid, - surface_impl ? &surface_impl->IDirectDrawSurface7_iface : NULL, device ? &device7 : NULL); + wined3d_mutex_lock(); + hr = d3d_device_create(ddraw, surface_impl, 2, &device_impl); if (SUCCEEDED(hr)) - { - device_impl = impl_from_IDirect3DDevice7(device7); *device = &device_impl->IDirect3DDevice2_iface; + else + { + WARN("Failed to create device, hr %#x.\n", hr); + *device = NULL; } + wined3d_mutex_unlock(); return hr; } diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index fa0f14480ef..d7873e8a064 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -278,7 +278,8 @@ struct IDirect3DDeviceImpl IDirect3DDevice3 IDirect3DDevice3_iface; IDirect3DDevice2 IDirect3DDevice2_iface; IDirect3DDevice IDirect3DDevice_iface; - LONG ref; + LONG ref; + UINT version; /* Other object connections */ struct wined3d_device *wined3d_device; @@ -293,7 +294,6 @@ struct IDirect3DDeviceImpl /* Required to keep track which of two available texture blending modes in d3ddevice3 is used */ BOOL legacyTextureBlending; - BOOL from_surface; D3DMATRIX legacy_projection; D3DMATRIX legacy_clipspace; @@ -315,8 +315,8 @@ struct IDirect3DDeviceImpl D3DMATRIXHANDLE world, proj, view; }; -HRESULT d3d_device_init(IDirect3DDeviceImpl *device, struct ddraw *ddraw, - struct ddraw_surface *target) DECLSPEC_HIDDEN; +HRESULT d3d_device_create(struct ddraw *ddraw, struct ddraw_surface *target, + UINT version, IDirect3DDeviceImpl **device) DECLSPEC_HIDDEN; /* The IID */ extern const GUID IID_D3DDEVICE_WineD3D DECLSPEC_HIDDEN; diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 8f65dc5197c..b656ab00cbd 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -33,6 +33,7 @@ #include "ddraw_private.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); +WINE_DECLARE_DEBUG_CHANNEL(winediag); /* The device ID */ const GUID IID_D3DDEVICE_WineD3D = { @@ -180,7 +181,7 @@ IDirect3DDeviceImpl_7_QueryInterface(IDirect3DDevice7 *iface, } /* DirectDrawSurface */ - else if (IsEqualGUID(&IID_IDirectDrawSurface, refiid) && This->from_surface) + else if (IsEqualGUID(&IID_IDirectDrawSurface, refiid) && This->version == 1) { *obj = &This->target->IDirectDrawSurface_iface; TRACE("Returning IDirectDrawSurface interface %p.\n", *obj); @@ -7015,7 +7016,8 @@ enum wined3d_depth_buffer_type IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DD return WINED3D_ZB_TRUE; } -HRESULT d3d_device_init(IDirect3DDeviceImpl *device, struct ddraw *ddraw, struct ddraw_surface *target) +static HRESULT d3d_device_init(IDirect3DDeviceImpl *device, struct ddraw *ddraw, + struct ddraw_surface *target, UINT version) { static const D3DMATRIX ident = { @@ -7035,6 +7037,7 @@ HRESULT d3d_device_init(IDirect3DDeviceImpl *device, struct ddraw *ddraw, struct device->IDirect3DDevice2_iface.lpVtbl = &d3d_device2_vtbl; device->IDirect3DDevice_iface.lpVtbl = &d3d_device1_vtbl; device->ref = 1; + device->version = version; device->ddraw = ddraw; device->target = target; list_init(&device->viewport_list); @@ -7092,3 +7095,46 @@ HRESULT d3d_device_init(IDirect3DDeviceImpl *device, struct ddraw *ddraw, struct return D3D_OK; } + +HRESULT d3d_device_create(struct ddraw *ddraw, struct ddraw_surface *target, + UINT version, IDirect3DDeviceImpl **device) +{ + IDirect3DDeviceImpl *object; + HRESULT hr; + + TRACE("ddraw %p, target %p, version %u, device %p.\n", ddraw, target, version, device); + + if (DefaultSurfaceType != WINED3D_SURFACE_TYPE_OPENGL) + { + ERR_(winediag)("The application wants to create a Direct3D device, " + "but the current DirectDrawRenderer does not support this.\n"); + + return DDERR_NO3D; + } + + if (ddraw->d3ddevice) + { + FIXME("Only one Direct3D device per DirectDraw object supported.\n"); + return DDERR_INVALIDPARAMS; + } + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate device memory.\n"); + return DDERR_OUTOFMEMORY; + } + + hr = d3d_device_init(object, ddraw, target, version); + if (FAILED(hr)) + { + WARN("Failed to initialize device, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created device %p.\n", object); + *device = object; + + return D3D_OK; +} diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index d5b57c00c35..1d614ac69fb 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -204,21 +204,19 @@ static HRESULT WINAPI ddraw_surface7_QueryInterface(IDirectDrawSurface7 *iface, || IsEqualGUID(riid, &IID_IDirect3DHALDevice) || IsEqualGUID(riid, &IID_IDirect3DRGBDevice)) { - IDirect3DDeviceImpl *device_impl; - IDirect3DDevice7 *device; + IDirect3DDeviceImpl *device; HRESULT hr; - hr = IDirect3D7_CreateDevice(&This->ddraw->IDirect3D7_iface, riid, - &This->IDirectDrawSurface7_iface, &device); + wined3d_mutex_lock(); + hr = d3d_device_create(This->ddraw, This, 1, &device); + wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create device, hr %#x.\n", hr); return hr; } - device_impl = impl_from_IDirect3DDevice7(device); - device_impl->from_surface = TRUE; - *obj = &device_impl->IDirect3DDevice_iface; + *obj = &device->IDirect3DDevice_iface; return S_OK; } -- 2.11.4.GIT