reenable openglosd doublebuffer

This commit is contained in:
jojo61 2018-09-28 08:55:44 +02:00
parent 4112cc8229
commit 4a28f3f99b
2 changed files with 28 additions and 43 deletions

View File

@ -512,17 +512,15 @@ cOglOutputFb::~cOglOutputFb(void) {
} }
bool cOglOutputFb::Init(void) { bool cOglOutputFb::Init(void) {
#if 0
//fetching osd vdpau output surface from softhddevice
// void *vdpauOutputSurface = GetVDPAUOutputSurface();
glGenTextures(1, &texture); glGenTextures(1, &texture);
//register surface for texture
// surface = glVDPAURegisterOutputSurfaceNV(vdpauOutputSurface, GL_TEXTURE_2D, 1, &texture);
//set write access to surface
// glVDPAUSurfaceAccessNV(surface, GL_WRITE_DISCARD_NV);
//create framebuffer
// glVDPAUMapSurfacesNV (1, &surface);
glBindTexture(GL_TEXTURE_2D, texture); glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glGenFramebuffers(1, &fb); glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb); glBindFramebuffer(GL_FRAMEBUFFER, fb);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
@ -530,18 +528,18 @@ bool cOglOutputFb::Init(void) {
esyslog("[softhddev]ERROR::cOglOutputFb: Framebuffer is not complete!"); esyslog("[softhddev]ERROR::cOglOutputFb: Framebuffer is not complete!");
return false; return false;
} }
#endif
return true; return true;
} }
void cOglOutputFb::BindWrite(void) { void cOglOutputFb::BindWrite(void) {
// glVDPAUMapSurfacesNV(1, &surface); // glVDPAUMapSurfacesNV(1, &surface);
// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
} }
void cOglOutputFb::Unbind(void) { void cOglOutputFb::Unbind(void) {
// glVDPAUUnmapSurfacesNV(1, &surface); // glVDPAUUnmapSurfacesNV(1, &surface);
// glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
} }
/**************************************************************************************** /****************************************************************************************
@ -671,7 +669,7 @@ void cOglVb::DrawArrays(int count) {
glFlush(); glFlush();
} }
#if 0
/**************************************************************************************** /****************************************************************************************
* cOpenGLCmd * cOpenGLCmd
****************************************************************************************/ ****************************************************************************************/
@ -685,7 +683,7 @@ bool cOglCmdInitOutputFb::Execute(void) {
oFb->Unbind(); oFb->Unbind();
return ok; return ok;
} }
#endif
//------------------ cOglCmdInitFb -------------------- //------------------ cOglCmdInitFb --------------------
cOglCmdInitFb::cOglCmdInitFb(cOglFb *fb, cCondWait *wait) : cOglCmd(fb) { cOglCmdInitFb::cOglCmdInitFb(cOglFb *fb, cCondWait *wait) : cOglCmd(fb) {
this->wait = wait; this->wait = wait;
@ -761,7 +759,7 @@ bool cOglCmdRenderFbToBufferFb::Execute(void) {
return true; return true;
} }
#if 0
//------------------ cOglCmdCopyBufferToOutputFb -------------------- //------------------ cOglCmdCopyBufferToOutputFb --------------------
cOglCmdCopyBufferToOutputFb::cOglCmdCopyBufferToOutputFb(cOglFb *fb, cOglOutputFb *oFb, GLint x, GLint y) : cOglCmd(fb) { cOglCmdCopyBufferToOutputFb::cOglCmdCopyBufferToOutputFb(cOglFb *fb, cOglOutputFb *oFb, GLint x, GLint y) : cOglCmd(fb) {
this->oFb = oFb; this->oFb = oFb;
@ -770,16 +768,19 @@ cOglCmdCopyBufferToOutputFb::cOglCmdCopyBufferToOutputFb(cOglFb *fb, cOglOutputF
} }
bool cOglCmdCopyBufferToOutputFb::Execute(void) { bool cOglCmdCopyBufferToOutputFb::Execute(void) {
pthread_mutex_lock(&OSDMutex);
fb->BindRead(); fb->BindRead();
oFb->BindWrite(); oFb->BindWrite();
glClear(GL_COLOR_BUFFER_BIT);
fb->Blit(x, y + fb->Height(), x + fb->Width(), y); fb->Blit(x, y + fb->Height(), x + fb->Width(), y);
oFb->Unbind(); oFb->Unbind();
pthread_mutex_unlock(&OSDMutex);
// ActivateOsd(oFb->texture,oFb->fb,glXGetCurrentContext()); ActivateOsd(oFb->texture,x, y ,fb->Width(), fb->Height());
return true; return true;
} }
#endif
//------------------ cOglCmdFill -------------------- //------------------ cOglCmdFill --------------------
cOglCmdFill::cOglCmdFill(cOglFb *fb, GLint color) : cOglCmd(fb) { cOglCmdFill::cOglCmdFill(cOglFb *fb, GLint color) : cOglCmd(fb) {
this->color = color; this->color = color;
@ -1899,13 +1900,13 @@ cOglOsd::cOglOsd(int Left, int Top, uint Level, std::shared_ptr<cOglThread> oglT
VideoGetOsdSize(&osdWidth, &osdHeight); VideoGetOsdSize(&osdWidth, &osdHeight);
dsyslog("[softhddev]cOglOsd osdLeft %d osdTop %d screenWidth %d screenHeight %d", Left, Top, osdWidth, osdHeight); dsyslog("[softhddev]cOglOsd osdLeft %d osdTop %d screenWidth %d screenHeight %d", Left, Top, osdWidth, osdHeight);
#if 0
//create vdpau output framebuffer //create vdpau output framebuffer
if (!oFb) { if (!oFb) {
oFb = new cOglOutputFb(osdWidth, osdHeight); oFb = new cOglOutputFb(osdWidth, osdHeight);
oglThread->DoCmd(new cOglCmdInitOutputFb(oFb)); oglThread->DoCmd(new cOglCmdInitOutputFb(oFb));
} }
#endif
} }
cOglOsd::~cOglOsd() { cOglOsd::~cOglOsd() {
@ -2000,7 +2001,7 @@ void cOglOsd::Flush(void) {
//uint64_t start = cTimeMs::Now(); //uint64_t start = cTimeMs::Now();
//dsyslog("[softhddev]Start Flush at %" PRIu64 "", cTimeMs::Now()); //dsyslog("[softhddev]Start Flush at %" PRIu64 "", cTimeMs::Now());
pthread_mutex_lock(&OSDMutex);
oglThread->DoCmd(new cOglCmdFill(bFb, clrTransparent)); oglThread->DoCmd(new cOglCmdFill(bFb, clrTransparent));
//render pixmap textures blended to buffer //render pixmap textures blended to buffer
@ -2020,9 +2021,7 @@ void cOglOsd::Flush(void) {
} }
} }
} }
ActivateOsd(bFb->texture,Left(), Top() , bFb->Width(), bFb->Height()); oglThread->DoCmd(new cOglCmdCopyBufferToOutputFb(bFb, oFb, Left(), Top()));
pthread_mutex_unlock(&OSDMutex);
// oglThread->DoCmd(new cOglCmdCopyBufferToOutputFb(bFb, oFb, Left(), Top()));
//dsyslog("[softhddev]End Flush at %" PRIu64 ", duration %d", cTimeMs::Now(), (int)(cTimeMs::Now()-start)); //dsyslog("[softhddev]End Flush at %" PRIu64 ", duration %d", cTimeMs::Now(), (int)(cTimeMs::Now()-start));
} }

