1#ifndef ACMXVK_INTERFACE_CONTROL_HPP
2#define ACMXVK_INTERFACE_CONTROL_HPP
7#if defined(__linux__) || defined(__APPLE__)
22 "/acmx2_shader_selection_v11";
26 inline constexpr const wchar_t *SHADER_SELECTION_MAPPING_NAME_WINDOWS =
27 L
"Local\\ACMX2ShaderSelectionV11";
28 inline constexpr const wchar_t *SHADER_SELECTION_MUTEX_NAME_WINDOWS =
29 L
"Local\\ACMX2ShaderSelectionMutexV11";
45 inline constexpr DWORD INTERFACE_LOCK_TIMEOUT_MS = 1000;
104 static_assert(std::is_standard_layout_v<ShaderSelectionData>);
105 static_assert(std::is_trivially_copyable_v<ShaderSelectionData>);
108#if defined(__linux__) || defined(__APPLE__) || defined(_WIN32)
109 class InterfaceLock {
111#if defined(__linux__) || defined(__APPLE__)
112 explicit InterfaceLock(sem_t *value) : semaphore(value) {
113 if (semaphore ==
nullptr || semaphore == SEM_FAILED)
115 while (::sem_wait(semaphore) != 0) {
122 explicit InterfaceLock(HANDLE value) : mutex(value) {
123 if (mutex ==
nullptr)
126 ::WaitForSingleObject(mutex, INTERFACE_LOCK_TIMEOUT_MS);
127 locked = result == WAIT_OBJECT_0 || result == WAIT_ABANDONED;
134#if defined(__linux__) || defined(__APPLE__)
135 ::sem_post(semaphore);
137 ::ReleaseMutex(mutex);
141 InterfaceLock(
const InterfaceLock &) =
delete;
142 InterfaceLock &operator=(
const InterfaceLock &) =
delete;
144 explicit operator bool()
const {
return locked; }
147#if defined(__linux__) || defined(__APPLE__)
148 sem_t *semaphore =
nullptr;
150 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