Henri Verbeet : wined3d: Create the backbuffer rendertarget view only after calling adapter_init_3d().
Alexandre Julliard
julliard at winehq.org
Thu Feb 11 15:37:14 CST 2021
Module: wine
Branch: master
Commit: b9a440d15d84e7967f70b38291d2f85767fb7a6f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b9a440d15d84e7967f70b38291d2f85767fb7a6f
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Thu Feb 11 11:52:15 2021 +0100
wined3d: Create the backbuffer rendertarget view only after calling adapter_init_3d().
Otherwise we may not be able to acquire a context to create the view. In
practice, this is only an issue for d3d9 and earlier in combination with the
Vulkan backend.
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/device.c | 45 +++++++++++++++++++++------------------------
1 file changed, 21 insertions(+), 24 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index a400221ee30..f61708219ac 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1088,6 +1088,24 @@ HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device, str
if (device->d3d_initialized)
return WINED3DERR_INVALIDCALL;
+ device->swapchain_count = 1;
+ if (!(device->swapchains = heap_calloc(device->swapchain_count, sizeof(*device->swapchains))))
+ {
+ ERR("Failed to allocate swapchain array.\n");
+ hr = E_OUTOFMEMORY;
+ goto err_out;
+ }
+ device->swapchains[0] = swapchain;
+
+ for (i = 0; i < ARRAY_SIZE(device->state.fb.render_targets); ++i)
+ if (device->state.fb.render_targets[i])
+ wined3d_rtv_bind_count_dec(device->state.fb.render_targets[i]);
+
+ memset(device->state.fb.render_targets, 0, sizeof(device->state.fb.render_targets));
+ if (FAILED(hr = device->adapter->adapter_ops->adapter_init_3d(device)))
+ goto err_out;
+ device->d3d_initialized = TRUE;
+
swapchain_desc = &swapchain->state.desc;
if (swapchain_desc->backbuffer_count && swapchain_desc->backbuffer_bind_flags & WINED3D_BIND_RENDER_TARGET)
{
@@ -1104,28 +1122,12 @@ HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device, str
NULL, &wined3d_null_parent_ops, &device->back_buffer_view)))
{
ERR("Failed to create rendertarget view, hr %#x.\n", hr);
- return hr;
+ device->adapter->adapter_ops->adapter_uninit_3d(device);
+ device->d3d_initialized = FALSE;
+ goto err_out;
}
}
- device->swapchain_count = 1;
- if (!(device->swapchains = heap_calloc(device->swapchain_count, sizeof(*device->swapchains))))
- {
- ERR("Failed to allocate swapchain array.\n");
- hr = E_OUTOFMEMORY;
- goto err_out;
- }
- device->swapchains[0] = swapchain;
-
- for (i = 0; i < ARRAY_SIZE(device->state.fb.render_targets); ++i)
- if (device->state.fb.render_targets[i])
- wined3d_rtv_bind_count_dec(device->state.fb.render_targets[i]);
-
- memset(device->state.fb.render_targets, 0, sizeof(device->state.fb.render_targets));
- if (FAILED(hr = device->adapter->adapter_ops->adapter_init_3d(device)))
- goto err_out;
- device->d3d_initialized = TRUE;
-
device_init_swapchain_state(device, swapchain);
TRACE("All defaults now set up.\n");
@@ -1147,11 +1149,6 @@ err_out:
heap_free(device->swapchains);
device->swapchains = NULL;
device->swapchain_count = 0;
- if (device->back_buffer_view)
- {
- wined3d_rendertarget_view_decref(device->back_buffer_view);
- device->back_buffer_view = NULL;
- }
return hr;
}
More information about the wine-cvs
mailing list