Merge pull request #1593 from reicast/fh/gl3-fallback

x11: fix fallback to gl 3.0. fix crash when switching renderer.
This commit is contained in:
flyinghead 2019-05-11 00:38:44 +02:00 committed by GitHub
commit 95a13d79b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 11 deletions

View File

@ -98,6 +98,7 @@ TA_context* _pvrrc;
void SetREP(TA_context* cntx); void SetREP(TA_context* cntx);
void killtex(); void killtex();
bool render_output_framebuffer(); bool render_output_framebuffer();
static void rend_create_renderer();
void dump_frame(const char* file, TA_context* ctx, u8* vram, u8* vram_ref = NULL) { void dump_frame(const char* file, TA_context* ctx, u8* vram, u8* vram_ref = NULL) {
FILE* fw = fopen(file, "wb"); FILE* fw = fopen(file, "wb");
@ -266,6 +267,13 @@ bool rend_frame(TA_context* ctx, bool draw_osd) {
bool rend_single_frame() bool rend_single_frame()
{ {
if (renderer_changed)
{
renderer_changed = false;
rend_term_renderer();
rend_create_renderer();
rend_init_renderer();
}
//wait render start only if no frame pending //wait render start only if no frame pending
do do
{ {
@ -362,6 +370,7 @@ void rend_init_renderer()
} }
printf("Selected renderer initialization failed. Falling back to default renderer.\n"); printf("Selected renderer initialization failed. Falling back to default renderer.\n");
renderer = fallback_renderer; renderer = fallback_renderer;
fallback_renderer = NULL; // avoid double-free
} }
} }
@ -377,7 +386,6 @@ void rend_term_renderer()
delete fallback_renderer; delete fallback_renderer;
fallback_renderer = NULL; fallback_renderer = NULL;
} }
tactx_Term();
} }
void* rend_thread(void* p) void* rend_thread(void* p)
@ -391,13 +399,6 @@ void* rend_thread(void* p)
{ {
if (rend_single_frame()) if (rend_single_frame())
renderer->Present(); renderer->Present();
if (renderer_changed)
{
renderer_changed = false;
rend_term_renderer();
rend_create_renderer();
rend_init_renderer();
}
} }
rend_term_renderer(); rend_term_renderer();
@ -538,6 +539,7 @@ void rend_end_render()
void rend_stop_renderer() void rend_stop_renderer()
{ {
renderer_enabled = false; renderer_enabled = false;
tactx_Term();
} }
void rend_vblank() void rend_vblank()

View File

@ -361,6 +361,11 @@ void input_x11_init()
printf("X11 Keyboard input disabled by config.\n"); printf("X11 Keyboard input disabled by config.\n");
} }
static int x11_error_handler(Display *, XErrorEvent *)
{
return 0;
}
void x11_window_create() void x11_window_create()
{ {
if (cfgLoadInt("pvr", "nox11", 0) == 0) if (cfgLoadInt("pvr", "nox11", 0) == 0)
@ -519,20 +524,22 @@ void x11_window_create()
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
None None
}; };
int (*old_handler)(Display *, XErrorEvent *) = XSetErrorHandler(&x11_error_handler);
x11_glc = glXCreateContextAttribsARB(x11Display, bestFbc, 0, True, context_attribs); x11_glc = glXCreateContextAttribsARB(x11Display, bestFbc, 0, True, context_attribs);
if (!x11_glc) if (!x11_glc)
{ {
printf("Open GL 4.3 not supported\n"); printf("Open GL 4.3 not supported\n");
// Try GL 3.1 // Try GL 3.0
context_attribs[1] = 3; context_attribs[1] = 3;
context_attribs[3] = 1; context_attribs[3] = 0;
x11_glc = glXCreateContextAttribsARB(x11Display, bestFbc, 0, True, context_attribs); x11_glc = glXCreateContextAttribsARB(x11Display, bestFbc, 0, True, context_attribs);
if (!x11_glc) if (!x11_glc)
{ {
die("Open GL 3.1 not supported\n"); die("Open GL 3.0 not supported\n");
} }
} }
XSetErrorHandler(old_handler);
XSync(x11Display, False); XSync(x11Display, False);
#endif #endif