From a399dc43a19e145eb170814ab69025f620a8e4a1 Mon Sep 17 00:00:00 2001 From: TellowKrinkle Date: Thu, 29 Jun 2023 01:16:28 -0500 Subject: [PATCH] VideoBackends:Metal: Align utility uniform sizes Prevents complaining from validation layers --- Source/Core/VideoBackends/Metal/MTLStateTracker.mm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Source/Core/VideoBackends/Metal/MTLStateTracker.mm b/Source/Core/VideoBackends/Metal/MTLStateTracker.mm index 8546744a4d..9a8b866e97 100644 --- a/Source/Core/VideoBackends/Metal/MTLStateTracker.mm +++ b/Source/Core/VideoBackends/Metal/MTLStateTracker.mm @@ -7,6 +7,7 @@ #include #include +#include "Common/Align.h" #include "Common/Assert.h" #include "Core/System.h" @@ -565,12 +566,15 @@ void Metal::StateTracker::InvalidateUniforms(bool vertex, bool geometry, bool fr void Metal::StateTracker::SetUtilityUniform(const void* buffer, size_t size) { + // Shader often uses 16-byte aligned types + // Metal validation will complain if our upload is smaller than the struct with padding + size_t aligned_size = Common::AlignUp(size, 16); if (m_state.utility_uniform_capacity < size) { - m_state.utility_uniform = std::unique_ptr(new u8[size]); - m_state.utility_uniform_capacity = size; + m_state.utility_uniform = std::unique_ptr(new u8[aligned_size]); + m_state.utility_uniform_capacity = static_cast(aligned_size); } - m_state.utility_uniform_size = size; + m_state.utility_uniform_size = static_cast(aligned_size); memcpy(m_state.utility_uniform.get(), buffer, size); m_flags.has_utility_vs_uniform = false; m_flags.has_utility_ps_uniform = false;