diff options
author | Charles Lombardo <clombardo169@gmail.com> | 2024-02-05 19:43:22 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-05 19:43:22 +0100 |
commit | a2f23746c26e0882ff8ffadc814a09859efe54e2 (patch) | |
tree | 67d9b2db9f75be979ffd8e14bc7e5521a454ad68 | |
parent | Merge pull request #12924 from liamwhite/pedantic-unsigned (diff) | |
parent | nvnflinger: release buffers before presentation sleep (diff) | |
download | yuzu-a2f23746c26e0882ff8ffadc814a09859efe54e2.tar yuzu-a2f23746c26e0882ff8ffadc814a09859efe54e2.tar.gz yuzu-a2f23746c26e0882ff8ffadc814a09859efe54e2.tar.bz2 yuzu-a2f23746c26e0882ff8ffadc814a09859efe54e2.tar.lz yuzu-a2f23746c26e0882ff8ffadc814a09859efe54e2.tar.xz yuzu-a2f23746c26e0882ff8ffadc814a09859efe54e2.tar.zst yuzu-a2f23746c26e0882ff8ffadc814a09859efe54e2.zip |
-rw-r--r-- | src/core/hle/service/nvnflinger/hardware_composer.cpp | 50 | ||||
-rw-r--r-- | src/core/hle/service/nvnflinger/hardware_composer.h | 2 | ||||
-rw-r--r-- | src/core/hle/service/nvnflinger/nvnflinger.cpp | 3 |
3 files changed, 27 insertions, 28 deletions
diff --git a/src/core/hle/service/nvnflinger/hardware_composer.cpp b/src/core/hle/service/nvnflinger/hardware_composer.cpp index c720dd1f8..ba2b5c28c 100644 --- a/src/core/hle/service/nvnflinger/hardware_composer.cpp +++ b/src/core/hle/service/nvnflinger/hardware_composer.cpp @@ -7,7 +7,6 @@ #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" #include "core/hle/service/nvnflinger/buffer_item.h" #include "core/hle/service/nvnflinger/buffer_item_consumer.h" -#include "core/hle/service/nvnflinger/buffer_queue_producer.h" #include "core/hle/service/nvnflinger/hardware_composer.h" #include "core/hle/service/nvnflinger/hwc_layer.h" #include "core/hle/service/nvnflinger/ui/graphic_buffer.h" @@ -46,31 +45,9 @@ HardwareComposer::HardwareComposer() = default; HardwareComposer::~HardwareComposer() = default; u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, VI::Display& display, - Nvidia::Devices::nvdisp_disp0& nvdisp, u32 frame_advance) { + Nvidia::Devices::nvdisp_disp0& nvdisp) { boost::container::small_vector<HwcLayer, 2> composition_stack; - m_frame_number += frame_advance; - - // Release any necessary framebuffers. - for (auto& [layer_id, framebuffer] : m_framebuffers) { - if (framebuffer.release_frame_number > m_frame_number) { - // Not yet ready to release this framebuffer. - continue; - } - - if (!framebuffer.is_acquired) { - // Already released. - continue; - } - - if (auto* layer = display.FindLayer(layer_id); layer != nullptr) { - // TODO: support release fence - // This is needed to prevent screen tearing - layer->GetConsumer().ReleaseBuffer(framebuffer.item, android::Fence::NoFence()); - framebuffer.is_acquired = false; - } - } - // Set default speed limit to 100%. *out_speed_scale = 1.0f; @@ -142,7 +119,30 @@ u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, VI::Display& display, MicroProfileFlip(); // Advance by at least one frame. - return swap_interval.value_or(1); + const u32 frame_advance = swap_interval.value_or(1); + m_frame_number += frame_advance; + + // Release any necessary framebuffers. + for (auto& [layer_id, framebuffer] : m_framebuffers) { + if (framebuffer.release_frame_number > m_frame_number) { + // Not yet ready to release this framebuffer. + continue; + } + + if (!framebuffer.is_acquired) { + // Already released. + continue; + } + + if (auto* layer = display.FindLayer(layer_id); layer != nullptr) { + // TODO: support release fence + // This is needed to prevent screen tearing + layer->GetConsumer().ReleaseBuffer(framebuffer.item, android::Fence::NoFence()); + framebuffer.is_acquired = false; + } + } + + return frame_advance; } void HardwareComposer::RemoveLayerLocked(VI::Display& display, LayerId layer_id) { diff --git a/src/core/hle/service/nvnflinger/hardware_composer.h b/src/core/hle/service/nvnflinger/hardware_composer.h index ddab94ac9..28392c512 100644 --- a/src/core/hle/service/nvnflinger/hardware_composer.h +++ b/src/core/hle/service/nvnflinger/hardware_composer.h @@ -27,7 +27,7 @@ public: ~HardwareComposer(); u32 ComposeLocked(f32* out_speed_scale, VI::Display& display, - Nvidia::Devices::nvdisp_disp0& nvdisp, u32 frame_advance); + Nvidia::Devices::nvdisp_disp0& nvdisp); void RemoveLayerLocked(VI::Display& display, LayerId layer_id); private: diff --git a/src/core/hle/service/nvnflinger/nvnflinger.cpp b/src/core/hle/service/nvnflinger/nvnflinger.cpp index a4e848882..d8ba89d43 100644 --- a/src/core/hle/service/nvnflinger/nvnflinger.cpp +++ b/src/core/hle/service/nvnflinger/nvnflinger.cpp @@ -291,8 +291,7 @@ void Nvnflinger::Compose() { auto nvdisp = nvdrv->GetDevice<Nvidia::Devices::nvdisp_disp0>(disp_fd); ASSERT(nvdisp); - swap_interval = display.GetComposer().ComposeLocked(&compose_speed_scale, display, *nvdisp, - swap_interval); + swap_interval = display.GetComposer().ComposeLocked(&compose_speed_scale, display, *nvdisp); } } |