diff --git a/src/core/hle/service/nvnflinger/hardware_composer.cpp b/src/core/hle/service/nvnflinger/hardware_composer.cpp index 9ac56e17bb..5decb791e1 100644 --- a/src/core/hle/service/nvnflinger/hardware_composer.cpp +++ b/src/core/hle/service/nvnflinger/hardware_composer.cpp @@ -57,21 +57,8 @@ u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, Display& display, // Set default speed limit to 100%. *out_speed_scale = 1.0f; - // If no layers are visible, skip the logic. Acquiring and holding buffers here would - // consume the producer's queue without ever presenting. - bool any_visible = false; - for (auto& layer : display.stack.layers) { - if (layer->visible) { - any_visible = true; - break; - } - } - if (!any_visible) { - return 1; - } - - // Wait for the previous composite, bounding the number of in-flight composites. nvdisp.WaitForComposite(); + this->ReleaseFramebuffersLocked(display); // Determine the number of vsync periods to wait before composing again. std::optional swap_interval{}; @@ -165,13 +152,6 @@ u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, Display& display, // Advance by 1 frame (60 FPS compositing) m_frame_number += 1; - // Release framebuffers once the frame has been handed to the compositor. This happens - // within the same vsync period as the acquire (release_frame_number is checked against - // the advanced counter), so the producer gets its buffers back immediately instead of - // losing a queue slot for a whole frame. - // TODO: support release fences; releasing before the composite has finished can tear. - this->ReleaseFramebuffersLocked(display); - return 1; } diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index ded92d3f1d..047e7eb6d8 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp @@ -83,20 +83,21 @@ void Joycons::ScanThread(std::stop_token stop_token) { constexpr u16 nintendo_vendor_id = 0x057e; Common::SetCurrentThreadName("JoyconScanThread"); + auto last_ret = 0u; do { - SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); - SDL_hid_device_info* cur_dev = devs; - - while (cur_dev) { - if (IsDeviceNew(cur_dev)) { - LOG_DEBUG(Input, "Device Found,type : {:04X} {:04X}", cur_dev->vendor_id, - cur_dev->product_id); - RegisterNewDevice(cur_dev); + auto ret = SDL_hid_device_change_count(); + if (last_ret == 0u || last_ret != ret) { + last_ret = ret; + SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); + for (auto* cur_dev = devs; cur_dev; cur_dev = cur_dev->next) { + if (IsDeviceNew(cur_dev)) { + LOG_DEBUG(Input, "Device Found,type : {:04X} {:04X}", cur_dev->vendor_id, cur_dev->product_id); + RegisterNewDevice(cur_dev); + } + cur_dev = cur_dev->next; } - cur_dev = cur_dev->next; + SDL_hid_free_enumeration(devs); } - - SDL_hid_free_enumeration(devs); } while (Common::StoppableTimedWait(stop_token, std::chrono::seconds{5})); }