[PATCH 5/5] wined3d: Make the adapter responsible for acquiring and releasing contexts.

Henri Verbeet hverbeet at codeweavers.com
Wed Jun 5 07:24:07 CDT 2019


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/adapter_gl.c      | 49 ++++-----------------------
 dlls/wined3d/adapter_vk.c      | 60 ++++++++++++++++++++-------------
 dlls/wined3d/context.c         | 75 ++++++++++++++++++------------------------
 dlls/wined3d/device.c          |  2 +-
 dlls/wined3d/directx.c         | 69 +++++++++++++++++++++++---------------
 dlls/wined3d/query.c           |  6 ++--
 dlls/wined3d/surface.c         |  2 +-
 dlls/wined3d/swapchain.c       | 39 ++++++++++++++++------
 dlls/wined3d/texture.c         |  2 +-
 dlls/wined3d/wined3d_private.h | 46 +++++++++++++++++++-------
 10 files changed, 190 insertions(+), 160 deletions(-)

diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index 110771f8ea9..c8ebe346431 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -4338,50 +4338,15 @@ static void adapter_gl_destroy_device(struct wined3d_device *device)
     heap_free(device_gl);
 }
 
-static HRESULT adapter_gl_create_context(struct wined3d_swapchain *swapchain, struct wined3d_context **context)
+struct wined3d_context *adapter_gl_acquire_context(struct wined3d_device *device,
+        struct wined3d_texture *texture, unsigned int sub_resource_idx)
 {
-    struct wined3d_context_gl *context_gl;
-    HRESULT hr;
-
-    TRACE("swapchain %p, context %p.\n", swapchain, context);
-
-    if (!(context_gl = heap_alloc_zero(sizeof(*context_gl))))
-        return E_OUTOFMEMORY;
-
-    if (FAILED(hr = wined3d_context_gl_init(context_gl, swapchain)))
-    {
-        WARN("Failed to initialise context.\n");
-        heap_free(context_gl);
-        return hr;
-    }
-
-    TRACE("Created context %p.\n", context_gl);
-    *context = &context_gl->c;
-
-    return WINED3D_OK;
+    return wined3d_context_gl_acquire(device, texture, sub_resource_idx);
 }
 
-static void adapter_gl_destroy_context(struct wined3d_context *context)
+void adapter_gl_release_context(struct wined3d_context *context)
 {
-    struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
-
-    if (context_gl->c.current && context_gl->c.tid != GetCurrentThreadId())
-    {
-        struct wined3d_gl_info *gl_info;
-
-        /* Make a copy of gl_info for wined3d_context_gl_cleanup() use, the
-         * one in wined3d_adapter may go away in the meantime. */
-        gl_info = heap_alloc(sizeof(*gl_info));
-        *gl_info = *context_gl->c.gl_info;
-        context_gl->c.gl_info = gl_info;
-        context_gl->c.destroyed = 1;
-
-        return;
-    }
-
-    wined3d_context_gl_cleanup(context_gl);
-    TlsSetValue(context_get_tls_idx(), NULL);
-    heap_free(context_gl);
+    return wined3d_context_gl_release(wined3d_context_gl(context));
 }
 
 static void adapter_gl_get_wined3d_caps(const struct wined3d_adapter *adapter, struct wined3d_caps *caps)
@@ -4672,8 +4637,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
     adapter_gl_destroy,
     adapter_gl_create_device,
     adapter_gl_destroy_device,
-    adapter_gl_create_context,
-    adapter_gl_destroy_context,
+    adapter_gl_acquire_context,
+    adapter_gl_release_context,
     adapter_gl_get_wined3d_caps,
     adapter_gl_check_format,
     adapter_gl_init_3d,
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index b944b2fb32a..00098182c1a 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -28,6 +28,8 @@ struct wined3d_device_vk
 {
     struct wined3d_device d;
 
+    struct wined3d_context context_vk;
+
     VkDevice vk_device;
     VkQueue vk_queue;
 
@@ -288,33 +290,22 @@ static void adapter_vk_destroy_device(struct wined3d_device *device)
     heap_free(device_vk);
 }
 
