Testers needed for -vo gl under Vista

Reimar Döffinger <[email protected]>
Newsgroups gmane.comp.video.mplayer.cygwin,gmane.comp.video.mplayer.user
Message-ID <[email protected]>
Hello,
to anyone who wants the issues to be fixed, I need someone who can
compile MPlayer and test patches.
Attached is a patch that might make -vo gl actually display something.
I was reading the VirtualDub blog, and it seems Vista just doesn't
update windows as long as there is still a DC allocated - and MPlayer
for simplicity always keeps one.
Note: I did not even test for compilation.

Greetings,
Reimar Döffinger

_______________________________________________
MPlayer-cygwin mailing list
[email protected]
http://lists.mplayerhq.hu/mailman/listinfo/mplayer-cygwin
vistagl.diff (text/plain, 3.8 KB)
Index: libvo/w32_common.c
===================================================================
--- libvo/w32_common.c	(revision 22946)
+++ libvo/w32_common.c	(working copy)
@@ -10,6 +10,9 @@
 #include "video_out.h"
 #include "aspect.h"
 #include "w32_common.h"
+#ifndef PFD_SUPPORT_COMPOSITION
+#define PFD_SUPPORT_COMPOSITION 0x00008000
+#endif
 #include "mp_fifo.h"
 
 extern int enable_mouse_movements;
@@ -20,7 +23,6 @@
 
 static const char* classname = "MPlayer - Media player for Win32";
 int vo_vm = 0;
-HDC vo_hdc = 0;
 
 // last non-fullscreen extends
 int prev_width;
@@ -250,6 +253,7 @@
 static int createRenderingContext(void) {
     HWND layer = HWND_NOTOPMOST;
     PIXELFORMATDESCRIPTOR pfd;
+    HDC vo_hdc = GetDC(vo_window);
     RECT r;
     int pf;
   if (WinID < 0) {
@@ -298,13 +302,14 @@
     memset(&pfd, 0, sizeof pfd);
     pfd.nSize = sizeof pfd;
     pfd.nVersion = 1;
-    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
+    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_SUPPORT_COMPOSITION;
     pfd.iPixelType = PFD_TYPE_RGBA;
     pfd.cColorBits = 24;
     pfd.iLayerType = PFD_MAIN_PLANE;
     pf = ChoosePixelFormat(vo_hdc, &pfd);
     if (!pf) {
             mp_msg(MSGT_VO, MSGL_ERR, "vo: win32: unable to select a valid pixel format!\n");
+        ReleaseDC(vo_hdc);
         return 0;
     }
 
@@ -312,6 +317,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_hdc);
     return 1;
 }
 
@@ -366,8 +372,6 @@
     }
     }
 
-    vo_hdc = GetDC(vo_window);
-
     myMonitorFromWindow = NULL;
     myGetMonitorInfo = NULL;
     myEnumDisplayMonitors = NULL;
Index: libvo/gl_common.c
===================================================================
--- libvo/gl_common.c	(revision 22946)
+++ libvo/gl_common.c	(working copy)
@@ -1341,6 +1381,7 @@
   HDC windc = GetDC(win);
   HGLRC new_context = 0;
   int keep_context = 0;
+  int res = SET_WINDOW_FAILED;
 
   // should only be needed when keeping context, but not doing glFinish
   // can cause flickering even when we do not keep it.
@@ -1356,7 +1397,7 @@
     new_context = wglCreateContext(windc);
     if (!new_context) {
       mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not create GL context!\n");
-      return SET_WINDOW_FAILED;
+      goto out;
     }
   }
 
@@ -1366,12 +1407,11 @@
     if (!keep_context) {
       wglDeleteContext(new_context);
     }
-    return SET_WINDOW_FAILED;
+    goto out;
   }
 
   // set new values
   vo_w32_window = win;
-  vo_hdc = windc;
   {
     RECT rect;
     GetClientRect(win, &rect);
@@ -1386,9 +1426,13 @@
     getFunctions(w32gpa, NULL);
 
     // and inform that reinit is neccessary
-    return SET_WINDOW_REINIT;
-  }
-  return SET_WINDOW_OK;
+    res = SET_WINDOW_REINIT;
+  } else
+    res = SET_WINDOW_OK;
+
+out:
+  ReleaseDC(windc);
+  return res;
 }
 
 void releaseGlContext(int *vinfo, HGLRC *context) {
@@ -1401,7 +1445,9 @@
 }
 
 void swapGlBuffers() {
+  HDC vo_hdc = GetDC(vo_w32_window);
   SwapBuffers(vo_hdc);
+  ReleaseDC(vo_hdc);
 }
 #else
 #ifdef HAVE_LIBDL
Index: libvo/vo_gl2.c
===================================================================
--- libvo/vo_gl2.c	(revision 22946)
+++ libvo/vo_gl2.c	(working copy)
@@ -106,6 +106,7 @@
 {
 #ifdef GL_WIN32
   PIXELFORMATDESCRIPTOR pfd;
+  HDC vo_hdc = GetDC(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;
@@ -115,6 +116,7 @@
     b_sz = pfd.cBlueBits;
     a_sz = pfd.cAlphaBits;
   }
+  ReleaseDC(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;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.