(D3D8) Refactor texture loading to no longer be thread-unsafe

This commit is contained in:
twinaphex 2018-02-10 21:36:40 +01:00
parent 49bea666ff
commit b45b1b3e55
2 changed files with 29 additions and 17 deletions

View File

@ -1647,13 +1647,14 @@ static void d3d8_set_menu_texture_enable(void *data,
d3d->menu->fullscreen = full_screen; d3d->menu->fullscreen = full_screen;
} }
static void d3d8_video_texture_load_d3d(d3d_video_t *d3d, static void d3d8_video_texture_load_d3d(
struct texture_image *ti, struct d3d9_texture_info *info,
enum texture_filter_type filter_type,
uintptr_t *id) uintptr_t *id)
{ {
D3DLOCKED_RECT d3dlr; D3DLOCKED_RECT d3dlr;
unsigned usage = 0; unsigned usage = 0;
d3d_video_t *d3d = (d3d_video_t*)info->userdata;
struct texture_image *ti = (struct texture_image*)info->data;
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)d3d_texture_new(d3d->dev, NULL, LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)d3d_texture_new(d3d->dev, NULL,
ti->width, ti->height, 0, ti->width, ti->height, 0,
usage, d3d_get_argb8888_format(), usage, d3d_get_argb8888_format(),
@ -1685,8 +1686,11 @@ static void d3d8_video_texture_load_d3d(d3d_video_t *d3d,
static int d3d8_video_texture_load_wrap_d3d(void *data) static int d3d8_video_texture_load_wrap_d3d(void *data)
{ {
uintptr_t id = 0; uintptr_t id = 0;
d3d8_video_texture_load_d3d((d3d_video_t*)video_driver_get_ptr(true), struct d3d8_texture_info *info = (struct d3d8_texture_info*)data;
(struct texture_image*)data, TEXTURE_FILTER_LINEAR, &id); if (!info)
return 0;
d3d8_video_texture_load_d3d(info, &id);
free(info);
return id; return id;
} }
@ -1694,15 +1698,21 @@ static uintptr_t d3d8_load_texture(void *video_data, void *data,
bool threaded, enum texture_filter_type filter_type) bool threaded, enum texture_filter_type filter_type)
{ {
uintptr_t id = 0; uintptr_t id = 0;
struct d3d8_texture_info *info = (struct d3d8_texture_info*)
calloc(1, sizeof(*info));
if (!info)
return 0;
info->userdata = video_data;
info->data = data;
info->type = filter_type;
if (threaded) if (threaded)
{ return video_thread_texture_load(info,
custom_command_method_t func = d3d8_video_texture_load_wrap_d3d; d3d8_video_texture_load_wrap_d3d);
return video_thread_texture_load(data, func);
}
d3d8_video_texture_load_d3d((d3d_video_t*)video_driver_get_ptr(false), d3d8_video_texture_load_d3d(info, &id);
(struct texture_image*)data, filter_type, &id); free(info);
return id; return id;
} }

View File

@ -1649,7 +1649,8 @@ struct d3d9_texture_info
enum texture_filter_type type; enum texture_filter_type type;
}; };
static void d3d9_video_texture_load_d3d(struct d3d9_texture_info *info, static void d3d9_video_texture_load_d3d(
struct d3d9_texture_info *info,
uintptr_t *id) uintptr_t *id)
{ {
D3DLOCKED_RECT d3dlr; D3DLOCKED_RECT d3dlr;
@ -1709,8 +1710,8 @@ static uintptr_t d3d9_load_texture(void *video_data, void *data,
bool threaded, enum texture_filter_type filter_type) bool threaded, enum texture_filter_type filter_type)
{ {
uintptr_t id = 0; uintptr_t id = 0;
struct d3d9_texture_info *info = (struct d3d9_texture_info*)calloc(1, sizeof(*info)); struct d3d9_texture_info *info = (struct d3d9_texture_info*)
calloc(1, sizeof(*info));
if (!info) if (!info)
return 0; return 0;
@ -1719,7 +1720,8 @@ static uintptr_t d3d9_load_texture(void *video_data, void *data,
info->type = filter_type; info->type = filter_type;
if (threaded) if (threaded)
return video_thread_texture_load(info, d3d9_video_texture_load_wrap_d3d); return video_thread_texture_load(info,
d3d9_video_texture_load_wrap_d3d);
d3d9_video_texture_load_d3d(info, &id); d3d9_video_texture_load_d3d(info, &id);
free(info); free(info);