diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index cf7255458..97c8d48d0 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -17,6 +17,8 @@ #include "video_core/renderer_vulkan/vk_rasterizer.h" #include "video_core/renderer_vulkan/vk_scheduler.h" +std::thread::id gpu_id; + namespace AmdGpu { static const char* dcb_task_name{"DCB_TASK"}; @@ -89,7 +91,7 @@ void Liverpool::ProcessCommands() { void Liverpool::Process(std::stop_token stoken) { Common::SetCurrentThreadName("shadPS4:GpuCommandProcessor"); - + gpu_id = std::this_thread::get_id(); while (!stoken.stop_requested()) { { std::unique_lock lk{submit_mutex}; diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index 530925606..72fcb00d0 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -288,13 +288,13 @@ bool BufferCache::CommitPendingDownloads(bool wait_done) { } } }; + const u64 wait_tick = scheduler.CurrentTick(); + scheduler.Flush(); { std::scoped_lock lk{queue_mutex}; - async_downloads.emplace(std::move(writeback_host), scheduler.CurrentTick(), - current_download_tick); + async_downloads.emplace(std::move(writeback_host), wait_tick, current_download_tick); } queue_cv.notify_one(); - scheduler.Flush(); if (wait_done) { WaitForTargetTick(current_download_tick); } diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 6e882cf8d..f9e74272e 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -62,9 +62,6 @@ void Rasterizer::CpSync() { } bool Rasterizer::CommitPendingDownloads(bool wait_done) { - SCOPE_EXIT { - scheduler.PopPendingOperations(); - }; return buffer_cache.CommitPendingDownloads(wait_done); } diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 4cf6ec9d0..18d211961 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -8,6 +8,8 @@ #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_scheduler.h" +extern std::thread::id gpu_id; + namespace Vulkan { std::mutex Scheduler::submit_mutex; @@ -68,6 +70,7 @@ void Scheduler::EndRendering() { void Scheduler::PopPendingOperations() { master_semaphore.Refresh(); while (!pending_ops.empty() && master_semaphore.IsFree(pending_ops.front().gpu_tick)) { + ASSERT(gpu_id == std::this_thread::get_id()); ASSERT(op_scope == 0); ++op_scope; pending_ops.front().callback();