From 1537f02c4c304d05c6fdac492357e6cc5b375481 Mon Sep 17 00:00:00 2001 From: pineappleEA Date: Tue, 23 May 2023 02:50:14 +0200 Subject: [PATCH] early-access version 3605 --- README.md | 2 +- .../renderer/adsp/audio_renderer.cpp | 5 +++ src/audio_core/renderer/system_manager.cpp | 9 ++-- src/audio_core/renderer/system_manager.h | 10 +---- src/audio_core/sink/sink_stream.cpp | 4 +- .../renderer_opengl/gl_texture_cache.h | 2 +- .../renderer_vulkan/pipeline_helper.h | 7 ---- .../renderer_vulkan/vk_graphics_pipeline.cpp | 7 ++-- src/video_core/renderer_vulkan/vk_scheduler.h | 9 ---- .../renderer_vulkan/vk_texture_cache.cpp | 6 +-- .../renderer_vulkan/vk_texture_cache.h | 2 +- src/video_core/texture_cache/texture_cache.h | 41 ++++++++++++++++--- .../texture_cache/texture_cache_base.h | 6 +-- src/video_core/textures/bcn.cpp | 1 + 14 files changed, 61 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 90f112254..8ef26f711 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 3604. +This is the source code for early-access 3605. ## Legal Notice diff --git a/src/audio_core/renderer/adsp/audio_renderer.cpp b/src/audio_core/renderer/adsp/audio_renderer.cpp index fcf49b299..f4bf09a70 100755 --- a/src/audio_core/renderer/adsp/audio_renderer.cpp +++ b/src/audio_core/renderer/adsp/audio_renderer.cpp @@ -154,6 +154,11 @@ void AudioRenderer::ThreadFunc() { return; case RenderMessage::AudioRenderer_Render: { + if (system.IsShuttingDown()) [[unlikely]] { + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + mailbox->ADSPSendMessage(RenderMessage::AudioRenderer_RenderResponse); + continue; + } std::array buffers_reset{}; std::array render_times_taken{}; const auto start_time{system.CoreTiming().GetClockTicks()}; diff --git a/src/audio_core/renderer/system_manager.cpp b/src/audio_core/renderer/system_manager.cpp index 5f96579b8..ee9a416fa 100755 --- a/src/audio_core/renderer/system_manager.cpp +++ b/src/audio_core/renderer/system_manager.cpp @@ -27,7 +27,7 @@ bool SystemManager::InitializeUnsafe() { if (!active) { if (adsp.Start()) { active = true; - thread = std::jthread([this](std::stop_token stop_token) { ThreadFunc(); }); + thread = std::jthread([this](std::stop_token stop_token) { ThreadFunc(stop_token); }); } } @@ -39,8 +39,7 @@ void SystemManager::Stop() { return; } active = false; - update.store(true); - update.notify_all(); + thread.request_stop(); thread.join(); adsp.Stop(); } @@ -85,12 +84,12 @@ bool SystemManager::Remove(System& system_) { return true; } -void SystemManager::ThreadFunc() { +void SystemManager::ThreadFunc(std::stop_token stop_token) { static constexpr char name[]{"AudioRenderSystemManager"}; MicroProfileOnThreadCreate(name); Common::SetCurrentThreadName(name); Common::SetCurrentThreadPriority(Common::ThreadPriority::High); - while (active) { + while (active && !stop_token.stop_requested()) { { std::scoped_lock l{mutex1}; diff --git a/src/audio_core/renderer/system_manager.h b/src/audio_core/renderer/system_manager.h index cfaa4053b..1e14102ec 100755 --- a/src/audio_core/renderer/system_manager.h +++ b/src/audio_core/renderer/system_manager.h @@ -66,13 +66,7 @@ private: /** * Main thread responsible for command generation. */ - void ThreadFunc(); - - enum class StreamState { - Filling, - Steady, - Draining, - }; + void ThreadFunc(std::stop_token stop_token); /// Core system Core::System& core; @@ -90,8 +84,6 @@ private: ADSP::ADSP& adsp; /// AudioRenderer mailbox for communication ADSP::AudioRenderer_Mailbox* mailbox{}; - /// Atomic for main thread to wait on - std::atomic update{}; }; } // namespace AudioCore::AudioRenderer diff --git a/src/audio_core/sink/sink_stream.cpp b/src/audio_core/sink/sink_stream.cpp index d57be6189..2dfc777ed 100755 --- a/src/audio_core/sink/sink_stream.cpp +++ b/src/audio_core/sink/sink_stream.cpp @@ -270,8 +270,8 @@ u64 SinkStream::GetExpectedPlayedSampleCount() { void SinkStream::WaitFreeSpace() { std::unique_lock lk{release_mutex}; - release_cv.wait( - lk, [this]() { return queued_buffers < max_queue_size || system.IsShuttingDown(); }); + release_cv.wait_for(lk, std::chrono::milliseconds(5), + [this]() { return queued_buffers < max_queue_size; }); } } // namespace AudioCore::Sink diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index df8780128..2e80d7cd2 100755 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h @@ -144,7 +144,7 @@ public: return state_tracker; } - void CheckFeedbackLoop(ImageView& image_view) const noexcept { + void BarrierFeedbackLoop() const noexcept { // OpenGL does not require a barrier for attachment feedback loops. } diff --git a/src/video_core/renderer_vulkan/pipeline_helper.h b/src/video_core/renderer_vulkan/pipeline_helper.h index 8518205c6..ee7f08a2b 100755 --- a/src/video_core/renderer_vulkan/pipeline_helper.h +++ b/src/video_core/renderer_vulkan/pipeline_helper.h @@ -175,7 +175,6 @@ public: std::array words{}; }; -template inline void PushImageDescriptors(TextureCache& texture_cache, GuestDescriptorQueue& guest_descriptor_queue, const Shader::Info& info, RescalingPushConstant& rescaling, @@ -193,9 +192,6 @@ inline void PushImageDescriptors(TextureCache& texture_cache, const VkImageView vk_image_view{image_view.Handle(desc.type)}; guest_descriptor_queue.AddSampledImage(vk_image_view, sampler); rescaling.PushTexture(texture_cache.IsRescaling(image_view)); - if constexpr (CheckFeedbackLoop) { - texture_cache.CheckFeedbackLoop(image_view); - } } } for (const auto& desc : info.image_descriptors) { @@ -207,9 +203,6 @@ inline void PushImageDescriptors(TextureCache& texture_cache, const VkImageView vk_image_view{image_view.StorageView(desc.type, desc.format)}; guest_descriptor_queue.AddImage(vk_image_view); rescaling.PushImage(texture_cache.IsRescaling(image_view)); - if constexpr (CheckFeedbackLoop) { - texture_cache.CheckFeedbackLoop(image_view); - } } } } diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 6225e4abc..166390869 100755 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -457,8 +457,8 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { const VideoCommon::ImageViewInOut* views_it{views.data()}; const auto prepare_stage{[&](size_t stage) LAMBDA_FORCEINLINE { buffer_cache.BindHostStageBuffers(stage); - PushImageDescriptors(texture_cache, guest_descriptor_queue, stage_infos[stage], - rescaling, samplers_it, views_it); + PushImageDescriptors(texture_cache, guest_descriptor_queue, stage_infos[stage], rescaling, + samplers_it, views_it); const auto& info{stage_infos[0]}; if (info.uses_render_area) { render_area.uses_render_area = true; @@ -481,12 +481,13 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { if constexpr (Spec::enabled_stages[4]) { prepare_stage(4); } + texture_cache.UpdateRenderTargets(false); + texture_cache.CheckFeedbackLoop(views); ConfigureDraw(rescaling, render_area); } void GraphicsPipeline::ConfigureDraw(const RescalingPushConstant& rescaling, const RenderAreaPushConstant& render_area) { - texture_cache.UpdateRenderTargets(false); scheduler.RequestRenderpass(texture_cache.GetFramebuffer()); if (!is_built.load(std::memory_order::relaxed)) { diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index 160dfb322..074b4b4df 100755 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -106,15 +106,6 @@ public: return *master_semaphore; } - [[nodiscard]] bool IsRenderpassImage(VkImage image) const noexcept { - for (u32 i = 0; i < num_renderpass_images; i++) { - if (image == renderpass_images[i]) { - return true; - } - } - return false; - } - std::mutex submit_mutex; private: diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 7d84a7e9f..8fa6b7ae2 100755 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -861,10 +861,8 @@ VkBuffer TextureCacheRuntime::GetTemporaryBuffer(size_t needed_size) { return *buffers[level]; } -void TextureCacheRuntime::CheckFeedbackLoop(ImageView& image_view) { - if (scheduler.IsRenderpassImage(image_view.ImageHandle())) { - scheduler.RequestOutsideRenderPassOperationContext(); - } +void TextureCacheRuntime::BarrierFeedbackLoop() { + scheduler.RequestOutsideRenderPassOperationContext(); } void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src, diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index fddd46c28..779dfd77c 100755 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -103,7 +103,7 @@ public: [[nodiscard]] VkBuffer GetTemporaryBuffer(size_t needed_size); - void CheckFeedbackLoop(ImageView& image_view); + void BarrierFeedbackLoop(); const Device& device; Scheduler& scheduler; diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 43400c23f..28872c3f9 100755 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -182,6 +182,42 @@ void TextureCache

