Skip to content

Commit

Permalink
Fix crash when using threaded video (#16518)
Browse files Browse the repository at this point in the history
for Mesa 23.2 and later
  • Loading branch information
viachaslavic committed May 13, 2024
1 parent 04baed2 commit 9ad2cc2
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 55 deletions.
2 changes: 1 addition & 1 deletion gfx/common/d3d9_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -1211,7 +1211,7 @@ uintptr_t d3d9_load_texture(void *video_data, void *data,

#ifdef HAVE_THREADS
if (threaded)
return video_thread_texture_load(&info,
return video_thread_texture_handle(&info,
d3d9_video_texture_load_wrap_d3d);
#endif

Expand Down
2 changes: 1 addition & 1 deletion gfx/drivers/d3d8.c
Original file line number Diff line number Diff line change
Expand Up @@ -2121,7 +2121,7 @@ static uintptr_t d3d8_load_texture(void *video_data, void *data,
info.type = filter_type;

if (threaded)
return video_thread_texture_load(&info,
return video_thread_texture_handle(&info,
d3d8_video_texture_load_wrap_d3d);

d3d8_video_texture_load_d3d(&info, &id);
Expand Down
37 changes: 26 additions & 11 deletions gfx/drivers/gl1.c
Original file line number Diff line number Diff line change
Expand Up @@ -2130,12 +2130,30 @@ static void video_texture_load_gl1(
static int video_texture_load_wrap_gl1(void *data)
{
uintptr_t id = 0;
if (!data)
return 0;
video_texture_load_gl1((struct texture_image*)data,
TEXTURE_FILTER_NEAREST, &id);
gl1_t *gl1 = (gl1_t*)video_driver_get_ptr();

if (gl1->ctx_driver->make_current)
gl1->ctx_driver->make_current(false);

if (data)
video_texture_load_gl1((struct texture_image*)data,
TEXTURE_FILTER_NEAREST, &id);
return (int)id;
}

static int video_texture_unload_wrap_gl1(void *data)
{
GLuint glid;
uintptr_t id = (uintptr_t)data;
gl1_t *gl1 = (gl1_t*)video_driver_get_ptr();

if (gl1 && gl1->ctx_driver->make_current)
gl1->ctx_driver->make_current(false);

glid = (GLuint)id;
glDeleteTextures(1, &glid);
return 0;
}
#endif

static uintptr_t gl1_load_texture(void *video_data, void *data,
Expand All @@ -2149,10 +2167,7 @@ static uintptr_t gl1_load_texture(void *video_data, void *data,
gl1_t *gl1 = (gl1_t*)video_data;
custom_command_method_t func = video_texture_load_wrap_gl1;

if (gl1->ctx_driver->make_current)
gl1->ctx_driver->make_current(false);

return video_thread_texture_load(data, func);
return video_thread_texture_handle(data, func);
}
#endif

Expand All @@ -2171,15 +2186,15 @@ static void gl1_unload_texture(void *data,
bool threaded, uintptr_t id)
{
GLuint glid;
gl1_t *gl1 = (gl1_t*)data;
if (!id)
return;

#ifdef HAVE_THREADS
if (threaded)
{
if (gl1->ctx_driver->make_current)
gl1->ctx_driver->make_current(false);
custom_command_method_t func = video_texture_unload_wrap_gl1;
video_thread_texture_handle((void *)id, func);
return;
}
#endif

Expand Down
50 changes: 32 additions & 18 deletions gfx/drivers/gl2.c
Original file line number Diff line number Diff line change
Expand Up @@ -5156,24 +5156,44 @@ static void video_texture_load_gl2(
static int video_texture_load_wrap_gl2_mipmap(void *data)
{
uintptr_t id = 0;
gl2_t *gl = (gl2_t*)video_driver_get_ptr();

if (!data)
return 0;
video_texture_load_gl2((struct texture_image*)data,
TEXTURE_FILTER_MIPMAP_LINEAR, &id);
if (gl && gl->ctx_driver->make_current)
gl->ctx_driver->make_current(false);

if (data)
video_texture_load_gl2((struct texture_image*)data,
TEXTURE_FILTER_MIPMAP_LINEAR, &id);
return (int)id;
}

static int video_texture_load_wrap_gl2(void *data)
{
uintptr_t id = 0;
gl2_t *gl = (gl2_t*)video_driver_get_ptr();

if (!data)
return 0;
video_texture_load_gl2((struct texture_image*)data,
TEXTURE_FILTER_LINEAR, &id);
if (gl && gl->ctx_driver->make_current)
gl->ctx_driver->make_current(false);

if (data)
video_texture_load_gl2((struct texture_image*)data,
TEXTURE_FILTER_LINEAR, &id);
return (int)id;
}

static int video_texture_unload_wrap_gl2(void *data)
{
GLuint glid;
uintptr_t id = (uintptr_t)data;
gl2_t *gl = (gl2_t*)video_driver_get_ptr();

if (gl && gl->ctx_driver->make_current)
gl->ctx_driver->make_current(false);

glid = (GLuint)id;
glDeleteTextures(1, &glid);
return 0;
}
#endif

static uintptr_t gl2_load_texture(void *video_data, void *data,
Expand All @@ -5184,12 +5204,7 @@ static uintptr_t gl2_load_texture(void *video_data, void *data,
#ifdef HAVE_THREADS
if (threaded)
{
gl2_t *gl = (gl2_t*)video_data;
custom_command_method_t func = video_texture_load_wrap_gl2;

if (gl->ctx_driver->make_current)
gl->ctx_driver->make_current(false);

switch (filter_type)
{
case TEXTURE_FILTER_MIPMAP_LINEAR:
Expand All @@ -5199,7 +5214,7 @@ static uintptr_t gl2_load_texture(void *video_data, void *data,
default:
break;
}
return video_thread_texture_load(data, func);
return video_thread_texture_handle(data, func);
}
#endif

Expand All @@ -5217,10 +5232,9 @@ static void gl2_unload_texture(void *data,
#ifdef HAVE_THREADS
if (threaded)
{
gl2_t *gl = (gl2_t*)data;
if (gl && gl->ctx_driver)
if (gl->ctx_driver->make_current)
gl->ctx_driver->make_current(false);
custom_command_method_t func = video_texture_unload_wrap_gl2;
video_thread_texture_handle((void *)id, func);
return;
}
#endif

Expand Down
57 changes: 36 additions & 21 deletions gfx/drivers/gl3.c
Original file line number Diff line number Diff line change
Expand Up @@ -2585,7 +2585,7 @@ static bool gl3_frame(void *data, const void *frame,
#endif
gl3_filter_chain_set_rotation(gl->filter_chain, retroarch_get_rotation());

/* Sub-frame info for multiframe shaders (per real content frame).
/* Sub-frame info for multiframe shaders (per real content frame).
Should always be 1 for non-use of subframes*/
if (!(gl->flags & GL3_FLAG_FRAME_DUPE_LOCK))
{
Expand All @@ -2604,7 +2604,7 @@ static bool gl3_frame(void *data, const void *frame,
gl->filter_chain, 1);
}

#ifdef GL3_ROLLING_SCANLINE_SIMULATION
#ifdef GL3_ROLLING_SCANLINE_SIMULATION
if ( (video_info->shader_subframes > 1)
&& (video_info->scan_subframes)
&& !video_info->black_frame_insertion
Expand All @@ -2620,8 +2620,8 @@ static bool gl3_frame(void *data, const void *frame,
{
gl3_filter_chain_set_simulate_scanline(
gl->filter_chain, false);
}
#endif // GL3_ROLLING_SCANLINE_SIMULATION
}
#endif // GL3_ROLLING_SCANLINE_SIMULATION

gl3_filter_chain_set_input_texture(gl->filter_chain, &texture);
gl3_filter_chain_build_offscreen_passes(gl->filter_chain,
Expand Down Expand Up @@ -2845,24 +2845,44 @@ static struct video_shader *gl3_get_current_shader(void *data)
static int video_texture_load_wrap_gl3_mipmap(void *data)
{
GLuint id = 0;
gl3_t *gl = (gl3_t*)video_driver_get_ptr();

if (!data)
return 0;
video_texture_load_gl3((struct texture_image*)data,
TEXTURE_FILTER_MIPMAP_LINEAR, &id);
if (gl && gl->ctx_driver->make_current)
gl->ctx_driver->make_current(false);

if (data)
video_texture_load_gl3((struct texture_image*)data,
TEXTURE_FILTER_MIPMAP_LINEAR, &id);
return (int)id;
}

static int video_texture_load_wrap_gl3(void *data)
{
GLuint id = 0;
gl3_t *gl = (gl3_t*)video_driver_get_ptr();

if (!data)
return 0;
video_texture_load_gl3((struct texture_image*)data,
TEXTURE_FILTER_LINEAR, &id);
if (gl && gl->ctx_driver->make_current)
gl->ctx_driver->make_current(false);

if (data)
video_texture_load_gl3((struct texture_image*)data,
TEXTURE_FILTER_LINEAR, &id);
return (int)id;
}

static int video_texture_unload_wrap_gl3(void *data)
{
GLuint glid;
uintptr_t id = (uintptr_t)data;
gl3_t *gl = (gl3_t*)video_driver_get_ptr();

if (gl && gl->ctx_driver->make_current)
gl->ctx_driver->make_current(false);

glid = (GLuint)id;
glDeleteTextures(1, &glid);
return 0;
}
#endif

static uintptr_t gl3_load_texture(void *video_data, void *data,
Expand All @@ -2873,12 +2893,7 @@ static uintptr_t gl3_load_texture(void *video_data, void *data,
#ifdef HAVE_THREADS
if (threaded)
{
gl3_t *gl = (gl3_t*)video_data;
custom_command_method_t func = video_texture_load_wrap_gl3;

if (gl->ctx_driver->make_current)
gl->ctx_driver->make_current(false);

switch (filter_type)
{
case TEXTURE_FILTER_MIPMAP_LINEAR:
Expand All @@ -2888,7 +2903,7 @@ static uintptr_t gl3_load_texture(void *video_data, void *data,
default:
break;
}
return video_thread_texture_load(data, func);
return video_thread_texture_handle(data, func);
}
#endif

Expand All @@ -2900,15 +2915,15 @@ static void gl3_unload_texture(void *data, bool threaded,
uintptr_t id)
{
GLuint glid;
gl3_t *gl = (gl3_t*)data;
if (!id)
return;

#ifdef HAVE_THREADS
if (threaded)
{
if (gl->ctx_driver->make_current)
gl->ctx_driver->make_current(false);
custom_command_method_t func = video_texture_unload_wrap_gl3;
video_thread_texture_handle((void *)id, func);
return;
}
#endif

Expand Down
2 changes: 1 addition & 1 deletion gfx/video_thread_wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -1423,7 +1423,7 @@ bool video_thread_font_init(const void **font_driver, void **font_handle,
return pkt.data.font_init.return_value;
}

unsigned video_thread_texture_load(void *data, custom_command_method_t func)
unsigned video_thread_texture_handle(void *data, custom_command_method_t func)
{
thread_packet_t pkt;
video_driver_state_t *video_st = video_state_get_ptr();
Expand Down
4 changes: 2 additions & 2 deletions gfx/video_thread_wrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ enum thread_cmd
CMD_POKE_SET_HDR_MAX_NITS,
CMD_POKE_SET_HDR_PAPER_WHITE_NITS,
CMD_POKE_SET_HDR_CONTRAST,
CMD_POKE_SET_HDR_EXPAND_GAMUT,
CMD_POKE_SET_HDR_EXPAND_GAMUT,

CMD_DUMMY = INT_MAX
};
Expand Down Expand Up @@ -270,7 +270,7 @@ bool video_thread_font_init(
custom_font_command_method_t func,
bool is_threaded);

unsigned video_thread_texture_load(void *data,
unsigned video_thread_texture_handle(void *data,
custom_command_method_t func);

RETRO_END_DECLS
Expand Down

0 comments on commit 9ad2cc2

Please sign in to comment.