[PATCH 3/6] wined3d: Make the adapter responsible for initialising and de-initialising 3D.

Henri Verbeet hverbeet at codeweavers.com
Tue May 7 05:30:08 CDT 2019


From: Józef Kucia <jkucia at codeweavers.com>

Signed-off-by: Henri Verbeet <hverbeet at 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,
-- 
2.11.0




More information about the wine-devel mailing list