summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/nvnflinger/hardware_composer.cpp50
-rw-r--r--src/core/hle/service/nvnflinger/hardware_composer.h2
-rw-r--r--src/core/hle/service/nvnflinger/nvnflinger.cpp3
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;
46HardwareComposer::~HardwareComposer() = default; 45HardwareComposer::~HardwareComposer() = default;
47 46
48u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, VI::Display& display, 47u32 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
148void HardwareComposer::RemoveLayerLocked(VI::Display& display, LayerId layer_id) { 148void 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
33private: 33private:
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