-static HRESULT adapter_vk_create_context(struct wined3d_swapchain *swapchain, struct wined3d_context **context)
+struct wined3d_context *adapter_vk_acquire_context(struct wined3d_device *device,
+        struct wined3d_texture *texture, unsigned int sub_resource_idx)
 {
-    struct wined3d_context *context_vk;
-    HRESULT hr;
-
-    TRACE("swapchain %p, context %p.\n", swapchain, context);
+    TRACE("device %p, texture %p, sub_resource_idx %u.\n", device, texture, sub_resource_idx);
 
-    if (!(context_vk = heap_alloc_zero(sizeof(*context_vk))))
-        return E_OUTOFMEMORY;
-
-    if (FAILED(hr = wined3d_context_vk_init(context_vk, swapchain)))
-    {
-        WARN("Failed to initialise context.\n");
-        heap_free(context_vk);
-        return hr;
-    }
+    wined3d_from_cs(device->cs);
 
-    TRACE("Created context %p.\n", context_vk);
-    *context = context_vk;
+    if (!device->context_count)
+        return NULL;
 
-    return WINED3D_OK;
+    return &wined3d_device_vk(device)->context_vk;
 }
 
-static void adapter_vk_destroy_context(struct wined3d_context *context)
+void adapter_vk_release_context(struct wined3d_context *context)
 {
-    wined3d_context_cleanup(context);
-    heap_free(context);
+    TRACE("context %p.\n", context);
 }
 
 static void adapter_vk_get_wined3d_caps(const struct wined3d_adapter *adapter, struct wined3d_caps *caps)
@@ -425,14 +416,39 @@ static BOOL adapter_vk_check_format(const struct wined3d_adapter *adapter,
 
 static HRESULT adapter_vk_init_3d(struct wined3d_device *device)
 {
+    struct wined3d_context *context_vk;
+    HRESULT hr;
+
     TRACE("device %p.\n", device);
 
+    context_vk = &wined3d_device_vk(device)->context_vk;
+    if (FAILED(hr = wined3d_context_vk_init(context_vk, device->swapchains[0])))
+    {
+        WARN("Failed to initialise context.\n");
+        return hr;
+    }
+
+    if (!device_context_add(device, context_vk))
+    {
+        ERR("Failed to add the newly created context to the context list.\n");
+        wined3d_context_cleanup(context_vk);
+        return E_FAIL;
+    }
+
+    TRACE("Initialised context %p.\n", context_vk);
+
     return WINED3D_OK;
 }
 
 static void adapter_vk_uninit_3d(struct wined3d_device *device)
 {
+    struct wined3d_context *context_vk;
+
     TRACE("device %p.\n", device);
+
+    context_vk = &wined3d_device_vk(device)->context_vk;
+    device_context_remove(device, context_vk);
+    wined3d_context_cleanup(context_vk);
 }
 
 static const struct wined3d_adapter_ops wined3d_adapter_vk_ops =
@@ -440,8 +456,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_vk_ops =
     adapter_vk_destroy,
     adapter_vk_create_device,
     adapter_vk_destroy_device,
-    adapter_vk_create_context,
-    adapter_vk_destroy_context,
+    adapter_vk_acquire_context,
+    adapter_vk_release_context,
     adapter_vk_get_wined3d_caps,
     adapter_vk_check_format,
     adapter_vk_init_3d,
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 2a2b2e8a87c..9784a48f91f 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1328,7 +1328,7 @@ void wined3d_context_cleanup(struct wined3d_context *context)
 {
 }
 
-void wined3d_context_gl_cleanup(struct wined3d_context_gl *context_gl)
+static void wined3d_context_gl_cleanup(struct wined3d_context_gl *context_gl)
 {
     struct wined3d_pipeline_statistics_query *pipeline_statistics_query;
     const struct wined3d_gl_info *gl_info = context_gl->c.gl_info;
@@ -1566,9 +1566,9 @@ BOOL context_set_current(struct wined3d_context *ctx)
     return TlsSetValue(wined3d_context_tls_idx, ctx);
 }
 
-void context_release(struct wined3d_context *context)
+void wined3d_context_gl_release(struct wined3d_context_gl *context_gl)
 {
-    struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
+    struct wined3d_context *context = &context_gl->c;
 
     TRACE("Releasing context %p, level %u.\n", context_gl, context->level);
 
@@ -1594,8 +1594,8 @@ void context_release(struct wined3d_context *context)
 
         if (context->destroy_delayed)
         {
-            TRACE("Destroying context %p.\n", context);
-            wined3d_context_destroy(context);
+            TRACE("Destroying context %p.\n", context_gl);
+            wined3d_context_gl_destroy(context_gl);
         }
     }
 }
