From 6e9d603314a9c4049c8559e6563292ee43ca7bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 13 May 2026 22:57:38 +0200 Subject: [PATCH 1/4] Bump langtool/Cargo.lock --- Tools/langtool/Cargo.lock | 78 +++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 44 deletions(-) diff --git a/Tools/langtool/Cargo.lock b/Tools/langtool/Cargo.lock index 6c5a6d1dadaa..bbdfbfe047fa 100644 --- a/Tools/langtool/Cargo.lock +++ b/Tools/langtool/Cargo.lock @@ -81,9 +81,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.16.3" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec6fb3fe69024a75fa7e1bfb48aa6cf59706a101658ea01bfd33b2b248a038f" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" dependencies = [ "aws-lc-sys", "zeroize", @@ -91,9 +91,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.40.0" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" dependencies = [ "cc", "cmake", @@ -139,9 +139,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.61" +version = "1.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" dependencies = [ "find-msvc-tools", "jobserver", @@ -492,9 +492,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" dependencies = [ "atomic-waker", "bytes", @@ -520,9 +520,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" @@ -746,7 +746,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.17.0", + "hashbrown 0.17.1", "serde", "serde_core", ] @@ -757,16 +757,6 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -840,9 +830,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.97" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ "cfg-if", "futures-util", @@ -1685,9 +1675,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.1" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -1737,20 +1727,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "68d6fdd9f81c2819c9a8b0e0cd91660e7746a8e6ea2ba7c6b2b057985f6bcb51" dependencies = [ "bitflags 2.11.1", "bytes", "futures-util", "http", "http-body", - "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -1888,9 +1878,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if", "once_cell", @@ -1901,9 +1891,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.70" +version = "0.4.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af934872acec734c2d80e6617bbb5ff4f12b052dd8e6332b0817bce889516084" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" dependencies = [ "js-sys", "wasm-bindgen", @@ -1911,9 +1901,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1921,9 +1911,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -1934,9 +1924,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] @@ -2036,9 +2026,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.97" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" dependencies = [ "js-sys", "wasm-bindgen", @@ -2390,9 +2380,9 @@ dependencies = [ [[package]] name = "wl-clipboard-rs" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "981a303dfbb75d659f6612d05a14b2e363c103d24f676a2d44a00d18507a1ad9" +checksum = "0e1b0451f89e40310b8ef524c068cadca8bf0c974cd31c384f210c4ba2095617" dependencies = [ "derive-new", "libc", @@ -2494,9 +2484,9 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] From 85ddf03c4b9dffe9e95eade97508929e971e8e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 13 May 2026 22:59:07 +0200 Subject: [PATCH 2/4] Vulkan: Remove deprecated use of device layers --- Common/GPU/Vulkan/VulkanContext.cpp | 72 ++++++----------------------- Common/GPU/Vulkan/VulkanContext.h | 8 +--- 2 files changed, 15 insertions(+), 65 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index 50b4f724a276..9b384731eb06 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -125,12 +125,11 @@ VkResult VulkanContext::CreateInstance(const CreateInfo &info) { } instance_layer_names_.clear(); - device_layer_names_.clear(); // We can get the list of layers and extensions without an instance so we can use this information // to enable the extensions we need that are available. GetInstanceLayerProperties(); - GetInstanceLayerExtensionList(nullptr, instance_extension_properties_); + GetInstanceLayerExtensionList(nullptr, &instance_extension_properties_); if (!IsInstanceExtensionAvailable(VK_KHR_SURFACE_EXTENSION_NAME)) { // Cannot create a Vulkan display without VK_KHR_SURFACE_EXTENSION. @@ -176,7 +175,6 @@ VkResult VulkanContext::CreateInstance(const CreateInfo &info) { // Enable the validation layers for (size_t i = 0; i < ARRAY_SIZE(validationLayers); i++) { instance_layer_names_.push_back(validationLayers[i]); - device_layer_names_.push_back(validationLayers[i]); } instance_extensions_enabled_.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); extensionsLookup_.EXT_debug_utils = true; @@ -234,7 +232,6 @@ VkResult VulkanContext::CreateInstance(const CreateInfo &info) { WARN_LOG(Log::G3D, "Validation on but instance layer not available - dropping layers"); // Drop the validation layers and try again. instance_layer_names_.clear(); - device_layer_names_.clear(); inst_info.enabledLayerCount = 0; inst_info.ppEnabledLayerNames = nullptr; res = vkCreateInstance(&inst_info, nullptr, &instance_); @@ -403,7 +400,7 @@ void VulkanContext::DestroySurface() { } } -VkResult VulkanContext::GetInstanceLayerExtensionList(const char *layerName, std::vector &extensions) { +VkResult VulkanContext::GetInstanceLayerExtensionList(const char *layerName, std::vector *extensions) { VkResult res; do { uint32_t instance_extension_count; @@ -412,8 +409,8 @@ VkResult VulkanContext::GetInstanceLayerExtensionList(const char *layerName, std return res; if (instance_extension_count == 0) return VK_SUCCESS; - extensions.resize(instance_extension_count); - res = vkEnumerateInstanceExtensionProperties(layerName, &instance_extension_count, extensions.data()); + extensions->resize(instance_extension_count); + res = vkEnumerateInstanceExtensionProperties(layerName, &instance_extension_count, extensions->data()); } while (res == VK_INCOMPLETE); return res; } @@ -445,10 +442,11 @@ VkResult VulkanContext::GetInstanceLayerProperties() { } while (res == VK_INCOMPLETE); // Now gather the extension list for each instance layer. + // (TODO: Is this meaningful, or used for anything?) for (uint32_t i = 0; i < instance_layer_count; i++) { LayerProperties layer_props; layer_props.properties = vk_props[i]; - res = GetInstanceLayerExtensionList(layer_props.properties.layerName, layer_props.extensions); + res = GetInstanceLayerExtensionList(layer_props.properties.layerName, &layer_props.extensions); if (res != VK_SUCCESS) return res; instance_layer_properties_.push_back(layer_props); @@ -456,60 +454,21 @@ VkResult VulkanContext::GetInstanceLayerProperties() { return res; } -// Pass layerName == nullptr to get the extension list for the device. -VkResult VulkanContext::GetDeviceLayerExtensionList(const char *layerName, std::vector &extensions) { +VkResult VulkanContext::GetDeviceExtensionList(std::vector *extensions) { VkResult res; do { uint32_t device_extension_count; - res = vkEnumerateDeviceExtensionProperties(physical_devices_[physical_device_], layerName, &device_extension_count, nullptr); + res = vkEnumerateDeviceExtensionProperties(physical_devices_[physical_device_], nullptr, &device_extension_count, nullptr); if (res != VK_SUCCESS) return res; if (!device_extension_count) return VK_SUCCESS; - extensions.resize(device_extension_count); - res = vkEnumerateDeviceExtensionProperties(physical_devices_[physical_device_], layerName, &device_extension_count, extensions.data()); + extensions->resize(device_extension_count); + res = vkEnumerateDeviceExtensionProperties(physical_devices_[physical_device_], nullptr, &device_extension_count, extensions->data()); } while (res == VK_INCOMPLETE); return res; } -VkResult VulkanContext::GetDeviceLayerProperties() { - /* - * It's possible, though very rare, that the number of - * instance layers could change. For example, installing something - * could include new layers that the loader would pick up - * between the initial query for the count and the - * request for VkLayerProperties. The loader indicates that - * by returning a VK_INCOMPLETE status and will update the - * the count parameter. - * The count parameter will be updated with the number of - * entries loaded into the data pointer - in case the number - * of layers went down or is smaller than the size given. - */ - uint32_t device_layer_count; - std::vector vk_props; - VkResult res; - do { - res = vkEnumerateDeviceLayerProperties(physical_devices_[physical_device_], &device_layer_count, nullptr); - if (res != VK_SUCCESS) - return res; - if (device_layer_count == 0) - return VK_SUCCESS; - vk_props.resize(device_layer_count); - res = vkEnumerateDeviceLayerProperties(physical_devices_[physical_device_], &device_layer_count, vk_props.data()); - } while (res == VK_INCOMPLETE); - - // Gather the list of extensions for each device layer. - for (uint32_t i = 0; i < device_layer_count; i++) { - LayerProperties layer_props; - layer_props.properties = vk_props[i]; - res = GetDeviceLayerExtensionList(layer_props.properties.layerName, layer_props.extensions); - if (res != VK_SUCCESS) - return res; - device_layer_properties_.push_back(layer_props); - } - return res; -} - // Returns true if all layer names specified in check_names can be found in given layer properties. bool VulkanContext::CheckLayers(const std::vector &layer_props, const std::vector &layer_names) const { uint32_t check_count = (uint32_t)layer_names.size(); @@ -609,11 +568,6 @@ VkResult VulkanContext::CreateDevice(int physical_device) { vulkanDeviceApiVersion_ = physicalDeviceProperties_[physical_device].properties.apiVersion; - GetDeviceLayerProperties(); - if (!CheckLayers(device_layer_properties_, device_layer_names_)) { - WARN_LOG(Log::G3D, "CheckLayers for device %d failed", physical_device); - } - queue_count = 0; vkGetPhysicalDeviceQueueFamilyProperties(physical_devices_[physical_device_], &queue_count, nullptr); _dbg_assert_(queue_count >= 1); @@ -662,7 +616,7 @@ VkResult VulkanContext::CreateDevice(int physical_device) { (memory_properties_.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) ? "HOST_COHERENT " : ""); } - GetDeviceLayerExtensionList(nullptr, device_extension_properties_); + GetDeviceExtensionList(&device_extension_properties_); device_extensions_enabled_.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME); @@ -824,8 +778,8 @@ VkResult VulkanContext::CreateDevice(int physical_device) { VkDeviceCreateInfo device_info{ VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO }; device_info.queueCreateInfoCount = 1; device_info.pQueueCreateInfos = &queue_info; - device_info.enabledLayerCount = (uint32_t)device_layer_names_.size(); - device_info.ppEnabledLayerNames = device_info.enabledLayerCount ? device_layer_names_.data() : nullptr; + device_info.enabledLayerCount = 0; + device_info.ppEnabledLayerNames = nullptr; device_info.enabledExtensionCount = (uint32_t)device_extensions_enabled_.size(); device_info.ppEnabledExtensionNames = device_info.enabledExtensionCount ? device_extensions_enabled_.data() : nullptr; diff --git a/Common/GPU/Vulkan/VulkanContext.h b/Common/GPU/Vulkan/VulkanContext.h index 1777b5732f8a..617d231de51b 100644 --- a/Common/GPU/Vulkan/VulkanContext.h +++ b/Common/GPU/Vulkan/VulkanContext.h @@ -302,11 +302,10 @@ class VulkanContext { return queueFamilyProperties_[family]; } - VkResult GetInstanceLayerExtensionList(const char *layerName, std::vector &extensions); + VkResult GetInstanceLayerExtensionList(const char *layerName, std::vector *extensions); VkResult GetInstanceLayerProperties(); - VkResult GetDeviceLayerExtensionList(const char *layerName, std::vector &extensions); - VkResult GetDeviceLayerProperties(); + VkResult GetDeviceExtensionList(std::vector *extensions); const std::vector &GetDeviceExtensionsAvailable() const { return device_extension_properties_; @@ -479,9 +478,6 @@ class VulkanContext { std::vector instance_extensions_enabled_; std::vector instance_extension_properties_; - std::vector device_layer_names_; - std::vector device_layer_properties_; - std::vector device_extensions_enabled_; std::vector device_extension_properties_; VulkanExtensions extensionsLookup_{}; From 27650fe3e46d9c7a6b896222b92a39d2963b5ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 13 May 2026 23:08:05 +0200 Subject: [PATCH 3/4] Fix race condition during Vulkan startup --- GPU/Vulkan/TextureCacheVulkan.cpp | 8 +++----- GPU/Vulkan/TextureCacheVulkan.h | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 37d975b0f00a..242421e7f241 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -256,16 +256,14 @@ void TextureCacheVulkan::DeviceRestore(Draw::DrawContext *draw) { VkResult res = vkCreateSampler(vulkan->GetDevice(), &samp, nullptr, &samplerNearest_); _assert_(res == VK_SUCCESS); - VkCommandBuffer cmdInit = (VkCommandBuffer)draw_->GetNativeObject(Draw::NativeObject::INIT_COMMANDBUFFER); - CompileScalingShader(cmdInit); + CompileScalingShader(); computeShaderManager_.DeviceRestore(draw); } void TextureCacheVulkan::NotifyConfigChanged() { TextureCacheCommon::NotifyConfigChanged(); - VkCommandBuffer cmdInit = (VkCommandBuffer)draw_->GetNativeObject(Draw::NativeObject::INIT_COMMANDBUFFER); - CompileScalingShader(cmdInit); + CompileScalingShader(); } static std::string ReadShaderSrc(const Path &filename) { @@ -364,7 +362,7 @@ bool TextureCacheVulkan::CompileMultipassShader(VulkanContext *vulkan, const Tex return true; } -void TextureCacheVulkan::CompileScalingShader(VkCommandBuffer cmdInit) { +void TextureCacheVulkan::CompileScalingShader() { if (!draw_) { // Something is very wrong. return; diff --git a/GPU/Vulkan/TextureCacheVulkan.h b/GPU/Vulkan/TextureCacheVulkan.h index 9da40d692d80..b1d5abd8db26 100644 --- a/GPU/Vulkan/TextureCacheVulkan.h +++ b/GPU/Vulkan/TextureCacheVulkan.h @@ -121,7 +121,7 @@ class TextureCacheVulkan : public TextureCacheCommon { void BuildTexture(TexCacheEntry *const entry) override; - void CompileScalingShader(VkCommandBuffer cmdInit); + void CompileScalingShader(); bool CompileMultipassShader(VulkanContext *vulkan, const TextureShaderInfo &shaderInfo, std::string *error); void ClearScalingShaders(VulkanContext *vulkan); bool HasScalingShader() const; From d0cbe7679ca5cc21ed27b3f71e56f1a44f1a8884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 13 May 2026 23:12:43 +0200 Subject: [PATCH 4/4] README.md updates --- README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2213b1de89cb..53b0e058a7db 100644 --- a/README.md +++ b/README.md @@ -45,18 +45,20 @@ During this cycle, I've mostly focused on UX improvements. - Rendering fixes - Fix a bug in lens flare occlusion for the Syphon Filter games ([#21511]) + - Fix a bug in the software renderer ([#21648]) - Misc UI improvements - - Soft keyboard has more symbols ([#21625]) - - Basic deep link support on iOS ([#21615]) - - Fix file picker problems on some Android devices (regression) ([#21614]) + - Instant type-to-search in game browser ([#21559], [#21565], [#21630]) + - Fix file picker problems on some Android devices (regression) ([#21614], [#21656]) - Fix crash in text edit fields on Mac/iOS ([#21601]) - PSP DVD prototypes can now load directly ([#21599], [#21601]) - Cheat UI has been cleaned up and supports titles and comments natively ([#21590]) - - Instant type-to-search in game browser ([#21559], [#21565], [#21630]) - RetroAchievements subset display improvements ([#21536]) + - Basic deep link support on iOS ([#21615]) + - Soft keyboard has more symbols ([#21625]) - Other + - Fix important (but mostly rare) crash bug affecting games that draw a lot ([#21669]) - More plugin zip files can now auto-install ([#21556]) - Pause on lost-focus on Linux ([#21517]) - Frameskipping no longer breaks analog stick auto-rotation in GoW, however manual rotation still broken ([#21508]) @@ -67,6 +69,8 @@ During this cycle, I've mostly focused on UX improvements. - Fix music looping in Death JR ([#21490]) - Hide the save-load indicator in the corner by default ([#21528]) - Fix crash in the remote debugger, by Nemoumbra ([#21652]) + - Fix screenshot cropping bug ([#21665]) + - mfplat.dll is no longer required on Windows unless you need camera/microphone ([#21660]) What's new in 1.20.3 -------------------- @@ -538,3 +542,9 @@ See [history.md](history.md). [#21565]: https://github.com/hrydgard/ppsspp/issues/21565 "Improve search to support full-width chars and to clear search on navigation" [#21630]: https://github.com/hrydgard/ppsspp/issues/21630 "Refactor type-to-search code for reuse, use in cheats dialog" [#21595]: https://github.com/hrydgard/ppsspp/issues/21595 "loongarch: Fix Jit_WeightsU16Skin in VertexDecoderLoongArch64.cpp" +[#21648]: https://github.com/hrydgard/ppsspp/issues/21648 "Remove 2 cases for fast path for soft gpu" +[#21656]: https://github.com/hrydgard/ppsspp/issues/21656 "Fix the java exception reporting for Android file picker errors, fix some search issues" +[#21669]: https://github.com/hrydgard/ppsspp/issues/21669 "Add \"allocation slack\" to our pushbuffers. Fixes a memory overwrite bug" +[#21652]: https://github.com/hrydgard/ppsspp/issues/21652 "Critical bug in the remote debugger" +[#21665]: https://github.com/hrydgard/ppsspp/issues/21665 "Raw screenshot cropping fix" +[#21660]: https://github.com/hrydgard/ppsspp/issues/21660 "Remove the mfplat.dll hard dependency (now fully dynamic)." \ No newline at end of file