shader_unset_dirty

This commit is contained in:
jacob 2025-05-23 21:59:38 -05:00
parent 332e8fdf2c
commit ad05469411

View File

@ -153,7 +153,7 @@ struct dx11_shader_desc {
struct arena includes_arena; struct arena includes_arena;
struct sys_mutex includes_mutex; struct sys_mutex includes_mutex;
struct dict includes_dict; struct dict includes_dict;
struct atomic_i32 should_reload; struct atomic_i32 is_dirty;
#endif #endif
}; };
@ -534,7 +534,7 @@ INTERNAL b32 shader_set_dirty(struct string name)
struct dx11_shader_desc *desc = &G.shader_info[i]; struct dx11_shader_desc *desc = &G.shader_info[i];
struct string desc_name = string_from_cstr_no_limit(desc->name_cstr); struct string desc_name = string_from_cstr_no_limit(desc->name_cstr);
if (string_eq(desc_name, name)) { if (string_eq(desc_name, name)) {
atomic_i32_eval_exchange(&desc->should_reload, 1); atomic_i32_eval_exchange(&desc->is_dirty, 1);
caused_dirty = true; caused_dirty = true;
} else { } else {
struct dict *includes_dict = &desc->includes_dict; struct dict *includes_dict = &desc->includes_dict;
@ -542,7 +542,7 @@ INTERNAL b32 shader_set_dirty(struct string name)
struct sys_lock lock = sys_mutex_lock_e(&desc->includes_mutex); struct sys_lock lock = sys_mutex_lock_e(&desc->includes_mutex);
{ {
if (dict_get(includes_dict, hash) != 0) { if (dict_get(includes_dict, hash) != 0) {
atomic_i32_eval_exchange(&desc->should_reload, 1); atomic_i32_eval_exchange(&desc->is_dirty, 1);
caused_dirty = true; caused_dirty = true;
} }
} }
@ -551,6 +551,11 @@ INTERNAL b32 shader_set_dirty(struct string name)
} }
return caused_dirty; return caused_dirty;
} }
INTERNAL b32 shader_unset_dirty(struct dx11_shader_desc *desc)
{
return atomic_i32_eval_compare_exchange(&desc->is_dirty, 1, 0) == 1;
}
#endif #endif
/* ========================== * /* ========================== *
@ -1173,7 +1178,7 @@ void gpu_present_backbuffer(i32 vsync)
#if RESOURCE_RELOADING #if RESOURCE_RELOADING
for (u64 i = SHADER_NONE + 1; i < NUM_SHADERS; ++i) { for (u64 i = SHADER_NONE + 1; i < NUM_SHADERS; ++i) {
struct dx11_shader_desc *desc = &G.shader_info[i]; struct dx11_shader_desc *desc = &G.shader_info[i];
if (atomic_i32_eval_compare_exchange(&desc->should_reload, 1, 0) == 1) { if (shader_unset_dirty(desc)) {
reload_shader(&G.shaders[i], desc); reload_shader(&G.shaders[i], desc);
} }
} }