[PATCH 3/5] wined3d: Cleanup context_create() error handling a bit.

Henri Verbeet hverbeet at codeweavers.com
Thu Oct 13 14:43:07 CDT 2011


---
 dlls/wined3d/context.c |  123 ++++++++++++++++++++++++++---------------------
 1 files changed, 68 insertions(+), 55 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 61398e6..9d15176 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1311,6 +1311,53 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
         return NULL;
     }
 
+    if (device->shader_backend->shader_dirtifyable_constants())
+    {
+        /* Create the dirty constants array and initialize them to dirty */
+        ret->vshader_const_dirty = HeapAlloc(GetProcessHeap(), 0,
+                sizeof(*ret->vshader_const_dirty) * device->d3d_vshader_constantF);
+        if (!ret->vshader_const_dirty)
+            goto out;
+
+        ret->pshader_const_dirty = HeapAlloc(GetProcessHeap(), 0,
+                sizeof(*ret->pshader_const_dirty) * device->d3d_pshader_constantF);
+        if (!ret->pshader_const_dirty)
+            goto out;
+
+        memset(ret->vshader_const_dirty, 1,
+               sizeof(*ret->vshader_const_dirty) * device->d3d_vshader_constantF);
+        memset(ret->pshader_const_dirty, 1,
+                sizeof(*ret->pshader_const_dirty) * device->d3d_pshader_constantF);
+    }
+
+    ret->blit_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+            gl_info->limits.buffers * sizeof(*ret->blit_targets));
+    if (!ret->blit_targets)
+        goto out;
+
+    ret->draw_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+            gl_info->limits.buffers * sizeof(*ret->draw_buffers));
+    if (!ret->draw_buffers)
+        goto out;
+
+    ret->free_occlusion_query_size = 4;
+    ret->free_occlusion_queries = HeapAlloc(GetProcessHeap(), 0,
+            ret->free_occlusion_query_size * sizeof(*ret->free_occlusion_queries));
+    if (!ret->free_occlusion_queries)
+        goto out;
+
+    list_init(&ret->occlusion_queries);
+
+    ret->free_event_query_size = 4;
+    ret->free_event_queries = HeapAlloc(GetProcessHeap(), 0,
+            ret->free_event_query_size * sizeof(*ret->free_event_queries));
+    if (!ret->free_event_queries)
+        goto out;
+
+    list_init(&ret->event_queries);
+    list_init(&ret->fbo_list);
+    list_init(&ret->fbo_destroy_list);
+
     if (!(hdc = GetDC(swapchain->win_handle)))
     {
         WARN("Failed to retireve device context, trying swapchain backup.\n");
@@ -1362,36 +1409,41 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
         goto out;
     }
 
+    context_enter(ret);
+
     if (!context_set_pixel_format(gl_info, hdc, pixel_format))
     {
         ERR("Failed to set pixel format %d on device context %p.\n", pixel_format, hdc);
+        context_release(ret);
+        goto out;
+    }
+
+    if (!(ctx = pwglCreateContext(hdc)))
+    {
+        ERR("Failed to create a WGL context.\n");
+        context_release(ret);
         goto out;
     }
 
-    ctx = pwglCreateContext(hdc);
     if (device->context_count)
     {
         if (!pwglShareLists(device->contexts[0]->glCtx, ctx))
         {
-            DWORD err = GetLastError();
             ERR("wglShareLists(%p, %p) failed, last error %#x.\n",
-                    device->contexts[0]->glCtx, ctx, err);
+                    device->contexts[0]->glCtx, ctx, GetLastError());
+            context_release(ret);
+            if (!pwglDeleteContext(ctx))
+                ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx, GetLastError());
+            goto out;
         }
     }
 
-    if(!ctx) {
-        ERR("Failed to create a WGL context\n");
-        goto out;
-    }
-
     if (!device_context_add(device, ret))
     {
         ERR("Failed to add the newly created context to the context list\n");
+        context_release(ret);
         if (!pwglDeleteContext(ctx))
-        {
-            DWORD err = GetLastError();
-            ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx, err);
-        }
+            ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx, GetLastError());
         goto out;
     }
 
@@ -1419,53 +1471,14 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     ret->hdc = hdc;
     ret->pixel_format = pixel_format;
 
-    if (device->shader_backend->shader_dirtifyable_constants())
-    {
-        /* Create the dirty constants array and initialize them to dirty */
-        ret->vshader_const_dirty = HeapAlloc(GetProcessHeap(), 0,
-                sizeof(*ret->vshader_const_dirty) * device->d3d_vshader_constantF);
-        ret->pshader_const_dirty = HeapAlloc(GetProcessHeap(), 0,
-                sizeof(*ret->pshader_const_dirty) * device->d3d_pshader_constantF);
-        memset(ret->vshader_const_dirty, 1,
-               sizeof(*ret->vshader_const_dirty) * device->d3d_vshader_constantF);
-        memset(ret->pshader_const_dirty, 1,
-                sizeof(*ret->pshader_const_dirty) * device->d3d_pshader_constantF);
-    }
-
-    ret->blit_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-            gl_info->limits.buffers * sizeof(*ret->blit_targets));
-    if (!ret->blit_targets) goto out;
-
-    ret->draw_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-            gl_info->limits.buffers * sizeof(*ret->draw_buffers));
-    if (!ret->draw_buffers) goto out;
-
-    ret->free_occlusion_query_size = 4;
-    ret->free_occlusion_queries = HeapAlloc(GetProcessHeap(), 0,
-            ret->free_occlusion_query_size * sizeof(*ret->free_occlusion_queries));
-    if (!ret->free_occlusion_queries) goto out;
-
-    list_init(&ret->occlusion_queries);
-
-    ret->free_event_query_size = 4;
-    ret->free_event_queries = HeapAlloc(GetProcessHeap(), 0,
-            ret->free_event_query_size * sizeof(*ret->free_event_queries));
-    if (!ret->free_event_queries) goto out;
-
-    list_init(&ret->event_queries);
-
-    TRACE("Successfully created new context %p\n", ret);
-
-    list_init(&ret->fbo_list);
-    list_init(&ret->fbo_destroy_list);
-
-    context_enter(ret);
-
     /* Set up the context defaults */
     if (!context_set_current(ret))
     {
-        ERR("Cannot activate context to set up defaults\n");
+        ERR("Cannot activate context to set up defaults.\n");
+        device_context_remove(device, ret);
         context_release(ret);
+        if (!pwglDeleteContext(ctx))
+            ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx, GetLastError());
         goto out;
     }
 
-- 
1.7.3.4




More information about the wine-patches mailing list