From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/wined3d/adapter_gl.c | 34 ++++++++++++++++++++++---- dlls/wined3d/adapter_vk.c | 14 +++++++++++ dlls/wined3d/device.c | 54 +++++++----------------------------------- dlls/wined3d/directx.c | 22 +++++++++++++++++ dlls/wined3d/wined3d_private.h | 4 ++++ 5 files changed, 77 insertions(+), 51 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index cedd012c89d..972d051a6b2 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -4233,6 +4233,15 @@ static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter_gl *adapter_gl, } }
+static void adapter_gl_destroy(struct wined3d_adapter *adapter) +{ + struct wined3d_adapter_gl *adapter_gl = wined3d_adapter_gl(adapter); + + heap_free(adapter_gl->pixel_formats); + wined3d_adapter_cleanup(adapter); + heap_free(adapter_gl); +} + static HRESULT adapter_gl_create_device(struct wined3d *wined3d, const struct wined3d_adapter *adapter, enum wined3d_device_type device_type, HWND focus_window, unsigned int flags, BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count, @@ -4522,13 +4531,26 @@ static BOOL adapter_gl_check_format(const struct wined3d_adapter *adapter, return FALSE; }
-static void adapter_gl_destroy(struct wined3d_adapter *adapter) +static HRESULT adapter_gl_init_3d(struct wined3d_device *device) { - struct wined3d_adapter_gl *adapter_gl = wined3d_adapter_gl(adapter); + TRACE("device %p.\n", device);
- heap_free(adapter_gl->pixel_formats); - wined3d_adapter_cleanup(adapter); - heap_free(adapter_gl); + wined3d_cs_init_object(device->cs, wined3d_device_create_primary_opengl_context_cs, device); + wined3d_cs_finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); + if (!device->swapchains[0]->num_contexts) + return E_FAIL; + + device->d3d_initialized = TRUE; + + return WINED3D_OK; +} + +static void adapter_gl_uninit_3d(struct wined3d_device *device) +{ + TRACE("device %p.\n", device); + + wined3d_cs_destroy_object(device->cs, wined3d_device_delete_opengl_contexts_cs, device); + wined3d_cs_finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); }
static const struct wined3d_adapter_ops wined3d_adapter_gl_ops = @@ -4539,6 +4561,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_gl_ops = wined3d_adapter_gl_create_context, adapter_gl_get_wined3d_caps, adapter_gl_check_format, + adapter_gl_init_3d, + adapter_gl_uninit_3d, };
static BOOL wined3d_adapter_gl_init(struct wined3d_adapter_gl *adapter_gl, diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index da53edd953a..7177e384fa2 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -398,6 +398,18 @@ static BOOL adapter_vk_check_format(const struct wined3d_adapter *adapter, return TRUE; }
+static HRESULT adapter_vk_init_3d(struct wined3d_device *device) +{ + TRACE("device %p.\n", device); + + return WINED3D_OK; +} + +static void adapter_vk_uninit_3d(struct wined3d_device *device) +{ + TRACE("device %p.\n", device); +} + static const struct wined3d_adapter_ops wined3d_adapter_vk_ops = { adapter_vk_destroy, @@ -406,6 +418,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_vk_ops = adapter_vk_create_context, adapter_vk_get_wined3d_caps, adapter_vk_check_format, + adapter_vk_init_3d, + adapter_vk_uninit_3d, };
static unsigned int wined3d_get_wine_vk_version(void) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index dcf05f054f5..eac6442804f 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1009,7 +1009,7 @@ static void device_init_swapchain_state(struct wined3d_device *device, struct wi wined3d_device_set_depth_stencil_view(device, ds_enable ? device->auto_depth_stencil_view : NULL); }
-static void wined3d_device_delete_opengl_contexts_cs(void *object) +void wined3d_device_delete_opengl_contexts_cs(void *object) { struct wined3d_resource *resource, *cursor; struct wined3d_device *device = object; @@ -1043,13 +1043,7 @@ static void wined3d_device_delete_opengl_contexts_cs(void *object) } }
-static void wined3d_device_delete_opengl_contexts(struct wined3d_device *device) -{ - wined3d_cs_destroy_object(device->cs, wined3d_device_delete_opengl_contexts_cs, device); - wined3d_cs_finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); -} - -static void wined3d_device_create_primary_opengl_context_cs(void *object) +void wined3d_device_create_primary_opengl_context_cs(void *object) { struct wined3d_device *device = object; struct wined3d_swapchain *swapchain; @@ -1084,16 +1078,6 @@ static void wined3d_device_create_primary_opengl_context_cs(void *object) context_release(context); }
-static HRESULT wined3d_device_create_primary_opengl_context(struct wined3d_device *device) -{ - wined3d_cs_init_object(device->cs, wined3d_device_create_primary_opengl_context_cs, device); - wined3d_cs_finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); - if (!device->swapchains[0]->num_contexts) - return E_FAIL; - - return WINED3D_OK; -} - HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device, struct wined3d_swapchain *swapchain) { static const struct wined3d_color black = {0.0f, 0.0f, 0.0f, 0.0f}; @@ -1136,24 +1120,8 @@ HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device, str device->swapchains[0] = swapchain;
memset(device->fb.render_targets, 0, sizeof(device->fb.render_targets)); - if (device->wined3d->flags & WINED3D_NO3D) - { - if (!(device->blitter = wined3d_cpu_blitter_create())) - { - ERR("Failed to create CPU blitter.\n"); - heap_free(device->swapchains); - device->swapchain_count = 0; - hr = E_FAIL; - goto err_out; - } - } - else - { - if (FAILED(hr = wined3d_device_create_primary_opengl_context(device))) - goto err_out; - - device->d3d_initialized = TRUE; - } + if (FAILED(hr = device->adapter->adapter_ops->adapter_init_3d(device))) + goto err_out;
device_init_swapchain_state(device, swapchain);
@@ -1231,10 +1199,7 @@ void wined3d_device_uninit_3d(struct wined3d_device *device)
wine_rb_clear(&device->samplers, device_free_sampler, NULL);
- if (no3d) - device->blitter->ops->blitter_destroy(device->blitter, NULL); - else - wined3d_device_delete_opengl_contexts(device); + device->adapter->adapter_ops->adapter_uninit_3d(device);
if ((view = device->fb.depth_stencil)) { @@ -5066,7 +5031,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, state_cleanup(&device->state);
if (device->d3d_initialized) - wined3d_device_delete_opengl_contexts(device); + device->adapter->adapter_ops->adapter_uninit_3d(device);
memset(&device->state, 0, sizeof(device->state)); state_init(&device->state, &device->fb, &device->adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT); @@ -5097,11 +5062,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, wined3d_cs_emit_set_scissor_rects(device->cs, 1, state->scissor_rects); }
- if (device->d3d_initialized) - { - if (reset_state) - hr = wined3d_device_create_primary_opengl_context(device); - } + if (device->d3d_initialized && reset_state) + hr = device->adapter->adapter_ops->adapter_init_3d(device);
/* All done. There is no need to reload resources or shaders, this will happen automatically on the * first use diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index c909e5185a1..d4aefadc29e 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -2272,6 +2272,26 @@ static BOOL adapter_no3d_check_format(const struct wined3d_adapter *adapter, return TRUE; }
+static HRESULT adapter_no3d_init_3d(struct wined3d_device *device) +{ + TRACE("device %p.\n", device); + + if (!(device->blitter = wined3d_cpu_blitter_create())) + { + ERR("Failed to create CPU blitter.\n"); + return E_FAIL; + } + + return WINED3D_OK; +} + +static void adapter_no3d_uninit_3d(struct wined3d_device *device) +{ + TRACE("device %p.\n", device); + + device->blitter->ops->blitter_destroy(device->blitter, NULL); +} + static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops = { adapter_no3d_destroy, @@ -2280,6 +2300,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops = wined3d_adapter_no3d_create_context, adapter_no3d_get_wined3d_caps, adapter_no3d_check_format, + adapter_no3d_init_3d, + adapter_no3d_uninit_3d, };
static void wined3d_adapter_no3d_init_d3d_info(struct wined3d_adapter *adapter, unsigned int wined3d_creation_flags) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index fbcda94537e..ddd5b8d0951 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2716,6 +2716,8 @@ struct wined3d_adapter_ops BOOL (*adapter_check_format)(const struct wined3d_adapter *adapter, const struct wined3d_format *adapter_format, const struct wined3d_format *rt_format, const struct wined3d_format *ds_format); + HRESULT (*adapter_init_3d)(struct wined3d_device *device); + void (*adapter_uninit_3d)(struct wined3d_device *device); };
/* The adapter structure */ @@ -3190,6 +3192,8 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c const struct wined3d_color *color, float depth, DWORD stencil) DECLSPEC_HIDDEN; BOOL device_context_add(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN; void device_context_remove(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN; +void wined3d_device_create_primary_opengl_context_cs(void *object) DECLSPEC_HIDDEN; +void wined3d_device_delete_opengl_contexts_cs(void *object) DECLSPEC_HIDDEN; HRESULT wined3d_device_init(struct wined3d_device *device, struct wined3d *wined3d, unsigned int adapter_idx, enum wined3d_device_type device_type, HWND focus_window, unsigned int flags, BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count,