mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-08-01 15:07:49 +00:00
xbmc-pvr: update XVBA patches
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
d233723f0a
commit
ea7aba51d4
@ -972,7 +972,7 @@ index 8ec91c8..4803dd7 100644
|
|||||||
PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
|
PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
|
||||||
PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0
|
PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0
|
||||||
diff --git a/xbmc/ApplicationMessenger.cpp b/xbmc/ApplicationMessenger.cpp
|
diff --git a/xbmc/ApplicationMessenger.cpp b/xbmc/ApplicationMessenger.cpp
|
||||||
index b43f765..e68c630 100644
|
index e95ecdc..892948a 100644
|
||||||
--- a/xbmc/ApplicationMessenger.cpp
|
--- a/xbmc/ApplicationMessenger.cpp
|
||||||
+++ b/xbmc/ApplicationMessenger.cpp
|
+++ b/xbmc/ApplicationMessenger.cpp
|
||||||
@@ -72,7 +72,7 @@
|
@@ -72,7 +72,7 @@
|
||||||
@ -1043,7 +1043,7 @@ index f0b4aeb..47d25e4 100644
|
|||||||
m_paused = false;
|
m_paused = false;
|
||||||
m_clock = 0;
|
m_clock = 0;
|
||||||
diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
|
diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
|
||||||
index 4961b7d..df3ec01 100644
|
index 4961b7d..70f20d7 100644
|
||||||
--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
|
--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
|
||||||
+++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
|
+++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
|
||||||
@@ -60,6 +60,9 @@
|
@@ -60,6 +60,9 @@
|
||||||
@ -1056,17 +1056,18 @@ index 4961b7d..df3ec01 100644
|
|||||||
|
|
||||||
#ifdef HAS_GLX
|
#ifdef HAS_GLX
|
||||||
#include <GL/glx.h>
|
#include <GL/glx.h>
|
||||||
@@ -120,6 +123,9 @@ CLinuxRendererGL::YUVBUFFER::YUVBUFFER()
|
@@ -120,6 +123,10 @@ CLinuxRendererGL::YUVBUFFER::YUVBUFFER()
|
||||||
#ifdef HAVE_LIBVDPAU
|
#ifdef HAVE_LIBVDPAU
|
||||||
vdpau = NULL;
|
vdpau = NULL;
|
||||||
#endif
|
#endif
|
||||||
+#ifdef HAVE_LIBXVBA
|
+#ifdef HAVE_LIBXVBA
|
||||||
+ xvba = NULL;
|
+ xvba = NULL;
|
||||||
|
+ xvba_tmp = NULL;
|
||||||
+#endif
|
+#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
CLinuxRendererGL::YUVBUFFER::~YUVBUFFER()
|
CLinuxRendererGL::YUVBUFFER::~YUVBUFFER()
|
||||||
@@ -159,6 +165,7 @@ CLinuxRendererGL::CLinuxRendererGL()
|
@@ -159,6 +166,7 @@ CLinuxRendererGL::CLinuxRendererGL()
|
||||||
m_rgbPbo = 0;
|
m_rgbPbo = 0;
|
||||||
|
|
||||||
m_dllSwScale = new DllSwScale;
|
m_dllSwScale = new DllSwScale;
|
||||||
@ -1074,7 +1075,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
CLinuxRendererGL::~CLinuxRendererGL()
|
CLinuxRendererGL::~CLinuxRendererGL()
|
||||||
@@ -223,7 +230,7 @@ bool CLinuxRendererGL::ValidateRenderer()
|
@@ -223,7 +231,7 @@ bool CLinuxRendererGL::ValidateRenderer()
|
||||||
|
|
||||||
void CLinuxRendererGL::ManageTextures()
|
void CLinuxRendererGL::ManageTextures()
|
||||||
{
|
{
|
||||||
@ -1083,7 +1084,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
//m_iYV12RenderBuffer = 0;
|
//m_iYV12RenderBuffer = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -568,6 +575,11 @@ void CLinuxRendererGL::Flush()
|
@@ -568,6 +576,11 @@ void CLinuxRendererGL::Flush()
|
||||||
m_bValidated = false;
|
m_bValidated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1095,7 +1096,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
void CLinuxRendererGL::Update(bool bPauseDrawing)
|
void CLinuxRendererGL::Update(bool bPauseDrawing)
|
||||||
{
|
{
|
||||||
if (!m_bConfigured) return;
|
if (!m_bConfigured) return;
|
||||||
@@ -729,14 +741,15 @@ unsigned int CLinuxRendererGL::PreInit()
|
@@ -729,14 +742,15 @@ unsigned int CLinuxRendererGL::PreInit()
|
||||||
{
|
{
|
||||||
CSingleLock lock(g_graphicsContext);
|
CSingleLock lock(g_graphicsContext);
|
||||||
m_bConfigured = false;
|
m_bConfigured = false;
|
||||||
@ -1114,7 +1115,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
|
|
||||||
// setup the background colour
|
// setup the background colour
|
||||||
m_clearColour = (float)(g_advancedSettings.m_videoBlackBarColour & 0xff) / 0xff;
|
m_clearColour = (float)(g_advancedSettings.m_videoBlackBarColour & 0xff) / 0xff;
|
||||||
@@ -816,7 +829,7 @@ void CLinuxRendererGL::UpdateVideoFilter()
|
@@ -816,7 +830,7 @@ void CLinuxRendererGL::UpdateVideoFilter()
|
||||||
case VS_SCALINGMETHOD_LINEAR:
|
case VS_SCALINGMETHOD_LINEAR:
|
||||||
SetTextureFilter(m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR);
|
SetTextureFilter(m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR);
|
||||||
m_renderQuality = RQ_SINGLEPASS;
|
m_renderQuality = RQ_SINGLEPASS;
|
||||||
@ -1123,7 +1124,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
{
|
{
|
||||||
m_pVideoFilterShader = new StretchFilterShader();
|
m_pVideoFilterShader = new StretchFilterShader();
|
||||||
if (!m_pVideoFilterShader->CompileAndLink())
|
if (!m_pVideoFilterShader->CompileAndLink())
|
||||||
@@ -897,6 +910,11 @@ void CLinuxRendererGL::LoadShaders(int field)
|
@@ -897,6 +911,11 @@ void CLinuxRendererGL::LoadShaders(int field)
|
||||||
CLog::Log(LOGNOTICE, "GL: Using VAAPI render method");
|
CLog::Log(LOGNOTICE, "GL: Using VAAPI render method");
|
||||||
m_renderMethod = RENDER_VAAPI;
|
m_renderMethod = RENDER_VAAPI;
|
||||||
}
|
}
|
||||||
@ -1135,7 +1136,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
int requestedMethod = g_guiSettings.GetInt("videoplayer.rendermethod");
|
int requestedMethod = g_guiSettings.GetInt("videoplayer.rendermethod");
|
||||||
@@ -1031,6 +1049,18 @@ void CLinuxRendererGL::LoadShaders(int field)
|
@@ -1031,6 +1050,18 @@ void CLinuxRendererGL::LoadShaders(int field)
|
||||||
m_textureCreate = &CLinuxRendererGL::CreateVAAPITexture;
|
m_textureCreate = &CLinuxRendererGL::CreateVAAPITexture;
|
||||||
m_textureDelete = &CLinuxRendererGL::DeleteVAAPITexture;
|
m_textureDelete = &CLinuxRendererGL::DeleteVAAPITexture;
|
||||||
}
|
}
|
||||||
@ -1154,7 +1155,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// setup default YV12 texture handlers
|
// setup default YV12 texture handlers
|
||||||
@@ -1124,6 +1154,13 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer)
|
@@ -1124,6 +1155,13 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer)
|
||||||
RenderVDPAU(renderBuffer, m_currentField);
|
RenderVDPAU(renderBuffer, m_currentField);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1168,7 +1169,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
#ifdef HAVE_LIBVA
|
#ifdef HAVE_LIBVA
|
||||||
else if (m_renderMethod & RENDER_VAAPI)
|
else if (m_renderMethod & RENDER_VAAPI)
|
||||||
{
|
{
|
||||||
@@ -1597,6 +1634,77 @@ void CLinuxRendererGL::RenderVAAPI(int index, int field)
|
@@ -1597,6 +1635,77 @@ void CLinuxRendererGL::RenderVAAPI(int index, int field)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1246,7 +1247,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
void CLinuxRendererGL::RenderSoftware(int index, int field)
|
void CLinuxRendererGL::RenderSoftware(int index, int field)
|
||||||
{
|
{
|
||||||
YUVPLANES &planes = m_buffers[index].fields[field];
|
YUVPLANES &planes = m_buffers[index].fields[field];
|
||||||
@@ -2351,6 +2459,408 @@ void CLinuxRendererGL::UploadVAAPITexture(int index)
|
@@ -2351,6 +2460,424 @@ void CLinuxRendererGL::UploadVAAPITexture(int index)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1259,6 +1260,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
+ m_buffers[index].xvba->FinishGL();
|
+ m_buffers[index].xvba->FinishGL();
|
||||||
+
|
+
|
||||||
+ SAFE_RELEASE(m_buffers[index].xvba);
|
+ SAFE_RELEASE(m_buffers[index].xvba);
|
||||||
|
+ SAFE_RELEASE(m_buffers[index].xvba_tmp);
|
||||||
+
|
+
|
||||||
+ if(plane.id && glIsTexture(plane.id))
|
+ if(plane.id && glIsTexture(plane.id))
|
||||||
+ glDeleteTextures(1, &plane.id);
|
+ glDeleteTextures(1, &plane.id);
|
||||||
@ -1305,6 +1307,13 @@ index 4961b7d..df3ec01 100644
|
|||||||
+#ifdef HAVE_LIBXVBA
|
+#ifdef HAVE_LIBXVBA
|
||||||
+ XVBA::CDecoder *xvba = m_buffers[index].xvba;
|
+ XVBA::CDecoder *xvba = m_buffers[index].xvba;
|
||||||
+
|
+
|
||||||
|
+ if (m_buffers[index].xvba_tmp)
|
||||||
|
+ {
|
||||||
|
+ SAFE_RELEASE(m_buffers[index].xvba);
|
||||||
|
+ xvba = m_buffers[index].xvba = m_buffers[index].xvba_tmp;
|
||||||
|
+ m_buffers[index].xvba_tmp = NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ YUVFIELDS &fields = m_buffers[index].fields;
|
+ YUVFIELDS &fields = m_buffers[index].fields;
|
||||||
+ YUVPLANE &planeFallback = fields[0][1];
|
+ YUVPLANE &planeFallback = fields[0][1];
|
||||||
+ YUVPLANE &plane = fields[m_currentField][0];
|
+ YUVPLANE &plane = fields[m_currentField][0];
|
||||||
@ -1369,6 +1378,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
+ m_buffers[index].xvba->FinishGL();
|
+ m_buffers[index].xvba->FinishGL();
|
||||||
+
|
+
|
||||||
+ SAFE_RELEASE(m_buffers[index].xvba);
|
+ SAFE_RELEASE(m_buffers[index].xvba);
|
||||||
|
+ SAFE_RELEASE(m_buffers[index].xvba_tmp);
|
||||||
+
|
+
|
||||||
+ if( fields[FIELD_FULL][0].id == 0 ) return;
|
+ if( fields[FIELD_FULL][0].id == 0 ) return;
|
||||||
+
|
+
|
||||||
@ -1571,6 +1581,13 @@ index 4961b7d..df3ec01 100644
|
|||||||
+ YUVFIELDS& fields = buf.fields;
|
+ YUVFIELDS& fields = buf.fields;
|
||||||
+ XVBA::CDecoder *xvba = m_buffers[source].xvba;
|
+ XVBA::CDecoder *xvba = m_buffers[source].xvba;
|
||||||
+
|
+
|
||||||
|
+ if (m_buffers[source].xvba_tmp)
|
||||||
|
+ {
|
||||||
|
+ SAFE_RELEASE(m_buffers[source].xvba);
|
||||||
|
+ xvba = m_buffers[source].xvba = m_buffers[source].xvba_tmp;
|
||||||
|
+ m_buffers[source].xvba_tmp = NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ if (!(im->flags&IMAGE_FLAG_READY) || !xvba)
|
+ if (!(im->flags&IMAGE_FLAG_READY) || !xvba)
|
||||||
+ {
|
+ {
|
||||||
+ m_eventTexturesDone[source]->Set();
|
+ m_eventTexturesDone[source]->Set();
|
||||||
@ -1655,7 +1672,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
void CLinuxRendererGL::UploadYUV422PackedTexture(int source)
|
void CLinuxRendererGL::UploadYUV422PackedTexture(int source)
|
||||||
{
|
{
|
||||||
YUVBUFFER& buf = m_buffers[source];
|
YUVBUFFER& buf = m_buffers[source];
|
||||||
@@ -2934,6 +3444,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature)
|
@@ -2934,6 +3461,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature)
|
||||||
if (m_renderMethod & RENDER_VAAPI)
|
if (m_renderMethod & RENDER_VAAPI)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -1665,7 +1682,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
return (m_renderMethod & RENDER_GLSL)
|
return (m_renderMethod & RENDER_GLSL)
|
||||||
|| (m_renderMethod & RENDER_ARB)
|
|| (m_renderMethod & RENDER_ARB)
|
||||||
|| ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE);
|
|| ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE);
|
||||||
@@ -2947,6 +3460,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature)
|
@@ -2947,6 +3477,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature)
|
||||||
if (m_renderMethod & RENDER_VAAPI)
|
if (m_renderMethod & RENDER_VAAPI)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -1675,7 +1692,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
return (m_renderMethod & RENDER_GLSL)
|
return (m_renderMethod & RENDER_GLSL)
|
||||||
|| (m_renderMethod & RENDER_ARB)
|
|| (m_renderMethod & RENDER_ARB)
|
||||||
|| ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE);
|
|| ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE);
|
||||||
@@ -2970,7 +3486,8 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature)
|
@@ -2970,7 +3503,8 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature)
|
||||||
if (feature == RENDERFEATURE_NONLINSTRETCH)
|
if (feature == RENDERFEATURE_NONLINSTRETCH)
|
||||||
{
|
{
|
||||||
if (((m_renderMethod & RENDER_GLSL) && !(m_renderMethod & RENDER_POT)) ||
|
if (((m_renderMethod & RENDER_GLSL) && !(m_renderMethod & RENDER_POT)) ||
|
||||||
@ -1685,7 +1702,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3010,10 +3527,22 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method)
|
@@ -3010,10 +3544,22 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method)
|
||||||
if(m_renderMethod & RENDER_VAAPI)
|
if(m_renderMethod & RENDER_VAAPI)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -1712,7 +1729,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
|
|
||||||
if((method == VS_INTERLACEMETHOD_RENDER_BLEND
|
if((method == VS_INTERLACEMETHOD_RENDER_BLEND
|
||||||
|| method == VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED
|
|| method == VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED
|
||||||
@@ -3045,7 +3574,7 @@ bool CLinuxRendererGL::Supports(ESCALINGMETHOD method)
|
@@ -3045,7 +3591,7 @@ bool CLinuxRendererGL::Supports(ESCALINGMETHOD method)
|
||||||
|| method == VS_SCALINGMETHOD_LANCZOS3)
|
|| method == VS_SCALINGMETHOD_LANCZOS3)
|
||||||
{
|
{
|
||||||
if ((glewIsSupported("GL_EXT_framebuffer_object") && (m_renderMethod & RENDER_GLSL)) ||
|
if ((glewIsSupported("GL_EXT_framebuffer_object") && (m_renderMethod & RENDER_GLSL)) ||
|
||||||
@ -1721,7 +1738,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
{
|
{
|
||||||
// spline36 and lanczos3 are only allowed through advancedsettings.xml
|
// spline36 and lanczos3 are only allowed through advancedsettings.xml
|
||||||
if(method != VS_SCALINGMETHOD_SPLINE36
|
if(method != VS_SCALINGMETHOD_SPLINE36
|
||||||
@@ -3104,7 +3633,7 @@ void CLinuxRendererGL::UnBindPbo(YUVBUFFER& buff)
|
@@ -3104,7 +3650,7 @@ void CLinuxRendererGL::UnBindPbo(YUVBUFFER& buff)
|
||||||
pbo = true;
|
pbo = true;
|
||||||
|
|
||||||
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, buff.pbo[plane]);
|
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, buff.pbo[plane]);
|
||||||
@ -1730,7 +1747,7 @@ index 4961b7d..df3ec01 100644
|
|||||||
buff.image.plane[plane] = (BYTE*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB) + PBO_OFFSET;
|
buff.image.plane[plane] = (BYTE*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB) + PBO_OFFSET;
|
||||||
}
|
}
|
||||||
if(pbo)
|
if(pbo)
|
||||||
@@ -3128,4 +3657,13 @@ void CLinuxRendererGL::AddProcessor(VAAPI::CHolder& holder)
|
@@ -3128,4 +3674,13 @@ void CLinuxRendererGL::AddProcessor(VAAPI::CHolder& holder)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1738,14 +1755,14 @@ index 4961b7d..df3ec01 100644
|
|||||||
+void CLinuxRendererGL::AddProcessor(XVBA::CDecoder* xvba)
|
+void CLinuxRendererGL::AddProcessor(XVBA::CDecoder* xvba)
|
||||||
+{
|
+{
|
||||||
+ YUVBUFFER &buf = m_buffers[NextYV12Texture()];
|
+ YUVBUFFER &buf = m_buffers[NextYV12Texture()];
|
||||||
+ SAFE_RELEASE(buf.xvba);
|
+ SAFE_RELEASE(buf.xvba_tmp);
|
||||||
+ buf.xvba = (XVBA::CDecoder*)xvba->Acquire();
|
+ buf.xvba_tmp = (XVBA::CDecoder*)xvba->Acquire();
|
||||||
+}
|
+}
|
||||||
+#endif
|
+#endif
|
||||||
+
|
+
|
||||||
#endif
|
#endif
|
||||||
diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h
|
diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h
|
||||||
index 38c84aa..9b8a5ae 100644
|
index 38c84aa..ae0b81b 100644
|
||||||
--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h
|
--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h
|
||||||
+++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h
|
+++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h
|
||||||
@@ -40,6 +40,7 @@ class CBaseTexture;
|
@@ -40,6 +40,7 @@ class CBaseTexture;
|
||||||
@ -1805,12 +1822,13 @@ index 38c84aa..9b8a5ae 100644
|
|||||||
|
|
||||||
CFrameBufferObject m_fbo;
|
CFrameBufferObject m_fbo;
|
||||||
|
|
||||||
@@ -270,6 +285,9 @@ protected:
|
@@ -270,6 +285,10 @@ protected:
|
||||||
#ifdef HAVE_LIBVA
|
#ifdef HAVE_LIBVA
|
||||||
VAAPI::CHolder& vaapi;
|
VAAPI::CHolder& vaapi;
|
||||||
#endif
|
#endif
|
||||||
+#ifdef HAVE_LIBXVBA
|
+#ifdef HAVE_LIBXVBA
|
||||||
+ XVBA::CDecoder* xvba;
|
+ XVBA::CDecoder* xvba;
|
||||||
|
+ XVBA::CDecoder* xvba_tmp;
|
||||||
+#endif
|
+#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1999,10 +2017,10 @@ index 1dce256..8b7d5fb 100644
|
|||||||
|
|
||||||
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp
|
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..8f0106a
|
index 0000000..d6317e0
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp
|
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp
|
||||||
@@ -0,0 +1,1380 @@
|
@@ -0,0 +1,1401 @@
|
||||||
+/*
|
+/*
|
||||||
+ * Copyright (C) 2005-2011 Team XBMC
|
+ * Copyright (C) 2005-2011 Team XBMC
|
||||||
+ * http://www.xbmc.org
|
+ * http://www.xbmc.org
|
||||||
@ -2264,6 +2282,8 @@ index 0000000..8f0106a
|
|||||||
+//-----------------------------------------------------------------------------
|
+//-----------------------------------------------------------------------------
|
||||||
+//-----------------------------------------------------------------------------
|
+//-----------------------------------------------------------------------------
|
||||||
+
|
+
|
||||||
|
+static unsigned int decoderId = 0;
|
||||||
|
+
|
||||||
+CDecoder::CDecoder()
|
+CDecoder::CDecoder()
|
||||||
+{
|
+{
|
||||||
+ m_context = 0;
|
+ m_context = 0;
|
||||||
@ -2317,7 +2337,9 @@ index 0000000..8f0106a
|
|||||||
+ return false;
|
+ return false;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ CLog::Log(LOGNOTICE,"(XVBA::Open) opening dxva decoder");
|
+ m_decoderId = decoderId++;
|
||||||
|
+
|
||||||
|
+ CLog::Log(LOGNOTICE,"(XVBA::Open) opening xvba decoder, id: %d", m_decoderId);
|
||||||
+
|
+
|
||||||
+ if(avctx->coded_width == 0
|
+ if(avctx->coded_width == 0
|
||||||
+ || avctx->coded_height == 0)
|
+ || avctx->coded_height == 0)
|
||||||
@ -2486,11 +2508,13 @@ index 0000000..8f0106a
|
|||||||
+
|
+
|
||||||
+void CDecoder::Close()
|
+void CDecoder::Close()
|
||||||
+{
|
+{
|
||||||
+ CLog::Log(LOGNOTICE, "XVBA::Close - closing decoder");
|
+ CLog::Log(LOGNOTICE, "XVBA::Close - closing decoder, id: %d", m_decoderId);
|
||||||
+
|
+
|
||||||
+ if (!m_context)
|
+ if (!m_context)
|
||||||
+ return;
|
+ return;
|
||||||
+
|
+
|
||||||
|
+ FinishGL();
|
||||||
|
+
|
||||||
+ DestroySession();
|
+ DestroySession();
|
||||||
+ if (m_context)
|
+ if (m_context)
|
||||||
+ m_context->Release();
|
+ m_context->Release();
|
||||||
@ -2590,6 +2614,14 @@ index 0000000..8f0106a
|
|||||||
+ if (Success != g_XVBA_vtable.CreateDecode(&sessionInput, &sessionOutput))
|
+ if (Success != g_XVBA_vtable.CreateDecode(&sessionInput, &sessionOutput))
|
||||||
+ {
|
+ {
|
||||||
+ SetError(__FUNCTION__, "failed to create decoder session", __LINE__);
|
+ SetError(__FUNCTION__, "failed to create decoder session", __LINE__);
|
||||||
|
+ CLog::Log(LOGERROR, "Decoder failed with following stats: m_surfaceWidth %u, m_surfaceHeight %u,"
|
||||||
|
+ " m_vidWidth %u, m_vidHeight %u, coded_width %d, coded_height %d",
|
||||||
|
+ m_surfaceWidth,
|
||||||
|
+ m_surfaceHeight,
|
||||||
|
+ m_vidWidth,
|
||||||
|
+ m_vidHeight,
|
||||||
|
+ avctx->coded_width,
|
||||||
|
+ avctx->coded_height);
|
||||||
+ return false;
|
+ return false;
|
||||||
+ }
|
+ }
|
||||||
+ m_xvbaSession = sessionOutput.session;
|
+ m_xvbaSession = sessionOutput.session;
|
||||||
@ -3254,7 +3286,9 @@ index 0000000..8f0106a
|
|||||||
+ return -1;
|
+ return -1;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ if (!m_flipBuffer[index].outPic)
|
+ if (!m_flipBuffer[index].outPic ||
|
||||||
|
+ !m_flipBuffer[index].outPic->render ||
|
||||||
|
+ !m_flipBuffer[index].outPic->render->surface)
|
||||||
+ return -1;
|
+ return -1;
|
||||||
+
|
+
|
||||||
+ int i = field;
|
+ int i = field;
|
||||||
@ -3348,11 +3382,14 @@ index 0000000..8f0106a
|
|||||||
+{
|
+{
|
||||||
+ CLog::Log(LOGNOTICE, "XVBA::FinishGL - clearing down gl resources");
|
+ CLog::Log(LOGNOTICE, "XVBA::FinishGL - clearing down gl resources");
|
||||||
+
|
+
|
||||||
+ CSharedLock lock(m_decoderSection);
|
+ CExclusiveLock lock(m_decoderSection);
|
||||||
|
+ // if decoder was created with non supported codec, we would not have a flipBuffer and segfault
|
||||||
|
+ if(!m_flipBuffer)
|
||||||
|
+ return;
|
||||||
+
|
+
|
||||||
+ for (unsigned int i=0; i<m_numRenderBuffers;++i)
|
+ for (unsigned int i=0; i<m_numRenderBuffers;++i)
|
||||||
+ {
|
+ {
|
||||||
+ if (m_flipBuffer[i].outPic && !m_flipBuffer[i].isDuplicate)
|
+ if (m_flipBuffer[i].outPic && !m_flipBuffer[i].isDuplicate && m_flipBuffer[i].outPic->render)
|
||||||
+ {
|
+ {
|
||||||
+ { CSingleLock lock(m_videoSurfaceSec);
|
+ { CSingleLock lock(m_videoSurfaceSec);
|
||||||
+ m_flipBuffer[i].outPic->render->state &= ~FF_XVBA_STATE_USED_FOR_RENDER;
|
+ m_flipBuffer[i].outPic->render->state &= ~FF_XVBA_STATE_USED_FOR_RENDER;
|
||||||
@ -3364,7 +3401,7 @@ index 0000000..8f0106a
|
|||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ for (int j=0; j<3; ++j)
|
+ for (unsigned int j=0; j<3; ++j)
|
||||||
+ {
|
+ {
|
||||||
+ if (glIsTexture(m_flipBuffer[i].glTexture[j]))
|
+ if (glIsTexture(m_flipBuffer[i].glTexture[j]))
|
||||||
+ {
|
+ {
|
||||||
@ -3374,7 +3411,9 @@ index 0000000..8f0106a
|
|||||||
+ }
|
+ }
|
||||||
+ if (m_flipBuffer[i].glSurface[j] && m_xvbaSession)
|
+ if (m_flipBuffer[i].glSurface[j] && m_xvbaSession)
|
||||||
+ {
|
+ {
|
||||||
+ g_XVBA_vtable.DestroySurface(m_flipBuffer[i].glSurface[j]);
|
+ { CSingleLock lock(m_apiSec);
|
||||||
|
+ g_XVBA_vtable.DestroySurface(m_flipBuffer[i].glSurface[j]);
|
||||||
|
+ }
|
||||||
+ m_flipBuffer[i].glSurface[j] = 0;
|
+ m_flipBuffer[i].glSurface[j] = 0;
|
||||||
+ CLog::Log(LOGDEBUG, "XVBA::FinishGL - destroyed shared surface");
|
+ CLog::Log(LOGDEBUG, "XVBA::FinishGL - destroyed shared surface");
|
||||||
+ }
|
+ }
|
||||||
@ -3385,10 +3424,10 @@ index 0000000..8f0106a
|
|||||||
+#endif
|
+#endif
|
||||||
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h
|
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..fdf605b
|
index 0000000..5ca39ab
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h
|
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h
|
||||||
@@ -0,0 +1,160 @@
|
@@ -0,0 +1,161 @@
|
||||||
+/*
|
+/*
|
||||||
+ * Copyright (C) 2005-2011 Team XBMC
|
+ * Copyright (C) 2005-2011 Team XBMC
|
||||||
+ * http://www.xbmc.org
|
+ * http://www.xbmc.org
|
||||||
@ -3514,6 +3553,7 @@ index 0000000..fdf605b
|
|||||||
+
|
+
|
||||||
+ XVBADecodeCap m_decoderCap;
|
+ XVBADecodeCap m_decoderCap;
|
||||||
+ void *m_xvbaSession;
|
+ void *m_xvbaSession;
|
||||||
|
+ unsigned int m_decoderId;
|
||||||
+ struct XVBABufferPool
|
+ struct XVBABufferPool
|
||||||
+ {
|
+ {
|
||||||
+ XVBABufferDescriptor *picture_descriptor_buffer;
|
+ XVBABufferDescriptor *picture_descriptor_buffer;
|
||||||
@ -5241,10 +5281,10 @@ index 09aeb14..aad726c 100644
|
|||||||
m_bSucceeded=false;
|
m_bSucceeded=false;
|
||||||
m_bCanceled=false;
|
m_bCanceled=false;
|
||||||
diff --git a/xbmc/network/AirPlayServer.cpp b/xbmc/network/AirPlayServer.cpp
|
diff --git a/xbmc/network/AirPlayServer.cpp b/xbmc/network/AirPlayServer.cpp
|
||||||
index d4c58e4..3ac73f9 100644
|
index 5a14773..dda7f0b 100644
|
||||||
--- a/xbmc/network/AirPlayServer.cpp
|
--- a/xbmc/network/AirPlayServer.cpp
|
||||||
+++ b/xbmc/network/AirPlayServer.cpp
|
+++ b/xbmc/network/AirPlayServer.cpp
|
||||||
@@ -168,7 +168,7 @@ void CAirPlayServer::StopServer(bool bWait)
|
@@ -182,7 +182,7 @@ void CAirPlayServer::StopServer(bool bWait)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5254,10 +5294,10 @@ index d4c58e4..3ac73f9 100644
|
|||||||
m_port = port;
|
m_port = port;
|
||||||
m_nonlocal = nonlocal;
|
m_nonlocal = nonlocal;
|
||||||
diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp
|
diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp
|
||||||
index 16f6e41..4799a24 100644
|
index 8779c7c..24ffa6f 100644
|
||||||
--- a/xbmc/network/AirTunesServer.cpp
|
--- a/xbmc/network/AirTunesServer.cpp
|
||||||
+++ b/xbmc/network/AirTunesServer.cpp
|
+++ b/xbmc/network/AirTunesServer.cpp
|
||||||
@@ -279,7 +279,7 @@ void CAirTunesServer::StopServer(bool bWait)
|
@@ -295,7 +295,7 @@ void CAirTunesServer::StopServer(bool bWait)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5392,7 +5432,7 @@ index e228621..b31dec0 100644
|
|||||||
AddBool(g_sysinfo.IsVistaOrHigher() ? vp: NULL, "videoplayer.usedxva2", 13427, g_sysinfo.IsVistaOrHigher() ? true : false);
|
AddBool(g_sysinfo.IsVistaOrHigher() ? vp: NULL, "videoplayer.usedxva2", 13427, g_sysinfo.IsVistaOrHigher() ? true : false);
|
||||||
#endif
|
#endif
|
||||||
diff --git a/xbmc/settings/GUIWindowSettingsCategory.cpp b/xbmc/settings/GUIWindowSettingsCategory.cpp
|
diff --git a/xbmc/settings/GUIWindowSettingsCategory.cpp b/xbmc/settings/GUIWindowSettingsCategory.cpp
|
||||||
index cdece6c..899ab93 100644
|
index eb04966..408152a 100644
|
||||||
--- a/xbmc/settings/GUIWindowSettingsCategory.cpp
|
--- a/xbmc/settings/GUIWindowSettingsCategory.cpp
|
||||||
+++ b/xbmc/settings/GUIWindowSettingsCategory.cpp
|
+++ b/xbmc/settings/GUIWindowSettingsCategory.cpp
|
||||||
@@ -936,6 +936,15 @@ void CGUIWindowSettingsCategory::UpdateSettings()
|
@@ -936,6 +936,15 @@ void CGUIWindowSettingsCategory::UpdateSettings()
|
||||||
@ -7037,7 +7077,7 @@ index 4534aa1..c245679 100644
|
|||||||
m_bRunning = false;
|
m_bRunning = false;
|
||||||
m_pObserver = NULL;
|
m_pObserver = NULL;
|
||||||
diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp
|
diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp
|
||||||
index 076dc3a..3bd58ef 100644
|
index 83fabfe..a2e6efc 100644
|
||||||
--- a/xbmc/video/VideoReferenceClock.cpp
|
--- a/xbmc/video/VideoReferenceClock.cpp
|
||||||
+++ b/xbmc/video/VideoReferenceClock.cpp
|
+++ b/xbmc/video/VideoReferenceClock.cpp
|
||||||
@@ -30,6 +30,9 @@
|
@@ -30,6 +30,9 @@
|
||||||
@ -7112,7 +7152,7 @@ index 076dc3a..3bd58ef 100644
|
|||||||
{
|
{
|
||||||
m_SystemFrequency = CurrentHostFrequency();
|
m_SystemFrequency = CurrentHostFrequency();
|
||||||
m_ClockSpeed = 1.0;
|
m_ClockSpeed = 1.0;
|
||||||
@@ -159,6 +208,8 @@ void CVideoReferenceClock::Process()
|
@@ -160,6 +209,8 @@ void CVideoReferenceClock::Process()
|
||||||
m_RefreshChanged = 0;
|
m_RefreshChanged = 0;
|
||||||
m_Started.Set();
|
m_Started.Set();
|
||||||
|
|
||||||
@ -7121,7 +7161,7 @@ index 076dc3a..3bd58ef 100644
|
|||||||
if (SetupSuccess)
|
if (SetupSuccess)
|
||||||
{
|
{
|
||||||
m_UseVblank = true; //tell other threads we're using vblank as clock
|
m_UseVblank = true; //tell other threads we're using vblank as clock
|
||||||
@@ -266,6 +317,14 @@ bool CVideoReferenceClock::SetupGLX()
|
@@ -267,6 +318,14 @@ bool CVideoReferenceClock::SetupGLX()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7136,7 +7176,7 @@ index 076dc3a..3bd58ef 100644
|
|||||||
m_vInfo = glXChooseVisual(m_Dpy, DefaultScreen(m_Dpy), singleBufferAttributes);
|
m_vInfo = glXChooseVisual(m_Dpy, DefaultScreen(m_Dpy), singleBufferAttributes);
|
||||||
if (!m_vInfo)
|
if (!m_vInfo)
|
||||||
{
|
{
|
||||||
@@ -273,13 +332,16 @@ bool CVideoReferenceClock::SetupGLX()
|
@@ -274,13 +333,16 @@ bool CVideoReferenceClock::SetupGLX()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7158,7 +7198,7 @@ index 076dc3a..3bd58ef 100644
|
|||||||
|
|
||||||
m_Context = glXCreateContext(m_Dpy, m_vInfo, NULL, True);
|
m_Context = glXCreateContext(m_Dpy, m_vInfo, NULL, True);
|
||||||
if (!m_Context)
|
if (!m_Context)
|
||||||
@@ -288,25 +350,32 @@ bool CVideoReferenceClock::SetupGLX()
|
@@ -289,25 +351,32 @@ bool CVideoReferenceClock::SetupGLX()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7202,7 +7242,7 @@ index 076dc3a..3bd58ef 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_glXGetVideoSyncSGI = (int (*)(unsigned int*))glXGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI");
|
m_glXGetVideoSyncSGI = (int (*)(unsigned int*))glXGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI");
|
||||||
@@ -323,16 +392,7 @@ bool CVideoReferenceClock::SetupGLX()
|
@@ -324,16 +393,7 @@ bool CVideoReferenceClock::SetupGLX()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7220,84 +7260,7 @@ index 076dc3a..3bd58ef 100644
|
|||||||
|
|
||||||
UpdateRefreshrate(true); //forced refreshrate update
|
UpdateRefreshrate(true); //forced refreshrate update
|
||||||
m_MissedVblanks = 0;
|
m_MissedVblanks = 0;
|
||||||
@@ -340,95 +400,11 @@ bool CVideoReferenceClock::SetupGLX()
|
@@ -479,18 +539,7 @@ void CVideoReferenceClock::CleanupGLX()
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
-bool CVideoReferenceClock::ParseNvSettings(int& RefreshRate)
|
|
||||||
-{
|
|
||||||
- double fRefreshRate;
|
|
||||||
- char Buff[255];
|
|
||||||
- int ReturnV;
|
|
||||||
- struct lconv *Locale = localeconv();
|
|
||||||
- FILE* NvSettings;
|
|
||||||
-
|
|
||||||
- const char* VendorPtr = (const char*)glGetString(GL_VENDOR);
|
|
||||||
- if (!VendorPtr)
|
|
||||||
- {
|
|
||||||
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: glGetString(GL_VENDOR) returned NULL, not using nvidia-settings");
|
|
||||||
- return false;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- CStdString Vendor = VendorPtr;
|
|
||||||
- Vendor.ToLower();
|
|
||||||
- if (Vendor.find("nvidia") == std::string::npos)
|
|
||||||
- {
|
|
||||||
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: GL_VENDOR:%s, not using nvidia-settings", Vendor.c_str());
|
|
||||||
- return false;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- NvSettings = popen(NVSETTINGSCMD, "r");
|
|
||||||
- if (!NvSettings)
|
|
||||||
- {
|
|
||||||
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: %s: %s", NVSETTINGSCMD, strerror(errno));
|
|
||||||
- return false;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- ReturnV = fscanf(NvSettings, "%254[^\n]", Buff);
|
|
||||||
- pclose(NvSettings);
|
|
||||||
- if (ReturnV != 1)
|
|
||||||
- {
|
|
||||||
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: %s produced no output", NVSETTINGSCMD);
|
|
||||||
- return false;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: output of %s: %s", NVSETTINGSCMD, Buff);
|
|
||||||
-
|
|
||||||
- for (int i = 0; i < 255 && Buff[i]; i++)
|
|
||||||
- {
|
|
||||||
- //workaround for locale mismatch
|
|
||||||
- if (Buff[i] == '.' || Buff[i] == ',')
|
|
||||||
- Buff[i] = *Locale->decimal_point;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- ReturnV = sscanf(Buff, "%lf", &fRefreshRate);
|
|
||||||
- if (ReturnV != 1 || fRefreshRate <= 0.0)
|
|
||||||
- {
|
|
||||||
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: can't make sense of that");
|
|
||||||
- return false;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- RefreshRate = MathUtils::round_int(fRefreshRate);
|
|
||||||
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: Detected refreshrate by nvidia-settings: %f hertz, rounding to %i hertz",
|
|
||||||
- fRefreshRate, RefreshRate);
|
|
||||||
-
|
|
||||||
- return true;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-int CVideoReferenceClock::GetRandRRate()
|
|
||||||
-{
|
|
||||||
- int RefreshRate;
|
|
||||||
- XRRScreenConfiguration *CurrInfo;
|
|
||||||
-
|
|
||||||
- CurrInfo = XRRGetScreenInfo(m_Dpy, RootWindow(m_Dpy, m_vInfo->screen));
|
|
||||||
- RefreshRate = XRRConfigCurrentRate(CurrInfo);
|
|
||||||
- XRRFreeScreenConfigInfo(CurrInfo);
|
|
||||||
-
|
|
||||||
- return RefreshRate;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
void CVideoReferenceClock::CleanupGLX()
|
|
||||||
{
|
{
|
||||||
CLog::Log(LOGDEBUG, "CVideoReferenceClock: Cleaning up GLX");
|
CLog::Log(LOGDEBUG, "CVideoReferenceClock: Cleaning up GLX");
|
||||||
|
|
||||||
@ -7317,16 +7280,17 @@ index 076dc3a..3bd58ef 100644
|
|||||||
|
|
||||||
if (m_vInfo)
|
if (m_vInfo)
|
||||||
{
|
{
|
||||||
@@ -448,7 +424,7 @@ void CVideoReferenceClock::CleanupGLX()
|
@@ -509,8 +558,7 @@ void CVideoReferenceClock::CleanupGLX()
|
||||||
|
m_Window = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//ati saves the Display* in their libGL, if we close it here, we crash
|
- //ati saves the Display* in their libGL, if we close it here, we crash
|
||||||
- if (m_Dpy && !AtiWorkaround)
|
- if (m_Dpy && !AtiWorkaround)
|
||||||
+ if (m_Dpy)
|
+ if (m_Dpy)
|
||||||
{
|
{
|
||||||
XCloseDisplay(m_Dpy);
|
XCloseDisplay(m_Dpy);
|
||||||
m_Dpy = NULL;
|
m_Dpy = NULL;
|
||||||
@@ -470,10 +446,55 @@ void CVideoReferenceClock::RunGLX()
|
@@ -532,10 +580,55 @@ void CVideoReferenceClock::RunGLX()
|
||||||
m_glXGetVideoSyncSGI(&VblankCount);
|
m_glXGetVideoSyncSGI(&VblankCount);
|
||||||
PrevVblankCount = VblankCount;
|
PrevVblankCount = VblankCount;
|
||||||
|
|
||||||
@ -7366,15 +7330,15 @@ index 076dc3a..3bd58ef 100644
|
|||||||
+ proximity++;
|
+ proximity++;
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
|
+ // we might have waited too long, reduce sleep time
|
||||||
+ else if (precision > 1)
|
+ else if (precision > 1)
|
||||||
+ precision--;
|
+ precision--;
|
||||||
+
|
+
|
||||||
|
+ // lets try to increase precision in order to reduce number
|
||||||
|
+ // of required steps
|
||||||
+ if (proximity > 4 && precision < 6)
|
+ if (proximity > 4 && precision < 6)
|
||||||
+ precision++;
|
+ precision++;
|
||||||
+
|
+
|
||||||
+// CLog::Log(LOGNOTICE, "----- diff: %ld, precision: %d, prox: %d, sleep: %d, correction: %d",
|
|
||||||
+// CurrentHostCounter()- lastVblankTime, precision, proximity, sleepTime, correction);
|
|
||||||
+
|
|
||||||
+ lastVblankTime = CurrentHostCounter();
|
+ lastVblankTime = CurrentHostCounter();
|
||||||
+
|
+
|
||||||
+ ReturnV = 0;
|
+ ReturnV = 0;
|
||||||
@ -7383,7 +7347,7 @@ index 076dc3a..3bd58ef 100644
|
|||||||
m_glXGetVideoSyncSGI(&VblankCount); //the vblank count returned by glXWaitVideoSyncSGI is not always correct
|
m_glXGetVideoSyncSGI(&VblankCount); //the vblank count returned by glXWaitVideoSyncSGI is not always correct
|
||||||
Now = CurrentHostCounter(); //get the timestamp of this vblank
|
Now = CurrentHostCounter(); //get the timestamp of this vblank
|
||||||
|
|
||||||
@@ -483,6 +504,9 @@ void CVideoReferenceClock::RunGLX()
|
@@ -545,6 +638,9 @@ void CVideoReferenceClock::RunGLX()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7393,7 +7357,7 @@ index 076dc3a..3bd58ef 100644
|
|||||||
if (VblankCount > PrevVblankCount)
|
if (VblankCount > PrevVblankCount)
|
||||||
{
|
{
|
||||||
//update the vblank timestamp, update the clock and send a signal that we got a vblank
|
//update the vblank timestamp, update the clock and send a signal that we got a vblank
|
||||||
@@ -491,14 +515,14 @@ void CVideoReferenceClock::RunGLX()
|
@@ -553,14 +649,14 @@ void CVideoReferenceClock::RunGLX()
|
||||||
UpdateClock((int)(VblankCount - PrevVblankCount), true);
|
UpdateClock((int)(VblankCount - PrevVblankCount), true);
|
||||||
SingleLock.Leave();
|
SingleLock.Leave();
|
||||||
SendVblankSignal();
|
SendVblankSignal();
|
||||||
@ -7410,7 +7374,7 @@ index 076dc3a..3bd58ef 100644
|
|||||||
//only try reattaching once
|
//only try reattaching once
|
||||||
if (IsReset)
|
if (IsReset)
|
||||||
return;
|
return;
|
||||||
@@ -1020,44 +1044,17 @@ bool CVideoReferenceClock::UpdateRefreshrate(bool Forced /*= false*/)
|
@@ -1082,23 +1178,13 @@ bool CVideoReferenceClock::UpdateRefreshrate(bool Forced /*= false*/)
|
||||||
|
|
||||||
#if defined(HAS_GLX) && defined(HAS_XRANDR)
|
#if defined(HAS_GLX) && defined(HAS_XRANDR)
|
||||||
|
|
||||||
@ -7436,23 +7400,10 @@ index 076dc3a..3bd58ef 100644
|
|||||||
+ if (!bUpdate) //refreshrate did not change
|
+ if (!bUpdate) //refreshrate did not change
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
- //the refreshrate can be wrong on nvidia drivers, so read it from nvidia-settings when it's available
|
//the refreshrate can be wrong on nvidia drivers, so read it from nvidia-settings when it's available
|
||||||
- if (m_UseNvSettings || Forced)
|
@@ -1119,7 +1205,7 @@ bool CVideoReferenceClock::UpdateRefreshrate(bool Forced /*= false*/)
|
||||||
- {
|
}
|
||||||
- int NvRefreshRate;
|
|
||||||
- //if this fails we can't get the refreshrate from nvidia-settings
|
|
||||||
- m_UseNvSettings = ParseNvSettings(NvRefreshRate);
|
|
||||||
-
|
|
||||||
- if (m_UseNvSettings)
|
|
||||||
- {
|
|
||||||
- CSingleLock SingleLock(m_CritSection);
|
|
||||||
- m_RefreshRate = NvRefreshRate;
|
|
||||||
- return true;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: Using RandR for refreshrate detection");
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
CSingleLock SingleLock(m_CritSection);
|
CSingleLock SingleLock(m_CritSection);
|
||||||
- m_RefreshRate = GetRandRRate();
|
- m_RefreshRate = GetRandRRate();
|
||||||
+ m_RefreshRate = MathUtils::round_int(g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()].fRefreshRate);
|
+ m_RefreshRate = MathUtils::round_int(g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()].fRefreshRate);
|
Loading…
x
Reference in New Issue
Block a user