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.
This commit is contained in:
parent
0ee3007963
commit
d93e61f249
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
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))
|
||||||
|
|
Loading…
Reference in New Issue