9 #include "reshade_overlay.hpp"
13 #define RESHADE_API_VERSION 20
16 #if defined(RESHADE_API_LIBRARY) || defined(RESHADE_API_LIBRARY_EXPORT)
18 #if defined(RESHADE_API_LIBRARY_EXPORT)
19 #define RESHADE_API_LIBRARY 1
20 #define RESHADE_API_LIBRARY_DECL extern "C" __declspec(dllexport)
22 #define RESHADE_API_LIBRARY_DECL extern "C" __declspec(dllimport)
25 RESHADE_API_LIBRARY_DECL
void ReShadeLogMessage(
void *module,
int level,
const char *
message);
27 RESHADE_API_LIBRARY_DECL
void ReShadeGetBasePath(
char *path,
size_t *path_size);
29 RESHADE_API_LIBRARY_DECL
bool ReShadeGetConfigValue(
void *module,
reshade::api::effect_runtime *runtime,
const char *section,
const char *key,
char *value,
size_t *value_size);
30 RESHADE_API_LIBRARY_DECL
void ReShadeSetConfigValue(
void *module,
reshade::api::effect_runtime *runtime,
const char *section,
const char *key,
const char *value);
31 RESHADE_API_LIBRARY_DECL
void ReShadeSetConfigArray(
void *module,
reshade::api::effect_runtime *runtime,
const char *section,
const char *key,
const char *value,
size_t value_size);
33 RESHADE_API_LIBRARY_DECL
bool ReShadeRegisterAddon(
void *module, uint32_t api_version);
34 RESHADE_API_LIBRARY_DECL
void ReShadeUnregisterAddon(
void *module);
37 RESHADE_API_LIBRARY_DECL
void ReShadeRegisterEventForAddon(
void *module,
reshade::addon_event ev,
void *callback);
39 RESHADE_API_LIBRARY_DECL
void ReShadeUnregisterEventForAddon(
void *module,
reshade::addon_event ev,
void *callback);
42 RESHADE_API_LIBRARY_DECL
void ReShadeRegisterOverlayForAddon(
void *module,
const char *title,
void(*callback)(
reshade::api::effect_runtime *runtime));
44 RESHADE_API_LIBRARY_DECL
void ReShadeUnregisterOverlayForAddon(
void *module,
const char *title,
void(*callback)(
reshade::api::effect_runtime *runtime));
55 extern "C" BOOL WINAPI
K32EnumProcessModules(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded);
57 namespace reshade::internal
62 inline HMODULE get_reshade_module_handle(HMODULE initial_handle =
nullptr)
64 static HMODULE handle = initial_handle;
65 if (handle ==
nullptr)
67 HMODULE modules[1024]; DWORD num = 0;
70 if (num >
sizeof(modules))
71 num =
sizeof(modules);
73 for (DWORD i = 0; i < num /
sizeof(HMODULE); ++i)
75 if (GetProcAddress(modules[i],
"ReShadeRegisterAddon") &&
76 GetProcAddress(modules[i],
"ReShadeUnregisterAddon"))
90 inline HMODULE get_current_module_handle(HMODULE initial_handle =
nullptr)
92 static HMODULE handle = initial_handle;
101 #if !defined(RESHADE_API_LIBRARY_EXPORT) || defined(BUILTIN_ADDON)
134 #if defined(RESHADE_API_LIBRARY)
135 ReShadeLogMessage(
nullptr,
static_cast<int>(
level),
message);
137 static const auto func =
reinterpret_cast<void(*)(
void *,
int,
const char *)
>(
138 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeLogMessage"));
139 func(internal::get_current_module_handle(),
static_cast<int>(
level),
message);
152 #if defined(RESHADE_API_LIBRARY)
153 ReShadeGetBasePath(path, path_size);
155 static const auto func =
reinterpret_cast<bool(*)(
char *,
size_t *)
>(
156 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeGetBasePath"));
157 func(path, path_size);
173 #if defined(RESHADE_API_LIBRARY)
174 return ReShadeGetConfigValue(
nullptr, runtime, section, key, value, value_size);
176 static const auto func =
reinterpret_cast<bool(*)(
void *,
api::effect_runtime *,
const char *,
const char *,
char *,
size_t *)
>(
177 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeGetConfigValue"));
178 return func(internal::get_current_module_handle(), runtime, section, key, value, value_size);
181 #if _HAS_CXX17 || __cplusplus >= 201703L
182 template <
typename T>
183 inline bool get_config_value(api::effect_runtime *runtime,
const char *section,
const char *key, T &value)
185 char value_string[32];
size_t value_length =
sizeof(value_string) - 1;
188 return std::from_chars(value_string, value_string + value_length, value).ec == std::errc {};
191 inline bool get_config_value<bool>(api::effect_runtime *runtime,
const char *section,
const char *key,
bool &value)
194 if (!get_config_value<int>(runtime, section, key, value_int))
196 value = (value_int != 0);
211 #if defined(RESHADE_API_LIBRARY)
212 ReShadeSetConfigValue(
nullptr, runtime, section, key, value);
214 static const auto func =
reinterpret_cast<void(*)(
void *,
api::effect_runtime *,
const char *,
const char *,
const char *)
>(
215 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeSetConfigValue"));
216 func(internal::get_current_module_handle(), runtime, section, key, value);
219 #if _HAS_CXX17 || __cplusplus >= 201703L
220 template <
typename T>
221 inline void set_config_value(api::effect_runtime *runtime,
const char *section,
const char *key,
const T &value)
223 char value_string[32] =
"";
224 std::to_chars(value_string, value_string +
sizeof(value_string) - 1, value);
225 set_config_value(runtime, section, key,
static_cast<const char *
>(value_string));
228 inline void set_config_value<bool>(api::effect_runtime *runtime,
const char *section,
const char *key,
const bool &value)
230 set_config_value<int>(runtime, section, key, value ? 1 : 0);
235 #if defined(RESHADE_API_LIBRARY)
236 ReShadeSetConfigArray(
nullptr, runtime, section, key, value, value_size);
238 static const auto func =
reinterpret_cast<void(*)(
void *,
api::effect_runtime *,
const char *,
const char *,
const char *,
size_t)
>(
239 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeSetConfigArray"));
240 func(internal::get_current_module_handle(), runtime, section, key, value, value_size);
250 inline bool register_addon(
void *addon_module, [[maybe_unused]]
void *reshade_module =
nullptr)
252 #if defined(RESHADE_API_LIBRARY)
255 addon_module = internal::get_current_module_handle(
static_cast<HMODULE
>(addon_module));
256 reshade_module = internal::get_reshade_module_handle(
static_cast<HMODULE
>(reshade_module));
258 if (reshade_module ==
nullptr)
261 const auto func =
reinterpret_cast<bool(*)(
void *, uint32_t)
>(
262 GetProcAddress(
static_cast<HMODULE
>(reshade_module),
"ReShadeRegisterAddon"));
267 #if defined(IMGUI_VERSION_NUM)
268 const auto imgui_func =
reinterpret_cast<const imgui_function_table *(*)(uint32_t)
>(
269 GetProcAddress(
static_cast<HMODULE
>(reshade_module),
"ReShadeGetImGuiFunctionTable"));
271 if (imgui_func ==
nullptr || !(imgui_function_table_instance() = imgui_func(IMGUI_VERSION_NUM)))
284 inline void unregister_addon(
void *addon_module, [[maybe_unused]]
void *reshade_module =
nullptr)
286 #if defined(RESHADE_API_LIBRARY)
287 ReShadeUnregisterAddon(addon_module);
289 addon_module = internal::get_current_module_handle(
static_cast<HMODULE
>(addon_module));
290 reshade_module = internal::get_reshade_module_handle(
static_cast<HMODULE
>(reshade_module));
292 if (reshade_module ==
nullptr)
295 const auto func =
reinterpret_cast<bool(*)(
void *)
>(
296 GetProcAddress(
static_cast<HMODULE
>(reshade_module),
"ReShadeUnregisterAddon"));
308 template <addon_event ev>
311 #if defined(RESHADE_API_LIBRARY)
312 ReShadeRegisterEvent(ev,
reinterpret_cast<void *
>(callback));
314 static const auto func =
reinterpret_cast<void(*)(
addon_event,
void *)
>(
315 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeRegisterEvent"));
317 func(ev,
reinterpret_cast<void *
>(callback));
325 template <addon_event ev>
328 #if defined(RESHADE_API_LIBRARY)
329 ReShadeUnregisterEvent(ev,
reinterpret_cast<void *
>(callback));
331 static const auto func =
reinterpret_cast<void(*)(
addon_event,
void *)
>(
332 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeUnregisterEvent"));
334 func(ev,
reinterpret_cast<void *
>(callback));
346 #if defined(RESHADE_API_LIBRARY)
347 ReShadeRegisterOverlay(title, callback);
349 static const auto func =
reinterpret_cast<void(*)(
const char *,
void(*)(
api::effect_runtime *))
>(
350 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeRegisterOverlay"));
352 func(title, callback);
362 #if defined(RESHADE_API_LIBRARY)
363 ReShadeUnregisterOverlay(title, callback);
365 static const auto func =
reinterpret_cast<void(*)(
const char *,
void(*)(
api::effect_runtime *))
>(
366 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeUnregisterOverlay"));
368 func(title, callback);
384 #if defined(RESHADE_API_LIBRARY)
385 return ReShadeCreateEffectRuntime(api, device, command_queue, swapchain, config_path, out_runtime);
388 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeCreateEffectRuntime"));
391 *out_runtime =
nullptr;
394 return func(api, device, command_queue, swapchain, config_path, out_runtime);
403 #if defined(RESHADE_API_LIBRARY)
404 ReShadeDestroyEffectRuntime(runtime);
407 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeDestroyEffectRuntime"));
418 #if defined(RESHADE_API_LIBRARY)
419 ReShadeUpdateAndPresentEffectRuntime(runtime);
422 GetProcAddress(internal::get_reshade_module_handle(),
"ReShadeUpdateAndPresentEffectRuntime"));
device_api
Underlying graphics API a device is using.
Definition: reshade_api_device.hpp:17
level
Severity levels for logging.
Definition: reshade.hpp:108
void message(level level, const char *message)
Writes a message to ReShade's log.
Definition: reshade.hpp:132
Definition: reshade.hpp:58
void unregister_event(typename addon_event_traits< ev >::decl callback)
Unregisters a callback from the specified event that was previously registered via register_event.
Definition: reshade.hpp:326
void register_event(typename addon_event_traits< ev >::decl callback)
Registers a callback for the specified event with ReShade.
Definition: reshade.hpp:309
addon_event
Definition: reshade_events.hpp:13
void unregister_addon(void *addon_module, [[maybe_unused]] void *reshade_module=nullptr)
Unregisters this module as an add-on. Call this in 'AddonUninit' or 'DllMain' during process detach,...
Definition: reshade.hpp:284
bool get_config_value(api::effect_runtime *runtime, const char *section, const char *key, char *value, size_t *value_size)
Gets a value from one of ReShade's config files. This can use either the global config file (ReShade....
Definition: reshade.hpp:171
void get_reshade_base_path(char *path, size_t *path_size)
Gets the base path ReShade uses to resolve relative paths.
Definition: reshade.hpp:150
bool create_effect_runtime(reshade::api::device_api api, void *device, void *command_queue, void *swapchain, const char *config_path, reshade::api::effect_runtime **out_runtime)
Creates a new effect runtime for an existing swap chain, for when it was not already hooked by ReShad...
Definition: reshade.hpp:382
void update_and_present_effect_runtime(api::effect_runtime *runtime)
Updates and renders an effect runtime onto the current back buffer of the swap chain it was created w...
Definition: reshade.hpp:416
void set_config_value(api::effect_runtime *runtime, const char *section, const char *key, const char *value)
Sets and saves a value in one of ReShade's config files. This can use either the global config file (...
Definition: reshade.hpp:209
bool register_addon(void *addon_module, [[maybe_unused]] void *reshade_module=nullptr)
Registers this module as an add-on with ReShade. Call this in 'AddonInit' or 'DllMain' during process...
Definition: reshade.hpp:250
void unregister_overlay(const char *title, void(*callback)(api::effect_runtime *runtime))
Unregisters an overlay that was previously registered via register_overlay.
Definition: reshade.hpp:360
void destroy_effect_runtime(api::effect_runtime *runtime)
Instantly destroys an effect runtime that was previously created via create_effect_runtime....
Definition: reshade.hpp:401
void register_overlay(const char *title, void(*callback)(api::effect_runtime *runtime))
Registers an overlay with ReShade.
Definition: reshade.hpp:344
BOOL WINAPI K32EnumProcessModules(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded)
#define RESHADE_API_VERSION
Definition: reshade.hpp:13
A post-processing effect runtime, used to control effects.
Definition: reshade_api.hpp:51