sdm: Add support for single buffer layers

Add support for single buffer layers. Graphics writes to the same
buffer being read by display. For dumb panels, there should be no
idle mode, smart panels should be put in an auto-refresh mode. Also
such layers cannot be sent to framebuffer.
Change-Id: Id4f15239d8edc258524dfddd4e9d72c67cd2406f
CRs-fixed: 1114808
This commit is contained in:
Ramakant Singh
2017-08-31 12:34:54 +05:30
parent d90a6a43cc
commit ae0570951d
4 changed files with 41 additions and 1 deletions

View File

@@ -809,6 +809,17 @@ gralloc1_error_t BufferManager::Perform(int operation, va_list args) {
} }
} break; } break;
case GRALLOC_MODULE_PERFORM_SET_SINGLE_BUFFER_MODE: {
private_handle_t* hnd = va_arg(args, private_handle_t*);
uint32_t *enable = va_arg(args, uint32_t*);
if (private_handle_t::validate(hnd) != 0) {
return GRALLOC1_ERROR_BAD_HANDLE;
}
if (setMetaData(hnd, SET_SINGLE_BUFFER_MODE, enable) != 0) {
return GRALLOC1_ERROR_UNSUPPORTED;
}
} break;
default: default:
break; break;
} }

View File

@@ -529,6 +529,12 @@ void HWCDisplay::BuildLayerStack() {
secure_display_active = true; secure_display_active = true;
} }
if (hwc_layer->IsSingleBuffered() &&
!(hwc_layer->IsRotationPresent() || hwc_layer->IsScalingPresent())) {
layer->flags.single_buffer = true;
layer_stack_.flags.single_buffered_layer_present = true;
}
if (hwc_layer->GetClientRequestedCompositionType() == HWC2::Composition::Cursor) { if (hwc_layer->GetClientRequestedCompositionType() == HWC2::Composition::Cursor) {
// Currently we support only one HWCursor & only at top most z-order // Currently we support only one HWCursor & only at top most z-order
if ((*layer_set_.rbegin())->GetId() == hwc_layer->GetId()) { if ((*layer_set_.rbegin())->GetId() == hwc_layer->GetId()) {
@@ -2039,7 +2045,8 @@ bool HWCDisplay::CanSkipValidate() {
} }
// Layer Stack checks // Layer Stack checks
if (layer_stack_.flags.hdr_present && (tone_mapper_ && tone_mapper_->IsActive())) { if ((layer_stack_.flags.hdr_present && (tone_mapper_ && tone_mapper_->IsActive())) ||
layer_stack_.flags.single_buffered_layer_present) {
DLOGV_IF(kTagClient, "HDR content present with tone mapping enabled. Returning false."); DLOGV_IF(kTagClient, "HDR content present with tone mapping enabled. Returning false.");
return false; return false;
} }

View File

@@ -769,6 +769,9 @@ DisplayError HWCLayer::SetMetaData(const private_handle_t *pvt_handle, Layer *la
GetUBWCStatsFromMetaData(&cr_stats[0], &(layer_buffer->ubwc_crstats[0])); GetUBWCStatsFromMetaData(&cr_stats[0], &(layer_buffer->ubwc_crstats[0]));
} // if (getMetaData) } // if (getMetaData)
single_buffer_ = false;
getMetaData(const_cast<private_handle_t *>(handle), GET_SINGLE_BUFFER_MODE, &single_buffer_);
return kErrorNone; return kErrorNone;
} }
@@ -888,4 +891,19 @@ int32_t HWCLayer::PopReleaseFence(void) {
return fence; return fence;
} }
bool HWCLayer::IsRotationPresent() {
return ((layer_->transform.rotation != 0.0f) ||
layer_->transform.flip_horizontal ||
layer_->transform.flip_vertical);
}
bool HWCLayer::IsScalingPresent() {
uint32_t src_width = static_cast<uint32_t>(layer_->src_rect.right - layer_->src_rect.left);
uint32_t src_height = static_cast<uint32_t>(layer_->src_rect.bottom - layer_->src_rect.top);
uint32_t dst_width = static_cast<uint32_t>(layer_->dst_rect.right - layer_->dst_rect.left);
uint32_t dst_height = static_cast<uint32_t>(layer_->dst_rect.bottom - layer_->dst_rect.top);
return ((src_width != dst_width) || (dst_height != src_height));
}
} // namespace sdm } // namespace sdm

View File

@@ -94,6 +94,9 @@ class HWCLayer {
bool SupportLocalConversion(ColorPrimaries working_primaries); bool SupportLocalConversion(ColorPrimaries working_primaries);
void ResetValidation() { needs_validate_ = false; } void ResetValidation() { needs_validate_ = false; }
bool NeedsValidation() { return (needs_validate_ || geometry_changes_); } bool NeedsValidation() { return (needs_validate_ || geometry_changes_); }
bool IsSingleBuffered() { return single_buffer_; }
bool IsScalingPresent();
bool IsRotationPresent();
private: private:
Layer *layer_ = nullptr; Layer *layer_ = nullptr;
@@ -107,6 +110,7 @@ class HWCLayer {
LayerTransform layer_transform_ = {}; LayerTransform layer_transform_ = {};
LayerRect dst_rect_ = {}; LayerRect dst_rect_ = {};
bool needs_validate_ = true; bool needs_validate_ = true;
bool single_buffer_ = false;
// Composition requested by client(SF) // Composition requested by client(SF)
HWC2::Composition client_requested_ = HWC2::Composition::Device; HWC2::Composition client_requested_ = HWC2::Composition::Device;