2 // Copyright (c) 2017 Intel Corporation
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
17 #include "logicaldisplay.h"
22 #include "logicaldisplaymanager.h"
24 namespace hwcomposer {
26 LogicalDisplay::LogicalDisplay(LogicalDisplayManager *display_manager,
27 NativeDisplay *physical_display,
28 uint32_t total_divisions, uint32_t index)
29 : logical_display_manager_(display_manager),
30 physical_display_(physical_display),
32 total_divisions_(total_divisions) {
35 LogicalDisplay::~LogicalDisplay() {
38 bool LogicalDisplay::Initialize(NativeBufferHandler * /*buffer_handler*/) {
42 bool LogicalDisplay::IsConnected() const {
43 return physical_display_->IsConnected();
46 uint32_t LogicalDisplay::PowerMode() const {
50 int LogicalDisplay::GetDisplayPipe() {
51 return physical_display_->GetDisplayPipe();
54 bool LogicalDisplay::SetActiveConfig(uint32_t config) {
55 bool success = physical_display_->SetActiveConfig(config);
56 width_ = (physical_display_->Width()) / total_divisions_;
60 bool LogicalDisplay::GetActiveConfig(uint32_t *config) {
61 return physical_display_->GetActiveConfig(config);
64 bool LogicalDisplay::SetPowerMode(uint32_t power_mode) {
65 power_mode_ = power_mode;
66 logical_display_manager_->UpdatePowerMode();
70 void LogicalDisplay::SetHDCPState(HWCContentProtection state,
71 HWCContentType content_type) {
72 logical_display_manager_->SetHDCPState(state, content_type);
75 void LogicalDisplay::SetHDCPSRM(const int8_t *SRM, uint32_t SRMLength) {
76 logical_display_manager_->SetHDCPSRM(SRM, SRMLength);
79 bool LogicalDisplay::ContainConnector(const uint32_t connector_id) {
80 return logical_display_manager_->ContainConnector(connector_id);
83 bool LogicalDisplay::Present(std::vector<HwcLayer *> &source_layers,
84 int32_t *retire_fence,
85 PixelUploaderCallback *call_back,
86 bool handle_constraints) {
87 if (power_mode_ != kOn)
90 return logical_display_manager_->Present(source_layers, retire_fence,
91 call_back, handle_constraints);
94 bool LogicalDisplay::PresentClone(NativeDisplay * /*display*/) {
98 int LogicalDisplay::RegisterVsyncCallback(
99 std::shared_ptr<VsyncCallback> callback, uint32_t display_id) {
100 display_id_ = display_id;
101 vsync_callback_ = callback;
105 void LogicalDisplay::RegisterRefreshCallback(
106 std::shared_ptr<RefreshCallback> callback, uint32_t display_id) {
107 display_id_ = display_id;
108 refresh_callback_ = callback;
111 void LogicalDisplay::RegisterHotPlugCallback(
112 std::shared_ptr<HotPlugCallback> callback, uint32_t display_id) {
113 display_id_ = display_id;
114 hotplug_callback_ = callback;
115 logical_display_manager_->RegisterHotPlugNotification();
118 void LogicalDisplay::VSyncControl(bool enabled) {
119 enable_vsync_ = enabled;
120 logical_display_manager_->UpdateVSyncControl();
123 void LogicalDisplay::VSyncUpdate(int64_t timestamp) {
124 if (vsync_callback_ && enable_vsync_) {
125 vsync_callback_->Callback(display_id_, timestamp);
129 void LogicalDisplay::RefreshUpdate() {
130 if (refresh_callback_ && power_mode_ == kOn) {
131 refresh_callback_->Callback(display_id_);
135 void LogicalDisplay::HotPlugUpdate(bool connected) {
136 if (hotplug_callback_) {
137 hotplug_callback_->Callback(display_id_, connected);
141 bool LogicalDisplay::CheckPlaneFormat(uint32_t format) {
142 return physical_display_->CheckPlaneFormat(format);
145 void LogicalDisplay::SetGamma(float red, float green, float blue) {
146 physical_display_->SetGamma(red, green, blue);
149 void LogicalDisplay::SetContrast(uint32_t red, uint32_t green, uint32_t blue) {
150 physical_display_->SetContrast(red, green, blue);
153 void LogicalDisplay::SetBrightness(uint32_t red, uint32_t green,
155 physical_display_->SetBrightness(red, green, blue);
158 void LogicalDisplay::SetDisableExplicitSync(bool disable_explicit_sync) {
159 physical_display_->SetDisableExplicitSync(disable_explicit_sync);
162 void LogicalDisplay::SetVideoScalingMode(uint32_t mode) {
163 physical_display_->SetVideoScalingMode(mode);
166 void LogicalDisplay::SetVideoColor(HWCColorControl color, float value) {
167 physical_display_->SetVideoColor(color, value);
170 void LogicalDisplay::GetVideoColor(HWCColorControl color, float *value,
171 float *start, float *end) {
172 physical_display_->GetVideoColor(color, value, start, end);
175 void LogicalDisplay::RestoreVideoDefaultColor(HWCColorControl color) {
176 physical_display_->RestoreVideoDefaultColor(color);
179 void LogicalDisplay::SetVideoDeinterlace(HWCDeinterlaceFlag flag,
180 HWCDeinterlaceControl mode) {
181 physical_display_->SetVideoDeinterlace(flag, mode);
184 void LogicalDisplay::RestoreVideoDefaultDeinterlace() {
185 physical_display_->RestoreVideoDefaultDeinterlace();
188 void LogicalDisplay::SetCanvasColor(uint16_t bpc, uint16_t red, uint16_t green,
189 uint16_t blue, uint16_t alpha) {
190 physical_display_->SetCanvasColor(bpc, red, green, blue, alpha);
193 void LogicalDisplay::UpdateScalingRatio(uint32_t /*primary_width*/,
194 uint32_t /*primary_height*/,
195 uint32_t /*display_width*/,
196 uint32_t /*display_height*/) {
199 void LogicalDisplay::CloneDisplay(NativeDisplay * /*source_display*/) {
202 bool LogicalDisplay::GetDisplayAttribute(uint32_t config /*config*/,
203 HWCDisplayAttribute attribute,
206 case HWCDisplayAttribute::kWidth:
207 physical_display_->GetDisplayAttribute(config, attribute, value);
208 *value = *value / total_divisions_;
214 return physical_display_->GetDisplayAttribute(config, attribute, value);
217 bool LogicalDisplay::GetDisplayConfigs(uint32_t *num_configs,
219 return physical_display_->GetDisplayConfigs(num_configs, configs);
222 bool LogicalDisplay::GetDisplayName(uint32_t *size, char *name) {
223 std::ostringstream stream;
225 std::string string = stream.str();
226 size_t length = string.length();
232 *size = std::min<uint32_t>(static_cast<uint32_t>(length - 1), *size);
233 strncpy(name, string.c_str(), *size);
237 } // namespace hwcomposer