From a311e896d778c9d29c9249b4799cc68757d629f5 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Fri, 25 Jul 2025 12:24:29 +0200 Subject: [PATCH 1/4] fix storage buffer cache for jamboree etc. --- src/core/hle/service/am/applet.h | 1 + .../am/service/application_functions.cpp | 17 +++++++++++++++-- src/video_core/buffer_cache/buffer_cache.h | 9 +++++++++ .../renderer_vulkan/vk_graphics_pipeline.cpp | 5 ++--- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/core/hle/service/am/applet.h b/src/core/hle/service/am/applet.h index 571904fab4..835cfe6ec8 100644 --- a/src/core/hle/service/am/applet.h +++ b/src/core/hle/service/am/applet.h @@ -92,6 +92,7 @@ struct Applet { // Channels std::deque> user_channel_launch_parameter{}; std::deque> preselected_user_launch_parameter{}; + std::deque> friend_invitation_storage_channel{}; // Caller applet std::weak_ptr caller_applet{}; diff --git a/src/core/hle/service/am/service/application_functions.cpp b/src/core/hle/service/am/service/application_functions.cpp index 3bab5ac5f1..560244c714 100644 --- a/src/core/hle/service/am/service/application_functions.cpp +++ b/src/core/hle/service/am/service/application_functions.cpp @@ -456,8 +456,21 @@ Result IApplicationFunctions::GetFriendInvitationStorageChannelEvent( Result IApplicationFunctions::TryPopFromFriendInvitationStorageChannel( Out> out_storage) { - LOG_INFO(Service_AM, "(STUBBED) called"); - R_THROW(AM::ResultNoDataInChannel); + LOG_DEBUG(Service_AM, "called"); + + std::scoped_lock lk{m_applet->lock}; + + auto& channel = m_applet->friend_invitation_storage_channel; + + if (channel.empty()) { + return AM::ResultNoDataInChannel; + } + + auto data = channel.back(); + channel.pop_back(); + + *out_storage = std::make_shared(system, std::move(data)); + R_SUCCEED(); } Result IApplicationFunctions::GetNotificationStorageChannelEvent( diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index a6e87a3583..081a98b7fb 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -467,6 +467,10 @@ void BufferCache

::BindComputeStorageBuffer(size_t ssbo_index, u32 cbuf_index, channel_state->written_compute_storage_buffers |= (is_written ? 1U : 0U) << ssbo_index; const auto& launch_desc = kepler_compute->launch_description; + if (((launch_desc.const_buffer_enable_mask >> cbuf_index) & 1) == 0) { + LOG_WARNING(HW_GPU, "Skipped binding SSBO: cbuf index {} is not enabled", cbuf_index); + return; + } ASSERT(((launch_desc.const_buffer_enable_mask >> cbuf_index) & 1) != 0); const auto& cbufs = launch_desc.const_buffer_config; @@ -1701,6 +1705,11 @@ template Binding BufferCache

::StorageBufferBinding(GPUVAddr ssbo_addr, u32 cbuf_index, bool is_written) const { const GPUVAddr gpu_addr = gpu_memory->Read(ssbo_addr); + + if (gpu_addr == 0) { + return NULL_BINDING; + } + const auto size = [&]() { const bool is_nvn_cbuf = cbuf_index == 0; // The NVN driver buffer (index 0) is known to pack the SSBO address followed by its size. diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 0d07e89b6b..ddd29e7acf 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -324,9 +324,8 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { size_t ssbo_index{}; for (const auto& desc : info.storage_buffers_descriptors) { ASSERT(desc.count == 1); - if (!buffer_cache.BindGraphicsStorageBuffer(stage, ssbo_index, desc.cbuf_index, - desc.cbuf_offset, desc.is_written)) - return false; + buffer_cache.BindGraphicsStorageBuffer(stage, ssbo_index, desc.cbuf_index, + desc.cbuf_offset, desc.is_written); ++ssbo_index; } } -- 2.39.5 From d7e27b804f50f4b50cfdc6ca48830ea51beab26c Mon Sep 17 00:00:00 2001 From: Maufeat Date: Fri, 25 Jul 2025 13:05:28 +0200 Subject: [PATCH 2/4] disable log spam, fixes actual performance lol --- externals/dynarmic/externals/catch | 2 +- externals/dynarmic/externals/fmt | 2 +- externals/dynarmic/externals/xbyak | 2 +- externals/dynarmic/externals/zycore-c | 2 +- externals/dynarmic/externals/zydis | 2 +- src/video_core/buffer_cache/buffer_cache.h | 2 +- src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | 5 +++-- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/externals/dynarmic/externals/catch b/externals/dynarmic/externals/catch index 5aa8d11321..74fcff6e5b 160000 --- a/externals/dynarmic/externals/catch +++ b/externals/dynarmic/externals/catch @@ -1 +1 @@ -Subproject commit 5aa8d113215bd9a97ecc1a2f3fc9506947a2fa57 +Subproject commit 74fcff6e5b190fb833a231b7f7c1829e3c3ac54d diff --git a/externals/dynarmic/externals/fmt b/externals/dynarmic/externals/fmt index 35dcc58263..02de29e003 160000 --- a/externals/dynarmic/externals/fmt +++ b/externals/dynarmic/externals/fmt @@ -1 +1 @@ -Subproject commit 35dcc58263d6b55419a5932bd6b0b3029a0a8c00 +Subproject commit 02de29e00321787fa515ca60f0f5911e61892dc6 diff --git a/externals/dynarmic/externals/xbyak b/externals/dynarmic/externals/xbyak index 12557954c6..44a72f3692 160000 --- a/externals/dynarmic/externals/xbyak +++ b/externals/dynarmic/externals/xbyak @@ -1 +1 @@ -Subproject commit 12557954c68a780563f9ab9fc24a3a156c96cba1 +Subproject commit 44a72f369268f7d552650891b296693e91db86bb diff --git a/externals/dynarmic/externals/zycore-c b/externals/dynarmic/externals/zycore-c index 75a36c45ae..7ad36e5211 160000 --- a/externals/dynarmic/externals/zycore-c +++ b/externals/dynarmic/externals/zycore-c @@ -1 +1 @@ -Subproject commit 75a36c45ae1ad382b0f4e0ede0af84c11ee69928 +Subproject commit 7ad36e52110b39cfb62b47bfdb6def94ac531309 diff --git a/externals/dynarmic/externals/zydis b/externals/dynarmic/externals/zydis index c2d2bab025..6372690e30 160000 --- a/externals/dynarmic/externals/zydis +++ b/externals/dynarmic/externals/zydis @@ -1 +1 @@ -Subproject commit c2d2bab0255e53a7c3e9b615f4eb69449eb942df +Subproject commit 6372690e30389a94db65ece2d8a1f0a2310475ed diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 081a98b7fb..66db162c5d 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -1732,7 +1732,7 @@ Binding BufferCache

::StorageBufferBinding(GPUVAddr ssbo_addr, u32 cbuf_index, const std::optional aligned_device_addr = gpu_memory->GpuToCpuAddress(aligned_gpu_addr); if (!aligned_device_addr || size == 0) { - LOG_WARNING(HW_GPU, "Failed to find storage buffer for cbuf index {}", cbuf_index); + LOG_DEBUG(HW_GPU, "Failed to find storage buffer for cbuf index {}", cbuf_index); return NULL_BINDING; } const std::optional device_addr = gpu_memory->GpuToCpuAddress(gpu_addr); diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index ddd29e7acf..6c5a52d659 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -324,8 +324,9 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { size_t ssbo_index{}; for (const auto& desc : info.storage_buffers_descriptors) { ASSERT(desc.count == 1); - buffer_cache.BindGraphicsStorageBuffer(stage, ssbo_index, desc.cbuf_index, - desc.cbuf_offset, desc.is_written); + if (!buffer_cache.BindGraphicsStorageBuffer(stage, ssbo_index, desc.cbuf_index, + desc.cbuf_offset, desc.is_written)) + continue; ++ssbo_index; } } -- 2.39.5 From 5929a7a07f50a4127a5e29b47192d3394e705d23 Mon Sep 17 00:00:00 2001 From: crueter Date: Sat, 26 Jul 2025 19:14:18 -0400 Subject: [PATCH 3/4] fix externals Signed-off-by: crueter --- externals/dynarmic/externals/catch | 2 +- externals/dynarmic/externals/fmt | 2 +- externals/dynarmic/externals/xbyak | 2 +- externals/dynarmic/externals/zycore-c | 2 +- externals/dynarmic/externals/zydis | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/externals/dynarmic/externals/catch b/externals/dynarmic/externals/catch index 74fcff6e5b..5aa8d11321 160000 --- a/externals/dynarmic/externals/catch +++ b/externals/dynarmic/externals/catch @@ -1 +1 @@ -Subproject commit 74fcff6e5b190fb833a231b7f7c1829e3c3ac54d +Subproject commit 5aa8d113215bd9a97ecc1a2f3fc9506947a2fa57 diff --git a/externals/dynarmic/externals/fmt b/externals/dynarmic/externals/fmt index 02de29e003..35dcc58263 160000 --- a/externals/dynarmic/externals/fmt +++ b/externals/dynarmic/externals/fmt @@ -1 +1 @@ -Subproject commit 02de29e00321787fa515ca60f0f5911e61892dc6 +Subproject commit 35dcc58263d6b55419a5932bd6b0b3029a0a8c00 diff --git a/externals/dynarmic/externals/xbyak b/externals/dynarmic/externals/xbyak index 44a72f3692..12557954c6 160000 --- a/externals/dynarmic/externals/xbyak +++ b/externals/dynarmic/externals/xbyak @@ -1 +1 @@ -Subproject commit 44a72f369268f7d552650891b296693e91db86bb +Subproject commit 12557954c68a780563f9ab9fc24a3a156c96cba1 diff --git a/externals/dynarmic/externals/zycore-c b/externals/dynarmic/externals/zycore-c index 7ad36e5211..75a36c45ae 160000 --- a/externals/dynarmic/externals/zycore-c +++ b/externals/dynarmic/externals/zycore-c @@ -1 +1 @@ -Subproject commit 7ad36e52110b39cfb62b47bfdb6def94ac531309 +Subproject commit 75a36c45ae1ad382b0f4e0ede0af84c11ee69928 diff --git a/externals/dynarmic/externals/zydis b/externals/dynarmic/externals/zydis index 6372690e30..c2d2bab025 160000 --- a/externals/dynarmic/externals/zydis +++ b/externals/dynarmic/externals/zydis @@ -1 +1 @@ -Subproject commit 6372690e30389a94db65ece2d8a1f0a2310475ed +Subproject commit c2d2bab0255e53a7c3e9b615f4eb69449eb942df -- 2.39.5 From d532f67863e10ef77cffe9d9315e779f4c30cb75 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Sun, 27 Jul 2025 02:19:20 +0200 Subject: [PATCH 4/4] should do that --- src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 6c5a52d659..ddd29e7acf 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -324,9 +324,8 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { size_t ssbo_index{}; for (const auto& desc : info.storage_buffers_descriptors) { ASSERT(desc.count == 1); - if (!buffer_cache.BindGraphicsStorageBuffer(stage, ssbo_index, desc.cbuf_index, - desc.cbuf_offset, desc.is_written)) - continue; + buffer_cache.BindGraphicsStorageBuffer(stage, ssbo_index, desc.cbuf_index, + desc.cbuf_offset, desc.is_written); ++ssbo_index; } } -- 2.39.5