Commit d93e61f2 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Release the stateblock only after mode setting in wined3d_device_reset().

While we're allowed to leave the device in a somewhat inconsistent state after a failed reset, such a state should be recoverable by calling reset again. If e.g. mode setting were to fail between the point where we destroy and recreate the stateblock a subsequent reset would crash because the device doesn't have a stateblock anymore.
parent 0ee30079
...@@ -5293,10 +5293,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, ...@@ -5293,10 +5293,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
if (swapchain_desc->enable_auto_depth_stencil) if (swapchain_desc->enable_auto_depth_stencil)
wined3d_device_set_depth_stencil(device, device->auto_depth_stencil); wined3d_device_set_depth_stencil(device, device->auto_depth_stencil);
TRACE("Resetting stateblock\n");
wined3d_stateblock_decref(device->updateStateBlock);
wined3d_stateblock_decref(device->stateBlock);
if (swapchain_desc->windowed) if (swapchain_desc->windowed)
{ {
mode.width = swapchain->orig_width; mode.width = swapchain->orig_width;
...@@ -5377,9 +5373,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, ...@@ -5377,9 +5373,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
} }
} }
if (device->d3d_initialized)
delete_opengl_contexts(device, swapchain);
if (!swapchain_desc->windowed != !swapchain->desc.windowed if (!swapchain_desc->windowed != !swapchain->desc.windowed
|| DisplayModeChanged) || DisplayModeChanged)
{ {
...@@ -5443,6 +5436,13 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, ...@@ -5443,6 +5436,13 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
device->exStyle = exStyle; device->exStyle = exStyle;
} }
TRACE("Resetting stateblock.\n");
wined3d_stateblock_decref(device->updateStateBlock);
wined3d_stateblock_decref(device->stateBlock);
if (device->d3d_initialized)
delete_opengl_contexts(device, swapchain);
/* Note: No parent needed for initial internal stateblock */ /* Note: No parent needed for initial internal stateblock */
hr = wined3d_stateblock_create(device, WINED3D_SBT_INIT, &device->stateBlock); hr = wined3d_stateblock_create(device, WINED3D_SBT_INIT, &device->stateBlock);
if (FAILED(hr)) if (FAILED(hr))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment