33#include < imgui.h>
44#include < reshade.hpp>
55#include < vector>
6+ #include < queue>
67
78using namespace reshade ::api;
89
910struct __declspec (uuid(" 745350f4-bd58-479b-8ad0-81e872a9952b" )) device_data
1011{
1112 effect_runtime *main_runtime = nullptr ;
1213
14+ bool block_effects = true ;
15+
1316 bool _hasBackBuffer = false ;
1417 resource_desc _back_buffer_desc;
1518 uint32_t _width;
@@ -19,6 +22,7 @@ struct __declspec(uuid("745350f4-bd58-479b-8ad0-81e872a9952b")) device_data
1922 resource _back_buffer_resolved = { 0 };
2023 resource_view _back_buffer_resolved_srv = { 0 };
2124 std::vector<resource_view> _back_buffer_targets;
25+ std::queue<effect_technique> _disabled_techniques;
2226
2327 resource depth_texture = { 0 };
2428 resource_view depth_texture_view = { 0 };
@@ -53,6 +57,22 @@ struct __declspec(uuid("745350f4-bd58-479b-8ad0-81e872a9952b")) device_data
5357 });
5458 }
5559
60+ void disable_techniques () {
61+ main_runtime->enumerate_techniques (nullptr , [this ](effect_runtime* runtime, auto technique) {
62+ if (runtime->get_technique_state (technique)) {
63+ _disabled_techniques.push (technique);
64+ runtime->set_technique_state (technique, false );
65+ }
66+ });
67+ }
68+
69+ void reenable_techniques () {
70+ while (!_disabled_techniques.empty ()) {
71+ main_runtime->set_technique_state (_disabled_techniques.front (), true );
72+ _disabled_techniques.pop ();
73+ }
74+ }
75+
5676 void free_buffer_resources () {
5777 if (main_runtime == 0 )
5878 return ;
@@ -233,6 +253,11 @@ bool supply_depth(void* pDepthTextureResource) {
233253
234254extern " C" bool __declspec (dllexport) AdvancedfxRenderEffects(void * pRenderTargetView, void * pDepthTextureResource) {
235255
256+ if (pRenderTargetView == 0 ) {
257+ // HLAE wants us to render no effects.
258+ return true ;
259+ }
260+
236261 if (g_MainCommandList == 0 )
237262 return false ;
238263
@@ -242,12 +267,6 @@ extern "C" bool __declspec(dllexport) AdvancedfxRenderEffects(void* pRenderTarge
242267 if (dev_data.main_runtime == 0 )
243268 return false ;
244269
245- if (pRenderTargetView == 0 ) {
246- // HLAE wants us to render no effects.
247- dev_data.main_runtime ->render_effects (g_MainCommandList, resource_view{ 0 });
248- return true ;
249- }
250-
251270 resource back_buffer_resource{ (uint64_t )pRenderTargetView };
252271
253272 if (!dev_data.ensure_buffers (back_buffer_resource))
@@ -274,12 +293,16 @@ extern "C" bool __declspec(dllexport) AdvancedfxRenderEffects(void* pRenderTarge
274293
275294 if (dev_data._back_buffer_resolved != 0 )
276295 {
296+ dev_data.block_effects = false ;
277297 dev_data.main_runtime ->render_effects (g_MainCommandList, dev_data._back_buffer_targets [0 ], dev_data._back_buffer_targets [1 ]);
298+ dev_data.block_effects = true ;
278299 }
279300 else
280301 {
281302 g_MainCommandList->barrier (back_buffer_resource, resource_usage::present, resource_usage::render_target);
303+ dev_data.block_effects = false ;
282304 dev_data.main_runtime ->render_effects (g_MainCommandList, dev_data._back_buffer_targets [0 ], dev_data._back_buffer_targets [1 ]);
305+ dev_data.block_effects = true ;
283306 g_MainCommandList->barrier (back_buffer_resource, resource_usage::render_target, resource_usage::present);
284307 }
285308
@@ -336,19 +359,26 @@ static void on_destroy_effect_runtime(effect_runtime *runtime)
336359 }
337360}
338361
339- static void on_draw_settings (effect_runtime * runtime)
362+ static void on_begin_render_effects (effect_runtime* runtime, command_list* cmd_list, resource_view, resource_view )
340363{
341- device * const device = runtime-> get_device ();
342- auto &dev_data = device-> get_private_data <device_data>() ;
364+ if (g_MainCommandList == 0 )
365+ return ;
343366
344- if (runtime != dev_data.main_runtime )
345- {
346- ImGui::TextUnformatted (" This is not the main effect runtime." );
367+ device* const device = g_MainCommandList->get_device ();
368+ auto & dev_data = device->get_private_data <device_data>();
369+
370+ if (dev_data.block_effects ) dev_data.disable_techniques ();
371+ }
372+
373+ static void on_finish_render_effects (effect_runtime* runtime, command_list* cmd_list, resource_view, resource_view)
374+ {
375+ if (g_MainCommandList == 0 )
347376 return ;
348- }
349377
350- ImGui::TextUnformatted (" v1.1.0" );
351- ImGui::TextUnformatted (" There are no settings currently." );
378+ device* const device = g_MainCommandList->get_device ();
379+ auto & dev_data = device->get_private_data <device_data>();
380+
381+ if (dev_data.block_effects ) dev_data.reenable_techniques ();
352382}
353383
354384BOOL APIENTRY DllMain (HMODULE hModule, DWORD fdwReason, LPVOID)
@@ -364,7 +394,8 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID)
364394 reshade::register_event<reshade::addon_event::destroy_command_list>(on_destroy_command_list);
365395 reshade::register_event<reshade::addon_event::init_effect_runtime>(on_init_effect_runtime);
366396 reshade::register_event<reshade::addon_event::destroy_effect_runtime>(on_destroy_effect_runtime);
367- reshade::register_overlay (nullptr , on_draw_settings);
397+ reshade::register_event<reshade::addon_event::reshade_begin_effects>(on_begin_render_effects);
398+ reshade::register_event<reshade::addon_event::reshade_finish_effects>(on_finish_render_effects);
368399
369400 // Need to set texture binding again after reloading
370401 reshade::register_event<reshade::addon_event::reshade_reloaded_effects>(update_effect_runtime);
0 commit comments