diff --git a/README.md b/README.md index bb381a831..62568aae4 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 2895. +This is the source code for early-access 2896. ## Legal Notice diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 1638bc41d..3b8b43994 100755 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -195,14 +195,16 @@ std::shared_ptr ARM_Dynarmic_32::MakeJit(Common::PageTable* if (page_table) { config.page_table = reinterpret_cast*>( page_table->pointers.data()); + config.absolute_offset_page_table = true; + config.page_table_pointer_mask_bits = Common::PageTable::ATTRIBUTE_BITS; + config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128; + config.only_detect_misalignment_via_page_table_on_page_boundary = true; + config.fastmem_pointer = page_table->fastmem_arena; + + config.fastmem_exclusive_access = config.fastmem_pointer != nullptr; + config.recompile_on_exclusive_fastmem_failure = true; } - config.absolute_offset_page_table = true; - config.page_table_pointer_mask_bits = Common::PageTable::ATTRIBUTE_BITS; - config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128; - config.only_detect_misalignment_via_page_table_on_page_boundary = true; - config.fastmem_exclusive_access = true; - config.recompile_on_exclusive_fastmem_failure = true; // Multi-process state config.processor_id = core_index; @@ -254,6 +256,7 @@ std::shared_ptr ARM_Dynarmic_32::MakeJit(Common::PageTable* } if (!Settings::values.cpuopt_fastmem) { config.fastmem_pointer = nullptr; + config.fastmem_exclusive_access = false; } if (!Settings::values.cpuopt_fastmem_exclusives) { config.fastmem_exclusive_access = false; diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 921a5a734..1d46f6d40 100755 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -250,7 +250,7 @@ std::shared_ptr ARM_Dynarmic_64::MakeJit(Common::PageTable* config.fastmem_address_space_bits = address_space_bits; config.silently_mirror_fastmem = false; - config.fastmem_exclusive_access = true; + config.fastmem_exclusive_access = config.fastmem_pointer != nullptr; config.recompile_on_exclusive_fastmem_failure = true; } @@ -314,6 +314,7 @@ std::shared_ptr ARM_Dynarmic_64::MakeJit(Common::PageTable* } if (!Settings::values.cpuopt_fastmem) { config.fastmem_pointer = nullptr; + config.fastmem_exclusive_access = false; } if (!Settings::values.cpuopt_fastmem_exclusives) { config.fastmem_exclusive_access = false; diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index 57d9c269d..f9f902c2d 100755 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp @@ -86,54 +86,16 @@ void EmulatedController::ReloadFromSettings() { } controller.colors_state.fullkey = { - .body = - { - .b = static_cast((player.body_color_left >> 16) & 0xFF), - .g = static_cast((player.body_color_left >> 8) & 0xFF), - .r = static_cast(player.body_color_left & 0xFF), - .a = 0xff, - }, - .button = - { - .b = static_cast((player.button_color_left >> 16) & 0xFF), - .g = static_cast((player.button_color_left >> 8) & 0xFF), - .r = static_cast(player.button_color_left & 0xFF), - .a = 0xff, - }, + .body = GetNpadColor(player.body_color_left), + .button = GetNpadColor(player.button_color_left), }; - controller.colors_state.left = { - .body = - { - .b = static_cast((player.body_color_left >> 16) & 0xFF), - .g = static_cast((player.body_color_left >> 8) & 0xFF), - .r = static_cast(player.body_color_left & 0xFF), - .a = 0xff, - }, - .button = - { - .b = static_cast((player.button_color_left >> 16) & 0xFF), - .g = static_cast((player.button_color_left >> 8) & 0xFF), - .r = static_cast(player.button_color_left & 0xFF), - .a = 0xff, - }, + .body = GetNpadColor(player.body_color_left), + .button = GetNpadColor(player.button_color_left), }; - - controller.colors_state.right = { - .body = - { - .b = static_cast((player.body_color_right >> 16) & 0xFF), - .g = static_cast((player.body_color_right >> 8) & 0xFF), - .r = static_cast(player.body_color_right & 0xFF), - .a = 0xff, - }, - .button = - { - .b = static_cast((player.button_color_right >> 16) & 0xFF), - .g = static_cast((player.button_color_right >> 8) & 0xFF), - .r = static_cast(player.button_color_right & 0xFF), - .a = 0xff, - }, + controller.colors_state.left = { + .body = GetNpadColor(player.body_color_right), + .button = GetNpadColor(player.button_color_right), }; // Other or debug controller should always be a pro controller @@ -1386,6 +1348,15 @@ const CameraState& EmulatedController::GetCamera() const { return controller.camera_state; } +NpadColor EmulatedController::GetNpadColor(u32 color) { + return { + .r = static_cast((color >> 16) & 0xFF), + .g = static_cast((color >> 8) & 0xFF), + .b = static_cast(color & 0xFF), + .a = 0xff, + }; +} + void EmulatedController::TriggerOnChange(ControllerTriggerType type, bool is_npad_service_update) { std::scoped_lock lock{callback_mutex}; for (const auto& poller_pair : callback_list) { diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h index 7658ed63b..c3aa8f9d3 100755 --- a/src/core/hid/emulated_controller.h +++ b/src/core/hid/emulated_controller.h @@ -424,6 +424,13 @@ private: */ void SetCamera(const Common::Input::CallbackStatus& callback); + /** + * Converts a color format from bgra to rgba + * @param color in bgra format + * @return NpadColor in rgba format + */ + NpadColor GetNpadColor(u32 color); + /** * Triggers a callback that something has changed on the controller status * @param type Input type of the event to trigger diff --git a/src/core/hid/hid_types.h b/src/core/hid/hid_types.h index 77b777897..e3b1cfbc6 100755 --- a/src/core/hid/hid_types.h +++ b/src/core/hid/hid_types.h @@ -328,9 +328,9 @@ struct TouchState { static_assert(sizeof(TouchState) == 0x28, "Touchstate is an invalid size"); struct NpadColor { - u8 b{}; - u8 g{}; u8 r{}; + u8 g{}; + u8 b{}; u8 a{}; }; static_assert(sizeof(NpadColor) == 4, "NpadColor is an invalid size"); diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 6edfcf9a8..706d9ba74 100755 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -33,10 +33,11 @@ VkSurfaceFormatKHR ChooseSwapSurfaceFormat(vk::Span formats) } VkPresentModeKHR ChooseSwapPresentMode(vk::Span modes) { - // Mailbox doesn't lock the application like fifo (vsync), prefer it + // Mailbox (triple buffering) doesn't lock the application like fifo (vsync), + // prefer it if vsync option is not selected const auto found_mailbox = std::find(modes.begin(), modes.end(), VK_PRESENT_MODE_MAILBOX_KHR); if (Settings::values.fullscreen_mode.GetValue() == Settings::FullscreenMode::Borderless && - found_mailbox != modes.end()) { + found_mailbox != modes.end() && !Settings::values.use_vsync.GetValue()) { return VK_PRESENT_MODE_MAILBOX_KHR; } if (!Settings::values.use_speed_limit.GetValue()) { diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui index 96de0b3d1..d6d819364 100755 --- a/src/yuzu/configuration/configure_graphics_advanced.ui +++ b/src/yuzu/configuration/configure_graphics_advanced.ui @@ -75,7 +75,7 @@ VSync prevents the screen from tearing, but some graphics cards have lower performance with VSync enabled. Keep it enabled if you don't notice a performance difference. - Use VSync (OpenGL only) + Use VSync