Merge "display: Change the place to set color mode" into display.lnx.6.0
diff --git a/Android.bp b/Android.bp
index deb9176..578718f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -5,7 +5,6 @@
"-Wconversion",
"-Wall",
"-Werror",
- "-std=c++14",
],
shared_libs: [
"liblog",
diff --git a/common.mk b/common.mk
index 16f736b..1aa8606 100644
--- a/common.mk
+++ b/common.mk
@@ -3,7 +3,7 @@
#Common C flags
common_flags := -Wno-missing-field-initializers
-common_flags += -Wall -Werror -std=c++14
+common_flags += -Wall -Werror
common_flags += -DUSE_GRALLOC1
ifeq ($(TARGET_IS_HEADLESS), true)
common_flags += -DTARGET_HEADLESS
diff --git a/composer/Android.mk b/composer/Android.mk
index 733d15c..306a03a 100644
--- a/composer/Android.mk
+++ b/composer/Android.mk
@@ -16,8 +16,7 @@
LOCAL_HEADER_LIBRARIES := display_headers
LOCAL_CFLAGS := -Wno-missing-field-initializers -Wno-unused-parameter \
- -std=c++11 -fcolor-diagnostics \
- -DLOG_TAG=\"SDM\" $(common_flags)
+ -DLOG_TAG=\"SDM\" $(common_flags) -fcolor-diagnostics
LOCAL_CLANG := true
LOCAL_SHARED_LIBRARIES := libbinder libhardware libutils libcutils libsync \
@@ -47,7 +46,8 @@
vendor.display.config@1.8 \
vendor.display.config@1.9 \
vendor.display.config@1.10 \
- vendor.display.config@1.11
+ vendor.display.config@1.11 \
+ vendor.display.config@1.12
LOCAL_SRC_FILES := QtiComposer.cpp QtiComposerClient.cpp service.cpp \
QtiComposerHandleImporter.cpp \
diff --git a/composer/QtiComposer.cpp b/composer/QtiComposer.cpp
index db7024d..4d0013d 100644
--- a/composer/QtiComposer.cpp
+++ b/composer/QtiComposer.cpp
@@ -38,6 +38,8 @@
namespace V2_0 {
namespace implementation {
+QtiComposerClient* QtiComposerClient::qti_composerclient_instance_ = nullptr;
+
QtiComposer::QtiComposer() {
hwc_session_ = HWCSession::GetInstance();
}
@@ -99,7 +101,7 @@
Return<void> QtiComposer::createClient(createClient_cb _hidl_cb) {
// TODO(user): Implement combinedly w.r.t createClient_2_3
- sp<IQtiComposerClient> composer_client = new QtiComposerClient();
+ sp<QtiComposerClient> composer_client = QtiComposerClient::CreateQtiComposerClientInstance();
if (!composer_client) {
_hidl_cb(Error::NO_RESOURCES, nullptr);
return Void();
@@ -112,7 +114,7 @@
// Methods from ::android::hardware::graphics::composer::V2_3::IComposer follow.
Return<void> QtiComposer::createClient_2_3(createClient_2_3_cb _hidl_cb) {
- sp<IQtiComposerClient> composer_client = new QtiComposerClient();
+ sp<QtiComposerClient> composer_client = QtiComposerClient::CreateQtiComposerClientInstance();
if (!composer_client) {
_hidl_cb(Error::NO_RESOURCES, nullptr);
return Void();
diff --git a/composer/QtiComposerClient.cpp b/composer/QtiComposerClient.cpp
index ea209ab..9b66951 100644
--- a/composer/QtiComposerClient.cpp
+++ b/composer/QtiComposerClient.cpp
@@ -1015,6 +1015,103 @@
: mClient(client), mWriter(client.mWriter) {
}
+bool QtiComposerClient::CommandReader::parseCommonCmd(
+ IComposerClient::Command command, uint16_t length) {
+ bool parsed = false;
+
+ switch (command) {
+ // Commands from ::android::hardware::graphics::composer::V2_1::IComposerClient follow.
+ case IComposerClient::Command::SELECT_DISPLAY:
+ parsed = parseSelectDisplay(length);
+ break;
+ case IComposerClient::Command::SELECT_LAYER:
+ parsed = parseSelectLayer(length);
+ break;
+ case IComposerClient::Command::SET_COLOR_TRANSFORM:
+ parsed = parseSetColorTransform(length);
+ break;
+ case IComposerClient::Command::SET_CLIENT_TARGET:
+ parsed = parseSetClientTarget(length);
+ break;
+ case IComposerClient::Command::SET_OUTPUT_BUFFER:
+ parsed = parseSetOutputBuffer(length);
+ break;
+ case IComposerClient::Command::VALIDATE_DISPLAY:
+ parsed = parseValidateDisplay(length);
+ break;
+ case IComposerClient::Command::ACCEPT_DISPLAY_CHANGES:
+ parsed = parseAcceptDisplayChanges(length);
+ break;
+ case IComposerClient::Command::PRESENT_DISPLAY:
+ parsed = parsePresentDisplay(length);
+ break;
+ case IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY:
+ parsed = parsePresentOrValidateDisplay(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_CURSOR_POSITION:
+ parsed = parseSetLayerCursorPosition(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_BUFFER:
+ parsed = parseSetLayerBuffer(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_SURFACE_DAMAGE:
+ parsed = parseSetLayerSurfaceDamage(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_BLEND_MODE:
+ parsed = parseSetLayerBlendMode(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_COLOR:
+ parsed = parseSetLayerColor(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_COMPOSITION_TYPE:
+ parsed = parseSetLayerCompositionType(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_DATASPACE:
+ parsed = parseSetLayerDataspace(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_DISPLAY_FRAME:
+ parsed = parseSetLayerDisplayFrame(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_PLANE_ALPHA:
+ parsed = parseSetLayerPlaneAlpha(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_SIDEBAND_STREAM:
+ parsed = parseSetLayerSidebandStream(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_SOURCE_CROP:
+ parsed = parseSetLayerSourceCrop(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_TRANSFORM:
+ parsed = parseSetLayerTransform(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_VISIBLE_REGION:
+ parsed = parseSetLayerVisibleRegion(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_Z_ORDER:
+ parsed = parseSetLayerZOrder(length);
+ break;
+ // Commands from ::android::hardware::graphics::composer::V2_2::IComposerClient follow.
+ case IComposerClient::Command::SET_LAYER_PER_FRAME_METADATA:
+ parsed = parseSetLayerPerFrameMetadata(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_FLOAT_COLOR:
+ parsed = parseSetLayerFloatColor(length);
+ break;
+ // Commands from ::android::hardware::graphics::composer::V2_3::IComposerClient follow.
+ case IComposerClient::Command::SET_LAYER_COLOR_TRANSFORM:
+ parsed = parseSetLayerColorTransform(length);
+ break;
+ case IComposerClient::Command::SET_LAYER_PER_FRAME_METADATA_BLOBS:
+ parsed = parseSetLayerPerFrameMetadataBlobs(length);
+ break;
+ default:
+ parsed = false;
+ break;
+ }
+
+ return parsed;
+}
+
Error QtiComposerClient::CommandReader::parse() {
IQtiComposerClient::Command qticommand;
uint16_t length;
@@ -1025,107 +1122,20 @@
}
bool parsed = false;
- IComposerClient::Command command = static_cast<IComposerClient::Command>(qticommand);
- switch (command) {
- // Commands from ::android::hardware::graphics::composer::V2_1::IComposerClient follow.
- case IComposerClient::Command::SELECT_DISPLAY:
- parsed = parseSelectDisplay(length);
- // Displays will not be removed while processing the command queue.
- if (parsed && mClient.mDisplayData.find(mDisplay) == mClient.mDisplayData.end()) {
- ALOGW("Command::SELECT_DISPLAY: Display %lu not found. Dropping commands.", mDisplay);
- mDisplay = sdm::HWCCallbacks::kNumDisplays;
- }
- break;
- case IComposerClient::Command::SELECT_LAYER:
- parsed = parseSelectLayer(length);
- break;
- case IComposerClient::Command::SET_COLOR_TRANSFORM:
- parsed = parseSetColorTransform(length);
- break;
- case IComposerClient::Command::SET_CLIENT_TARGET:
- parsed = parseSetClientTarget(length);
- break;
- case IComposerClient::Command::SET_OUTPUT_BUFFER:
- parsed = parseSetOutputBuffer(length);
- break;
- case IComposerClient::Command::VALIDATE_DISPLAY:
- parsed = parseValidateDisplay(length);
- break;
- case IComposerClient::Command::ACCEPT_DISPLAY_CHANGES:
- parsed = parseAcceptDisplayChanges(length);
- break;
- case IComposerClient::Command::PRESENT_DISPLAY:
- parsed = parsePresentDisplay(length);
- break;
- case IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY:
- parsed = parsePresentOrValidateDisplay(length);
- break;
- case IComposerClient::Command::SET_LAYER_CURSOR_POSITION:
- parsed = parseSetLayerCursorPosition(length);
- break;
- case IComposerClient::Command::SET_LAYER_BUFFER:
- parsed = parseSetLayerBuffer(length);
- break;
- case IComposerClient::Command::SET_LAYER_SURFACE_DAMAGE:
- parsed = parseSetLayerSurfaceDamage(length);
- break;
- case IComposerClient::Command::SET_LAYER_BLEND_MODE:
- parsed = parseSetLayerBlendMode(length);
- break;
- case IComposerClient::Command::SET_LAYER_COLOR:
- parsed = parseSetLayerColor(length);
- break;
- case IComposerClient::Command::SET_LAYER_COMPOSITION_TYPE:
- parsed = parseSetLayerCompositionType(length);
- break;
- case IComposerClient::Command::SET_LAYER_DATASPACE:
- parsed = parseSetLayerDataspace(length);
- break;
- case IComposerClient::Command::SET_LAYER_DISPLAY_FRAME:
- parsed = parseSetLayerDisplayFrame(length);
- break;
- case IComposerClient::Command::SET_LAYER_PLANE_ALPHA:
- parsed = parseSetLayerPlaneAlpha(length);
- break;
- case IComposerClient::Command::SET_LAYER_SIDEBAND_STREAM:
- parsed = parseSetLayerSidebandStream(length);
- break;
- case IComposerClient::Command::SET_LAYER_SOURCE_CROP:
- parsed = parseSetLayerSourceCrop(length);
- break;
- case IComposerClient::Command::SET_LAYER_TRANSFORM:
- parsed = parseSetLayerTransform(length);
- break;
- case IComposerClient::Command::SET_LAYER_VISIBLE_REGION:
- parsed = parseSetLayerVisibleRegion(length);
- break;
- case IComposerClient::Command::SET_LAYER_Z_ORDER:
- parsed = parseSetLayerZOrder(length);
- break;
- // Commands from ::android::hardware::graphics::composer::V2_2::IComposerClient follow.
- case IComposerClient::Command::SET_LAYER_PER_FRAME_METADATA:
- parsed = parseSetLayerPerFrameMetadata(length);
- break;
- case IComposerClient::Command::SET_LAYER_FLOAT_COLOR:
- parsed = parseSetLayerFloatColor(length);
- break;
- // Commands from ::android::hardware::graphics::composer::V2_3::IComposerClient follow.
- case IComposerClient::Command::SET_LAYER_COLOR_TRANSFORM:
- parsed = parseSetLayerColorTransform(length);
- break;
- case IComposerClient::Command::SET_LAYER_PER_FRAME_METADATA_BLOBS:
- parsed = parseSetLayerPerFrameMetadataBlobs(length);
- break;
- default:
- parsed = false;
- break;
+ switch (qticommand) {
+ case IQtiComposerClient::Command::SET_LAYER_TYPE:
+ parsed = parseSetLayerType(length);
+ break;
+ default:
+ parsed = parseCommonCmd(static_cast<IComposerClient::Command>(qticommand), length);
+ break;
}
endCommand();
if (!parsed) {
ALOGE("failed to parse command 0x%x, length %" PRIu16,
- command, length);
+ qticommand, length);
break;
}
}
@@ -1630,6 +1640,20 @@
return true;
}
+bool QtiComposerClient::CommandReader::parseSetLayerType(uint16_t length) {
+ if (length != CommandWriter::kSetLayerTypeLength) {
+ return false;
+ }
+
+ auto err = mClient.hwc_session_->SetLayerType(mDisplay, mLayer,
+ static_cast<IQtiComposerClient::LayerType>(read()));
+ if (static_cast<Error>(err) != Error::NONE) {
+ mWriter.setError(getCommandLoc(), static_cast<Error>(err));
+ }
+
+ return true;
+}
+
bool QtiComposerClient::CommandReader::parseSetLayerPerFrameMetadata(uint16_t length) {
// (key, value) pairs
if (length % 2 != 0) {
@@ -1845,7 +1869,7 @@
// Methods from ::android::hidl::base::V1_0::IBase follow.
IQtiComposerClient* HIDL_FETCH_IQtiComposerClient(const char* /* name */) {
- return new QtiComposerClient();
+ return QtiComposerClient::CreateQtiComposerClientInstance();
}
} // namespace implementation
diff --git a/composer/QtiComposerClient.h b/composer/QtiComposerClient.h
index 741dbf6..4b06900 100644
--- a/composer/QtiComposerClient.h
+++ b/composer/QtiComposerClient.h
@@ -82,10 +82,11 @@
};
class QtiComposerClient : public IQtiComposerClient {
- public:
QtiComposerClient();
virtual ~QtiComposerClient();
+ static QtiComposerClient* qti_composerclient_instance_;
+ public:
// Methods from ::android::hardware::graphics::composer::V2_1::IComposerClient follow.
Return<void> registerCallback(const sp<composer_V2_1::IComposerCallback>& callback) override;
Return<uint32_t> getMaxVirtualDisplayCount() override;
@@ -206,6 +207,20 @@
return (mCapabilities.count(capability) > 0);
}
+ static QtiComposerClient* CreateQtiComposerClientInstance() {
+ if (!qti_composerclient_instance_) {
+ qti_composerclient_instance_ = new QtiComposerClient();
+ return qti_composerclient_instance_;
+ }
+ return nullptr;
+ }
+
+ void onLastStrongRef(const void* id) {
+ if (qti_composerclient_instance_) {
+ qti_composerclient_instance_ = nullptr;
+ }
+ }
+
private:
struct LayerBuffers {
std::vector<BufferCacheEntry> Buffers;
@@ -260,6 +275,7 @@
bool parseSetLayerTransform(uint16_t length);
bool parseSetLayerVisibleRegion(uint16_t length);
bool parseSetLayerZOrder(uint16_t length);
+ bool parseSetLayerType(uint16_t length);
// Commands from ::android::hardware::graphics::composer::V2_2::IComposerClient follow.
bool parseSetLayerPerFrameMetadata(uint16_t length);
@@ -269,6 +285,8 @@
bool parseSetLayerColorTransform(uint16_t length);
bool parseSetLayerPerFrameMetadataBlobs(uint16_t length);
+ bool parseCommonCmd(IComposerClient::Command command, uint16_t length);
+
hwc_rect_t readRect();
std::vector<hwc_rect_t> readRegion(size_t count);
hwc_frect_t readFRect();
diff --git a/composer/QtiComposerCommandBuffer.h b/composer/QtiComposerCommandBuffer.h
index 755a90b..b352670 100644
--- a/composer/QtiComposerCommandBuffer.h
+++ b/composer/QtiComposerCommandBuffer.h
@@ -411,6 +411,13 @@
endCommand();
}
+ static constexpr uint16_t kSetLayerTypeLength = 1;
+ void setLayerType(uint32_t z) {
+ beginCommand(IQtiComposerClient::Command::SET_LAYER_TYPE, kSetLayerTypeLength);
+ write(z);
+ endCommand();
+ }
+
// Commands from ::android::hardware::graphics::composer::V2_2::IComposerClient follow.
static constexpr uint16_t kSetLayerFloatColorLength = 4;
void setLayerFloatColor(IQtiComposerClient::FloatColor color) {
diff --git a/composer/hwc_display.cpp b/composer/hwc_display.cpp
index af2a57f..8f852fb 100644
--- a/composer/hwc_display.cpp
+++ b/composer/hwc_display.cpp
@@ -785,6 +785,11 @@
layer->update_mask.set(kClientCompRequest);
}
+ if (hwc_layer->GetType() == kLayerGame) {
+ layer->flags.is_game = true;
+ layer->input_buffer.flags.game = true;
+ }
+
layer_stack_.layers.push_back(layer);
}
@@ -824,6 +829,18 @@
layer_stack_.layers.push_back(client_target_->GetSDMLayer());
}
+HWC2::Error HWCDisplay::SetLayerType(hwc2_layer_t layer_id, IQtiComposerClient::LayerType type) {
+ const auto map_layer = layer_map_.find(layer_id);
+ if (map_layer == layer_map_.end()) {
+ DLOGE("[%" PRIu64 "] SetLayerType failed to find layer", id_);
+ return HWC2::Error::BadLayer;
+ }
+
+ const auto layer = map_layer->second;
+ layer->SetLayerType(type);
+ return HWC2::Error::None;
+}
+
HWC2::Error HWCDisplay::SetLayerZOrder(hwc2_layer_t layer_id, uint32_t z) {
const auto map_layer = layer_map_.find(layer_id);
if (map_layer == layer_map_.end()) {
@@ -1259,12 +1276,13 @@
break;
}
case kInvalidateDisplay:
- case kThermalEvent:
- case kPanelDeadEvent: {
+ case kThermalEvent: {
SEQUENCE_WAIT_SCOPE_LOCK(HWCSession::locker_[id_]);
validated_ = false;
} break;
+ case kPanelDeadEvent:
case kDisplayPowerResetEvent: {
+ SEQUENCE_WAIT_SCOPE_LOCK(HWCSession::locker_[id_]);
validated_ = false;
if (event_handler_) {
event_handler_->DisplayPowerReset();
@@ -1785,7 +1803,7 @@
}
}
-int HWCDisplay::SetFrameBufferResolution(uint32_t x_pixels, uint32_t y_pixels) {
+int HWCDisplay::SetFrameBufferConfig(uint32_t x_pixels, uint32_t y_pixels) {
if (x_pixels <= 0 || y_pixels <= 0) {
DLOGW("Unsupported config: x_pixels=%d, y_pixels=%d", x_pixels, y_pixels);
return -EINVAL;
@@ -1810,12 +1828,25 @@
// Create rects to represent the new source and destination crops
LayerRect crop = LayerRect(0, 0, FLOAT(x_pixels), FLOAT(y_pixels));
hwc_rect_t scaled_display_frame = {0, 0, INT(x_pixels), INT(y_pixels)};
+ auto client_target_layer = client_target_->GetSDMLayer();
+ client_target_layer->src_rect = crop;
ApplyScanAdjustment(&scaled_display_frame);
client_target_->SetLayerDisplayFrame(scaled_display_frame);
client_target_->ResetPerFrameData();
+ DLOGI("New framebuffer resolution (%dx%d)", fb_config.x_pixels, fb_config.y_pixels);
+
+ return 0;
+}
+
+int HWCDisplay::SetFrameBufferResolution(uint32_t x_pixels, uint32_t y_pixels) {
+ int error = SetFrameBufferConfig(x_pixels, y_pixels);
+ if (error < 0) {
+ DLOGV("SetFrameBufferConfig failed. Error = %d", error);
+ return error;
+ }
+
auto client_target_layer = client_target_->GetSDMLayer();
- client_target_layer->src_rect = crop;
int aligned_width;
int aligned_height;
@@ -1844,8 +1875,6 @@
client_target_layer->input_buffer.unaligned_height = y_pixels;
client_target_layer->plane_alpha = 255;
- DLOGI("New framebuffer resolution (%dx%d)", fb_config.x_pixels, fb_config.y_pixels);
-
return 0;
}
diff --git a/composer/hwc_display.h b/composer/hwc_display.h
index b9632a2..8fea114 100644
--- a/composer/hwc_display.h
+++ b/composer/hwc_display.h
@@ -213,6 +213,10 @@
return HWC2::Error::Unsupported;
}
+ virtual bool IsSmartPanelConfig(uint32_t config_id) {
+ return false;
+ }
+
// Display Configurations
static uint32_t GetThrottlingRefreshRate() { return HWCDisplay::throttling_refresh_rate_; }
static void SetThrottlingRefreshRate(uint32_t newRefreshRate)
@@ -329,6 +333,7 @@
virtual HWC2::Error CreateLayer(hwc2_layer_t *out_layer_id);
virtual HWC2::Error DestroyLayer(hwc2_layer_t layer_id);
virtual HWC2::Error SetLayerZOrder(hwc2_layer_t layer_id, uint32_t z);
+ virtual HWC2::Error SetLayerType(hwc2_layer_t layer_id, IQtiComposerClient::LayerType type);
virtual HWC2::Error Validate(uint32_t *out_num_types, uint32_t *out_num_requests) = 0;
virtual HWC2::Error GetReleaseFences(uint32_t *out_num_elements, hwc2_layer_t *out_layers,
int32_t *out_fences);
@@ -398,6 +403,7 @@
uint32_t SanitizeRefreshRate(uint32_t req_refresh_rate);
virtual void GetUnderScanConfig() { }
int32_t SetClientTargetDataSpace(int32_t dataspace);
+ int SetFrameBufferConfig(uint32_t x_pixels, uint32_t y_pixels);
bool validated_ = false;
bool layer_stack_invalid_ = true;
diff --git a/composer/hwc_display_builtin.cpp b/composer/hwc_display_builtin.cpp
index e6f33ba..85cdda6 100644
--- a/composer/hwc_display_builtin.cpp
+++ b/composer/hwc_display_builtin.cpp
@@ -965,9 +965,28 @@
}
Layer *sdm_layer = client_target_->GetSDMLayer();
- SetFrameBufferResolution(sdm_layer->input_buffer.unaligned_width,
- sdm_layer->input_buffer.unaligned_height);
+ uint32_t fb_width = 0, fb_height = 0;
+
+ GetFrameBufferResolution(&fb_width, &fb_height);
+
+ if (fb_width != sdm_layer->input_buffer.unaligned_width ||
+ fb_height != sdm_layer->input_buffer.unaligned_height) {
+ if (SetFrameBufferConfig(sdm_layer->input_buffer.unaligned_width,
+ sdm_layer->input_buffer.unaligned_height)) {
+ return HWC2::Error::BadParameter;
+ }
+ }
return HWC2::Error::None;
}
+
+bool HWCDisplayBuiltIn::IsSmartPanelConfig(uint32_t config_id) {
+ if (config_id < hwc_config_map_.size()) {
+ uint32_t index = hwc_config_map_.at(config_id);
+ return variable_config_map_.at(index).smart_panel;
+ }
+
+ return false;
+}
+
} // namespace sdm
diff --git a/composer/hwc_display_builtin.h b/composer/hwc_display_builtin.h
index 6838fda..a3ed162 100644
--- a/composer/hwc_display_builtin.h
+++ b/composer/hwc_display_builtin.h
@@ -100,6 +100,7 @@
virtual HWC2::Error UpdatePowerMode(HWC2::PowerMode mode);
virtual HWC2::Error SetClientTarget(buffer_handle_t target, int32_t acquire_fence,
int32_t dataspace, hwc_region_t damage);
+ virtual bool IsSmartPanelConfig(uint32_t config_id);
private:
HWCDisplayBuiltIn(CoreInterface *core_intf, BufferAllocator *buffer_allocator,
diff --git a/composer/hwc_layers.cpp b/composer/hwc_layers.cpp
index 0b9e609..84e947f 100644
--- a/composer/hwc_layers.cpp
+++ b/composer/hwc_layers.cpp
@@ -546,6 +546,30 @@
return HWC2::Error::None;
}
+HWC2::Error HWCLayer::SetLayerType(IQtiComposerClient::LayerType type) {
+ LayerTypes layer_type = kLayerUnknown;
+ switch (type) {
+ case IQtiComposerClient::LayerType::UNKNOWN:
+ layer_type = kLayerUnknown;
+ break;
+ case IQtiComposerClient::LayerType::APP:
+ layer_type = kLayerApp;
+ break;
+ case IQtiComposerClient::LayerType::GAME:
+ layer_type = kLayerGame;
+ break;
+ case IQtiComposerClient::LayerType::BROWSER:
+ layer_type = kLayerBrowser;
+ break;
+ default:
+ DLOGW("Unsupported layer type %d", layer_type);
+ break;
+ }
+
+ type_ = layer_type;
+ return HWC2::Error::None;
+}
+
HWC2::Error HWCLayer::SetLayerColorTransform(const float *matrix) {
if (std::memcmp(matrix, layer_->color_transform_matrix, sizeof(layer_->color_transform_matrix))) {
std::memcpy(layer_->color_transform_matrix, matrix, sizeof(layer_->color_transform_matrix));
diff --git a/composer/hwc_layers.h b/composer/hwc_layers.h
index 44d3ae1..ac6c21f 100644
--- a/composer/hwc_layers.h
+++ b/composer/hwc_layers.h
@@ -34,6 +34,7 @@
#undef HWC2_INCLUDE_STRINGIFICATION
#undef HWC2_USE_CPP11
#include <android/hardware/graphics/composer/2.2/IComposerClient.h>
+#include <vendor/qti/hardware/display/composer/2.0/IQtiComposerClient.h>
#include <deque>
#include <map>
#include <set>
@@ -42,6 +43,7 @@
using PerFrameMetadataKey =
android::hardware::graphics::composer::V2_2::IComposerClient::PerFrameMetadataKey;
+using vendor::qti::hardware::display::composer::V2_0::IQtiComposerClient;
namespace sdm {
@@ -67,12 +69,20 @@
kBufferGeometry = 0x200,
};
+enum LayerTypes {
+ kLayerUnknown = 0,
+ kLayerApp = 1,
+ kLayerGame = 2,
+ kLayerBrowser = 3,
+};
+
class HWCLayer {
public:
explicit HWCLayer(hwc2_display_t display_id, HWCBufferAllocator *buf_allocator);
~HWCLayer();
uint32_t GetZ() const { return z_; }
hwc2_layer_t GetId() const { return id_; }
+ LayerTypes GetType() const { return type_; }
Layer *GetSDMLayer() { return layer_; }
void ResetPerFrameData();
@@ -91,6 +101,7 @@
HWC2::Error SetLayerPerFrameMetadata(uint32_t num_elements, const PerFrameMetadataKey *keys,
const float *metadata);
HWC2::Error SetLayerZOrder(uint32_t z);
+ HWC2::Error SetLayerType(IQtiComposerClient::LayerType type);
HWC2::Error SetLayerColorTransform(const float *matrix);
void SetComposition(const LayerComposition &sdm_composition);
HWC2::Composition GetClientRequestedCompositionType() { return client_requested_; }
@@ -121,6 +132,7 @@
private:
Layer *layer_ = nullptr;
+ LayerTypes type_ = kLayerUnknown;
uint32_t z_ = 0;
const hwc2_layer_t id_;
const hwc2_display_t display_id_;
diff --git a/composer/hwc_session.cpp b/composer/hwc_session.cpp
index bea3d00..d405bbc 100644
--- a/composer/hwc_session.cpp
+++ b/composer/hwc_session.cpp
@@ -903,6 +903,11 @@
return CallDisplayFunction(display, &HWCDisplay::SetLayerZOrder, layer, z);
}
+int32_t HWCSession::SetLayerType(hwc2_display_t display, hwc2_layer_t layer,
+ IQtiComposerClient::LayerType type) {
+ return CallDisplayFunction(display, &HWCDisplay::SetLayerType, layer, type);
+}
+
int32_t HWCSession::SetLayerColorTransform(hwc2_display_t display, hwc2_layer_t layer,
const float *matrix) {
return CallLayerFunction(display, layer, &HWCLayer::SetLayerColorTransform, matrix);
@@ -1907,7 +1912,6 @@
PPPendingParams pending_action;
PPDisplayAPIPayload resp_payload, req_payload;
uint8_t *disp_id = NULL;
- bool invalidate_needed = true;
int32_t *mode_id = NULL;
if (!color_mgr_) {
@@ -1945,10 +1949,7 @@
DLOGV_IF(kTagQDCM, "pending action = %d, display_id = %d", BITMAP(count), display_id);
switch (BITMAP(count)) {
case kInvalidating:
- {
- invalidate_needed = false;
- callbacks_.Refresh(display_id);
- }
+ callbacks_.Refresh(display_id);
break;
case kEnterQDCMMode:
ret = color_mgr_->EnableQDCMMode(true, hwc_display_[display_id]);
@@ -2064,9 +2065,7 @@
resp_payload.DestroyPayload();
SEQUENCE_WAIT_SCOPE_LOCK(locker_[display_id]);
- if (invalidate_needed) {
- hwc_display_[display_id]->ResetValidation();
- }
+ hwc_display_[display_id]->ResetValidation();
return ret;
}
diff --git a/composer/hwc_session.h b/composer/hwc_session.h
index f75d97e..87ebbe0 100644
--- a/composer/hwc_session.h
+++ b/composer/hwc_session.h
@@ -20,7 +20,8 @@
#ifndef __HWC_SESSION_H__
#define __HWC_SESSION_H__
-#include <vendor/display/config/1.11/IDisplayConfig.h>
+#include <vendor/display/config/1.12/IDisplayConfig.h>
+#include <vendor/qti/hardware/display/composer/2.0/IQtiComposerClient.h>
#include <core/core_interface.h>
#include <utils/locker.h>
@@ -47,7 +48,7 @@
namespace sdm {
-using vendor::display::config::V1_11::IDisplayConfig;
+using vendor::display::config::V1_12::IDisplayConfig;
using vendor::display::config::V1_10::IDisplayCWBCallback;
using ::android::hardware::Return;
@@ -56,6 +57,8 @@
using ::android::hardware::hidl_vec;
using ::android::sp;
+using vendor::qti::hardware::display::composer::V2_0::IQtiComposerClient;
+
int32_t GetDataspaceFromColorMode(ColorMode mode);
// Create a singleton uevent listener thread valid for life of hardware composer process.
@@ -232,6 +235,8 @@
int32_t SetLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer, hwc_frect_t crop);
int32_t SetLayerTransform(hwc2_display_t display, hwc2_layer_t layer, int32_t int_transform);
int32_t SetLayerZOrder(hwc2_display_t display, hwc2_layer_t layer, uint32_t z);
+ int32_t SetLayerType(hwc2_display_t display, hwc2_layer_t layer,
+ IQtiComposerClient::LayerType type);
int32_t SetLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer, hwc_region_t damage);
int32_t SetLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer, hwc_region_t damage);
int32_t SetLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer, int32_t int_type);
@@ -393,6 +398,7 @@
uint32_t disp_id, const Rect &rect, bool post_processed,
const hidl_handle& buffer) override;
Return<int32_t> setQsyncMode(uint32_t disp_id, IDisplayConfig::QsyncMode mode) override;
+ Return<bool> isSmartPanelConfig(uint32_t disp_id, uint32_t config_id) override;
// QClient methods
virtual android::status_t notifyCallback(uint32_t command, const android::Parcel *input_parcel,
diff --git a/composer/hwc_session_services.cpp b/composer/hwc_session_services.cpp
index d639371..4ff1bdf 100644
--- a/composer/hwc_session_services.cpp
+++ b/composer/hwc_session_services.cpp
@@ -923,6 +923,20 @@
return cwb_.PostBuffer(callback, post_processed, buffer);
}
+Return<bool> HWCSession::isSmartPanelConfig(uint32_t disp_id, uint32_t config_id) {
+ if (disp_id != qdutils::DISPLAY_PRIMARY) {
+ return false;
+ }
+
+ SCOPE_LOCK(locker_[disp_id]);
+ if (!hwc_display_[disp_id]) {
+ DLOGE("Display %d is not created yet.", disp_id);
+ return false;
+ }
+
+ return hwc_display_[disp_id]->IsSmartPanelConfig(config_id);
+}
+
int32_t HWCSession::CWB::PostBuffer(const sp<IDisplayCWBCallback> &callback, bool post_processed,
const hidl_handle& buffer) {
SCOPE_LOCK(queue_lock_);
diff --git a/composer/vendor.qti.hardware.display.composer-service.xml b/composer/vendor.qti.hardware.display.composer-service.xml
index 7789fd3..3f0431a 100644
--- a/composer/vendor.qti.hardware.display.composer-service.xml
+++ b/composer/vendor.qti.hardware.display.composer-service.xml
@@ -48,7 +48,7 @@
<hal format="hidl">
<name>vendor.display.config</name>
<transport>hwbinder</transport>
- <version>1.11</version>
+ <version>1.12</version>
<interface>
<name>IDisplayConfig</name>
<instance>default</instance>
diff --git a/config/display-product.mk b/config/display-product.mk
index 586b7f7..8a1d367 100644
--- a/config/display-product.mk
+++ b/config/display-product.mk
@@ -26,6 +26,8 @@
vendor.display.config@1.8.vendor \
vendor.display.config@1.9.vendor \
vendor.display.config@1.10.vendor \
+ vendor.display.config@1.11.vendor \
+ vendor.display.config@1.12.vendor \
vendor.qti.hardware.display.mapper@2.0.vendor \
vendor.qti.hardware.display.mapper@3.0.vendor \
modetest
diff --git a/gpu_tonemapper/Android.mk b/gpu_tonemapper/Android.mk
index 13217f1..ec59eef 100644
--- a/gpu_tonemapper/Android.mk
+++ b/gpu_tonemapper/Android.mk
@@ -19,7 +19,7 @@
LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
LOCAL_CFLAGS := $(version_flag) -Wno-missing-field-initializers -Wall \
- -Wno-unused-parameter -std=c++11 -DLOG_TAG=\"GPU_TONEMAPPER\"
+ -Wno-unused-parameter -DLOG_TAG=\"GPU_TONEMAPPER\"
LOCAL_SRC_FILES := TonemapFactory.cpp \
glengine.cpp \
diff --git a/include/Android.mk b/include/Android.mk
index f787fbc..51f742c 100644
--- a/include/Android.mk
+++ b/include/Android.mk
@@ -9,6 +9,7 @@
LOCAL_COPY_HEADERS_TO := $(common_header_export_path)
LOCAL_COPY_HEADERS := display_color_processing.h \
display_properties.h \
+ dpps_control_interface.h \
../libqdutils/qd_utils.h \
../libqdutils/display_config.h \
../libqservice/QServiceUtils.h \
diff --git a/include/display_color_processing.h b/include/display_color_processing.h
index 4ff1a77..ce6ea21 100644
--- a/include/display_color_processing.h
+++ b/include/display_color_processing.h
@@ -84,6 +84,52 @@
struct rgb entries[LUT1D_ENTRIES_SIZE];
};
+static const uint32_t kDeTuningFlagSharpFactor = 0x01;
+static const uint32_t kDeTuningFlagClip = 0x02;
+static const uint32_t kDeTuningFlagThrQuiet = 0x04;
+static const uint32_t kDeTuningFlagThrDieout = 0x08;
+static const uint32_t kDeTuningFlagThrLow = 0x10;
+static const uint32_t kDeTuningFlagThrHigh = 0x20;
+static const uint32_t kDeTuningFlagContentQualLevel = 0x40;
+static const uint32_t kDeTuningFlagDeBlend = 0x80;
+
+typedef enum {
+ kDeContentQualUnknown,
+ kDeContentQualLow,
+ kDeContentQualMedium,
+ kDeContentQualHigh,
+ kDeContentQualMax,
+} PPDEContentQualLevel;
+
+typedef enum {
+ kDeContentTypeUnknown,
+ kDeContentTypeVideo,
+ kDeContentTypeGraphics,
+ kDeContentTypeMax,
+} PPDEContentType;
+
+/*
+struct PPDETuningCfg
+*/
+struct PPDETuningCfg {
+ uint32_t flags;
+ int32_t sharp_factor;
+ uint16_t thr_quiet;
+ uint16_t thr_dieout;
+ uint16_t thr_low;
+ uint16_t thr_high;
+ uint16_t clip;
+ PPDEContentQualLevel quality;
+ PPDEContentType content_type;
+ uint32_t de_blend;
+};
+
+struct PPDETuningCfgData {
+ uint32_t cfg_en;
+ struct PPDETuningCfg params;
+ bool cfg_pending;
+};
+
#ifdef __cplusplus
}
#endif
diff --git a/sdm/include/private/dpps_control_interface.h b/include/dpps_control_interface.h
similarity index 89%
rename from sdm/include/private/dpps_control_interface.h
rename to include/dpps_control_interface.h
index 8a44907..df27e65 100644
--- a/sdm/include/private/dpps_control_interface.h
+++ b/include/dpps_control_interface.h
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2016, The Linux Foundation. All rights reserved.
+* Copyright (c) 2016, 2019, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
@@ -25,13 +25,16 @@
#ifndef __DPPS_CONTROL_INTERFACE_H__
#define __DPPS_CONTROL_INTERFACE_H__
+#include <string>
+
namespace sdm {
class DppsControlInterface {
public:
virtual ~DppsControlInterface() { }
- virtual DisplayError On() = 0;
- virtual DisplayError Off() = 0;
+ virtual int On() = 0;
+ virtual int Off() = 0;
+ virtual int ApplyCommand(const std::string &command) = 0;
};
} // namespace sdm
diff --git a/libdebug/Android.mk b/libdebug/Android.mk
index 273b83d..4d18804 100644
--- a/libdebug/Android.mk
+++ b/libdebug/Android.mk
@@ -6,7 +6,7 @@
LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := libdl
-LOCAL_CFLAGS := -DLOG_TAG=\"SDM\" -Wall -std=c++11 -Werror -fno-operator-names
+LOCAL_CFLAGS := -DLOG_TAG=\"SDM\" -Wall -Werror -fno-operator-names
LOCAL_CLANG := true
LOCAL_SRC_FILES := debug_handler.cpp
LOCAL_COPY_HEADERS_TO := qcom/display
diff --git a/libdrmutils/Android.mk b/libdrmutils/Android.mk
index 94325fe..f881a4b 100644
--- a/libdrmutils/Android.mk
+++ b/libdrmutils/Android.mk
@@ -10,7 +10,7 @@
$(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
LOCAL_HEADER_LIBRARIES := display_headers
LOCAL_SHARED_LIBRARIES := libdrm libdl libdisplaydebug
-LOCAL_CFLAGS := -DLOG_TAG=\"DRMUTILS\" -Wall -std=c++11 -Werror -fno-operator-names
+LOCAL_CFLAGS := -DLOG_TAG=\"DRMUTILS\" -Wall -Werror -fno-operator-names
LOCAL_CLANG := true
LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
LOCAL_SRC_FILES := drm_master.cpp drm_res_mgr.cpp drm_lib_loader.cpp
diff --git a/sde-drm/Android.mk b/sde-drm/Android.mk
index 775a0fa..39490d3 100644
--- a/sde-drm/Android.mk
+++ b/sde-drm/Android.mk
@@ -13,7 +13,7 @@
-isystem external/libdrm
LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
LOCAL_CFLAGS := -Wno-missing-field-initializers -Wall -Werror -fno-operator-names \
- -Wno-unused-parameter -std=c++11 -DLOG_TAG=\"SDE_DRM\"
+ -Wno-unused-parameter -DLOG_TAG=\"SDE_DRM\"
LOCAL_CLANG := true
LOCAL_SRC_FILES := drm_manager.cpp \
drm_connector.cpp \
@@ -36,4 +36,4 @@
LOCAL_VENDOR_MODULE := true
include $(BUILD_SHARED_LIBRARY)
-endif
\ No newline at end of file
+endif
diff --git a/sde-drm/drm_dpps_mgr_imp.cpp b/sde-drm/drm_dpps_mgr_imp.cpp
index bd88d30..68ed4a5 100644
--- a/sde-drm/drm_dpps_mgr_imp.cpp
+++ b/sde-drm/drm_dpps_mgr_imp.cpp
@@ -379,9 +379,15 @@
ret = drmIoctl(info.drm_fd, DRM_IOCTL_MSM_REGISTER_EVENT, &event_req);
else
ret = drmIoctl(info.drm_fd, DRM_IOCTL_MSM_DEREGISTER_EVENT, &event_req);
- if (ret)
- DRM_LOGE("Failed to set event 0x%x, object_id %u, object_type 0x%x, enable %d",
- event_req.event, event_req.object_id, info.object_type, info.enable);
+ if (ret) {
+ if (ret == -EALREADY) {
+ DRM_LOGI("Duplicated request to set event 0x%x, object_id %u, object_type 0x%x, enable %d",
+ event_req.event, event_req.object_id, info.object_type, info.enable);
+ } else {
+ DRM_LOGE("Failed to set event 0x%x, object_id %u, object_type 0x%x, enable %d, ret %d",
+ event_req.event, event_req.object_id, info.object_type, info.enable, ret);
+ }
+ }
it = dpps_dirty_event_.erase(it);
} else {
it++;
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index 2cfdb40..6506056 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -216,11 +216,12 @@
uint32_t fps = 0; //!< Frame rate per second.
uint32_t vsync_period_ns = 0; //!< VSync period in nanoseconds.
bool is_yuv = false; //!< If the display output is in YUV format.
+ bool smart_panel = false; //!< If the display config has smart panel.
bool operator==(const DisplayConfigVariableInfo& info) const {
return ((x_pixels == info.x_pixels) && (y_pixels == info.y_pixels) && (x_dpi == info.x_dpi) &&
(y_dpi == info.y_dpi) && (fps == info.fps) && (vsync_period_ns == info.vsync_period_ns)
- && (is_yuv == info.is_yuv));
+ && (is_yuv == info.is_yuv) && (smart_panel == info.smart_panel));
}
};
diff --git a/sdm/include/core/layer_buffer.h b/sdm/include/core/layer_buffer.h
index 1f55913..af158f7 100644
--- a/sdm/include/core/layer_buffer.h
+++ b/sdm/include/core/layer_buffer.h
@@ -214,6 +214,9 @@
uint32_t mask_layer : 1; //!< This flag shall be set by client to indicate that the layer
//!< is union of solid fill regions typically transparent pixels
//!< and black pixels.
+
+ uint32_t game : 1; //!< This flag shall be set by the client to indicate that the
+ //!< the content is game.
};
uint32_t flags = 0; //!< For initialization purpose only.
diff --git a/sdm/include/core/layer_stack.h b/sdm/include/core/layer_stack.h
index 8859784..8a03bfc 100644
--- a/sdm/include/core/layer_stack.h
+++ b/sdm/include/core/layer_stack.h
@@ -166,6 +166,9 @@
uint32_t color_transform : 1; //!< This flag will be set by SDM when the layer
//!< has a custom matrix
+
+ uint32_t is_game : 1; //!< This flag shall be set by client to indicate that this layer
+ //!< is a game layer.
};
uint32_t flags = 0; //!< For initialization purpose only.
diff --git a/sdm/include/private/color_params.h b/sdm/include/private/color_params.h
index 573e741..cdc6577 100644
--- a/sdm/include/private/color_params.h
+++ b/sdm/include/private/color_params.h
@@ -32,6 +32,8 @@
#include <stdio.h>
#include <string.h>
+#include <display_color_processing.h>
+#include <dpps_control_interface.h>
#include <utils/locker.h>
#include <utils/constants.h>
#include <core/sdm_types.h>
@@ -186,9 +188,11 @@
struct PPHWAttributes : HWResourceInfo, HWPanelInfo, DisplayConfigVariableInfo {
char panel_name[256] = "generic_panel";
PPFeatureVersion version;
+ DppsControlInterface *dpps_intf = NULL;
void Set(const HWResourceInfo &hw_res, const HWPanelInfo &panel_info,
- const DisplayConfigVariableInfo &attr, const PPFeatureVersion &feature_ver);
+ const DisplayConfigVariableInfo &attr, const PPFeatureVersion &feature_ver,
+ DppsControlInterface *dpps_intf);
};
struct PPDisplayAPIPayload {
@@ -272,49 +276,6 @@
uint32_t buffer_size;
};
-static const uint32_t kDeTuningFlagSharpFactor = 0x01;
-static const uint32_t kDeTuningFlagClip = 0x02;
-static const uint32_t kDeTuningFlagThrQuiet = 0x04;
-static const uint32_t kDeTuningFlagThrDieout = 0x08;
-static const uint32_t kDeTuningFlagThrLow = 0x10;
-static const uint32_t kDeTuningFlagThrHigh = 0x20;
-static const uint32_t kDeTuningFlagContentQualLevel = 0x40;
-static const uint32_t kDeTuningFlagDeBlend = 0x80;
-
-typedef enum {
- kDeContentQualUnknown,
- kDeContentQualLow,
- kDeContentQualMedium,
- kDeContentQualHigh,
- kDeContentQualMax,
-} PPDEContentQualLevel;
-
-typedef enum {
- kDeContentTypeUnknown,
- kDeContentTypeVideo,
- kDeContentTypeGraphics,
- kDeContentTypeMax,
-} PPDEContentType;
-
-struct PPDETuningCfg {
- uint32_t flags = 0;
- int32_t sharp_factor = 0;
- uint16_t thr_quiet = 0;
- uint16_t thr_dieout = 0;
- uint16_t thr_low = 0;
- uint16_t thr_high = 0;
- uint16_t clip = 0;
- PPDEContentQualLevel quality = kDeContentQualUnknown;
- PPDEContentType content_type = kDeContentTypeUnknown;
- uint32_t de_blend = 0;
-};
-
-struct PPDETuningCfgData {
- uint32_t cfg_en = 0;
- PPDETuningCfg params;
- bool cfg_pending = false;
-};
-
struct SDEGamutCfg {
static const int kGamutTableNum = 4;
static const int kGamutScaleoffTableNum = 3;
diff --git a/sdm/include/private/hw_info_types.h b/sdm/include/private/hw_info_types.h
index 007767e..0daf0ef 100644
--- a/sdm/include/private/hw_info_types.h
+++ b/sdm/include/private/hw_info_types.h
@@ -667,6 +667,7 @@
DestScaleInfoMap dest_scale_info_map = {};
HWHDRLayerInfo hdr_layer_info = {};
Handle pvt_data = NULL; // Private data used by sdm extension only.
+ bool game_present = false; // Indicates there is game layer or not
};
struct HWQosData {
diff --git a/sdm/include/utils/constants.h b/sdm/include/utils/constants.h
index e34ce60..691e88c 100644
--- a/sdm/include/utils/constants.h
+++ b/sdm/include/utils/constants.h
@@ -43,6 +43,7 @@
#define UINT32(exp) static_cast<uint32_t>(exp)
#define INT32(exp) static_cast<int32_t>(exp)
#define UINT64(exp) static_cast<uint64_t>(exp)
+#define DOUBLE(exp) static_cast<double>(exp)
#define ROUND_UP(number, step) ((((number) + ((step) - 1)) / (step)) * (step))
diff --git a/sdm/libs/core/Android.mk b/sdm/libs/core/Android.mk
index 5b88f60..5840821 100644
--- a/sdm/libs/core/Android.mk
+++ b/sdm/libs/core/Android.mk
@@ -74,6 +74,5 @@
$(SDM_HEADER_PATH)/private/hw_info_types.h \
$(SDM_HEADER_PATH)/private/partial_update_interface.h \
$(SDM_HEADER_PATH)/private/resource_interface.h \
- $(SDM_HEADER_PATH)/private/strategy_interface.h \
- $(SDM_HEADER_PATH)/private/dpps_control_interface.h
+ $(SDM_HEADER_PATH)/private/strategy_interface.h
include $(BUILD_COPY_HEADERS)
diff --git a/sdm/libs/core/color_manager.cpp b/sdm/libs/core/color_manager.cpp
index f9e353a..b9a33e8 100644
--- a/sdm/libs/core/color_manager.cpp
+++ b/sdm/libs/core/color_manager.cpp
@@ -252,7 +252,8 @@
ColorManagerProxy *ColorManagerProxy::CreateColorManagerProxy(DisplayType type,
HWInterface *hw_intf,
const HWDisplayAttributes &attribute,
- const HWPanelInfo &panel_info) {
+ const HWPanelInfo &panel_info,
+ DppsControlInterface *dpps_intf) {
DisplayError error = kErrorNone;
PPFeatureVersion versions;
int32_t display_id = -1;
@@ -274,7 +275,7 @@
if (error != kErrorNone) {
DLOGW("Fail to get DSPP feature versions");
} else {
- hw_attr.Set(hw_res_info_, panel_info, attribute, versions);
+ hw_attr.Set(hw_res_info_, panel_info, attribute, versions, dpps_intf);
DLOGI("PAV2 version is versions = %d, version = %d ",
hw_attr.version.version[kGlobalColorFeaturePaV2],
versions.version[kGlobalColorFeaturePaV2]);
@@ -371,7 +372,8 @@
void PPHWAttributes::Set(const HWResourceInfo &hw_res,
const HWPanelInfo &panel_info,
const DisplayConfigVariableInfo &attr,
- const PPFeatureVersion &feature_ver) {
+ const PPFeatureVersion &feature_ver,
+ DppsControlInterface *intf) {
HWResourceInfo &res = *this;
res = hw_res;
HWPanelInfo &panel = *this;
@@ -379,6 +381,7 @@
DisplayConfigVariableInfo &attributes = *this;
attributes = attr;
version = feature_ver;
+ dpps_intf = intf;
if (strlen(panel_info.panel_name)) {
snprintf(&panel_name[0], sizeof(panel_name), "%s", &panel_info.panel_name[0]);
diff --git a/sdm/libs/core/color_manager.h b/sdm/libs/core/color_manager.h
index c84c032..c8f47e9 100644
--- a/sdm/libs/core/color_manager.h
+++ b/sdm/libs/core/color_manager.h
@@ -128,7 +128,8 @@
*/
static ColorManagerProxy *CreateColorManagerProxy(DisplayType type, HWInterface *hw_intf,
const HWDisplayAttributes &attribute,
- const HWPanelInfo &panel_info);
+ const HWPanelInfo &panel_info,
+ DppsControlInterface *dpps_intf);
/* need reverse the effect of CreateColorManagerProxy. */
~ColorManagerProxy();
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
index 919e57f..6980820 100644
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -559,7 +559,15 @@
// DPPS feature and HDR using SSPP tone mapping can co-exist
// DPPS feature and HDR using DSPP tone mapping are mutually exclusive
if (dpps_ctrl_intf_ && hw_res_info_.src_tone_map.none()) {
- return enable ? dpps_ctrl_intf_->On() : dpps_ctrl_intf_->Off();
+ int err = 0;
+ if (enable) {
+ err = dpps_ctrl_intf_->On();
+ } else {
+ err = dpps_ctrl_intf_->Off();
+ }
+ if (err) {
+ return kErrorUndefined;
+ }
}
return kErrorNone;
diff --git a/sdm/libs/core/comp_manager.h b/sdm/libs/core/comp_manager.h
index d804cd0..b7a15c3 100644
--- a/sdm/libs/core/comp_manager.h
+++ b/sdm/libs/core/comp_manager.h
@@ -87,6 +87,7 @@
bool IsSafeMode() { return safe_mode_; }
void GenerateROI(Handle display_ctx, HWLayers *hw_layers);
DisplayError CheckEnforceSplit(Handle comp_handle, uint32_t new_refresh_rate);
+ DppsControlInterface* GetDppsControlIntf() { return dpps_ctrl_intf_; }
private:
static const int kMaxThermalLevel = 3;
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 05e8b0e..e2c2dab 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -132,8 +132,10 @@
// ColorManager supported for built-in display.
if (kBuiltIn == display_type_) {
+ DppsControlInterface *dpps_intf = comp_manager_->GetDppsControlIntf();
color_mgr_ = ColorManagerProxy::CreateColorManagerProxy(display_type_, hw_intf_,
- display_attributes_, hw_panel_info_);
+ display_attributes_, hw_panel_info_,
+ dpps_intf);
if (color_mgr_) {
if (InitializeColorModes() != kErrorNone) {
@@ -221,11 +223,16 @@
hw_layers_info.wide_color_primaries.push_back(
layer->input_buffer.color_metadata.colorPrimaries);
}
+ if (layer->flags.is_game) {
+ hw_layers_info.game_present = true;
+ }
}
DLOGD_IF(kTagDisplay,
- "LayerStack layer_count: %d, app_layer_count: %d, gpu_target_index: %d, display: %d-%d",
- layers.size(), hw_layers_info.app_layer_count, hw_layers_info.gpu_target_index,
+ "LayerStack layer_count: %d, app_layer_count: %d, "
+ "gpu_target_index: %d, game_present: %d, display: %d-%d",
+ layers.size(), hw_layers_info.app_layer_count,
+ hw_layers_info.gpu_target_index, hw_layers_info.game_present,
display_id_, display_type_);
if (!hw_layers_info.app_layer_count) {
diff --git a/sdm/libs/core/display_builtin.cpp b/sdm/libs/core/display_builtin.cpp
index 81a27e1..c223ce2 100644
--- a/sdm/libs/core/display_builtin.cpp
+++ b/sdm/libs/core/display_builtin.cpp
@@ -134,11 +134,6 @@
uint32_t new_mixer_height = 0;
uint32_t display_width = display_attributes_.x_pixels;
uint32_t display_height = display_attributes_.y_pixels;
- if (reset_panel_) {
- DLOGW("panel is in bad state, resetting the panel");
- ResetPanel();
- reset_panel_ = false;
- }
DTRACE_SCOPED();
if (NeedsMixerReconfiguration(layer_stack, &new_mixer_width, &new_mixer_height)) {
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index d3fd241..62f5923 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -588,6 +588,9 @@
mm_width = connector_info_.mmWidth;
mm_height = connector_info_.mmHeight;
topology = connector_info_.modes[index].topology;
+ if (mode.flags & DRM_MODE_FLAG_CMD_MODE_PANEL) {
+ display_attributes_[index].smart_panel = true;
+ }
}
display_attributes_[index].x_pixels = mode.hdisplay;
diff --git a/sdm/libs/utils/rect.cpp b/sdm/libs/utils/rect.cpp
index 1e0db28..3ea436f 100644
--- a/sdm/libs/utils/rect.cpp
+++ b/sdm/libs/utils/rect.cpp
@@ -255,19 +255,19 @@
int y_offset = INT(src_domain.top);
LayerRect modified_in_rect = Reposition(in_rect, -x_offset, -y_offset);
- float src_domain_width = src_domain.right - src_domain.left;
- float src_domain_height = src_domain.bottom - src_domain.top;
- float dst_domain_width = dst_domain.right - dst_domain.left;
- float dst_domain_height = dst_domain.bottom - dst_domain.top;
+ double src_domain_width = DOUBLE(src_domain.right - src_domain.left);
+ double src_domain_height = DOUBLE(src_domain.bottom - src_domain.top);
+ double dst_domain_width = DOUBLE(dst_domain.right - dst_domain.left);
+ double dst_domain_height = DOUBLE(dst_domain.bottom - dst_domain.top);
- float width_ratio = dst_domain_width / src_domain_width;
- float height_ratio = dst_domain_height / src_domain_height;
+ double width_ratio = DOUBLE(dst_domain_width / src_domain_width);
+ double height_ratio = DOUBLE(dst_domain_height / src_domain_height);
// using floorf for all since ceilf on float will round to next int value.
- out_rect->left = floorf(dst_domain.left + (width_ratio * modified_in_rect.left));
- out_rect->top = floorf(dst_domain.top + (height_ratio * modified_in_rect.top));
- out_rect->right = floorf(dst_domain.left + (width_ratio * modified_in_rect.right));
- out_rect->bottom = floorf(dst_domain.top + (height_ratio * modified_in_rect.bottom));
+ out_rect->left = floor(dst_domain.left + (width_ratio * modified_in_rect.left));
+ out_rect->top = floor(dst_domain.top + (height_ratio * modified_in_rect.top));
+ out_rect->right = floor(dst_domain.left + (width_ratio * modified_in_rect.right));
+ out_rect->bottom = floor(dst_domain.top + (height_ratio * modified_in_rect.bottom));
}
void TransformHV(const LayerRect &src_domain, const LayerRect &in_rect,