From: Paul Gofman <pgofman@codeweavers.com> --- dlls/ddraw/surface.c | 16 ++++++++++++---- dlls/ddraw/tests/ddraw1.c | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index c48aeb7c839..5be55596128 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -6327,12 +6327,20 @@ static HRESULT ddraw_surface_reserve_memory(struct wined3d_texture *wined3d_text return hr; } +static BOOL force_3ddevice(struct ddraw *ddraw, const DDSURFACEDESC2 *desc, unsigned int surface_version) +{ + return surface_version == 1 && desc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE && !(ddraw->flags & DDRAW_NO3D); +} + static void wined3d_resource_desc_from_ddraw(struct ddraw *ddraw, - struct wined3d_resource_desc *wined3d_desc, const DDSURFACEDESC2 *desc) + struct wined3d_resource_desc *wined3d_desc, const DDSURFACEDESC2 *desc, unsigned int version) { - const DWORD caps = desc->ddsCaps.dwCaps; + DWORD caps = desc->ddsCaps.dwCaps; const DWORD caps2 = desc->ddsCaps.dwCaps2; + if (force_3ddevice(ddraw, desc, version)) + caps |= DDSCAPS_3DDEVICE; + wined3d_desc->resource_type = WINED3D_RTYPE_TEXTURE_2D; wined3d_desc->format = wined3dformat_from_ddrawformat(&desc->ddpfPixelFormat); wined3d_desc->multisample_type = WINED3D_MULTISAMPLE_NONE; @@ -6397,7 +6405,7 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d unsigned int i, j; HRESULT hr; - wined3d_resource_desc_from_ddraw(ddraw, &wined3d_desc, desc); + wined3d_resource_desc_from_ddraw(ddraw, &wined3d_desc, desc, texture->version); if (wined3d_desc.format == WINED3DFMT_UNKNOWN) { @@ -6976,7 +6984,7 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_ if (desc->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) bind_flags |= WINED3D_BIND_DEPTH_STENCIL; - else if (desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) + else if ((desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) || force_3ddevice(ddraw, desc, version)) bind_flags |= WINED3D_BIND_RENDER_TARGET; if (!(ddraw->flags & DDRAW_NO3D) && SUCCEEDED(hr = wined3d_check_device_format(ddraw->wined3d, diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index 6ce50821590..37af1eebef8 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -5705,7 +5705,7 @@ static void test_flip(void) if (have_3ddevice) { hr = IDirectDrawSurface_QueryInterface(backbuffer1, &IID_IDirect3DHALDevice, (void **)&device); - todo_wine ok(hr == DD_OK || broken(hr == E_FAIL), "got %#lx.\n", hr); + ok(hr == DD_OK || broken(hr == E_FAIL), "got %#lx.\n", hr); if (SUCCEEDED(hr)) IDirect3DDevice_Release(device); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10992