diff --git a/25350884f9ea1e3847f74617b0f5a419f21399bb.patch b/25350884f9ea1e3847f74617b0f5a419f21399bb.patch new file mode 100644 index 0000000..fc336f2 --- /dev/null +++ b/25350884f9ea1e3847f74617b0f5a419f21399bb.patch @@ -0,0 +1,93 @@ +From 25350884f9ea1e3847f74617b0f5a419f21399bb Mon Sep 17 00:00:00 2001 +From: Kelebek1 +Date: Wed, 20 Jul 2022 14:42:26 +0100 +Subject: [PATCH] Fix decode span out of bounds + +--- + .../renderer/command/data_source/decode.cpp | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/src/audio_core/renderer/command/data_source/decode.cpp b/src/audio_core/renderer/command/data_source/decode.cpp +index 0759a67ef3d..ed20ea5714f 100644 +--- a/src/audio_core/renderer/command/data_source/decode.cpp ++++ b/src/audio_core/renderer/command/data_source/decode.cpp +@@ -105,12 +105,10 @@ static u32 DecodeAdpcm(Core::Memory::Memory& memory, std::span out_buffer, + constexpr u32 NibblesPerFrame{16}; + + if (req.buffer == 0 || req.buffer_size == 0) { +- LOG_ERROR(Service_Audio, "Buffer is 0!"); + return 0; + } + + if (req.start_offset >= req.end_offset) { +- LOG_ERROR(Service_Audio, "Start offset greater than end offset!"); + return 0; + } + +@@ -122,8 +120,7 @@ static u32 DecodeAdpcm(Core::Memory::Memory& memory, std::span out_buffer, + end += 1; + } + +- if (end / 2 > req.buffer_size) { +- LOG_ERROR(Service_Audio, "End greater than buffer size!"); ++ if (req.buffer_size < end / 2) { + return 0; + } + +@@ -141,7 +138,7 @@ static u32 DecodeAdpcm(Core::Memory::Memory& memory, std::span out_buffer, + } + + const auto size{std::max((samples_to_process / 8U) * SamplesPerFrame, 8U)}; +- std::vector wavebuffer(size, 0); ++ std::vector wavebuffer(size); + memory.ReadBlockUnsafe(req.buffer + position_in_frame / 2, wavebuffer.data(), + wavebuffer.size()); + +@@ -239,7 +236,7 @@ void DecodeFromWaveBuffers(Core::Memory::Memory& memory, const DecodeFromWaveBuf + args.pitch}; + const auto size_required{fraction + remaining_sample_count * sample_rate_ratio}; + +- if (size_required.to_int_floor() < 0) { ++ if (size_required < 0) { + return; + } + +@@ -325,19 +322,22 @@ void DecodeFromWaveBuffers(Core::Memory::Memory& memory, const DecodeFromWaveBuf + switch (args.sample_format) { + case SampleFormat::PcmInt16: + samples_decoded = DecodePcm( +- memory, {&temp_buffer[temp_buffer_pos], args.sample_count}, decode_arg); ++ memory, {&temp_buffer[temp_buffer_pos], temp_buffer_pos - TempBufferSize}, ++ decode_arg); + break; + + case SampleFormat::PcmFloat: + samples_decoded = DecodePcm( +- memory, {&temp_buffer[temp_buffer_pos], args.sample_count}, decode_arg); ++ memory, {&temp_buffer[temp_buffer_pos], temp_buffer_pos - TempBufferSize}, ++ decode_arg); + break; + + case SampleFormat::Adpcm: { + decode_arg.adpcm_context = &voice_state.adpcm_context; + memory.ReadBlockUnsafe(args.data_address, &decode_arg.coefficients, args.data_size); + samples_decoded = DecodeAdpcm( +- memory, {&temp_buffer[temp_buffer_pos], args.sample_count}, decode_arg); ++ memory, {&temp_buffer[temp_buffer_pos], temp_buffer_pos - TempBufferSize}, ++ decode_arg); + } break; + + default: +diff --git a/src/audio_core/renderer/command/data_source/decode.cpp b/src/audio_core/renderer/command/data_source/decode.cpp +index ed20ea5714f..6d2fe4248f2 100644 +--- a/src/audio_core/renderer/command/data_source/decode.cpp ++++ b/src/audio_core/renderer/command/data_source/decode.cpp +@@ -108,7 +108,7 @@ static u32 DecodeAdpcm(Core::Memory::Memory& memory, std::span out_buffer, + return 0; + } + +- if (req.start_offset >= req.end_offset) { ++ if (req.end_offset < req.start_offset) { + return 0; + } + diff --git a/382b41b18f304fcd7aca76b004f7e19f52706d27.patch b/382b41b18f304fcd7aca76b004f7e19f52706d27.patch new file mode 100644 index 0000000..c45feac --- /dev/null +++ b/382b41b18f304fcd7aca76b004f7e19f52706d27.patch @@ -0,0 +1,40 @@ +From 382b41b18f304fcd7aca76b004f7e19f52706d27 Mon Sep 17 00:00:00 2001 +From: Liam +Date: Tue, 19 Jul 2022 17:46:26 -0400 +Subject: [PATCH] video_core: use correct byte size for framebuffer + +--- + src/video_core/renderer_vulkan/vk_blit_screen.cpp | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp +index 1ec8392e142f..4a1d96322239 100644 +--- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp ++++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp +@@ -87,8 +87,12 @@ u32 GetBytesPerPixel(const Tegra::FramebufferConfig& framebuffer) { + } + + std::size_t GetSizeInBytes(const Tegra::FramebufferConfig& framebuffer) { +- return static_cast(framebuffer.stride) * +- static_cast(framebuffer.height) * GetBytesPerPixel(framebuffer); ++ // TODO(Rodrigo): Read this from HLE ++ constexpr u32 block_height_log2 = 4; ++ const u32 bytes_per_pixel = GetBytesPerPixel(framebuffer); ++ const u64 size_bytes{Tegra::Texture::CalculateSize( ++ true, bytes_per_pixel, framebuffer.stride, framebuffer.height, 1, block_height_log2, 0)}; ++ return size_bytes; + } + + VkFormat GetFormat(const Tegra::FramebufferConfig& framebuffer) { +@@ -169,9 +173,8 @@ VkSemaphore BlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer, + // TODO(Rodrigo): Read this from HLE + constexpr u32 block_height_log2 = 4; + const u32 bytes_per_pixel = GetBytesPerPixel(framebuffer); +- const u64 size_bytes{Tegra::Texture::CalculateSize(true, bytes_per_pixel, +- framebuffer.stride, framebuffer.height, +- 1, block_height_log2, 0)}; ++ const u64 size_bytes{GetSizeInBytes(framebuffer)}; ++ + Tegra::Texture::UnswizzleTexture( + mapped_span.subspan(image_offset, size_bytes), std::span(host_ptr, size_bytes), + bytes_per_pixel, framebuffer.width, framebuffer.height, 1, block_height_log2, 0); diff --git a/org.yuzu_emu.yuzu.json b/org.yuzu_emu.yuzu.json index 0a29061..6acac85 100644 --- a/org.yuzu_emu.yuzu.json +++ b/org.yuzu_emu.yuzu.json @@ -265,6 +265,14 @@ { "type": "file", "path": "compatibility_list.json" + }, + { + "type": "patch", + "path": "382b41b18f304fcd7aca76b004f7e19f52706d27.patch" + }, + { + "type": "patch", + "path": "25350884f9ea1e3847f74617b0f5a419f21399bb.patch" } ] }