Henri Verbeet : wined3d: Introduce wined3d_context_init().

Alexandre Julliard julliard at winehq.org
Thu May 2 16:45:10 CDT 2019


Module: wine
Branch: master
Commit: cfe9314b646abbde60d1b1d05f92c43f82a27c30
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=cfe9314b646abbde60d1b1d05f92c43f82a27c30

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Thu May  2 17:28:52 2019 +0430

wined3d: Introduce wined3d_context_init().

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/context.c | 83 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 50 insertions(+), 33 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 4b6aaa9..223e6b2 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1882,22 +1882,12 @@ HGLRC context_create_wgl_attribs(const struct wined3d_gl_info *gl_info, HDC hdc,
     return ctx;
 }
 
-struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
+static BOOL wined3d_context_init(struct wined3d_context *context, struct wined3d_swapchain *swapchain,
         struct wined3d_texture *target, const struct wined3d_format *ds_format)
 {
     struct wined3d_device *device = swapchain->device;
-    struct wined3d_context_gl *context_gl;
-    struct wined3d_context *context;
     DWORD state;
 
-    TRACE("swapchain %p, target %p, window %p.\n", swapchain, target, swapchain->win_handle);
-
-    wined3d_from_cs(device->cs);
-
-    if (!(context_gl = heap_alloc_zero(sizeof(*context_gl))))
-        return NULL;
-    context = &context_gl->c;
-
     list_init(&context->timestamp_queries);
     list_init(&context->occlusion_queries);
     list_init(&context->fences);
@@ -1910,31 +1900,28 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     if (!device->shader_backend->shader_allocate_context_data(context))
     {
         ERR("Failed to allocate shader backend context data.\n");
-        goto out;
+        return FALSE;
     }
+
     if (!device->adapter->fragment_pipe->allocate_context_data(context))
     {
         ERR("Failed to allocate fragment pipeline context data.\n");
-        goto out;
+        device->shader_backend->shader_free_context_data(context);
+        return FALSE;
     }
 
     if (!(context->hdc = GetDCEx(swapchain->win_handle, 0, DCX_USESTYLE | DCX_CACHE)))
     {
         WARN("Failed to retrieve device context, trying swapchain backup.\n");
 
-        if ((context->hdc = swapchain_get_backup_dc(swapchain)))
-            context->hdc_is_private = TRUE;
-        else
+        if (!(context->hdc = swapchain_get_backup_dc(swapchain)))
         {
             ERR("Failed to retrieve a device context.\n");
-            goto out;
+            device->shader_backend->shader_free_context_data(context);
+            device->adapter->fragment_pipe->free_context_data(context);
+            return FALSE;
         }
-    }
-
-    if (!device_context_add(device, context))
-    {
-        ERR("Failed to add the newly created context to the context list\n");
-        goto out;
+        context->hdc_is_private = TRUE;
     }
 
     context->win_handle = swapchain->win_handle;
@@ -1956,13 +1943,6 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     context->current_rt.sub_resource_idx = 0;
     context->tid = GetCurrentThreadId();
 
-    if (!(device->adapter->adapter_ops->adapter_create_context(context, target, ds_format)))
-    {
-        device_context_remove(device, context);
-        goto out;
-    }
-
-    device->shader_backend->shader_init_context_state(context);
     context->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
             | (1u << WINED3D_SHADER_TYPE_VERTEX)
             | (1u << WINED3D_SHADER_TYPE_GEOMETRY)
@@ -1970,13 +1950,50 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
             | (1u << WINED3D_SHADER_TYPE_DOMAIN)
             | (1u << WINED3D_SHADER_TYPE_COMPUTE);
 
+    return TRUE;
+}
+
+struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
+        struct wined3d_texture *target, const struct wined3d_format *ds_format)
+{
+    struct wined3d_device *device = swapchain->device;
+    struct wined3d_context_gl *context_gl;
+    struct wined3d_context *context;
+
+    TRACE("swapchain %p, target %p, window %p.\n", swapchain, target, swapchain->win_handle);
+
+    wined3d_from_cs(device->cs);
+
+    if (!(context_gl = heap_alloc_zero(sizeof(*context_gl))))
+        return NULL;
+    context = &context_gl->c;
+
+    if (!(wined3d_context_init(context, swapchain, target, ds_format)))
+    {
+        heap_free(context_gl);
+        return NULL;
+    }
+
+    if (!device_context_add(device, context))
+    {
+        ERR("Failed to add the newly created context to the context list\n");
+        goto fail;
+    }
+
+    if (!(device->adapter->adapter_ops->adapter_create_context(context, target, ds_format)))
+    {
+        device_context_remove(device, context);
+        goto fail;
+    }
+
+    device->shader_backend->shader_init_context_state(context);
+
     TRACE("Created context %p.\n", context);
 
     return context;
 
-out:
-    if (context->hdc)
-        wined3d_release_dc(swapchain->win_handle, context->hdc);
+fail:
+    wined3d_release_dc(context->win_handle, context->hdc);
     device->shader_backend->shader_free_context_data(context);
     device->adapter->fragment_pipe->free_context_data(context);
     heap_free(context_gl);




More information about the wine-cvs mailing list