diff --git a/Source/Core/VideoBackends/Metal/MTLStateTracker.h b/Source/Core/VideoBackends/Metal/MTLStateTracker.h index f425cd288457..5b816c27a92e 100644 --- a/Source/Core/VideoBackends/Metal/MTLStateTracker.h +++ b/Source/Core/VideoBackends/Metal/MTLStateTracker.h @@ -17,6 +17,7 @@ #include "VideoBackends/Metal/MTLTexture.h" #include "VideoBackends/Metal/MTLUtil.h" +#include "VideoCommon/Constants.h" #include "VideoCommon/FramebufferManager.h" #include "VideoCommon/PerfQueryBase.h" @@ -194,6 +195,7 @@ class StateTracker // MARK: State u8 m_dirty_textures; u8 m_dirty_samplers; + static_assert(sizeof(m_dirty_textures) * 8 >= VideoCommon::MAX_PIXEL_SHADER_SAMPLERS, "Make these bigger"); union Flags { struct @@ -249,11 +251,11 @@ class StateTracker Util::Viewport viewport; const Pipeline* render_pipeline = nullptr; const ComputePipeline* compute_pipeline = nullptr; - std::array, 8> textures = {}; - std::array, 8> samplers = {}; - std::array sampler_min_lod; - std::array sampler_max_lod; - std::array sampler_states; + std::array, VideoCommon::MAX_PIXEL_SHADER_SAMPLERS> textures = {}; + std::array, VideoCommon::MAX_PIXEL_SHADER_SAMPLERS> samplers = {}; + std::array sampler_min_lod; + std::array sampler_max_lod; + std::array sampler_states; const Texture* compute_texture = nullptr; std::unique_ptr utility_uniform; u32 utility_uniform_size = 0; diff --git a/Source/Core/VideoBackends/Metal/MTLStateTracker.mm b/Source/Core/VideoBackends/Metal/MTLStateTracker.mm index 53462b9bdf4e..2769910d88aa 100644 --- a/Source/Core/VideoBackends/Metal/MTLStateTracker.mm +++ b/Source/Core/VideoBackends/Metal/MTLStateTracker.mm @@ -371,8 +371,8 @@ explicit Backref(StateTracker* state_tracker) : state_tracker(state_tracker) {} m_current.cull_mode = MTLCullModeNone; m_current.perf_query_group = static_cast(-1); m_flags.NewEncoder(); - m_dirty_samplers = 0xff; - m_dirty_textures = 0xff; + m_dirty_samplers = (1 << VideoCommon::MAX_PIXEL_SHADER_SAMPLERS) - 1; + m_dirty_textures = (1 << VideoCommon::MAX_PIXEL_SHADER_SAMPLERS) - 1; CheckScissor(); CheckViewport(); ASSERT_MSG(VIDEO, m_current_render_encoder, "Failed to create render encoder!"); @@ -386,8 +386,8 @@ explicit Backref(StateTracker* state_tracker) : state_tracker(state_tracker) {} if (m_manual_buffer_upload) [m_current_compute_encoder waitForFence:m_fence]; m_flags.NewEncoder(); - m_dirty_samplers = 0xff; - m_dirty_textures = 0xff; + m_dirty_samplers = (1 << VideoCommon::MAX_PIXEL_SHADER_SAMPLERS) - 1; + m_dirty_textures = (1 << VideoCommon::MAX_PIXEL_SHADER_SAMPLERS) - 1; } void Metal::StateTracker::EndRenderPass() @@ -801,13 +801,13 @@ static NSRange RangeOfBits(u32 value) if (m_state.vertices) SetVertexBufferNow(0, m_state.vertices, 0); } - if (u8 dirty = m_dirty_textures & pipe->GetTextures()) + if (u32 dirty = m_dirty_textures & pipe->GetTextures()) { m_dirty_textures &= ~pipe->GetTextures(); NSRange range = RangeOfBits(dirty); [enc setFragmentTextures:&m_state.textures[range.location] withRange:range]; } - if (u8 dirty = m_dirty_samplers & pipe->GetSamplers()) + if (u32 dirty = m_dirty_samplers & pipe->GetSamplers()) { m_dirty_samplers &= ~pipe->GetSamplers(); NSRange range = RangeOfBits(dirty);