Merge branch 'LA.HB.1.3.9_1' into display.lnx.3.0-dev
Change-Id: I72aff6fecdf580de749f1fb6f91d346dc0f91448
CRs-Fixed: 1058446
diff --git a/common.mk b/common.mk
index 298e0bf..af72e7b 100644
--- a/common.mk
+++ b/common.mk
@@ -1,9 +1,14 @@
#Common headers
display_top := $(call my-dir)
+#Common C flags
+common_flags := -DDEBUG_CALC_FPS -Wno-missing-field-initializers
+common_flags += -Wconversion -Wall -Werror -std=c++11
+
use_hwc2 := false
ifeq ($(TARGET_USES_HWC2), true)
use_hwc2 := true
+ common_flags += -DVIDEO_MODE_DEFER_RETIRE_FENCE
endif
common_includes := $(display_top)/libqdutils
@@ -25,9 +30,6 @@
LOCAL_CLANG := true
endif
-#Common C flags
-common_flags := -DDEBUG_CALC_FPS -Wno-missing-field-initializers
-common_flags += -Wconversion -Wall -Werror -std=c++11
ifneq ($(TARGET_USES_GRALLOC1), true)
common_flags += -isystem $(display_top)/libgralloc
else
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index b1a34d1..bd2d7d3 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -697,7 +697,7 @@
return kErrorNotSupported;
}
- DLOGI("Number of color modes = %d", num_color_modes_);
+ DLOGV_IF(kTagQDCM, "Number of modes from color manager = %d", num_color_modes_);
*mode_count = num_color_modes_;
return kErrorNone;
@@ -726,7 +726,15 @@
for (uint32_t i = 0; i < num_color_modes_; i++) {
DLOGV_IF(kTagQDCM, "Color Mode[%d]: Name = %s mode_id = %d", i, color_modes_[i].name,
color_modes_[i].id);
- color_mode_map_.insert(std::make_pair(color_modes_[i].name, &color_modes_[i]));
+ auto it = color_mode_map_.find(color_modes_[i].name);
+ if (it != color_mode_map_.end()) {
+ if (it->second->id < color_modes_[i].id) {
+ color_mode_map_.erase(it);
+ color_mode_map_.insert(std::make_pair(color_modes_[i].name, &color_modes_[i]));
+ }
+ } else {
+ color_mode_map_.insert(std::make_pair(color_modes_[i].name, &color_modes_[i]));
+ }
}
}
@@ -755,7 +763,7 @@
SDEDisplayMode *sde_display_mode = it->second;
- DLOGV_IF(kTagQDCM, "Color Mode Name = %s corresponding mode_id = %d", sde_display_mode->name,
+ DLOGD("Color Mode Name = %s corresponding mode_id = %d", sde_display_mode->name,
sde_display_mode->id);
DisplayError error = kErrorNone;
error = color_mgr_->ColorMgrSetMode(sde_display_mode->id);
diff --git a/sdm/libs/core/fb/hw_device.cpp b/sdm/libs/core/fb/hw_device.cpp
index f75e92a..5b1bc80 100644
--- a/sdm/libs/core/fb/hw_device.cpp
+++ b/sdm/libs/core/fb/hw_device.cpp
@@ -501,7 +501,12 @@
}
stack->retire_fence_fd = mdp_commit.retire_fence;
-
+#ifdef VIDEO_MODE_DEFER_RETIRE_FENCE
+ if (hw_panel_info_.mode == kModeVideo) {
+ stack->retire_fence_fd = stored_retire_fence;
+ stored_retire_fence = mdp_commit.retire_fence;
+ }
+#endif
// MDP returns only one release fence for the entire layer stack. Duplicate this fence into all
// layers being composed by MDP.
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index 8916dc4..e2e146e 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -135,6 +135,7 @@
const char *fb_path_;
BufferSyncHandler *buffer_sync_handler_;
int device_fd_;
+ int stored_retire_fence = -1;
HWDeviceType device_type_;
mdp_layer_commit mdp_disp_commit_;
mdp_input_layer mdp_in_layers_[kMaxSDELayers * 2]; // split panel (left + right)
diff --git a/sdm/libs/hwc/hwc_color_manager.cpp b/sdm/libs/hwc/hwc_color_manager.cpp
index 652ea3b..acf5f37 100644
--- a/sdm/libs/hwc/hwc_color_manager.cpp
+++ b/sdm/libs/hwc/hwc_color_manager.cpp
@@ -53,8 +53,8 @@
namespace sdm {
uint32_t HWCColorManager::Get8BitsARGBColorValue(const PPColorFillParams ¶ms) {
- uint32_t argb_color = ((params.color.r << 16) & 0xff0000) | ((params.color.g) & 0xff)
- | ((params.color.b << 8) & 0xff00);
+ uint32_t argb_color = ((params.color.r << 16) & 0xff0000) | ((params.color.g << 8) & 0xff00) |
+ ((params.color.b) & 0xff);
return argb_color;
}
diff --git a/sdm/libs/hwc2/hwc_color_manager.cpp b/sdm/libs/hwc2/hwc_color_manager.cpp
index 3b73003..a5cb821 100644
--- a/sdm/libs/hwc2/hwc_color_manager.cpp
+++ b/sdm/libs/hwc2/hwc_color_manager.cpp
@@ -53,8 +53,8 @@
namespace sdm {
uint32_t HWCColorManager::Get8BitsARGBColorValue(const PPColorFillParams ¶ms) {
- uint32_t argb_color = ((params.color.r << 16) & 0xff0000) | ((params.color.g) & 0xff) |
- ((params.color.b << 8) & 0xff00);
+ uint32_t argb_color = ((params.color.r << 16) & 0xff0000) | ((params.color.g << 8) & 0xff00) |
+ ((params.color.b) & 0xff);
return argb_color;
}
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 1f901d8..9a8de43 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -60,7 +60,7 @@
HWC2::Error HWCColorMode::Init() {
PopulateColorModes();
- return HWC2::Error::None;
+ return SetColorMode(HAL_COLOR_MODE_NATIVE);
}
HWC2::Error HWCColorMode::DeInit() {
@@ -169,14 +169,14 @@
return;
}
- DLOGI("Color Modes supported count = %d", color_mode_count);
+ DLOGV_IF(kTagQDCM, "Color Modes supported count = %d", color_mode_count);
std::vector<std::string> color_modes(color_mode_count);
error = display_intf_->GetColorModes(&color_mode_count, &color_modes);
for (uint32_t i = 0; i < color_mode_count; i++) {
std::string &mode_string = color_modes.at(i);
- DLOGI("Color Mode[%d] = %s", i, mode_string.c_str());
+ DLOGV_IF(kTagQDCM, "Color Mode[%d] = %s", i, mode_string.c_str());
if (mode_string.find("hal_native") != std::string::npos) {
PopulateTransform(HAL_COLOR_MODE_NATIVE, mode_string);
} else if (mode_string.find("hal_srgb") != std::string::npos) {
@@ -330,6 +330,13 @@
// TODO(user): Add blit target layers
for (auto hwc_layer : layer_set_) {
Layer *layer = hwc_layer->GetSDMLayer();
+ layer->flags = {}; // Reset earlier flags
+ if (hwc_layer->GetClientRequestedCompositionType() == HWC2::Composition::Client) {
+ layer->flags.skip = true;
+ } else if (hwc_layer->GetClientRequestedCompositionType() == HWC2::Composition::SolidColor) {
+ layer->flags.solid_fill = true;
+ }
+
// set default composition as GPU for SDM
layer->composition = kCompositionGPU;
@@ -374,8 +381,18 @@
ApplyScanAdjustment(&scaled_display_frame);
hwc_layer->SetLayerDisplayFrame(scaled_display_frame);
ApplyDeInterlaceAdjustment(layer);
- // TODO(user): Verify if we still need to configure the solid fill layerbuffer,
- // it should already have a valid dst_rect by this point
+ // SDM requires these details even for solid fill
+ if (layer->flags.solid_fill) {
+ LayerBuffer *layer_buffer = layer->input_buffer;
+ layer_buffer->width = UINT32(layer->dst_rect.right - layer->dst_rect.left);
+ layer_buffer->height = UINT32(layer->dst_rect.bottom - layer->dst_rect.top);
+ layer_buffer->acquire_fence_fd = -1;
+ layer_buffer->release_fence_fd = -1;
+ layer->src_rect.left = 0;
+ layer->src_rect.top = 0;
+ layer->src_rect.right = layer_buffer->width;
+ layer->src_rect.bottom = layer_buffer->height;
+ }
if (layer->frame_rate > metadata_refresh_rate_) {
metadata_refresh_rate_ = SanitizeRefreshRate(layer->frame_rate);
@@ -756,6 +773,12 @@
if (!validated_ && !layer_set_.empty()) {
return HWC2::Error::NotValidated;
}
+
+ for (const auto& change : layer_changes_) {
+ auto hwc_layer = layer_map_[change.first];
+ auto composition = change.second;
+ hwc_layer->UpdateClientCompositionType(composition);
+ }
return HWC2::Error::None;
}
@@ -889,6 +912,8 @@
} else if (layer->composition != kCompositionGPU) {
hwc_layer->PushReleaseFence(layer_buffer->release_fence_fd);
layer_buffer->release_fence_fd = -1;
+ } else {
+ hwc_layer->PushReleaseFence(-1);
}
}
@@ -898,22 +923,21 @@
}
}
- *out_retire_fence = stored_retire_fence_;
+ *out_retire_fence = -1;
if (!flush_) {
// if swapinterval property is set to 0 then close and reset the list retire fence
if (swap_interval_zero_) {
close(layer_stack_.retire_fence_fd);
layer_stack_.retire_fence_fd = -1;
}
- stored_retire_fence_ = layer_stack_.retire_fence_fd;
+ *out_retire_fence = layer_stack_.retire_fence_fd;
if (dump_frame_count_) {
dump_frame_count_--;
dump_frame_index_++;
}
- } else {
- stored_retire_fence_ = -1;
}
+
geometry_changes_ = GeometryChanges::kNone;
flush_ = false;
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index 9b21391..2221027 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -263,7 +263,6 @@
bool validated_ = false;
bool color_tranform_failed_ = false;
HWCColorMode *color_mode_ = NULL;
- int32_t stored_retire_fence_ = -1;
private:
void DumpInputBuffers(void);
diff --git a/sdm/libs/hwc2/hwc_display_primary.cpp b/sdm/libs/hwc2/hwc_display_primary.cpp
index 9a158f5..198eddb 100644
--- a/sdm/libs/hwc2/hwc_display_primary.cpp
+++ b/sdm/libs/hwc2/hwc_display_primary.cpp
@@ -159,9 +159,6 @@
auto status = HWC2::Error::None;
DisplayError error = kErrorNone;
- if (!boot_animation_completed_)
- ProcessBootAnimCompleted();
-
if (display_paused_) {
MarkLayersForGPUBypass();
return status;
diff --git a/sdm/libs/hwc2/hwc_display_virtual.cpp b/sdm/libs/hwc2/hwc_display_virtual.cpp
index 8c16e5c..787640c 100644
--- a/sdm/libs/hwc2/hwc_display_virtual.cpp
+++ b/sdm/libs/hwc2/hwc_display_virtual.cpp
@@ -148,16 +148,10 @@
}
status = HWCDisplay::PostCommitLayerStack(out_retire_fence);
- // On Virtual displays, use the output buffer release fence as the retire fence
- // Close the layer stack retire fence as it is unused
- if (layer_stack_.output_buffer) {
- stored_retire_fence_ = layer_stack_.output_buffer->release_fence_fd;
- close(layer_stack_.retire_fence_fd);
- layer_stack_.retire_fence_fd = -1;
- }
}
}
CloseAcquireFds();
+ close(output_buffer_->acquire_fence_fd);
return status;
}
@@ -180,6 +174,7 @@
output_buffer_->acquire_fence_fd = dup(release_fence);
if (output_handle) {
+ output_handle_ = output_handle;
output_buffer_->buffer_id = reinterpret_cast<uint64_t>(output_handle);
int output_handle_format = output_handle->format;
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index 225b599..a18cb4a 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -43,7 +43,7 @@
close(release_fences_.front());
release_fences_.pop();
}
-
+ close(ion_fd_);
if (layer_) {
if (layer_->input_buffer) {
delete (layer_->input_buffer);
@@ -64,6 +64,16 @@
}
const private_handle_t *handle = static_cast<const private_handle_t *>(buffer);
+
+ // Validate and dup ion fd from surfaceflinger
+ // This works around bug 30281222
+ if (handle->fd < 0) {
+ return HWC2::Error::BadParameter;
+ } else {
+ close(ion_fd_);
+ ion_fd_ = dup(handle->fd);
+ }
+
LayerBuffer *layer_buffer = layer_->input_buffer;
layer_buffer->width = UINT32(handle->width);
layer_buffer->height = UINT32(handle->height);
@@ -83,7 +93,7 @@
layer_buffer->flags.secure_display = true;
}
- layer_buffer->planes[0].fd = handle->fd;
+ layer_buffer->planes[0].fd = ion_fd_;
layer_buffer->planes[0].offset = handle->offset;
layer_buffer->planes[0].stride = UINT32(handle->width);
layer_buffer->acquire_fence_fd = acquire_fence;
@@ -128,24 +138,20 @@
HWC2::Error HWCLayer::SetLayerColor(hwc_color_t color) {
layer_->solid_fill_color = GetUint32Color(color);
layer_->input_buffer->format = kFormatARGB8888;
- DLOGD("Layer color set to: %u", layer_->solid_fill_color);
- DLOGD("[%" PRIu64 "][%" PRIu64 "] Layer color set to %u %" PRIu64, display_id_, id_,
- layer_->solid_fill_color);
+ DLOGV_IF(kTagCompManager, "[%" PRIu64 "][%" PRIu64 "] Layer color set to %x", display_id_, id_,
+ layer_->solid_fill_color);
return HWC2::Error::None;
}
HWC2::Error HWCLayer::SetLayerCompositionType(HWC2::Composition type) {
- layer_->flags = {}; // Reset earlier flags
client_requested_ = type;
switch (type) {
case HWC2::Composition::Client:
- layer_->flags.skip = true;
break;
case HWC2::Composition::Device:
// We try and default to this in SDM
break;
case HWC2::Composition::SolidColor:
- layer_->flags.solid_fill = true;
break;
case HWC2::Composition::Cursor:
break;
@@ -277,7 +283,7 @@
uint32_t r = UINT32(source.r) << 16;
uint32_t g = UINT32(source.g) << 8;
uint32_t b = UINT32(source.b);
- uint32_t color = a & r & g & b;
+ uint32_t color = a | r | g | b;
return color;
}
diff --git a/sdm/libs/hwc2/hwc_layers.h b/sdm/libs/hwc2/hwc_layers.h
index 56e0336..ed93a5a 100644
--- a/sdm/libs/hwc2/hwc_layers.h
+++ b/sdm/libs/hwc2/hwc_layers.h
@@ -72,6 +72,7 @@
HWC2::Error SetLayerZOrder(uint32_t z);
void SetComposition(const LayerComposition &sdm_composition);
HWC2::Composition GetClientRequestedCompositionType() { return client_requested_; }
+ void UpdateClientCompositionType(HWC2::Composition type) { client_requested_ = type; }
HWC2::Composition GetDeviceSelectedCompositionType() { return device_selected_; }
uint32_t GetGeometryChanges() { return geometry_changes_; }
void ResetGeometryChanges() { geometry_changes_ = GeometryChanges::kNone; }
@@ -85,6 +86,7 @@
const hwc2_display_t display_id_;
static std::atomic<hwc2_layer_t> next_id_;
std::queue<int32_t> release_fences_;
+ int ion_fd_ = -1;
// Composition requested by client(SF)
HWC2::Composition client_requested_ = HWC2::Composition::Device;
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index 2c177f0..66ab568 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -200,9 +200,10 @@
void HWCSession::GetCapabilities(struct hwc2_device *device, uint32_t *outCount,
int32_t *outCapabilities) {
- if (outCapabilities == NULL) {
- *outCount = 0;
+ if (outCapabilities != nullptr && *outCount >= 1) {
+ outCapabilities[0] = HWC2_CAPABILITY_SKIP_CLIENT_COLOR_TRANSFORM;
}
+ *outCount = 1;
}
template <typename PFN, typename T>
@@ -234,9 +235,13 @@
HWCSession *hwc_session = static_cast<HWCSession *>(device);
auto status = hwc_session->CreateVirtualDisplayObject(width, height, format);
- if (status == HWC2::Error::None)
+ if (status == HWC2::Error::None) {
*out_display_id = HWC_DISPLAY_VIRTUAL;
- DLOGI("Created virtual display id:% " PRIu64 " with res: %dx%d", *out_display_id, width, height);
+ DLOGI("Created virtual display id:% " PRIu64 " with res: %dx%d",
+ *out_display_id, width, height);
+ } else {
+ DLOGE("Failed to create virtual display: %s", to_string(status).c_str());
+ }
return INT32(status);
}
@@ -257,6 +262,7 @@
if (hwc_session->hwc_display_[display]) {
HWCDisplayVirtual::Destroy(hwc_session->hwc_display_[display]);
+ hwc_session->hwc_display_[display] = nullptr;
return HWC2_ERROR_NONE;
} else {
return HWC2_ERROR_BAD_DISPLAY;