::FillComputeImageViews(std::span views) { views); } +template +void TextureCache

::CheckFeedbackLoop(std::span views) { + const bool requires_barrier = [&] { + for (const auto& view : views) { + if (!view.id) { + continue; + } + auto& image_view = slot_image_views[view.id]; + + // Check color targets + for (const auto& ct_view_id : render_targets.color_buffer_ids) { + if (ct_view_id) { + auto& ct_view = slot_image_views[ct_view_id]; + if (image_view.image_id == ct_view.image_id) { + return true; + } + } + } + + // Check zeta target + if (render_targets.depth_buffer_id) { + auto& zt_view = slot_image_views[render_targets.depth_buffer_id]; + if (image_view.image_id == zt_view.image_id) { + return true; + } + } + } + + return false; + }(); + + if (requires_barrier) { + runtime.BarrierFeedbackLoop(); + } +} + template typename P::Sampler* TextureCache

::GetGraphicsSampler(u32 index) { if (index > channel_state->graphics_sampler_table.Limit()) { @@ -2374,11 +2410,6 @@ bool TextureCache

::IsFullClear(ImageViewId id) { scissor.max_y >= size.height; } -template -void TextureCache

::CheckFeedbackLoop(ImageView& image_view) { - runtime.CheckFeedbackLoop(image_view); -} - template void TextureCache

::CreateChannel(struct Tegra::Control::ChannelState& channel) { VideoCommon::ChannelSetupCaches::CreateChannel(channel); diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h index c69eb3925..d7e73c732 100755 --- a/src/video_core/texture_cache/texture_cache_base.h +++ b/src/video_core/texture_cache/texture_cache_base.h @@ -148,6 +148,9 @@ public: /// Fill image_view_ids with the compute images in indices void FillComputeImageViews(std::span views); + /// Handle feedback loops during draws. + void CheckFeedbackLoop(std::span views); + /// Get the sampler from the graphics descriptor table in the specified index Sampler* GetGraphicsSampler(u32 index); @@ -224,9 +227,6 @@ public: [[nodiscard]] bool IsRescaling(const ImageViewBase& image_view) const noexcept; - /// Handle feedback loops during draws. - void CheckFeedbackLoop(ImageView& image_view); - /// Create channel state. void CreateChannel(Tegra::Control::ChannelState& channel) final override; diff --git a/src/video_core/textures/bcn.cpp b/src/video_core/textures/bcn.cpp index 248c57c3a..671212a49 100755 --- a/src/video_core/textures/bcn.cpp +++ b/src/video_core/textures/bcn.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include "common/alignment.h" #include "video_core/textures/bcn.h"