diff options
| -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 @@ | |||
| 7 | #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" | 7 | #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" |
| 8 | #include "core/hle/service/nvnflinger/buffer_item.h" | 8 | #include "core/hle/service/nvnflinger/buffer_item.h" |
| 9 | #include "core/hle/service/nvnflinger/buffer_item_consumer.h" | 9 | #include "core/hle/service/nvnflinger/buffer_item_consumer.h" |
| 10 | #include "core/hle/service/nvnflinger/buffer_queue_producer.h" | ||
| 11 | #include "core/hle/service/nvnflinger/hardware_composer.h" | 10 | #include "core/hle/service/nvnflinger/hardware_composer.h" |
| 12 | #include "core/hle/service/nvnflinger/hwc_layer.h" | 11 | #include "core/hle/service/nvnflinger/hwc_layer.h" |
| 13 | #include "core/hle/service/nvnflinger/ui/graphic_buffer.h" | 12 | #include "core/hle/service/nvnflinger/ui/graphic_buffer.h" |
| @@ -46,31 +45,9 @@ HardwareComposer::HardwareComposer() = default; | |||
| 46 | HardwareComposer::~HardwareComposer() = default; | 45 | HardwareComposer::~HardwareComposer() = default; |
| 47 | 46 | ||
| 48 | u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, VI::Display& display, | 47 | u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, VI::Display& display, |
| 49 | Nvidia::Devices::nvdisp_disp0& nvdisp, u32 frame_advance) { | 48 | Nvidia::Devices::nvdisp_disp0& nvdisp) { |
| 50 | boost::container::small_vector<HwcLayer, 2> composition_stack; | 49 | boost::container::small_vector<HwcLayer, 2> composition_stack; |
| 51 | 50 | ||
| 52 | m_frame_number += frame_advance; | ||
| 53 | |||
| 54 | // Release any necessary framebuffers. | ||
| 55 | for (auto& [layer_id, framebuffer] : m_framebuffers) { | ||
| 56 | if (framebuffer.release_frame_number > m_frame_number) { | ||
| 57 | // Not yet ready to release this framebuffer. | ||
| 58 | continue; | ||
| 59 | } | ||
| 60 | |||
| 61 | if (!framebuffer.is_acquired) { | ||
| 62 | // Already released. | ||
| 63 | continue; | ||
| 64 | } | ||
| 65 | |||
| 66 | if (auto* layer = display.FindLayer(layer_id); layer != nullptr) { | ||
| 67 | // TODO: support release fence | ||
| 68 | // This is needed to prevent screen tearing | ||
| 69 | layer->GetConsumer().ReleaseBuffer(framebuffer.item, android::Fence::NoFence()); | ||
| 70 | framebuffer.is_acquired = false; | ||
| 71 | } | ||
| 72 | } | ||
| 73 | |||
| 74 | // Set default speed limit to 100%. | 51 | // Set default speed limit to 100%. |
| 75 | *out_speed_scale = 1.0f; | 52 | *out_speed_scale = 1.0f; |
| 76 | 53 | ||
| @@ -142,7 +119,30 @@ u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, VI::Display& display, | |||
| 142 | MicroProfileFlip(); | 119 | MicroProfileFlip(); |
| 143 | 120 | ||
| 144 | // Advance by at least one frame. | 121 | // Advance by at least one frame. |
| 145 | return swap_interval.value_or(1); | 122 | const u32 frame_advance = swap_interval.value_or(1); |
| 123 | m_frame_number += frame_advance; | ||
| 124 | |||
| 125 | // Release any necessary framebuffers. | ||
| 126 | for (auto& [layer_id, framebuffer] : m_framebuffers) { | ||
| 127 | if (framebuffer.release_frame_number > m_frame_number) { | ||
| 128 | // Not yet ready to release this framebuffer. | ||
| 129 | continue; | ||
| 130 | } | ||
| 131 | |||
| 132 | if (!framebuffer.is_acquired) { | ||
| 133 | // Already released. | ||
| 134 | continue; | ||
| 135 | } | ||
| 136 | |||
| 137 | if (auto* layer = display.FindLayer(layer_id); layer != nullptr) { | ||
| 138 | // TODO: support release fence | ||
| 139 | // This is needed to prevent screen tearing | ||
| 140 | layer->GetConsumer().ReleaseBuffer(framebuffer.item, android::Fence::NoFence()); | ||
| 141 | framebuffer.is_acquired = false; | ||
| 142 | } | ||
| 143 | } | ||
| 144 | |||
| 145 | return frame_advance; | ||
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | void HardwareComposer::RemoveLayerLocked(VI::Display& display, LayerId layer_id) { | 148 | 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: | |||
| 27 | ~HardwareComposer(); | 27 | ~HardwareComposer(); |
| 28 | 28 | ||
| 29 | u32 ComposeLocked(f32* out_speed_scale, VI::Display& display, | 29 | u32 ComposeLocked(f32* out_speed_scale, VI::Display& display, |
| 30 | Nvidia::Devices::nvdisp_disp0& nvdisp, u32 frame_advance); | 30 | Nvidia::Devices::nvdisp_disp0& nvdisp); |
| 31 | void RemoveLayerLocked(VI::Display& display, LayerId layer_id); | 31 | void RemoveLayerLocked(VI::Display& display, LayerId layer_id); |
| 32 | 32 | ||
| 33 | private: | 33 | 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() { | |||
| 291 | auto nvdisp = nvdrv->GetDevice<Nvidia::Devices::nvdisp_disp0>(disp_fd); | 291 | auto nvdisp = nvdrv->GetDevice<Nvidia::Devices::nvdisp_disp0>(disp_fd); |
| 292 | ASSERT(nvdisp); | 292 | ASSERT(nvdisp); |
| 293 | 293 | ||
| 294 | swap_interval = display.GetComposer().ComposeLocked(&compose_speed_scale, display, *nvdisp, | 294 | swap_interval = display.GetComposer().ComposeLocked(&compose_speed_scale, display, *nvdisp); |
| 295 | swap_interval); | ||
| 296 | } | 295 | } |
| 297 | } | 296 | } |
| 298 | 297 | ||