diff --git a/main.c b/main.c
index 76b90c9..0cb8556 100644
--- a/main.c
+++ b/main.c
@@ -379,6 +379,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
 HRESULT __stdcall ddraw_SetCooperativeLevel(IDirectDrawImpl *This, HWND hWnd, DWORD dwFlags)
 {
+    PIXELFORMATDESCRIPTOR pfd;
+
     printf("DirectDraw::SetCooperativeLevel(This=%p, hWnd=0x%08X, dwFlags=0x%08X)\n", This, (unsigned int)hWnd, (unsigned int)dwFlags);
 
     /* Red Alert for some weird reason does this on Windows XP */
@@ -397,6 +399,20 @@ HRESULT __stdcall ddraw_SetCooperativeLevel(IDirectDrawImpl *This, HWND hWnd, DW
         SetWindowLong(This->hWnd, GWL_WNDPROC, (LONG)WndProc);
     }
 
+    if(!This->render.hDC)
+    {
+        This->render.hDC = GetDC(This->hWnd);
+
+        memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
+        pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
+        pfd.nVersion = 1;
+        pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
+        pfd.iPixelType = PFD_TYPE_RGBA;
+        pfd.cColorBits = ddraw->render.bpp ? ddraw->render.bpp : ddraw->mode.dmBitsPerPel;
+        pfd.iLayerType = PFD_MAIN_PLANE;
+        SetPixelFormat( This->render.hDC, ChoosePixelFormat( This->render.hDC, &pfd ), &pfd );
+    }
+
     return DD_OK;
 }
 
@@ -443,6 +459,18 @@ ULONG __stdcall ddraw_Release(IDirectDrawImpl *This)
             LeaveCriticalSection(&This->cs);
         }
 
+        if(This->render.hDC)
+        {
+            ReleaseDC(This->hWnd, This->render.hDC);
+            This->render.hDC = NULL;
+        }
+
+        if(This->render.ev)
+        {
+            CloseHandle(This->render.ev);
+            ddraw->render.ev = NULL;
+        }
+
         DeleteCriticalSection(&This->cs);
 
         /* restore old wndproc, subsequent ddraw creation will otherwise fail */
@@ -532,6 +560,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
     }
 
     InitializeCriticalSection(&This->cs);
+    This->render.ev = CreateEvent(NULL, TRUE, FALSE, NULL);
 
     /* load configuration options from ddraw.ini */
     char cwd[MAX_PATH];
diff --git a/main.h b/main.h
index 6398ee0..929c5c2 100644
--- a/main.h
+++ b/main.h
@@ -54,6 +54,9 @@ typedef struct IDirectDrawImpl
         int bpp;
         int filter;
 
+        HDC hDC;
+        int *tex;
+
         HANDLE thread;
         BOOL run;
         HANDLE ev;
diff --git a/render.c b/render.c
index 6c03199..9c38805 100644
--- a/render.c
+++ b/render.c
@@ -23,29 +23,16 @@
 DWORD WINAPI render_main(void)
 {
     int i,j;
-    PIXELFORMATDESCRIPTOR pfd;
-    HDC hDC;
     HGLRC hRC;
 
-    hDC = GetDC(ddraw->hWnd);
-
     int tex_width = 1024;
     int tex_height = 1024;
     float scale_w = 1.0f;
     float scale_h = 1.0f;
     int *tex = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, tex_width * tex_height * sizeof(int));
 
-    memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
-    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
-    pfd.nVersion = 1;
-    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
-    pfd.iPixelType = PFD_TYPE_RGBA;
-    pfd.cColorBits = ddraw->render.bpp ? ddraw->render.bpp : ddraw->mode.dmBitsPerPel;
-    pfd.iLayerType = PFD_MAIN_PLANE;
-    SetPixelFormat( hDC, ChoosePixelFormat( hDC, &pfd ), &pfd );
-
-    hRC = wglCreateContext( hDC );
-    wglMakeCurrent( hDC, hRC );
+    hRC = wglCreateContext( ddraw->render.hDC );
+    wglMakeCurrent( ddraw->render.hDC, hRC );
 
     DWORD tick_start;
     DWORD tick_end;
@@ -61,8 +48,6 @@ DWORD WINAPI render_main(void)
         frame_len = 1000.0f / ddraw->render.maxfps;
     }
 
-    ddraw->render.ev = CreateEvent(NULL, TRUE, FALSE, NULL);
-
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex);
     glViewport(0, 0, ddraw->render.width, ddraw->render.height);
 
@@ -114,7 +99,7 @@ DWORD WINAPI render_main(void)
         glTexCoord2f(0,scale_h);        glVertex2f(-1, -1);
         glEnd();
 
-        SwapBuffers(hDC);
+        SwapBuffers(ddraw->render.hDC);
 
         if(ddraw->render.maxfps > 0)
         {
@@ -130,12 +115,9 @@ DWORD WINAPI render_main(void)
     }
 
     HeapFree(GetProcessHeap(), 0, tex);
-    CloseHandle(ddraw->render.ev);
-    ddraw->render.ev = NULL;
 
     wglMakeCurrent(NULL, NULL);
     wglDeleteContext(hRC);
-    ReleaseDC(ddraw->hWnd, hDC);
 
     return 0;
 }