diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 04:53:59 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 04:53:59 +0000 |
commit | ceb1a518a92a668ddfc19af999e6202f219c2677 (patch) | |
tree | 0be8b55408ec891b7c275a1eb9e4f0310702b339 /hwc2_device/HwcLayer.h | |
parent | c2930d1f02a2c27acaeadf8703b4e4045b9247d1 (diff) | |
parent | 39e9dc65f3a608c85124d4014b07ede70680f18b (diff) | |
download | drm_hwcomposer-ceb1a518a92a668ddfc19af999e6202f219c2677.tar.gz |
Snap for 10453563 from 39e9dc65f3a608c85124d4014b07ede70680f18b to mainline-mediaprovider-releaseaml_mpr_341713020aml_mpr_341614010aml_mpr_341511070aml_mpr_341411070aml_mpr_341313030aml_mpr_341111030aml_mpr_341111020aml_mpr_341015090aml_mpr_341015030aml_mpr_340919000android14-mainline-mediaprovider-release
Change-Id: I184e2678931887b1f15230b421c704f85e1f5933
Diffstat (limited to 'hwc2_device/HwcLayer.h')
-rw-r--r-- | hwc2_device/HwcLayer.h | 103 |
1 files changed, 62 insertions, 41 deletions
diff --git a/hwc2_device/HwcLayer.h b/hwc2_device/HwcLayer.h index df4ce6d..41b3dbb 100644 --- a/hwc2_device/HwcLayer.h +++ b/hwc2_device/HwcLayer.h @@ -19,14 +19,17 @@ #include <hardware/hwcomposer2.h> -#include <cmath> - -#include "drmhwcomposer.h" +#include "bufferinfo/BufferInfoGetter.h" +#include "compositor/LayerData.h" namespace android { +class HwcDisplay; + class HwcLayer { public: + explicit HwcLayer(HwcDisplay *parent_display) : parent_(parent_display){}; + HWC2::Composition GetSfType() const { return sf_type_; } @@ -43,35 +46,20 @@ class HwcLayer { return sf_type_ != validated_type_; } - uint32_t GetZOrder() const { - return z_order_; - } - - buffer_handle_t GetBuffer() { - return buffer_; + bool GetPriorBufferScanOutFlag() const { + return prior_buffer_scanout_flag_; } - hwc_rect_t GetDisplayFrame() { - return display_frame_; + void SetPriorBufferScanOutFlag(bool state) { + prior_buffer_scanout_flag_ = state; } - UniqueFd GetReleaseFence() { - return std::move(release_fence_); + uint32_t GetZOrder() const { + return z_order_; } - void PopulateDrmLayer(DrmHwcLayer *layer); - - bool RequireScalingOrPhasing() const { - float src_width = source_crop_.right - source_crop_.left; - float src_height = source_crop_.bottom - source_crop_.top; - - auto dest_width = float(display_frame_.right - display_frame_.left); - auto dest_height = float(display_frame_.bottom - display_frame_.top); - - bool scaling = src_width != dest_width || src_height != dest_height; - bool phasing = (source_crop_.left - std::floor(source_crop_.left) != 0) || - (source_crop_.top - std::floor(source_crop_.top) != 0); - return scaling || phasing; + auto &GetLayerData() { + return layer_data_; } // Layer hooks @@ -96,26 +84,59 @@ class HwcLayer { HWC2::Composition sf_type_ = HWC2::Composition::Invalid; HWC2::Composition validated_type_ = HWC2::Composition::Invalid; - buffer_handle_t buffer_ = nullptr; - hwc_rect_t display_frame_; - static constexpr float kOpaqueFloat = 1.0F; - float alpha_ = kOpaqueFloat; - hwc_frect_t source_crop_; - DrmHwcTransform transform_ = DrmHwcTransform::kIdentity; uint32_t z_order_ = 0; - DrmHwcBlending blending_ = DrmHwcBlending::kNone; - DrmHwcColorSpace color_space_ = DrmHwcColorSpace::kUndefined; - DrmHwcSampleRange sample_range_ = DrmHwcSampleRange::kUndefined; + LayerData layer_data_; + /* Should be populated to layer_data_.acquire_fence only before presenting */ UniqueFd acquire_fence_; - /* - * Release fence is not used. - * There is no release fence support available in the DRM/KMS. In case no - * release fence provided application will use this buffer for writing when - * the next frame present fence is signaled. + /* The following buffer data can have 2 sources: + * 1 - Mapper@4 metadata API + * 2 - HWC@2 API + * We keep ability to have 2 sources in drm_hwc. It may be useful for CLIENT + * layer, at this moment HWC@2 API can't specify blending mode for this layer, + * but Mapper@4 can do that */ - UniqueFd release_fence_; + BufferColorSpace color_space_{}; + BufferSampleRange sample_range_{}; + BufferBlendMode blend_mode_{}; + buffer_handle_t buffer_handle_{}; + bool buffer_handle_updated_{}; + + bool prior_buffer_scanout_flag_{}; + + HwcDisplay *const parent_; + + /* Layer state */ + public: + void PopulateLayerData(bool test); + + bool IsLayerUsableAsDevice() const { + return !bi_get_failed_ && !fb_import_failed_ && buffer_handle_ != nullptr; + } + + private: + void ImportFb(); + bool bi_get_failed_{}; + bool fb_import_failed_{}; + + /* SwapChain Cache */ + public: + void SwChainClearCache(); + + private: + struct SwapChainElement { + std::optional<BufferInfo> bi; + std::shared_ptr<DrmFbIdHandle> fb; + }; + + bool SwChainGetBufferFromCache(BufferUniqueId unique_id); + void SwChainReassemble(BufferUniqueId unique_id); + void SwChainAddCurrentBuffer(BufferUniqueId unique_id); + + std::map<int /*seq_no*/, SwapChainElement> swchain_cache_; + std::map<BufferUniqueId, int /*seq_no*/> swchain_lookup_table_; + bool swchain_reassembled_{}; }; } // namespace android |