diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index 7c3d77c8a25..03e2aa7f8a0 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -116,7 +116,7 @@ struct d3d9_device UINT implicit_swapchain_count; struct wined3d_swapchain **implicit_swapchains; - struct wined3d_stateblock *recording; + struct wined3d_stateblock *recording, *state, *update_state; }; HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wined3d *wined3d, diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 953bf4c5419..3e3d5c70500 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -605,6 +605,7 @@ static ULONG WINAPI DECLSPEC_HOTPATCH d3d9_device_Release(IDirect3DDevice9Ex *if if (device->recording) wined3d_stateblock_decref(device->recording); + wined3d_stateblock_decref(device->state); wined3d_device_release_focus_window(device->wined3d_device); wined3d_device_decref(device->wined3d_device); @@ -999,6 +1000,7 @@ static HRESULT d3d9_device_reset(struct d3d9_device *device, if (device->recording) wined3d_stateblock_decref(device->recording); device->recording = NULL; + device->update_state = device->state; device->auto_mipmaps = 0; wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_ZENABLE, !!swapchain_desc.enable_auto_depth_stencil); @@ -2360,7 +2362,7 @@ static HRESULT WINAPI d3d9_device_BeginStateBlock(IDirect3DDevice9Ex *iface) wined3d_mutex_lock(); if (SUCCEEDED(hr = wined3d_device_begin_stateblock(device->wined3d_device, &stateblock))) - device->recording = stateblock; + device->update_state = device->recording = stateblock; wined3d_mutex_unlock(); return hr; @@ -2385,6 +2387,7 @@ static HRESULT WINAPI d3d9_device_EndStateBlock(IDirect3DDevice9Ex *iface, IDire } wined3d_stateblock = device->recording; device->recording = NULL; + device->update_state = device->state; wined3d_mutex_unlock(); if (!(object = heap_alloc_zero(sizeof(*object)))) @@ -4497,6 +4500,15 @@ HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wine if (flags & D3DCREATE_ADAPTERGROUP_DEVICE) count = caps.NumberOfAdaptersInGroup; + if (FAILED(hr = wined3d_stateblock_create(device->wined3d_device, WINED3D_SBT_PRIMARY, &device->state))) + { + ERR("Failed to create the primary stateblock, hr %#x.\n", hr); + wined3d_device_decref(device->wined3d_device); + wined3d_mutex_unlock(); + return hr; + } + device->update_state = device->state; + if (flags & D3DCREATE_MULTITHREADED) wined3d_device_set_multithreaded(device->wined3d_device); diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 80e58114c10..1a20e86d3f0 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -1573,11 +1573,12 @@ static HRESULT stateblock_init(struct wined3d_stateblock *stateblock, stateblock->ref = 1; stateblock->device = device; - wined3d_stateblock_state_init(&stateblock->stateblock_state, device, 0); + wined3d_stateblock_state_init(&stateblock->stateblock_state, device, + type == WINED3D_SBT_PRIMARY ? WINED3D_STATE_INIT_DEFAULT : 0); stateblock->changed.store_stream_offset = 1; - if (type == WINED3D_SBT_RECORDED) + if (type == WINED3D_SBT_RECORDED || type == WINED3D_SBT_PRIMARY) return WINED3D_OK; TRACE("Updating changed flags appropriate for type %#x.\n", type); diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index ee28ab1bb94..dcf622ea4fe 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -774,6 +774,7 @@ enum wined3d_stateblock_type WINED3D_SBT_PIXEL_STATE = 2, WINED3D_SBT_VERTEX_STATE = 3, WINED3D_SBT_RECORDED = 4, /* WineD3D private */ + WINED3D_SBT_PRIMARY = 5, /* WineD3D private */ }; enum wined3d_decl_method