[7/10] WineD3D: Make the context array dynamic

Stefan Dösinger stefan at codeweavers.com
Mon Feb 12 12:18:56 CST 2007


-------------- next part --------------
From dd3ad62a7ed0206ddb7031551b3844d3595eced5 Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Fri, 26 Jan 2007 18:06:51 +0100
Subject: [PATCH] WineD3D: Make the context array dynamic

---
 dlls/wined3d/context.c         |    2 +-
 dlls/wined3d/device.c          |   13 +++++++++----
 dlls/wined3d/directx.c         |    6 ++++++
 dlls/wined3d/wined3d_private.h |    2 +-
 4 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 1f6d693..6dc88fb 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -207,7 +207,7 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU
     /* TODO: Thread selection */
 
     /* TODO: Activate the opengl context */
-    context = &This->contexts[This->activeContext];
+    context = This->contexts[This->activeContext];
 
     switch(usage) {
         case CTXUSAGE_RESOURCELOAD:
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 1f27916..1771e63 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -350,10 +350,16 @@ static ULONG WINAPI IWineD3DDeviceImpl_Release(IWineD3DDevice *iface) {
     TRACE("(%p) : Releasing from %d\n", This, refCount + 1);
 
     if (!refCount) {
+        UINT i;
         if (This->fbo) {
             GL_EXTCALL(glDeleteFramebuffersEXT(1, &This->fbo));
         }
 
+        for(i = 0; i < This->numContexts; i++) {
+            HeapFree(GetProcessHeap(), 0, This->contexts[i]);
+        }
+        HeapFree(GetProcessHeap(), 0, This->contexts);
+
         HeapFree(GetProcessHeap(), 0, This->render_targets);
 
         HeapFree(GetProcessHeap(), 0, This->draw_buffers);
@@ -2007,8 +2013,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR
 
     /* Initialize the current view state */
     This->view_ident = 1;
-    This->numContexts = 1;
-    This->contexts[0].last_was_rhw = 0;
+    This->contexts[0]->last_was_rhw = 0;
     glGetIntegerv(GL_MAX_LIGHTS, &This->maxConcurrentLights);
     TRACE("(%p) All defaults now set up, leaving Init3D with %p\n", This, This);
 
@@ -5948,7 +5953,7 @@ static void device_render_to_texture(IWineD3DDeviceImpl* This, BOOL isTexture) {
     if (This->depth_copy_state != WINED3D_DCS_NO_COPY) {
         This->depth_copy_state = WINED3D_DCS_COPY;
     }
-    This->contexts[0].last_was_rhw = FALSE;
+    This->contexts[0]->last_was_rhw = FALSE;
     /* Viewport state will reapply the projection matrix for now */
     IWineD3DDeviceImpl_MarkStateDirty(This, WINED3DRS_CULLMODE);
 
@@ -6985,7 +6990,7 @@ void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state) {
     if(!rep) return;
 
     for(i = 0; i < This->numContexts; i++) {
-        context = &This->contexts[i];
+        context = This->contexts[i];
         if(isStateDirty(context, rep)) continue;
 
         context->dirtyArray[context->numDirtyEntries++] = rep;
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 7bd04bb..e711b10 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2444,6 +2444,12 @@ static HRESULT  WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
     object->ddraw_format = pixelformat_for_depth(GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES));
     ReleaseDC(0, hDC);
 
+    /* Allocate one context for now */
+    object->contexts = HeapAlloc(GetProcessHeap(), 0, sizeof(WineD3DContext *));
+    object->contexts[0] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WineD3DContext));
+    object->numContexts = 1;
+    object->activeContext = 0;
+
     return WINED3D_OK;
 create_device_error:
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 03d5759..7be34ac 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -695,7 +695,7 @@ struct IWineD3DDeviceImpl
     BOOL                      useDrawStridedSlow;
 
     /* Context management */
-    WineD3DContext          contexts[1];   /* Dynamic array later */
+    WineD3DContext          **contexts;   /* Dynamic array containing pointers to context structures */
     UINT                    activeContext; /* Only 0 for now      */
     UINT                    numContexts;   /* Always 1 for now    */
 };
-- 
1.4.4.3



More information about the wine-devel mailing list