diff --git a/Source/Core/VideoBackends/Metal/MTLStateTracker.h b/Source/Core/VideoBackends/Metal/MTLStateTracker.h index 32f6e1db01..f4fa38605b 100644 --- a/Source/Core/VideoBackends/Metal/MTLStateTracker.h +++ b/Source/Core/VideoBackends/Metal/MTLStateTracker.h @@ -4,10 +4,11 @@ #pragma once #include -#include #include #include +#include + #include "Common/Assert.h" #include "Common/CommonTypes.h" #include "Common/MathUtil.h" @@ -72,7 +73,7 @@ public: bool HasUnflushedData() { return static_cast(m_current_render_cmdbuf); } bool GPUBusy() { - return m_current_draw != 1 + m_last_finished_draw.load(std::memory_order_acquire); + return m_current_draw != 1 + u64(retro_atomic_load_acquire_64(&m_last_finished_draw)); } void ReloadSamplers(); void NotifyOfCPUGPUSync() @@ -186,7 +187,7 @@ private: CPUBuffer m_texture_upload_buffer; BufferPair m_upload_buffers[static_cast(UploadBuffer::Last) + 1]; u64 m_current_draw = 1; - std::atomic m_last_finished_draw{0}; + retro_atomic_64_t m_last_finished_draw; MRCOwned> m_dummy_texture; diff --git a/Source/Core/VideoBackends/Metal/MTLStateTracker.mm b/Source/Core/VideoBackends/Metal/MTLStateTracker.mm index a9fb4e63fb..504d63a565 100644 --- a/Source/Core/VideoBackends/Metal/MTLStateTracker.mm +++ b/Source/Core/VideoBackends/Metal/MTLStateTracker.mm @@ -106,6 +106,7 @@ void Metal::StateTracker::UsageTracker::Reset(size_t new_size) Metal::StateTracker::StateTracker() : m_backref(std::make_shared(this)) { + retro_atomic_64_init(&m_last_finished_draw, 0); m_flags.should_apply_label = true; m_fence = MRCTransfer([g_device newFence]); m_resolve_pass_desc = MRCTransfer([MTLRenderPassDescriptor new]); @@ -142,7 +143,7 @@ Metal::StateTracker::Map Metal::StateTracker::AllocateForTextureUpload(size_t am { amt = (amt + 15) & ~15ull; CPUBuffer& buffer = m_texture_upload_buffer; - u64 last_draw = m_last_finished_draw.load(std::memory_order_acquire); + u64 last_draw = u64(retro_atomic_load_acquire_64(&m_last_finished_draw)); bool needs_new = buffer.usage.PrepareForAllocation(last_draw, amt); if (needs_new) [[unlikely]] { @@ -170,7 +171,7 @@ Metal::StateTracker::Map Metal::StateTracker::AllocateForTextureUpload(size_t am std::pair Metal::StateTracker::Preallocate(UploadBuffer buffer_idx, size_t amt) { BufferPair& buffer = m_upload_buffers[static_cast(buffer_idx)]; - u64 last_draw = m_last_finished_draw.load(std::memory_order_acquire); + u64 last_draw = u64(retro_atomic_load_acquire_64(&m_last_finished_draw)); size_t base_pos = buffer.usage.Pos(); bool needs_new = buffer.usage.PrepareForAllocation(last_draw, amt); bool needs_upload = needs_new || buffer.usage.Pos() == 0; @@ -422,8 +423,8 @@ void Metal::StateTracker::FlushEncoders() { // We can do the update non-atomically because we only ever update under the lock u64 newval = - std::max(draw, tracker->m_last_finished_draw.load(std::memory_order_relaxed)); - tracker->m_last_finished_draw.store(newval, std::memory_order_release); + std::max(draw, u64(retro_atomic_load_relaxed_64(&tracker->m_last_finished_draw))); + retro_atomic_store_release_64(&tracker->m_last_finished_draw, int64_t(newval)); if (q) { if (PerfQuery* query = static_cast(g_perf_query.get()))