/* * Copyright 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include // TODO(b/129481165): remove the #pragma below and fix conversion issues #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wconversion" #pragma clang diagnostic ignored "-Wextra" #include #include #include #include #include "DisplayHardware/Hal.h" #include // TODO(b/129481165): remove the #pragma below and fix conversion issues #pragma clang diagnostic pop // ignored "-Wconversion -Wextra" namespace android::compositionengine { namespace hal = android::hardware::graphics::composer::hal; // More complex metadata for this layer struct GenericLayerMetadataEntry { // True if the metadata may affect the composed result. // See setLayerGenericMetadata in IComposerClient.hal bool mandatory; // Byte blob or parcel std::vector value; std::string dumpAsString() const; struct Hasher { size_t operator()(const GenericLayerMetadataEntry& entry) const { size_t hash = 0; for (const auto value : entry.value) { hashCombineSingleHashed(hash, value); } return hash; } }; }; inline bool operator==(const GenericLayerMetadataEntry& lhs, const GenericLayerMetadataEntry& rhs) { return lhs.mandatory == rhs.mandatory && lhs.value == rhs.value; } // Defining PrintTo helps with Google Tests. inline void PrintTo(const GenericLayerMetadataEntry& v, ::std::ostream* os) { *os << v.dumpAsString(); } using GenericLayerMetadataMap = std::unordered_map; /* * Used by LayerFE::getCompositionState * Note that fields that affect HW composer state may need to be mirrored into * android::compositionengine::impl::planner::LayerState */ struct LayerFECompositionState { // If set to true, forces client composition on all output layers until // the next geometry change. bool forceClientComposition{false}; // TODO(b/121291683): Reorganize and rename the contents of this structure /* * Visibility state */ // The filter that determines which outputs include this layer ui::LayerFilter outputFilter; // If false, this layer should not be considered visible bool isVisible{true}; // True if the layer is completely opaque bool isOpaque{true}; // If true, invalidates the entire visible region bool contentDirty{false}; // The alpha value for this layer float alpha{1.f}; // Background blur in pixels int backgroundBlurRadius{0}; // The transform from layer local coordinates to composition coordinates ui::Transform geomLayerTransform; // The inverse of the layer transform ui::Transform geomInverseLayerTransform; // The hint from the layer producer as to what portion of the layer is // transparent. Region transparentRegionHint; // The blend mode for this layer hal::BlendMode blendMode{hal::BlendMode::INVALID}; // The bounds of the layer in layer local coordinates FloatRect geomLayerBounds; ShadowSettings shadowSettings; // List of regions that require blur std::vector blurRegions; StretchEffect stretchEffect; /* * Geometry state */ bool isSecure{false}; bool geomUsesSourceCrop{false}; bool geomBufferUsesDisplayInverseTransform{false}; uint32_t geomBufferTransform{0}; Rect geomBufferSize; Rect geomContentCrop; Rect geomCrop; GenericLayerMetadataMap metadata; /* * Per-frame content */ // The type of composition for this layer aidl::android::hardware::graphics::composer3::Composition compositionType{ aidl::android::hardware::graphics::composer3::Composition::INVALID}; // The buffer and related state sp buffer; sp acquireFence = Fence::NO_FENCE; Region surfaceDamage; uint64_t frameNumber = 0; // The handle to use for a sideband stream for this layer sp sidebandStream; // If true, this sideband layer has a frame update bool sidebandStreamHasFrame{false}; // The color for this layer half4 color; /* * Per-frame presentation state */ // If true, this layer will use the dataspace chosen for the output and // ignore the dataspace value just below bool isColorspaceAgnostic{false}; // The dataspace for this layer ui::Dataspace dataspace{ui::Dataspace::UNKNOWN}; // The metadata for this layer HdrMetadata hdrMetadata; // The color transform mat4 colorTransform; bool colorTransformIsIdentity{true}; // True if the layer has protected content bool hasProtectedContent{false}; /* * Cursor state */ // The output-independent frame for the cursor Rect cursorFrame; // framerate of the layer as measured by LayerHistory float fps; // The dimming flag bool dimmingEnabled{true}; float currentHdrSdrRatio = 1.f; float desiredHdrSdrRatio = 1.f; gui::CachingHint cachingHint = gui::CachingHint::Enabled; virtual ~LayerFECompositionState(); // Debugging virtual void dump(std::string& out) const; }; } // namespace android::compositionengine