@@ -2302,54 +2302,45 @@ HRESULT wined3d_context_vk_init(struct wined3d_context *context_vk, struct wined
     return WINED3D_OK;
 }
 
-struct wined3d_context *context_create(struct wined3d_swapchain *swapchain)
+void wined3d_context_gl_destroy(struct wined3d_context_gl *context_gl)
 {
-    struct wined3d_device *device = swapchain->device;
-    struct wined3d_context *context;
-    HRESULT hr;
+    struct wined3d_device *device = context_gl->c.device;
 
-    TRACE("swapchain %p.\n", swapchain);
+    TRACE("Destroying context %p.\n", context_gl);
 
     wined3d_from_cs(device->cs);
 
-    if (FAILED(hr = device->adapter->adapter_ops->adapter_create_context(swapchain, &context)))
-        return NULL;
-
-    if (!device_context_add(device, context))
+    /* We delay destroying a context when it is active. The context_release()
+     * function invokes wined3d_context_gl_destroy() again while leaving the
+     * last level. */
+    if (context_gl->c.level)
     {
-        ERR("Failed to add the newly created context to the context list.\n");
-        device->adapter->adapter_ops->adapter_destroy_context(context);
-        return NULL;
+        TRACE("Delaying destruction of context %p.\n", context_gl);
+        context_gl->c.destroy_delayed = 1;
+        /* FIXME: Get rid of a pointer to swapchain from wined3d_context. */
+        context_gl->c.swapchain = NULL;
+        return;
     }
 
-    TRACE("Created context %p.\n", context);
+    device_context_remove(device, &context_gl->c);
 
-    return context;
-}
-
-void wined3d_context_destroy(struct wined3d_context *context)
-{
-    struct wined3d_device *device = context->device;
-
-    TRACE("Destroying ctx %p\n", context);
+    if (context_gl->c.current && context_gl->c.tid != GetCurrentThreadId())
+    {
+        struct wined3d_gl_info *gl_info;
 
-    wined3d_from_cs(device->cs);
+        /* Make a copy of gl_info for wined3d_context_gl_cleanup() use, the
+         * one in wined3d_adapter may go away in the meantime. */
+        gl_info = heap_alloc(sizeof(*gl_info));
+        *gl_info = *context_gl->c.gl_info;
+        context_gl->c.gl_info = gl_info;
+        context_gl->c.destroyed = 1;
 
-    /* We delay destroying a context when it is active. The context_release()
-     * function invokes wined3d_context_destroy() again while leaving the last
-     * level. */
-    if (context->level)
-    {
-        TRACE("Delaying destruction of context %p.\n", context);
-        context->destroy_delayed = 1;
-        /* FIXME: Get rid of a pointer to swapchain from wined3d_context. */
-        context->swapchain = NULL;
         return;
     }
 
-    device_context_remove(device, context);
-
-    device->adapter->adapter_ops->adapter_destroy_context(context);
+    wined3d_context_gl_cleanup(context_gl);
+    TlsSetValue(context_get_tls_idx(), NULL);
+    heap_free(context_gl);
 }
 
 const unsigned int *wined3d_context_gl_get_tex_unit_mapping(const struct wined3d_context_gl *context_gl,
@@ -4206,7 +4197,7 @@ static void wined3d_context_gl_activate(struct wined3d_context_gl *context_gl,
     }
 }
 
-struct wined3d_context *context_acquire(const struct wined3d_device *device,
+struct wined3d_context *wined3d_context_gl_acquire(const struct wined3d_device *device,
         struct wined3d_texture *texture, unsigned int sub_resource_idx)
 {
     struct wined3d_context *current_context = context_get_current();
@@ -4215,8 +4206,6 @@ struct wined3d_context *context_acquire(const struct wined3d_device *device,
 
     TRACE("device %p, texture %p, sub_resource_idx %u.\n", device, texture, sub_resource_idx);
 
-    wined3d_from_cs(device->cs);
-
     if (current_context && current_context->destroyed)
         current_context = NULL;
 
@@ -4270,7 +4259,7 @@ struct wined3d_context *context_acquire(const struct wined3d_device *device,
     return context;
 }
 
-struct wined3d_context *context_reacquire(const struct wined3d_device *device,
+struct wined3d_context *context_reacquire(struct wined3d_device *device,
         struct wined3d_context *context)
 {
     struct wined3d_context *acquired_context;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 683401bd1da..ed77a6e144a 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1075,7 +1075,7 @@ void wined3d_device_delete_opengl_contexts_cs(void *object)
         if (device->contexts[0]->swapchain)
             swapchain_destroy_contexts(device->contexts[0]->swapchain);
         else
-            wined3d_context_destroy(device->contexts[0]);
+            wined3d_context_gl_destroy(wined3d_context_gl(device->contexts[0]));
     }
 }
 
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 49fa3a35f74..313e522f4a5 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2233,21 +2233,22 @@ static HRESULT adapter_no3d_create_device(struct wined3d *wined3d, const struct
         const enum wined3d_feature_level *levels, unsigned int level_count,
         struct wined3d_device_parent *device_parent, struct wined3d_device **device)
 {
-    struct wined3d_device *object;
+    struct wined3d_device_no3d *device_no3d;
     HRESULT hr;
 
-    if (!(object = heap_alloc_zero(sizeof(*object))))
+    if (!(device_no3d = heap_alloc_zero(sizeof(*device_no3d))))
         return E_OUTOFMEMORY;
 
-    if (FAILED(hr = wined3d_device_init(object, wined3d, adapter->ordinal, device_type,
+    if (FAILED(hr = wined3d_device_init(&device_no3d->d, wined3d, adapter->ordinal, device_type,
             focus_window, flags, surface_alignment, levels, level_count, device_parent)))
     {
         WARN("Failed to initialize device, hr %#x.\n", hr);
-        heap_free(object);
+        heap_free(device_no3d);
         return hr;
     }
 
-    *device = object;
+    *device = &device_no3d->d;
+
     return WINED3D_OK;
 }
 
@@ -2257,32 +2258,22 @@ static void adapter_no3d_destroy_device(struct wined3d_device *device)
     heap_free(device);
 }
 
-static HRESULT adapter_no3d_create_context(struct wined3d_swapchain *swapchain, struct wined3d_context **context)
+struct wined3d_context *adapter_no3d_acquire_context(struct wined3d_device *device,
+        struct wined3d_texture *texture, unsigned int sub_resource_idx)
 {
-    struct wined3d_context *context_no3d;
-
-    TRACE("swapchain %p, context %p.\n", swapchain, context);
-
-    if (!(context_no3d = heap_alloc_zero(sizeof(*context_no3d))))
-        return E_OUTOFMEMORY;
+    TRACE("device %p, texture %p, sub_resource_idx %u.\n", device, texture, sub_resource_idx);
 
-    if (FAILED(wined3d_context_no3d_init(context_no3d, swapchain)))
-    {
-        WARN("Failed to initialise context.\n");
-        heap_free(context_no3d);
-        return E_FAIL;
-    }
+    wined3d_from_cs(device->cs);
 
-    TRACE("Created context %p.\n", context_no3d);
-    *context = context_no3d;
+    if (!device->context_count)
+        return NULL;
 
-    return WINED3D_OK;
+    return &wined3d_device_no3d(device)->context_no3d;
 }
 
-static void adapter_no3d_destroy_context(struct wined3d_context *context)
+void adapter_no3d_release_context(struct wined3d_context *context)
 {
-    wined3d_context_cleanup(context);
-    heap_free(context);
+    TRACE("context %p.\n", context);
 }
 
 static void adapter_no3d_get_wined3d_caps(const struct wined3d_adapter *adapter, struct wined3d_caps *caps)
@@ -2298,11 +2289,32 @@ static BOOL adapter_no3d_check_format(const struct wined3d_adapter *adapter,
 
 static HRESULT adapter_no3d_init_3d(struct wined3d_device *device)
 {
+    struct wined3d_context *context_no3d;
+    HRESULT hr;
+
     TRACE("device %p.\n", device);
 
+    context_no3d = &wined3d_device_no3d(device)->context_no3d;
+    if (FAILED(hr = wined3d_context_no3d_init(context_no3d, device->swapchains[0])))
+    {
+        WARN("Failed to initialise context.\n");
+        return hr;
+    }
+
+    if (!device_context_add(device, context_no3d))
+    {
+        ERR("Failed to add the newly created context to the context list.\n");
+        wined3d_context_cleanup(context_no3d);
+        return E_FAIL;
+    }
+
+    TRACE("Initialised context %p.\n", context_no3d);
+
     if (!(device->blitter = wined3d_cpu_blitter_create()))
     {
         ERR("Failed to create CPU blitter.\n");
+        device_context_remove(device, context_no3d);
+        wined3d_context_cleanup(context_no3d);
         return E_FAIL;
     }
 
@@ -2311,9 +2323,14 @@ static HRESULT adapter_no3d_init_3d(struct wined3d_device *device)
 
 static void adapter_no3d_uninit_3d(struct wined3d_device *device)
 {
+    struct wined3d_context *context_no3d;
+
     TRACE("device %p.\n", device);
 
+    context_no3d = &wined3d_device_no3d(device)->context_no3d;
     device->blitter->ops->blitter_destroy(device->blitter, NULL);
+    device_context_remove(device, context_no3d);
+    wined3d_context_cleanup(context_no3d);
 }
 
 static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
@@ -2321,8 +2338,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
     adapter_no3d_destroy,
     adapter_no3d_create_device,
     adapter_no3d_destroy_device,
-    adapter_no3d_create_context,
-    adapter_no3d_destroy_context,
+    adapter_no3d_acquire_context,
+    adapter_no3d_release_context,
     adapter_no3d_get_wined3d_caps,
     adapter_no3d_check_format,
     adapter_no3d_init_3d,
diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c
index 87c50eebe51..eeec8e25098 100644
--- a/dlls/wined3d/query.c
+++ b/dlls/wined3d/query.c
@@ -180,7 +180,7 @@ static BOOL wined3d_fence_supported(const struct wined3d_gl_info *gl_info)
 }
 
 static enum wined3d_fence_result wined3d_fence_test(const struct wined3d_fence *fence,
-        const struct wined3d_device *device, DWORD flags)
+        struct wined3d_device *device, DWORD flags)
 {
     const struct wined3d_gl_info *gl_info;
     struct wined3d_context *context;
@@ -258,7 +258,7 @@ static enum wined3d_fence_result wined3d_fence_test(const struct wined3d_fence *
 }
 
 enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
-        const struct wined3d_device *device)
+        struct wined3d_device *device)
 {
     const struct wined3d_gl_info *gl_info;
     struct wined3d_context *context;
@@ -332,7 +332,7 @@ enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
     return ret;
 }
 
-void wined3d_fence_issue(struct wined3d_fence *fence, const struct wined3d_device *device)
+void wined3d_fence_issue(struct wined3d_fence *fence, struct wined3d_device *device)
 {
     struct wined3d_context *context = NULL;
     const struct wined3d_gl_info *gl_info;
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index a30605b912a..7d126420d17 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -149,7 +149,7 @@ static BOOL is_multisample_location(const struct wined3d_texture_gl *texture_gl,
 
 /* Blit between surface locations. Onscreen on different swapchains is not supported.
  * Depth / stencil is not supported. Context activation is done by the caller. */
-static void texture2d_blt_fbo(const struct wined3d_device *device, struct wined3d_context *context,
+static void texture2d_blt_fbo(struct wined3d_device *device, struct wined3d_context *context,
         enum wined3d_texture_filter_type filter, struct wined3d_texture *src_texture,
         unsigned int src_sub_resource_idx, DWORD src_location, const RECT *src_rect,
         struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx, DWORD dst_location,
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 481b3b718ed..2c816218c8e 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -1059,32 +1059,51 @@ HRESULT CDECL wined3d_swapchain_create(struct wined3d_device *device, struct win
 
 static struct wined3d_context *swapchain_create_context(struct wined3d_swapchain *swapchain)
 {
+    struct wined3d_device *device = swapchain->device;
+    struct wined3d_context_gl *context_gl;
     struct wined3d_context **ctx_array;
-    struct wined3d_context *ctx;
 
     TRACE("Creating a new context for swapchain %p, thread %u.\n", swapchain, GetCurrentThreadId());
 
-    if (!(ctx = context_create(swapchain)))
+    wined3d_from_cs(device->cs);
+
+    if (!(context_gl = heap_alloc_zero(sizeof(*context_gl))))
+    {
+        ERR("Failed to allocate context memory.\n");
+        return NULL;
+    }
+
+    if (FAILED(wined3d_context_gl_init(context_gl, swapchain)))
     {
-        ERR("Failed to create a new context for the swapchain\n");
+        WARN("Failed to initialise context.\n");
+        heap_free(context_gl);
         return NULL;
     }
-    context_release(ctx);
+
+    if (!device_context_add(device, &context_gl->c))
+    {
+        ERR("Failed to add the newly created context to the context list.\n");
+        wined3d_context_gl_destroy(context_gl);
+        return NULL;
+    }
+
+    TRACE("Created context %p.\n", context_gl);
+
+    context_release(&context_gl->c);
 
     if (!(ctx_array = heap_calloc(swapchain->num_contexts + 1, sizeof(*ctx_array))))
     {
-        ERR("Out of memory when trying to allocate a new context array\n");
-        wined3d_context_destroy(ctx);
+        ERR("Failed to allocate new context array memory.\n");
+        wined3d_context_gl_destroy(context_gl);
         return NULL;
     }
     memcpy(ctx_array, swapchain->context, sizeof(*ctx_array) * swapchain->num_contexts);
     heap_free(swapchain->context);
-    ctx_array[swapchain->num_contexts] = ctx;
+    ctx_array[swapchain->num_contexts] = &context_gl->c;
     swapchain->context = ctx_array;
     swapchain->num_contexts++;
 
-    TRACE("Returning context %p\n", ctx);
-    return ctx;
+    return &context_gl->c;
 }
 
 void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain)
@@ -1093,7 +1112,7 @@ void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain)
 
     for (i = 0; i < swapchain->num_contexts; ++i)
     {
-        wined3d_context_destroy(swapchain->context[i]);
+        wined3d_context_gl_destroy(wined3d_context_gl(swapchain->context[i]));
     }
     heap_free(swapchain->context);
     swapchain->num_contexts = 0;
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index beda90093c3..dc60d874bd6 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -490,7 +490,7 @@ static void wined3d_texture_remove_buffer_object(struct wined3d_texture *texture
 static void wined3d_texture_update_map_binding(struct wined3d_texture *texture)
 {
     unsigned int sub_count = texture->level_count * texture->layer_count;
-    const struct wined3d_device *device = texture->resource.device;
+    struct wined3d_device *device = texture->resource.device;
     DWORD map_binding = texture->update_map_binding;
     struct wined3d_context *context = NULL;
     unsigned int i;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 864476c6f07..89d3272a091 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1733,9 +1733,9 @@ struct wined3d_fence
 
 HRESULT wined3d_fence_create(struct wined3d_device *device, struct wined3d_fence **fence) DECLSPEC_HIDDEN;
 void wined3d_fence_destroy(struct wined3d_fence *fence) DECLSPEC_HIDDEN;
-void wined3d_fence_issue(struct wined3d_fence *fence, const struct wined3d_device *device) DECLSPEC_HIDDEN;
+void wined3d_fence_issue(struct wined3d_fence *fence, struct wined3d_device *device) DECLSPEC_HIDDEN;
 enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
-        const struct wined3d_device *device) DECLSPEC_HIDDEN;
+        struct wined3d_device *device) DECLSPEC_HIDDEN;
 
 /* Direct3D terminology with little modifications. We do not have an issued
  * state because only the driver knows about it, but we have a created state
@@ -2057,6 +2057,8 @@ static inline const struct wined3d_context_gl *wined3d_context_gl_const(const st
     return CONTAINING_RECORD(context, struct wined3d_context_gl, c);
 }
 
+struct wined3d_context *wined3d_context_gl_acquire(const struct wined3d_device *device,
+        struct wined3d_texture *texture, unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
 void wined3d_context_gl_active_texture(struct wined3d_context_gl *context_gl,
         const struct wined3d_gl_info *gl_info, unsigned int unit) DECLSPEC_HIDDEN;
 void wined3d_context_gl_alloc_fence(struct wined3d_context_gl *context_gl,
@@ -2081,7 +2083,7 @@ void wined3d_context_gl_apply_ffp_blit_state(struct wined3d_context_gl *context_
 void wined3d_context_gl_bind_texture(struct wined3d_context_gl *context_gl,
         GLenum target, GLuint name) DECLSPEC_HIDDEN;
 void wined3d_context_gl_check_fbo_status(const struct wined3d_context_gl *context_gl, GLenum target) DECLSPEC_HIDDEN;
-void wined3d_context_gl_cleanup(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
+void wined3d_context_gl_destroy(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
 void wined3d_context_gl_free_fence(struct wined3d_fence *fence) DECLSPEC_HIDDEN;
 void wined3d_context_gl_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
 void wined3d_context_gl_free_pipeline_statistics_query(struct wined3d_pipeline_statistics_query *query) DECLSPEC_HIDDEN;
@@ -2094,6 +2096,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl,
         struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 void wined3d_context_gl_load_tex_coords(const struct wined3d_context_gl *context_gl,
         const struct wined3d_stream_info *si, GLuint *current_bo, const struct wined3d_state *state) DECLSPEC_HIDDEN;
+void wined3d_context_gl_release(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
 void wined3d_context_gl_set_draw_buffer(struct wined3d_context_gl *context_gl, GLenum buffer) DECLSPEC_HIDDEN;
 void wined3d_context_gl_texture_update(struct wined3d_context_gl *context_gl,
         const struct wined3d_texture_gl *texture_gl) DECLSPEC_HIDDEN;
@@ -2232,16 +2235,12 @@ void wined3d_raw_blitter_create(struct wined3d_blitter **next,
 
 BOOL wined3d_clip_blit(const RECT *clip_rect, RECT *clipped, RECT *other) DECLSPEC_HIDDEN;
 
-struct wined3d_context *context_acquire(const struct wined3d_device *device,
-        struct wined3d_texture *texture, unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
 void context_bind_bo(struct wined3d_context *context, GLenum binding, GLuint name) DECLSPEC_HIDDEN;
 void context_bind_dummy_textures(const struct wined3d_context *context) DECLSPEC_HIDDEN;
 void context_copy_bo_address(struct wined3d_context *context,
         const struct wined3d_bo_address *dst, GLenum dst_binding,
         const struct wined3d_bo_address *src, GLenum src_binding, size_t size) DECLSPEC_HIDDEN;
-struct wined3d_context *context_create(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 HGLRC context_create_wgl_attribs(const struct wined3d_gl_info *gl_info, HDC hdc, HGLRC share_ctx) DECLSPEC_HIDDEN;
-void wined3d_context_destroy(struct wined3d_context *context) DECLSPEC_HIDDEN;
 void context_draw_shaded_quad(struct wined3d_context *context, struct wined3d_texture_gl *texture_gl,
         unsigned int sub_resource_idx, const RECT *src_rect, const RECT *dst_rect,
         enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN;
@@ -2258,9 +2257,8 @@ void context_invalidate_compute_state(struct wined3d_context *context, DWORD sta
 void context_invalidate_state(struct wined3d_context *context, DWORD state_id) DECLSPEC_HIDDEN;
 void *context_map_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *data,
         size_t size, GLenum binding, DWORD flags) DECLSPEC_HIDDEN;
-struct wined3d_context *context_reacquire(const struct wined3d_device *device,
+struct wined3d_context *context_reacquire(struct wined3d_device *device,
         struct wined3d_context *context) DECLSPEC_HIDDEN;
-void context_release(struct wined3d_context *context) DECLSPEC_HIDDEN;
 void context_resource_released(const struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
 void context_restore(struct wined3d_context *context, struct wined3d_texture *texture,
         unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
@@ -2745,8 +2743,9 @@ struct wined3d_adapter_ops
             BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count,
             struct wined3d_device_parent *device_parent, struct wined3d_device **device);
     void (*adapter_destroy_device)(struct wined3d_device *device);
-    HRESULT (*adapter_create_context)(struct wined3d_swapchain *swapchain, struct wined3d_context **context);
-    void (*adapter_destroy_context)(struct wined3d_context *context);
+    struct wined3d_context *(*adapter_acquire_context)(struct wined3d_device *device,
+            struct wined3d_texture *texture, unsigned int sub_resource_idx);
+    void (*adapter_release_context)(struct wined3d_context *context);
     void (*adapter_get_wined3d_caps)(const struct wined3d_adapter *adapter, struct wined3d_caps *caps);
     BOOL (*adapter_check_format)(const struct wined3d_adapter *adapter,
             const struct wined3d_format *adapter_format, const struct wined3d_format *rt_format,
@@ -3240,6 +3239,18 @@ HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device,
         struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 void wined3d_device_uninit_3d(struct wined3d_device *device) DECLSPEC_HIDDEN;
 
+struct wined3d_device_no3d
+{
+    struct wined3d_device d;
+
+    struct wined3d_context context_no3d;
+};
+
+static inline struct wined3d_device_no3d *wined3d_device_no3d(struct wined3d_device *device)
+{
+    return CONTAINING_RECORD(device, struct wined3d_device_no3d, d);
+}
+
 struct wined3d_device_gl
 {
     struct wined3d_device d;
@@ -4899,6 +4910,19 @@ BOOL invert_matrix(struct wined3d_matrix *out, const struct wined3d_matrix *m) D
 void compute_normal_matrix(float *normal_matrix, BOOL legacy_lighting,
         const struct wined3d_matrix *modelview) DECLSPEC_HIDDEN;
 
+static inline struct wined3d_context *context_acquire(struct wined3d_device *device,
+        struct wined3d_texture *texture, unsigned int sub_resource_idx)
+{
+    wined3d_from_cs(device->cs);
+
+    return device->adapter->adapter_ops->adapter_acquire_context(device, texture, sub_resource_idx);
+}
+
+static inline void context_release(struct wined3d_context *context)
+{
+    context->device->adapter->adapter_ops->adapter_release_context(context);
+}
+
 /* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */
 #define WINED3D_OPENGL_WINDOW_CLASS_NAME "WineD3D_OpenGL"
 
-- 
2.11.0




More information about the wine-devel mailing list