Skip to content
This repository was archived by the owner on Oct 8, 2024. It is now read-only.

Commit 19987a8

Browse files
committed
Implement the 2.4 new Vsync Callback for Mosaic
Without the implementation of new Vsync API. SurfaceFlinger will crash in init once mosaic is enabled. This one should be part of the implementation of HAL2.4. Remaining issue: need check LogicDisplay, PanoramaDisplay and so on. All of them need to support the new API. Change-Id: I3f602343a9dcf097444bd832b4f6a53cf7af4a36 Tracked-On: OAM-96194 Signed-off-by: Shaofeng Tang <shaofeng.tang@intel.com>
1 parent 32aaf3a commit 19987a8

3 files changed

Lines changed: 67 additions & 1 deletion

File tree

common/core/mosaicdisplay.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,20 @@ class MDVsyncCallback : public hwcomposer::VsyncCallback {
4444
MosaicDisplay *display_;
4545
};
4646

47+
class MDVsyncPeriodCallback : public hwcomposer::VsyncPeriodCallback {
48+
public:
49+
MDVsyncPeriodCallback(MosaicDisplay *display) : display_(display) {
50+
}
51+
52+
void Callback(uint32_t display, int64_t timestamp,
53+
uint32_t vsyncPeriodNanos) {
54+
display_->VSyncPeriodUpdate(timestamp, vsyncPeriodNanos);
55+
}
56+
57+
private:
58+
MosaicDisplay *display_;
59+
};
60+
4761
class MDRefreshCallback : public hwcomposer::RefreshCallback {
4862
public:
4963
MDRefreshCallback(MosaicDisplay *display) : display_(display) {
@@ -330,6 +344,21 @@ int MosaicDisplay::RegisterVsyncCallback(
330344
return 0;
331345
}
332346

347+
int MosaicDisplay::RegisterVsyncPeriodCallback(
348+
std::shared_ptr<VsyncPeriodCallback> callback, uint32_t display_id) {
349+
display_id_ = display_id;
350+
vsync_period_callback_ = callback;
351+
352+
uint32_t size = physical_displays_.size();
353+
auto v_callback = std::make_shared<MDVsyncPeriodCallback>(this);
354+
for (uint32_t i = 0; i < size; i++) {
355+
physical_displays_.at(i)->RegisterVsyncPeriodCallback(
356+
v_callback, physical_displays_.at(i)->GetDisplayPipe());
357+
}
358+
359+
return 0;
360+
}
361+
333362
void MosaicDisplay::RegisterRefreshCallback(
334363
std::shared_ptr<RefreshCallback> callback, uint32_t display_id) {
335364
display_id_ = display_id;
@@ -389,6 +418,27 @@ void MosaicDisplay::VSyncUpdate(int64_t timestamp) {
389418
lock_.unlock();
390419
}
391420

421+
void MosaicDisplay::VSyncPeriodUpdate(int64_t timestamp,
422+
uint32_t vsyncPeriodNanos) {
423+
lock_.lock();
424+
if (vsync_period_callback_ && enable_vsync_ && vsync_divisor_ > 0) {
425+
vsync_counter_--;
426+
vsync_timestamp_ += timestamp;
427+
if (vsync_counter_ == 0) {
428+
vsync_timestamp_ /= vsync_divisor_;
429+
vsync_period_callback_->Callback(display_id_, vsync_timestamp_,
430+
vsyncPeriodNanos);
431+
vsync_counter_ = vsync_divisor_;
432+
vsync_timestamp_ = 0;
433+
pending_vsync_ = false;
434+
} else {
435+
pending_vsync_ = true;
436+
}
437+
}
438+
439+
lock_.unlock();
440+
}
441+
392442
void MosaicDisplay::RefreshUpdate() {
393443
if (connected_ && refresh_callback_ && power_mode_ == kOn) {
394444
refresh_callback_->Callback(display_id_);
@@ -574,6 +624,11 @@ bool MosaicDisplay::GetDisplayAttribute(uint32_t /*config*/,
574624
return status;
575625
}
576626

627+
bool MosaicDisplay::GetDisplayVsyncPeriod(uint32_t *outVsyncPeriod) {
628+
return GetDisplayAttribute(config_, HWCDisplayAttribute::kRefreshRate,
629+
reinterpret_cast<int32_t *>(outVsyncPeriod));
630+
}
631+
577632
bool MosaicDisplay::GetDisplayConfigs(uint32_t *num_configs,
578633
uint32_t *configs) {
579634
if (!num_configs)

common/core/mosaicdisplay.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ class MosaicDisplay : public NativeDisplay {
6161
int RegisterVsyncCallback(std::shared_ptr<VsyncCallback> callback,
6262
uint32_t display_id) override;
6363

64+
int RegisterVsyncPeriodCallback(std::shared_ptr<VsyncPeriodCallback> callback,
65+
uint32_t display_id) override;
66+
6467
void RegisterRefreshCallback(std::shared_ptr<RefreshCallback> callback,
6568
uint32_t display_id) override;
6669

@@ -95,6 +98,8 @@ class MosaicDisplay : public NativeDisplay {
9598
bool GetDisplayAttribute(uint32_t /*config*/, HWCDisplayAttribute attribute,
9699
int32_t *value) override;
97100

101+
bool GetDisplayVsyncPeriod(uint32_t *outVsyncPeriod) override;
102+
98103
bool GetDisplayConfigs(uint32_t *num_configs, uint32_t *configs) override;
99104
bool GetDisplayName(uint32_t *size, char *name) override;
100105

@@ -117,6 +122,8 @@ class MosaicDisplay : public NativeDisplay {
117122

118123
void VSyncUpdate(int64_t timestamp);
119124

125+
void VSyncPeriodUpdate(int64_t timestamp, uint32_t vsyncPeriodNanos);
126+
120127
void RefreshUpdate();
121128

122129
void HotPlugUpdate(bool connected);
@@ -141,6 +148,7 @@ class MosaicDisplay : public NativeDisplay {
141148
std::vector<NativeDisplay *> connected_displays_;
142149
std::shared_ptr<RefreshCallback> refresh_callback_ = NULL;
143150
std::shared_ptr<VsyncCallback> vsync_callback_ = NULL;
151+
std::shared_ptr<VsyncPeriodCallback> vsync_period_callback_ = NULL;
144152
std::shared_ptr<HotPlugCallback> hotplug_callback_ = NULL;
145153
int32_t dpix_;
146154
int32_t dpiy_;

public/nativedisplay.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,10 @@ class NativeDisplay {
104104
virtual void GetDisplayCapabilities(uint32_t *outNumCapabilities,
105105
uint32_t *outCapabilities) = 0;
106106
virtual bool GetDisplayVsyncPeriod(uint32_t *outVsyncPeriod) {
107-
return false;
107+
// TODO implement this method in all displays
108+
// FTB, return 16ms by default.
109+
*outVsyncPeriod = 16666666;
110+
return true;
108111
};
109112

110113
/**

0 commit comments

Comments
 (0)