Fix Discord streaming for OpenGL
Check if the OpenGL context is valid on every operation, and if not re-initialize it. Also rebind the textures every time the frame is drawn. Also rename the SetCurrent method to SetContext, which is clearer. Fix #643 Fix #767 Fix #840 Fix #843 Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This commit is contained in:
parent
24b92462f9
commit
7561ca97c1
|
@ -38,10 +38,11 @@ protected:
|
||||||
void DrawArea(wxWindowDC& dc);
|
void DrawArea(wxWindowDC& dc);
|
||||||
void OnSize(wxSizeEvent& ev);
|
void OnSize(wxSizeEvent& ev);
|
||||||
void AdjustViewport();
|
void AdjustViewport();
|
||||||
|
void RefreshGL();
|
||||||
#ifndef wxGL_IMPLICIT_CONTEXT
|
#ifndef wxGL_IMPLICIT_CONTEXT
|
||||||
wxGLContext* ctx;
|
wxGLContext* ctx = nullptr;
|
||||||
#endif
|
#endif
|
||||||
bool SetCurrent();
|
bool SetContext();
|
||||||
void DrawingPanelInit();
|
void DrawingPanelInit();
|
||||||
GLuint texid, vlist;
|
GLuint texid, vlist;
|
||||||
int texsize;
|
int texsize;
|
||||||
|
|
|
@ -2183,9 +2183,26 @@ static int glopts[] = {
|
||||||
WX_GL_RGBA, WX_GL_DOUBLEBUFFER, 0
|
WX_GL_RGBA, WX_GL_DOUBLEBUFFER, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
bool GLDrawingPanel::SetCurrent()
|
bool GLDrawingPanel::SetContext()
|
||||||
{
|
{
|
||||||
#ifndef wxGL_IMPLICIT_CONTEXT
|
#ifndef wxGL_IMPLICIT_CONTEXT
|
||||||
|
// Check if the current context is valid
|
||||||
|
if (!ctx
|
||||||
|
#if wxCHECK_VERSION(3, 1, 0)
|
||||||
|
|| !ctx->IsOK()
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Delete the old context
|
||||||
|
if (ctx) {
|
||||||
|
delete ctx;
|
||||||
|
ctx = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new context
|
||||||
|
ctx = new wxGLContext(this);
|
||||||
|
DrawingPanelInit();
|
||||||
|
}
|
||||||
return wxGLCanvas::SetCurrent(*ctx);
|
return wxGLCanvas::SetCurrent(*ctx);
|
||||||
#else
|
#else
|
||||||
return wxGLContext::SetCurrent(*this);
|
return wxGLContext::SetCurrent(*this);
|
||||||
|
@ -2198,11 +2215,7 @@ GLDrawingPanel::GLDrawingPanel(wxWindow* parent, int _width, int _height)
|
||||||
wxFULL_REPAINT_ON_RESIZE | wxWANTS_CHARS)
|
wxFULL_REPAINT_ON_RESIZE | wxWANTS_CHARS)
|
||||||
{
|
{
|
||||||
widgets::RequestHighResolutionOpenGlSurfaceForWindow(this);
|
widgets::RequestHighResolutionOpenGlSurfaceForWindow(this);
|
||||||
#ifndef wxGL_IMPLICIT_CONTEXT
|
SetContext();
|
||||||
ctx = new wxGLContext(this);
|
|
||||||
#endif
|
|
||||||
SetCurrent();
|
|
||||||
if (!did_init) DrawingPanelInit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLDrawingPanel::~GLDrawingPanel()
|
GLDrawingPanel::~GLDrawingPanel()
|
||||||
|
@ -2211,7 +2224,7 @@ GLDrawingPanel::~GLDrawingPanel()
|
||||||
// it's also unsafe if panel no longer displayed
|
// it's also unsafe if panel no longer displayed
|
||||||
if (did_init)
|
if (did_init)
|
||||||
{
|
{
|
||||||
SetCurrent();
|
SetContext();
|
||||||
glDeleteLists(vlist, 1);
|
glDeleteLists(vlist, 1);
|
||||||
glDeleteTextures(1, &texid);
|
glDeleteTextures(1, &texid);
|
||||||
}
|
}
|
||||||
|
@ -2223,7 +2236,7 @@ GLDrawingPanel::~GLDrawingPanel()
|
||||||
|
|
||||||
void GLDrawingPanel::DrawingPanelInit()
|
void GLDrawingPanel::DrawingPanelInit()
|
||||||
{
|
{
|
||||||
SetCurrent();
|
SetContext();
|
||||||
|
|
||||||
DrawingPanelBase::DrawingPanelInit();
|
DrawingPanelBase::DrawingPanelInit();
|
||||||
|
|
||||||
|
@ -2361,7 +2374,6 @@ void GLDrawingPanel::DrawingPanelInit()
|
||||||
|
|
||||||
void GLDrawingPanel::OnSize(wxSizeEvent& ev)
|
void GLDrawingPanel::OnSize(wxSizeEvent& ev)
|
||||||
{
|
{
|
||||||
SetCurrent();
|
|
||||||
AdjustViewport();
|
AdjustViewport();
|
||||||
|
|
||||||
// Temporary hack to backport 800d6ed69b from wxWidgets until 3.2.2 is released.
|
// Temporary hack to backport 800d6ed69b from wxWidgets until 3.2.2 is released.
|
||||||
|
@ -2373,7 +2385,7 @@ void GLDrawingPanel::OnSize(wxSizeEvent& ev)
|
||||||
|
|
||||||
void GLDrawingPanel::AdjustViewport()
|
void GLDrawingPanel::AdjustViewport()
|
||||||
{
|
{
|
||||||
SetCurrent();
|
SetContext();
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
widgets::GetRealPixelClientSize(this, &x, &y);
|
widgets::GetRealPixelClientSize(this, &x, &y);
|
||||||
|
@ -2387,10 +2399,20 @@ void GLDrawingPanel::AdjustViewport()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLDrawingPanel::RefreshGL()
|
||||||
|
{
|
||||||
|
SetContext();
|
||||||
|
|
||||||
|
// Rebind any textures or other OpenGL resources here
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texid);
|
||||||
|
}
|
||||||
|
|
||||||
void GLDrawingPanel::DrawArea(wxWindowDC& dc)
|
void GLDrawingPanel::DrawArea(wxWindowDC& dc)
|
||||||
{
|
{
|
||||||
(void)dc; // unused params
|
(void)dc; // unused params
|
||||||
SetCurrent();
|
SetContext();
|
||||||
|
RefreshGL();
|
||||||
|
|
||||||
if (!did_init)
|
if (!did_init)
|
||||||
DrawingPanelInit();
|
DrawingPanelInit();
|
||||||
|
|
Loading…
Reference in New Issue