diff --git a/backend/Backend.cpp b/backend/Backend.cpp index da3e8fc..370fda4 100644 --- a/backend/Backend.cpp +++ b/backend/Backend.cpp @@ -31,7 +31,7 @@ HwcLayer *GetCursorLayer(const std::vector &layers) { auto it = std::find_if(layers.begin(), layers.end(), [&](auto *layer) -> bool { return layer->GetSfType() == - HWC2::Composition::Cursor; + HwcLayer::CompositionType::kCursor; }); if (it == layers.end()) { return nullptr; @@ -136,9 +136,9 @@ bool Backend::IsClientLayer(HwcDisplay *display, HwcLayer *layer) { display->GetHwc()->GetResMan().ForcedScalingWithGpu()); } -bool Backend::HardwareSupportsLayerType(HWC2::Composition comp_type) { - return comp_type == HWC2::Composition::Device || - comp_type == HWC2::Composition::Cursor; +bool Backend::HardwareSupportsLayerType(HwcLayer::CompositionType comp_type) { + return comp_type == HwcLayer::CompositionType::kDevice || + comp_type == HwcLayer::CompositionType::kCursor; } uint32_t Backend::CalcPixOps(const std::vector &layers, @@ -161,12 +161,12 @@ void Backend::MarkValidated(std::vector &layers, bool use_cursor_plane) { for (size_t z_order = 0; z_order < layers.size(); ++z_order) { if (z_order >= client_first_z && z_order < client_first_z + client_size) { - layers[z_order]->SetValidatedType(HWC2::Composition::Client); - } else if (use_cursor_plane && - layers[z_order]->GetSfType() == HWC2::Composition::Cursor) { - layers[z_order]->SetValidatedType(HWC2::Composition::Cursor); + layers[z_order]->SetValidatedType(HwcLayer::CompositionType::kClient); + } else if (use_cursor_plane && layers[z_order]->GetSfType() == + HwcLayer::CompositionType::kCursor) { + layers[z_order]->SetValidatedType(HwcLayer::CompositionType::kCursor); } else { - layers[z_order]->SetValidatedType(HWC2::Composition::Device); + layers[z_order]->SetValidatedType(HwcLayer::CompositionType::kDevice); } } } diff --git a/backend/Backend.h b/backend/Backend.h index 1c5ce0a..33f8347 100644 --- a/backend/Backend.h +++ b/backend/Backend.h @@ -30,7 +30,7 @@ class Backend { virtual bool IsClientLayer(HwcDisplay *display, HwcLayer *layer); protected: - static bool HardwareSupportsLayerType(HWC2::Composition comp_type); + static bool HardwareSupportsLayerType(HwcLayer::CompositionType comp_type); static uint32_t CalcPixOps(const std::vector &layers, size_t first_z, size_t size); static void MarkValidated(std::vector &layers, diff --git a/backend/BackendClient.cpp b/backend/BackendClient.cpp index 7c1bb64..d262ba3 100644 --- a/backend/BackendClient.cpp +++ b/backend/BackendClient.cpp @@ -22,7 +22,7 @@ namespace android { void BackendClient::ValidateDisplay(HwcDisplay *display) { for (auto &[layer_handle, layer] : display->layers()) { - layer.SetValidatedType(HWC2::Composition::Client); + layer.SetValidatedType(HwcLayer::CompositionType::kClient); } } diff --git a/hwc2_device/HwcDisplay.cpp b/hwc2_device/HwcDisplay.cpp index dad6933..ca2495b 100644 --- a/hwc2_device/HwcDisplay.cpp +++ b/hwc2_device/HwcDisplay.cpp @@ -286,11 +286,11 @@ auto HwcDisplay::ValidateStagedComposition() -> std::vector { */ for (auto &l : layers_) { l.second.SetPriorBufferScanOutFlag(l.second.GetValidatedType() != - HWC2::Composition::Client); + HwcLayer::CompositionType::kClient); /* Populate layer data for layers that might be mapped to a drm plane. */ - if (l.second.GetSfType() == HWC2::Composition::Device || - l.second.GetSfType() == HWC2::Composition::Cursor) { + if (l.second.GetSfType() == HwcLayer::CompositionType::kDevice || + l.second.GetSfType() == HwcLayer::CompositionType::kCursor) { l.second.PopulateLayerData(); } } @@ -777,10 +777,10 @@ HWC2::Error HwcDisplay::CreateComposition(AtomicCommitArgs &a_args) { std::optional cursor_layer = std::nullopt; for (auto &[_, layer] : layers_) { switch (layer.GetValidatedType()) { - case HWC2::Composition::Device: + case HwcLayer::CompositionType::kDevice: z_map.emplace(layer.GetZOrder(), &layer); break; - case HWC2::Composition::Cursor: + case HwcLayer::CompositionType::kCursor: if (!cursor_layer.has_value()) { cursor_layer = layer.GetLayerData(); } else { @@ -788,13 +788,16 @@ HWC2::Error HwcDisplay::CreateComposition(AtomicCommitArgs &a_args) { z_map.emplace(layer.GetZOrder(), &layer); } break; - case HWC2::Composition::Client: + case HwcLayer::CompositionType::kClient: // Place it at the z_order of the lowest client layer use_client_layer = true; client_layer_count++; client_z_order = std::min(client_z_order, layer.GetZOrder()); break; - default: + case HwcLayer::CompositionType::kSolidColor: + case HwcLayer::CompositionType::kInvalid: + ALOGE("Invalid layer type: %d", + static_cast(layer.GetValidatedType())); continue; } } @@ -1040,9 +1043,9 @@ std::vector HwcDisplay::GetOrderLayersByZPos() { std::sort(std::begin(ordered_layers), std::end(ordered_layers), [](const HwcLayer *lhs, const HwcLayer *rhs) { // Cursor layers should always have highest zpos. - if ((lhs->GetSfType() == HWC2::Composition::Cursor) != - (rhs->GetSfType() == HWC2::Composition::Cursor)) { - return rhs->GetSfType() == HWC2::Composition::Cursor; + if ((lhs->GetSfType() == HwcLayer::CompositionType::kCursor) != + (rhs->GetSfType() == HwcLayer::CompositionType::kCursor)) { + return rhs->GetSfType() == HwcLayer::CompositionType::kCursor; } return lhs->GetZOrder() < rhs->GetZOrder(); @@ -1151,8 +1154,8 @@ void HwcDisplay::set_backend(std::unique_ptr backend) { bool HwcDisplay::NeedsClientLayerUpdate() const { return std::any_of(layers_.begin(), layers_.end(), [](const auto &pair) { const auto &layer = pair.second; - return layer.GetSfType() == HWC2::Composition::Client || - layer.GetValidatedType() == HWC2::Composition::Client; + return layer.GetSfType() == HwcLayer::CompositionType::kClient || + layer.GetValidatedType() == HwcLayer::CompositionType::kClient; }); } diff --git a/hwc2_device/HwcDisplay.h b/hwc2_device/HwcDisplay.h index 532b8c3..d0ba94a 100644 --- a/hwc2_device/HwcDisplay.h +++ b/hwc2_device/HwcDisplay.h @@ -106,7 +106,7 @@ class HwcDisplay { // To be called after SetDisplayProperties. Returns an empty vector if the // requested layers have been validated, otherwise the vector describes // the requested composition type changes. - using ChangedLayer = std::pair; + using ChangedLayer = std::pair; auto ValidateStagedComposition() -> std::vector; // Mark previously validated properties as ready to present. diff --git a/hwc2_device/HwcLayer.h b/hwc2_device/HwcLayer.h index 0fdcbbc..0225213 100644 --- a/hwc2_device/HwcLayer.h +++ b/hwc2_device/HwcLayer.h @@ -17,7 +17,6 @@ #pragma once #include -#include #include #include "bufferinfo/BufferInfo.h" @@ -44,6 +43,13 @@ class HwcLayer { int32_t slot_id; SharedFd fence; }; + enum class CompositionType { + kInvalid, + kClient, + kDevice, + kSolidColor, + kCursor + }; // A set of properties to be validated. struct LayerProperties { std::optional slot_buffer; @@ -51,7 +57,7 @@ class HwcLayer { std::optional blend_mode; std::optional color_space; std::optional sample_range; - std::optional composition_type; + std::optional composition_type; std::optional display_frame; std::optional alpha; std::optional source_crop; @@ -62,16 +68,16 @@ class HwcLayer { explicit HwcLayer(HwcDisplay *parent_display) : parent_(parent_display){}; - HWC2::Composition GetSfType() const { + CompositionType GetSfType() const { return sf_type_; } - HWC2::Composition GetValidatedType() const { + CompositionType GetValidatedType() const { return validated_type_; } void AcceptTypeChange() { sf_type_ = validated_type_; } - void SetValidatedType(HWC2::Composition type) { + void SetValidatedType(CompositionType type) { validated_type_ = type; } bool IsTypeChanged() const { @@ -107,8 +113,8 @@ class HwcLayer { private: // sf_type_ stores the initial type given to us by surfaceflinger, // validated_type_ stores the type after running ValidateDisplay - HWC2::Composition sf_type_ = HWC2::Composition::Invalid; - HWC2::Composition validated_type_ = HWC2::Composition::Invalid; + CompositionType sf_type_ = CompositionType::kInvalid; + CompositionType validated_type_ = CompositionType::kInvalid; uint32_t z_order_ = 0; LayerData layer_data_; diff --git a/hwc2_device/hwc2_device.cpp b/hwc2_device/hwc2_device.cpp index a23e792..38eba3e 100644 --- a/hwc2_device/hwc2_device.cpp +++ b/hwc2_device/hwc2_device.cpp @@ -1005,7 +1005,24 @@ static int32_t SetLayerCompositionType(hwc2_device_t *device, GET_LAYER(layer); HwcLayer::LayerProperties layer_properties; - layer_properties.composition_type = static_cast(type); + switch (static_cast(type)) { + case HWC2::Composition::Client: + layer_properties.composition_type = HwcLayer::CompositionType::kClient; + break; + case HWC2::Composition::Device: + layer_properties.composition_type = HwcLayer::CompositionType::kDevice; + break; + case HWC2::Composition::SolidColor: + layer_properties + .composition_type = HwcLayer::CompositionType::kSolidColor; + break; + case HWC2::Composition::Cursor: + layer_properties.composition_type = HwcLayer::CompositionType::kCursor; + break; + default: + ALOGE("Unsupported composition type t=%d", type); + break; + } ilayer->SetLayerProperties(layer_properties); return 0; diff --git a/hwc3/ComposerClient.cpp b/hwc3/ComposerClient.cpp index be5e01d..16855ce 100644 --- a/hwc3/ComposerClient.cpp +++ b/hwc3/ComposerClient.cpp @@ -220,7 +220,7 @@ std::optional> AidlToColorTransformMatrix( return color_transform_matrix; } -std::optional AidlToCompositionType( +std::optional AidlToCompositionType( const std::optional composition) { if (!composition) { return std::nullopt; @@ -228,15 +228,15 @@ std::optional AidlToCompositionType( switch (composition->composition) { case Composition::INVALID: - return HWC2::Composition::Invalid; + return HwcLayer::CompositionType::kInvalid; case Composition::CLIENT: - return HWC2::Composition::Client; + return HwcLayer::CompositionType::kClient; case Composition::DEVICE: - return HWC2::Composition::Device; + return HwcLayer::CompositionType::kDevice; case Composition::SOLID_COLOR: - return HWC2::Composition::SolidColor; + return HwcLayer::CompositionType::kSolidColor; case Composition::CURSOR: - return HWC2::Composition::Cursor; + return HwcLayer::CompositionType::kCursor; // Unsupported composition types. case Composition::DISPLAY_DECORATION: