summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'media-tv/mythtv/files/mythtv-0.20-vsync.patch')
-rw-r--r--media-tv/mythtv/files/mythtv-0.20-vsync.patch154
1 files changed, 154 insertions, 0 deletions
diff --git a/media-tv/mythtv/files/mythtv-0.20-vsync.patch b/media-tv/mythtv/files/mythtv-0.20-vsync.patch
new file mode 100644
index 000000000000..d176466c37dd
--- /dev/null
+++ b/media-tv/mythtv/files/mythtv-0.20-vsync.patch
@@ -0,0 +1,154 @@
+Index: libs/libmythtv/vsync.cpp
+===================================================================
+--- libs/libmythtv/vsync.cpp (revision 11251)
++++ libs/libmythtv/vsync.cpp (working copy)
+@@ -35,8 +35,8 @@
+ #include "util-x11.h" // for OpenGL VSync
+
+ #ifdef USING_OPENGL_VSYNC
+-#define GLX_GLXEXT_PROTOTYPES
+ #define XMD_H 1
++#define GLX_GLXEXT_PROTOTYPES
+ #include <GL/glx.h>
+ #include <GL/gl.h>
+ #undef GLX_ARB_get_proc_address
+@@ -437,12 +437,59 @@
+ UpdateNexttrigger();
+ }
+
++#ifdef USING_OPENGL_VSYNC
++class OpenGLVideoSyncPrivate
++{
++ public:
++ OpenGLVideoSyncPrivate()
++ {
++ m_glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC) glXGetProcAddress("glXGetVideoSyncSGI");
++ m_glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC) glXGetProcAddress("glXWaitVideoSyncSGI");
++ }
++
++ bool funcsLoaded()
++ {
++ return m_glXGetVideoSyncSGI && m_glXWaitVideoSyncSGI;
++ }
++
++ public:
++ int glXGetVideoSyncSGI(unsigned int *count)
++ {
++ return m_glXGetVideoSyncSGI(count);
++ }
++
++ int glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
++ {
++ return m_glXWaitVideoSyncSGI(divisor, remainder, count);
++ }
++
++ __GLXextFuncPtr glXGetProcAddress(const char * const procName)
++ {
++ __GLXextFuncPtr ret = glXGetProcAddressARB((const GLubyte *) procName);
++ if (!ret)
++ {
++ VERBOSE(VB_PLAYBACK,
++ QString("Error: glXGetProcAddressARB unable to find %1")
++ .arg(procName));
++ }
++ return ret;
++ }
++
++ private:
++ PFNGLXGETVIDEOSYNCSGIPROC m_glXGetVideoSyncSGI;
++ PFNGLXWAITVIDEOSYNCSGIPROC m_glXWaitVideoSyncSGI;
++};
++#endif // USING_OPENGL_VSYNC
++
+ OpenGLVideoSync::OpenGLVideoSync(VideoOutput *video_output,
+ int frame_interval, int refresh_interval,
+ bool interlaced)
+ : VideoSync(video_output, frame_interval, refresh_interval, interlaced),
+- m_drawable(0), m_context(0)
++ m_drawable(0), m_context(0), m_imp(0)
+ {
++#ifdef USING_OPENGL_VSYNC
++ m_imp = new OpenGLVideoSyncPrivate;
++#endif // USING_OPENGL_VSYNC
+ }
+
+ OpenGLVideoSync::~OpenGLVideoSync()
+@@ -457,6 +504,7 @@
+ if (m_drawable)
+ X11S(XDestroyWindow(vo->XJ_disp, m_drawable));
+ }
++ delete m_imp;
+ #endif /* USING_OPENGL_VSYNC */
+ }
+
+@@ -503,6 +551,12 @@
+ return false;
+ }
+
++ if (!m_imp->funcsLoaded())
++ {
++ VERBOSE(VB_PLAYBACK, QString("GL sync functions not found"));
++ return false;
++ }
++
+ int attribList[] = {GLX_RGBA,
+ GLX_RED_SIZE, 1,
+ GLX_GREEN_SIZE, 1,
+@@ -552,7 +606,7 @@
+ if (ret != False)
+ {
+ unsigned int count;
+- X11S(ret = glXGetVideoSyncSGI(&count));
++ X11S(ret = m_imp->glXGetVideoSyncSGI(&count));
+ if (ret == 0)
+ {
+ VERBOSE(VB_PLAYBACK, "Using OpenGLVideoSync");
+@@ -631,9 +685,9 @@
+
+ // Wait for a refresh so we start out synched
+ unsigned int count;
+- err = glXGetVideoSyncSGI(&count);
++ err = m_imp->glXGetVideoSyncSGI(&count);
+ checkGLSyncError("OpenGLVideoSync::Start(): Frame Number Query", err);
+- err = glXWaitVideoSyncSGI(2, (count+1)%2 ,&count);
++ err = m_imp->glXWaitVideoSyncSGI(2, (count+1)%2 ,&count);
+ checkGLSyncError("OpenGLVideoSync::Start(): A/V Sync", err);
+
+ // Initialize next trigger
+@@ -649,13 +703,13 @@
+ OffsetTimeval(m_nexttrigger, sync_delay);
+
+ unsigned int frameNum = 0;
+- int err = glXGetVideoSyncSGI(&frameNum);
++ int err = m_imp->glXGetVideoSyncSGI(&frameNum);
+ checkGLSyncError("Frame Number Query", err);
+
+ // Always sync to the next retrace execpt when we are very late.
+ if ((m_delay = CalcDelay()) > -(m_refresh_interval/2))
+ {
+- err = glXWaitVideoSyncSGI(2, (frameNum+1)%2 ,&frameNum);
++ err = m_imp->glXWaitVideoSyncSGI(2, (frameNum+1)%2 ,&frameNum);
+ checkGLSyncError(msg1, err);
+ m_delay = CalcDelay();
+ }
+@@ -664,7 +718,7 @@
+ if (m_delay > 0)
+ {
+ uint n = m_delay / m_refresh_interval + 1;
+- err = glXWaitVideoSyncSGI((n+1), (frameNum+n)%(n+1), &frameNum);
++ err = m_imp->glXWaitVideoSyncSGI((n+1), (frameNum+n)%(n+1), &frameNum);
+ checkGLSyncError(msg2, err);
+ m_delay = CalcDelay();
+ }
+Index: libs/libmythtv/vsync.h
+===================================================================
+--- libs/libmythtv/vsync.h (revision 11251)
++++ libs/libmythtv/vsync.h (working copy)
+@@ -214,6 +214,7 @@
+ private:
+ GLXDrawable m_drawable;
+ GLXContext m_context;
++ class OpenGLVideoSyncPrivate *m_imp;
+ };
+
+ #ifdef __linux__