From: Paul Gofman pgofman@codeweavers.com
--- dlls/ddraw/surface.c | 20 ++++++++++++++++++-- dlls/ddraw/tests/ddraw2.c | 4 ++-- dlls/ddraw/tests/ddraw4.c | 4 ++-- dlls/ddraw/tests/ddraw7.c | 8 ++++---- 4 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 71179b01a0b..6a7b5bdb680 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -6780,6 +6780,22 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
LIST_FOR_EACH_ENTRY(device, &ddraw->d3ddevice_list, struct d3d_device, ddraw_entry) { + if (FAILED(hr = wined3d_stateblock_create(ddraw->wined3d_device, + device->state, WINED3D_SBT_ALL, &device->saved_state))) + { + struct list *entry; + + ERR("Failed to create stateblock, hr %#lx.\n", hr); + entry = &device->ddraw_entry; + while ((entry = list_prev(&ddraw->d3ddevice_list, entry))) + { + device = LIST_ENTRY(entry, struct d3d_device, ddraw_entry); + wined3d_stateblock_decref(device->saved_state); + device->saved_state = NULL; + } + free(texture); + return E_OUTOFMEMORY; + } if (device->recording) wined3d_stateblock_decref(device->recording); device->recording = NULL; @@ -6797,8 +6813,8 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
LIST_FOR_EACH_ENTRY(device, &ddraw->d3ddevice_list, struct d3d_device, ddraw_entry) { - wined3d_stateblock_set_render_state(device->state, WINED3D_RS_ZENABLE, - !!swapchain_desc.enable_auto_depth_stencil); + wined3d_stateblock_apply(device->saved_state, device->state); + device->saved_state = NULL; } } } diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 79ffe51a6f8..66fceafbc8d 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -16705,10 +16705,10 @@ static void test_d3d_state_reset(void)
hr = IDirect3DDevice2_GetRenderState(device, D3DRENDERSTATE_FOGCOLOR, &state); ok(hr == DD_OK, "got %#lx.\n", hr); - todo_wine ok(state == 0x00282828, "got %#lx.\n", state); + ok(state == 0x00282828, "got %#lx.\n", state); hr = IDirect3DDevice2_GetRenderState(device, D3DRENDERSTATE_ZENABLE, &state); ok(hr == DD_OK, "got %#lx.\n", hr); - todo_wine ok(state == TRUE, "got %#lx.\n", state); + ok(state == TRUE, "got %#lx.\n", state);
hr = IDirectDraw2_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(hr == DD_OK, "got %#lx.\n", hr); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 278d2b21da0..a952eb683a5 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -19809,10 +19809,10 @@ static void test_d3d_state_reset(void)
hr = IDirect3DDevice3_GetRenderState(device, D3DRENDERSTATE_FOGCOLOR, &state); ok(hr == DD_OK, "got %#lx.\n", hr); - todo_wine ok(state == 0x00282828, "got %#lx.\n", state); + ok(state == 0x00282828, "got %#lx.\n", state); hr = IDirect3DDevice3_GetRenderState(device, D3DRENDERSTATE_ZENABLE, &state); ok(hr == DD_OK, "got %#lx.\n", hr); - todo_wine ok(state == TRUE, "got %#lx.\n", state); + ok(state == TRUE, "got %#lx.\n", state);
hr = IDirectDraw4_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(hr == DD_OK, "got %#lx.\n", hr); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 709030ecdbe..04fe5a2049b 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -20251,15 +20251,15 @@ static void test_d3d_state_reset(void)
hr = IDirect3DDevice7_GetViewport(device, &vp2); ok(hr == DD_OK, "got %#lx.\n", hr); - todo_wine ok(vp2.dwWidth == vp1.dwWidth, "got %ld, expected %ld.\n", vp2.dwWidth, vp1.dwWidth); - todo_wine ok(vp2.dwHeight == vp1.dwHeight, "got %ld, expected %ld.\n", vp2.dwHeight, vp1.dwHeight); + ok(vp2.dwWidth == vp1.dwWidth, "got %ld, expected %ld.\n", vp2.dwWidth, vp1.dwWidth); + ok(vp2.dwHeight == vp1.dwHeight, "got %ld, expected %ld.\n", vp2.dwHeight, vp1.dwHeight);
hr = IDirect3DDevice7_GetRenderState(device, D3DRENDERSTATE_FOGCOLOR, &state); ok(hr == DD_OK, "got %#lx.\n", hr); - todo_wine ok(state == 0x00282828, "got %#lx.\n", state); + ok(state == 0x00282828, "got %#lx.\n", state); hr = IDirect3DDevice7_GetRenderState(device, D3DRENDERSTATE_ZENABLE, &state); ok(hr == DD_OK, "got %#lx.\n", hr); - todo_wine ok(state == TRUE, "got %#lx.\n", state); + ok(state == TRUE, "got %#lx.\n", state);
hr = IDirectDraw7_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(hr == DD_OK, "got %#lx.\n", hr);