22
video.c
View File

@ -798,15 +798,14 @@ static void GlxSetupDecoder(int width, int height, GLuint * textures)
/// @param width window width /// @param width window width
/// @param height window height /// @param height window height
/// ///
static inline void GlxRenderTexture(GLuint texture, int x, int y, int width, static inline void GlxRenderTexture(GLuint texture, int x, int y, int width, int height)
int height)
{ {
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture); glBindTexture(GL_TEXTURE_2D, texture);
// glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // no color // glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // no color
#ifndef USE_OPENGLOSD
glBegin(GL_QUADS); { glBegin(GL_QUADS); {
glTexCoord2f(1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f);
glVertex2i(x + width, y + height); glVertex2i(x + width, y + height);
@ -818,19 +817,6 @@ static inline void GlxRenderTexture(GLuint texture, int x, int y, int width,
glVertex2i(x + width, y); glVertex2i(x + width, y);
} }
glEnd(); glEnd();
#else
glBegin(GL_QUADS); {
glTexCoord2f(1.0f, 1.0f);
glVertex2i(x+width , y );
glTexCoord2f(0.0f, 1.0f);
glVertex2i(x, y );
glTexCoord2f(0.0f, 0.0f);
glVertex2i(x, y+height);
glTexCoord2f(1.0f, 0.0f);
glVertex2i(x+width , y+height);
}
glEnd();
#endif
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
@ -3147,8 +3133,8 @@ static void CuvidDisplayFrame(void)
GlxRenderTexture(OsdGlTextures[OsdIndex], 0,0, VideoWindowWidth, VideoWindowHeight); GlxRenderTexture(OsdGlTextures[OsdIndex], 0,0, VideoWindowWidth, VideoWindowHeight);
#else #else
pthread_mutex_lock(&OSDMutex); pthread_mutex_lock(&OSDMutex);
glXMakeCurrent(XlibDisplay, VideoWindow, GlxContext ); glXMakeCurrent(XlibDisplay, VideoWindow, GlxContext );
GlxRenderTexture(OSDtexture, OSDx, OSDy, OSDxsize, OSDysize); GlxRenderTexture(OSDtexture, 0,0, VideoWindowWidth, VideoWindowHeight);
pthread_mutex_unlock(&OSDMutex); pthread_mutex_unlock(&OSDMutex);
#endif #endif
glXMakeCurrent(XlibDisplay, VideoWindow, GlxSharedContext); glXMakeCurrent(XlibDisplay, VideoWindow, GlxSharedContext);