changeset 29904:f529a2bb299d

Add support for Windows OpenGL rendering onto a device instead of into a window. Has little use except for experimenting - on Windows 9x it could be used to render on monitors that were not managed by Windows, but that feature was removed in newer Windows versions.
author reimar
date Sat, 21 Nov 2009 22:27:40 +0000
parents 391e683541a7
children 908f55fb5ed8
files libvo/gl_common.c libvo/vo_gl2.c libvo/w32_common.c
diffstat 3 files changed, 48 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/gl_common.c	Sat Nov 21 19:50:33 2009 +0000
+++ b/libvo/gl_common.c	Sat Nov 21 22:27:40 2009 +0000
@@ -1461,7 +1461,7 @@
 int setGlWindow(int *vinfo, HGLRC *context, HWND win)
 {
   int new_vinfo;
-  HDC windc = GetDC(win);
+  HDC windc = vo_w32_get_dc(win);
   HGLRC new_context = 0;
   int keep_context = 0;
   int res = SET_WINDOW_FAILED;
@@ -1514,7 +1514,7 @@
     res = SET_WINDOW_OK;
 
 out:
-  ReleaseDC(win, windc);
+  vo_w32_release_dc(win, windc);
   return res;
 }
 
@@ -1528,9 +1528,9 @@
 }
 
 void swapGlBuffers(void) {
-  HDC vo_hdc = GetDC(vo_w32_window);
+  HDC vo_hdc = vo_w32_get_dc(vo_w32_window);
   SwapBuffers(vo_hdc);
-  ReleaseDC(vo_w32_window, vo_hdc);
+  vo_w32_release_dc(vo_w32_window, vo_hdc);
 }
 #else
 #ifdef HAVE_LIBDL
--- a/libvo/vo_gl2.c	Sat Nov 21 19:50:33 2009 +0000
+++ b/libvo/vo_gl2.c	Sat Nov 21 22:27:40 2009 +0000
@@ -117,7 +117,7 @@
 {
 #ifdef GL_WIN32
   PIXELFORMATDESCRIPTOR pfd;
-  HDC vo_hdc = GetDC(vo_w32_window);
+  HDC vo_hdc = vo_w32_get_dc(vo_w32_window);
   int pf = GetPixelFormat(vo_hdc);
   if (!DescribePixelFormat(vo_hdc, pf, sizeof pfd, &pfd)) {
     r_sz = g_sz = b_sz = a_sz = 0;
@@ -127,7 +127,7 @@
     b_sz = pfd.cBlueBits;
     a_sz = pfd.cAlphaBits;
   }
-  ReleaseDC(vo_w32_window, vo_hdc);
+  vo_w32_release_dc(vo_w32_window, vo_hdc);
 #else
   if (glXGetConfig(mDisplay, gl_vinfo, GLX_RED_SIZE, &r_sz) != 0) r_sz = 0;
   if (glXGetConfig(mDisplay, gl_vinfo, GLX_GREEN_SIZE, &g_sz) != 0) g_sz = 0;
--- a/libvo/w32_common.c	Sat Nov 21 19:50:33 2009 +0000
+++ b/libvo/w32_common.c	Sat Nov 21 22:27:40 2009 +0000
@@ -51,6 +51,8 @@
 static HINSTANCE hInstance;
 #define vo_window vo_w32_window
 HWND vo_window = 0;
+/** HDC used when rendering to a device instead of window */
+static HDC dev_hdc;
 static int event_flags;
 static int mon_cnt;
 
@@ -328,7 +330,7 @@
 static int createRenderingContext(void) {
     HWND layer = HWND_NOTOPMOST;
     PIXELFORMATDESCRIPTOR pfd;
-    HDC vo_hdc = GetDC(vo_window);
+    HDC vo_hdc = vo_w32_get_dc(vo_window);
     RECT r;
     int pf;
   if (WinID < 0) {
@@ -395,7 +397,7 @@
 
     mp_msg(MSGT_VO, MSGL_V, "vo: win32: running at %dx%d with depth %d\n", vo_screenwidth, vo_screenheight, vo_depthonscreen);
 
-    ReleaseDC(vo_window, vo_hdc);
+    vo_w32_release_dc(vo_window, vo_hdc);
     return 1;
 }
 
@@ -430,6 +432,18 @@
 }
 
 /**
+ * \brief return the name of the selected device if it is indepedant
+ */
+static char *get_display_name(void) {
+    DISPLAY_DEVICE disp;
+    disp.cb = sizeof(disp);
+    EnumDisplayDevices(NULL, vo_adapter_num, &disp, 0);
+    if (disp.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)
+        return NULL;
+    return disp.DeviceName;
+}
+
+/**
  * \brief Initialize w32_common framework.
  *
  * The first function that should be called from the w32_common framework.
@@ -450,6 +464,7 @@
     HICON mplayerIcon = 0;
     char exedir[MAX_PATH];
     HINSTANCE user32;
+    char *dev;
 
     if (vo_window)
         return 1;
@@ -497,6 +512,9 @@
         myGetMonitorInfo = GetProcAddress(user32, "GetMonitorInfoA");
         myEnumDisplayMonitors = GetProcAddress(user32, "EnumDisplayMonitors");
     }
+    dev_hdc = 0;
+    dev = get_display_name();
+    if (dev) dev_hdc = CreateDC(dev, NULL, NULL, NULL);
     updateScreenProperties();
 
     return 1;
@@ -564,7 +582,29 @@
     resetMode();
     ShowCursor(1);
     vo_depthonscreen = 0;
+    if (dev_hdc) DeleteDC(dev_hdc);
+    dev_hdc = 0;
     DestroyWindow(vo_window);
     vo_window = 0;
     UnregisterClass(classname, 0);
 }
+
+/**
+ * \brief get a device context to draw in
+ *
+ * \param wnd window the DC should belong to if it makes sense
+ */
+HDC vo_w32_get_dc(HWND wnd) {
+    if (dev_hdc) return dev_hdc;
+    return GetDC(wnd);
+}
+
+/**
+ * \brief release a device context
+ *
+ * \param wnd window the DC probably belongs to
+ */
+void vo_w32_release_dc(HWND wnd, HDC dc) {
+    if (dev_hdc) return;
+    ReleaseDC(wnd, dc);
+}