1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <hardware/hwcomposer2.h> 20 21 #include "bufferinfo/BufferInfoGetter.h" 22 #include "compositor/LayerData.h" 23 24 namespace android { 25 26 class HwcDisplay; 27 28 class HwcLayer { 29 public: HwcLayer(HwcDisplay * parent_display)30 explicit HwcLayer(HwcDisplay *parent_display) : parent_(parent_display){}; 31 GetSfType()32 HWC2::Composition GetSfType() const { 33 return sf_type_; 34 } GetValidatedType()35 HWC2::Composition GetValidatedType() const { 36 return validated_type_; 37 } AcceptTypeChange()38 void AcceptTypeChange() { 39 sf_type_ = validated_type_; 40 } SetValidatedType(HWC2::Composition type)41 void SetValidatedType(HWC2::Composition type) { 42 validated_type_ = type; 43 } IsTypeChanged()44 bool IsTypeChanged() const { 45 return sf_type_ != validated_type_; 46 } 47 GetPriorBufferScanOutFlag()48 bool GetPriorBufferScanOutFlag() const { 49 return prior_buffer_scanout_flag_; 50 } 51 SetPriorBufferScanOutFlag(bool state)52 void SetPriorBufferScanOutFlag(bool state) { 53 prior_buffer_scanout_flag_ = state; 54 } 55 GetZOrder()56 uint32_t GetZOrder() const { 57 return z_order_; 58 } 59 GetLayerData()60 auto &GetLayerData() { 61 return layer_data_; 62 } 63 64 // Layer hooks 65 HWC2::Error SetCursorPosition(int32_t /*x*/, int32_t /*y*/); 66 HWC2::Error SetLayerBlendMode(int32_t mode); 67 HWC2::Error SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fence); 68 HWC2::Error SetLayerColor(hwc_color_t /*color*/); 69 HWC2::Error SetLayerCompositionType(int32_t type); 70 HWC2::Error SetLayerDataspace(int32_t dataspace); 71 HWC2::Error SetLayerDisplayFrame(hwc_rect_t frame); 72 HWC2::Error SetLayerPlaneAlpha(float alpha); 73 HWC2::Error SetLayerSidebandStream(const native_handle_t *stream); 74 HWC2::Error SetLayerSourceCrop(hwc_frect_t crop); 75 HWC2::Error SetLayerSurfaceDamage(hwc_region_t damage); 76 HWC2::Error SetLayerTransform(int32_t transform); 77 HWC2::Error SetLayerVisibleRegion(hwc_region_t visible); 78 HWC2::Error SetLayerZOrder(uint32_t order); 79 80 private: 81 // sf_type_ stores the initial type given to us by surfaceflinger, 82 // validated_type_ stores the type after running ValidateDisplay 83 HWC2::Composition sf_type_ = HWC2::Composition::Invalid; 84 HWC2::Composition validated_type_ = HWC2::Composition::Invalid; 85 86 uint32_t z_order_ = 0; 87 LayerData layer_data_; 88 89 /* The following buffer data can have 2 sources: 90 * 1 - Mapper@4 metadata API 91 * 2 - HWC@2 API 92 * We keep ability to have 2 sources in drm_hwc. It may be useful for CLIENT 93 * layer, at this moment HWC@2 API can't specify blending mode for this layer, 94 * but Mapper@4 can do that 95 */ 96 BufferColorSpace color_space_{}; 97 BufferSampleRange sample_range_{}; 98 BufferBlendMode blend_mode_{}; 99 buffer_handle_t buffer_handle_{}; 100 bool buffer_handle_updated_{}; 101 102 bool prior_buffer_scanout_flag_{}; 103 104 HwcDisplay *const parent_; 105 106 /* Layer state */ 107 public: 108 void PopulateLayerData(); 109 IsLayerUsableAsDevice()110 bool IsLayerUsableAsDevice() const { 111 return !bi_get_failed_ && !fb_import_failed_ && buffer_handle_ != nullptr; 112 } 113 114 private: 115 void ImportFb(); 116 bool bi_get_failed_{}; 117 bool fb_import_failed_{}; 118 119 /* SwapChain Cache */ 120 public: 121 void SwChainClearCache(); 122 123 private: 124 struct SwapChainElement { 125 std::optional<BufferInfo> bi; 126 std::shared_ptr<DrmFbIdHandle> fb; 127 }; 128 129 bool SwChainGetBufferFromCache(BufferUniqueId unique_id); 130 void SwChainReassemble(BufferUniqueId unique_id); 131 void SwChainAddCurrentBuffer(BufferUniqueId unique_id); 132 133 std::map<int /*seq_no*/, SwapChainElement> swchain_cache_; 134 std::map<BufferUniqueId, int /*seq_no*/> swchain_lookup_table_; 135 bool swchain_reassembled_{}; 136 }; 137 138 } // namespace android 139