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:
commit
95a13d79b7
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue