From: Paul Gofman <pgofman@codeweavers.com> --- dlls/ddraw/surface.c | 19 +++++++++++++------ dlls/ddraw/tests/ddraw1.c | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 95a4a50a244..1b351e7ba33 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -6348,10 +6348,17 @@ static HRESULT ddraw_surface_reserve_memory(struct wined3d_texture *wined3d_text return hr; } +static bool is_render_target(struct ddraw *ddraw, DWORD caps, unsigned int surface_version) +{ + if (caps & DDSCAPS_3DDEVICE) + return true; + return surface_version == 1 && caps & 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; wined3d_desc->resource_type = WINED3D_RTYPE_TEXTURE_2D; @@ -6371,7 +6378,7 @@ static void wined3d_resource_desc_from_ddraw(struct ddraw *ddraw, wined3d_desc->bind_flags |= WINED3D_BIND_SHADER_RESOURCE; if (caps & DDSCAPS_ZBUFFER) wined3d_desc->bind_flags |= WINED3D_BIND_DEPTH_STENCIL; - else if (caps & DDSCAPS_3DDEVICE) + else if (is_render_target(ddraw, caps, version)) wined3d_desc->bind_flags |= WINED3D_BIND_RENDER_TARGET; if ((caps & DDSCAPS_SYSTEMMEMORY) && !(caps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))) @@ -6389,7 +6396,7 @@ static void wined3d_resource_desc_from_ddraw(struct ddraw *ddraw, else if (caps & DDSCAPS_VIDEOMEMORY) { /* Dynamic resources can't be written by the GPU. */ - if (!(caps & (DDSCAPS_3DDEVICE | DDSCAPS_ZBUFFER))) + if (!(caps & DDSCAPS_ZBUFFER) && !is_render_target(ddraw, caps, version)) wined3d_desc->usage |= WINED3DUSAGE_DYNAMIC; } } @@ -6418,7 +6425,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) { @@ -6997,7 +7004,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 (is_render_target(ddraw, desc->ddsCaps.dwCaps, 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 3e5457e464b..9ddb58b1bbb 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -5724,7 +5724,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