1#ifndef ACMXVK_INTERFACE_CONTROL_HPP
2#define ACMXVK_INTERFACE_CONTROL_HPP
7#if defined(__linux__) || defined(__APPLE__)
24 inline constexpr const wchar_t *SHADER_SELECTION_MAPPING_NAME_WINDOWS = L
"Local\\ACMX2ShaderSelectionV11";
25 inline constexpr const wchar_t *SHADER_SELECTION_MUTEX_NAME_WINDOWS = L
"Local\\ACMX2ShaderSelectionMutexV11";
41 inline constexpr DWORD INTERFACE_LOCK_TIMEOUT_MS = 1000;
100 static_assert(std::is_standard_layout_v<ShaderSelectionData>);
101 static_assert(std::is_trivially_copyable_v<ShaderSelectionData>);
104#if defined(__linux__) || defined(__APPLE__) || defined(_WIN32)
105 class InterfaceLock {
107#if defined(__linux__) || defined(__APPLE__)
108 explicit InterfaceLock(sem_t *value) : semaphore(value) {
109 if (semaphore ==
nullptr || semaphore == SEM_FAILED)
111 while (::sem_wait(semaphore) != 0) {
118 explicit InterfaceLock(HANDLE value) : mutex(value) {
119 if (mutex ==
nullptr)
121 const DWORD result = ::WaitForSingleObject(mutex, INTERFACE_LOCK_TIMEOUT_MS);
122 locked = result == WAIT_OBJECT_0 || result == WAIT_ABANDONED;
129#if defined(__linux__) || defined(__APPLE__)
130 ::sem_post(semaphore);
132 ::ReleaseMutex(mutex);
136 InterfaceLock(
const InterfaceLock &) =
delete;
137 InterfaceLock &operator=(
const InterfaceLock &) =
delete;
139 explicit operator bool()
const {
return locked; }
142#if defined(__linux__) || defined(__APPLE__)
143 sem_t *semaphore =
nullptr;
145 HANDLE mutex =
nullptr;
constexpr std::uint32_t MAX_SHADER_NAME
constexpr std::uint32_t MAX_GPU_FILTER_COUNT
constexpr std::uint32_t SHADER_SELECTION_VERSION
constexpr std::uint32_t MAX_UNIFORM_NAME
constexpr const char * SHADER_SELECTION_SEMAPHORE_NAME
constexpr std::uint32_t SHADER_SELECTION_MAGIC
constexpr std::uint32_t MAX_AUDIO_FILE_PATH
constexpr std::uint32_t MAX_CUSTOM_UNIFORMS
constexpr const char * SHADER_SELECTION_SHM_NAME
constexpr std::uint32_t MAX_DREAM_LAYER
constexpr std::uint32_t MAX_RELOAD_PATH
constexpr std::uint32_t MAX_PASS_COUNT
constexpr std::uint32_t MAX_DREAM_MODEL_PATH
constexpr std::uint32_t MAX_WATERMARK_TEXT
constexpr std::size_t SHADER_SELECTION_DATA_SIZE
std::uint32_t custom_uniform_count
std::int32_t gpu_filter_indices[MAX_GPU_FILTER_COUNT]
char audio_file_path[MAX_AUDIO_FILE_PATH]
char shader_pass_names[MAX_PASS_COUNT][MAX_SHADER_NAME]
std::int32_t reload_shader_index
char watermark_text[MAX_WATERMARK_TEXT]
std::uint8_t reserved_flags[3]
std::uint32_t reload_sequence
std::int32_t selected_index
std::uint8_t watermark_enabled
std::int32_t shader_pass_indices[MAX_PASS_COUNT]
float custom_uniform_values[MAX_CUSTOM_UNIFORMS]
std::uint32_t audio_file_sequence
std::uint8_t normalized_time_enabled
std::uint8_t gpu_buffer_size
std::int32_t dream_iterations
std::uint8_t gpu_filter_enabled
std::uint8_t audio_reserved
std::int32_t dream_channel
std::uint8_t dream_enabled
std::uint32_t gpu_filter_count
char custom_uniform_names[MAX_CUSTOM_UNIFORMS][MAX_UNIFORM_NAME]
std::int32_t dream_octaves
std::uint8_t repeat_enabled
char dream_layer[MAX_DREAM_LAYER]
std::int32_t audio_output_device
char reload_shader_path[MAX_RELOAD_PATH]
std::uint32_t shader_pass_count
char dream_model_path[MAX_DREAM_MODEL_PATH]
std::uint8_t dream_gpu_filter_first
std::int32_t dream_smoothing
std::uint8_t display_filter_enabled
std::uint8_t dream_reserved
std::int32_t dream_maximum_dimension
char selected_shader_name[MAX_SHADER_NAME]
std::uint8_t shader_pass_enabled
std::uint8_t audio_pass_through
std::int32_t dream_jitter
std::uint8_t audio_repeat