diff --git a/src/reshade_effect_manager.cpp b/src/reshade_effect_manager.cpp index 1d06dd952..3597ca12d 100644 --- a/src/reshade_effect_manager.cpp +++ b/src/reshade_effect_manager.cpp @@ -4,6 +4,7 @@ #include "reshade_effect_manager.hpp" #include "log.hpp" +#include "steamcompmgr.hpp" #include "effect_parser.hpp" #include "effect_codegen.hpp" @@ -55,7 +56,7 @@ class ReshadeUniform void copy(void* mappedBuffer, const void* data, size_t size); template - void copy(void* mappedBuffer, const T& thing); + void copy(void* mappedBuffer, const T* thing); reshadefx::uniform_info m_info; }; @@ -192,9 +193,82 @@ void ReshadeUniform::copy(void* mappedBuffer, const void* data, size_t size) } template -void ReshadeUniform::copy(void* mappedBuffer, const T& thing) +void ReshadeUniform::copy(void* mappedBuffer, const T* thing) { - copy(mappedBuffer, (const void*)&thing, sizeof(T)); + assert(m_info.type.array_length == 0 || m_info.type.array_length == 1); + + uint32_t zero_data[16] = {}; + + switch (m_info.type.base) + { + case reshadefx::type::t_bool: + if (thing) + { + VkBool32 VkBool32_stuff[16]; + for (uint32_t i = 0; i < m_info.type.components(); i++) + VkBool32_stuff[i] = !!thing[i]; + copy(mappedBuffer, VkBool32_stuff, sizeof(VkBool32) * m_info.type.components()); + } + else + { + if (m_info.has_initializer_value) + copy(mappedBuffer, (const void*)&m_info.initializer_value.as_uint[0], sizeof(VkBool32) * m_info.type.components() ); + else + copy(mappedBuffer, (const void*)zero_data, sizeof(VkBool32) * m_info.type.components() ); + } + break; + case reshadefx::type::t_int: + if (thing) + { + int32_t int32_t_stuff[16]; + for (uint32_t i = 0; i < m_info.type.components(); i++) + int32_t_stuff[i] = thing[i]; + copy(mappedBuffer, int32_t_stuff, sizeof(int32_t) * m_info.type.components()); + } + else + { + if (m_info.has_initializer_value) + copy(mappedBuffer, (const void*)&m_info.initializer_value.as_int[0], sizeof(int32_t) * m_info.type.components() ); + else + copy(mappedBuffer, (const void*)zero_data, sizeof(int32_t) * m_info.type.components() ); + } + break; + case reshadefx::type::t_uint: + if (thing) + { + uint32_t uint32_t_stuff[16]; + for (uint32_t i = 0; i < m_info.type.components(); i++) + uint32_t_stuff[i] = thing[i]; + copy(mappedBuffer, uint32_t_stuff, sizeof(uint32_t) * m_info.type.components()); + } + else + { + if (m_info.has_initializer_value) + copy(mappedBuffer, (const void*)&m_info.initializer_value.as_uint[0], sizeof(uint32_t) * m_info.type.components() ); + else + copy(mappedBuffer, (const void*)zero_data, sizeof(uint32_t) * m_info.type.components() ); + } + break; + case reshadefx::type::t_float: + if (thing) + { + float float_stuff[16]; + for (uint32_t i = 0; i < m_info.type.components(); i++) + float_stuff[i] = thing[i]; + copy(mappedBuffer, float_stuff, sizeof(float) * m_info.type.components()); + } + else + { + if (m_info.has_initializer_value) + copy(mappedBuffer, (const void*)&m_info.initializer_value.as_float[0], sizeof(float) * m_info.type.components() ); + else + copy(mappedBuffer, (const void*)zero_data, sizeof(float) * m_info.type.components() ); + } + break; + default: + reshade_log.errorf("Unknown uniform type!"); + break; + } } ////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -210,7 +284,7 @@ void FrameTimeUniform::update(void* mappedBuffer) lastFrame = currentFrame; float frametime = duration.count(); - copy(mappedBuffer, frametime); + copy(mappedBuffer, &frametime); } FrameTimeUniform::~FrameTimeUniform() { @@ -223,7 +297,7 @@ FrameCountUniform::FrameCountUniform(reshadefx::uniform_info uniformInfo) } void FrameCountUniform::update(void* mappedBuffer) { - copy(mappedBuffer, count); + copy(mappedBuffer, &count); count++; } FrameCountUniform::~FrameCountUniform() @@ -264,7 +338,7 @@ void TimerUniform::update(void* mappedBuffer) std::chrono::duration duration = currentFrame - start; float timer = duration.count(); - copy(mappedBuffer, timer); + copy(mappedBuffer, &timer); } TimerUniform::~TimerUniform() { @@ -358,7 +432,7 @@ RandomUniform::RandomUniform(reshadefx::uniform_info uniformInfo) void RandomUniform::update(void* mappedBuffer) { int32_t value = min + (std::rand() % (max - min + 1)); - copy(mappedBuffer, value); + copy(mappedBuffer, &value); } RandomUniform::~RandomUniform() { @@ -372,7 +446,7 @@ KeyUniform::KeyUniform(reshadefx::uniform_info uniformInfo) void KeyUniform::update(void* mappedBuffer) { VkBool32 keyDown = VK_FALSE; // TODO - copy(mappedBuffer, keyDown); + copy(mappedBuffer, &keyDown); } KeyUniform::~KeyUniform() { @@ -386,7 +460,7 @@ MouseButtonUniform::MouseButtonUniform(reshadefx::uniform_info uniformInfo) void MouseButtonUniform::update(void* mappedBuffer) { VkBool32 keyDown = VK_FALSE; // TODO - copy(mappedBuffer, keyDown); + copy(mappedBuffer, &keyDown); } MouseButtonUniform::~MouseButtonUniform() { @@ -399,7 +473,13 @@ MousePointUniform::MousePointUniform(reshadefx::uniform_info uniformInfo) } void MousePointUniform::update(void* mappedBuffer) { - float point[2] = {0.0f, 0.0f}; // TODO + MouseCursor *cursor = steamcompmgr_get_current_cursor(); + int32_t point[2] = {0, 0}; + if (cursor) + { + point[0] = cursor->x(); + point[1] = cursor->y(); + } copy(mappedBuffer, point); } MousePointUniform::~MousePointUniform() @@ -428,8 +508,8 @@ DepthUniform::DepthUniform(reshadefx::uniform_info uniformInfo) } void DepthUniform::update(void* mappedBuffer) { - VkBool32 hasDepth = VK_FALSE; // TODO - copy(mappedBuffer, hasDepth); + VkBool32 hasDepth = VK_FALSE; + copy(mappedBuffer, &hasDepth); } DepthUniform::~DepthUniform() { @@ -442,40 +522,7 @@ DataUniform::DataUniform(reshadefx::uniform_info uniformInfo) } void DataUniform::update(void* mappedBuffer) { - assert(m_info.type.array_length == 0 || m_info.type.array_length == 1); - - uint32_t zero_data[16] = {}; - - switch (m_info.type.base) - { - case reshadefx::type::t_bool: - if (m_info.has_initializer_value) - copy(mappedBuffer, (const void*)&m_info.initializer_value.as_uint[0], sizeof(VkBool32) * m_info.type.components() ); - else - copy(mappedBuffer, (const void*)zero_data, sizeof(VkBool32) * m_info.type.components() ); - break; - case reshadefx::type::t_int: - if (m_info.has_initializer_value) - copy(mappedBuffer, (const void*)&m_info.initializer_value.as_int[0], sizeof(int32_t) * m_info.type.components() ); - else - copy(mappedBuffer, (const void*)zero_data, sizeof(int32_t) * m_info.type.components() ); - break; - case reshadefx::type::t_uint: - if (m_info.has_initializer_value) - copy(mappedBuffer, (const void*)&m_info.initializer_value.as_uint[0], sizeof(uint32_t) * m_info.type.components() ); - else - copy(mappedBuffer, (const void*)zero_data, sizeof(uint32_t) * m_info.type.components() ); - break; - case reshadefx::type::t_float: - if (m_info.has_initializer_value) - copy(mappedBuffer, (const void*)&m_info.initializer_value.as_float[0], sizeof(float) * m_info.type.components() ); - else - copy(mappedBuffer, (const void*)zero_data, sizeof(float) * m_info.type.components() ); - break; - default: - reshade_log.errorf("Unknown uniform type!"); - break; - } + copy(mappedBuffer, nullptr); } DataUniform::~DataUniform() { diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index e88cbe9c5..eb59347eb 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -7731,3 +7731,16 @@ struct wlserver_x11_surface_info *lookup_x11_surface_info_from_xid( gamescope_xw return &w->xwayland().surface; } + +MouseCursor *steamcompmgr_get_current_cursor() +{ + return global_focus.cursor; +} + +MouseCursor *steamcompmgr_get_server_cursor(uint32_t idx) +{ + gamescope_xwayland_server_t *server = wlserver_get_xwayland_server( idx ); + if ( server && server->ctx ) + return server->ctx->cursor.get(); + return nullptr; +} diff --git a/src/steamcompmgr.hpp b/src/steamcompmgr.hpp index f3a6c775a..676bb2938 100644 --- a/src/steamcompmgr.hpp +++ b/src/steamcompmgr.hpp @@ -143,4 +143,7 @@ extern pid_t focusWindow_pid; void init_xwayland_ctx(uint32_t serverId, gamescope_xwayland_server_t *xwayland_server); void gamescope_set_selection(std::string contents, int selection); +MouseCursor *steamcompmgr_get_current_cursor(); +MouseCursor *steamcompmgr_get_server_cursor(uint32_t serverId); + extern int g_nAsyncFlipsEnabled;