drm_hwcomposer: Rework HWC frontends buffer management
Change summary:
- Use BufferInfo instead of native_buffer to configure the HwcLayer.
- Extend buffer properties with slot info.
- Provide fence and active slot ID separate from the buffer.
- Move swapchain tracking into HWC2. HWC3 doesn't need that.
Why:
- Support more flexible resource management control from the frontend
side, which is required by HWC3 API.
- Move more Android-specific data types to the frontend module.
Change-Id: Idaa4c552f600f78d6f0ad21997cfa7f3a6c6cbd8
Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
diff --git a/hwc2_device/HwcLayer.h b/hwc2_device/HwcLayer.h
index d597977..c335d88 100644
--- a/hwc2_device/HwcLayer.h
+++ b/hwc2_device/HwcLayer.h
@@ -18,23 +18,36 @@
#include <aidl/android/hardware/graphics/common/Transform.h>
#include <hardware/hwcomposer2.h>
+#include <memory>
+#include "bufferinfo/BufferInfo.h"
#include "bufferinfo/BufferInfoGetter.h"
#include "compositor/LayerData.h"
+#include "utils/fd.h"
namespace android {
class HwcDisplay;
+class FrontendLayerBase {
+ public:
+ virtual ~FrontendLayerBase() = default;
+};
+
class HwcLayer {
public:
struct Buffer {
- buffer_handle_t buffer_handle;
- SharedFd acquire_fence;
+ int32_t slot_id;
+ std::optional<BufferInfo> bi;
+ };
+ struct Slot {
+ int32_t slot_id;
+ SharedFd fence;
};
// A set of properties to be validated.
struct LayerProperties {
- std::optional<Buffer> buffer;
+ std::optional<Buffer> slot_buffer;
+ std::optional<Slot> active_slot;
std::optional<BufferBlendMode> blend_mode;
std::optional<BufferColorSpace> color_space;
std::optional<BufferSampleRange> sample_range;
@@ -82,6 +95,14 @@
void SetLayerProperties(const LayerProperties &layer_properties);
+ auto GetFrontendPrivateData() -> std::shared_ptr<FrontendLayerBase> {
+ return frontend_private_data_;
+ }
+
+ auto SetFrontendPrivateData(std::shared_ptr<FrontendLayerBase> data) {
+ frontend_private_data_ = std::move(data);
+ }
+
private:
// sf_type_ stores the initial type given to us by surfaceflinger,
// validated_type_ stores the type after running ValidateDisplay
@@ -101,43 +122,32 @@
BufferColorSpace color_space_{};
BufferSampleRange sample_range_{};
BufferBlendMode blend_mode_{};
- buffer_handle_t buffer_handle_{};
- bool buffer_handle_updated_{};
+ bool buffer_updated_{};
bool prior_buffer_scanout_flag_{};
HwcDisplay *const parent_;
- /* Layer state */
- public:
- void PopulateLayerData();
+ std::shared_ptr<FrontendLayerBase> frontend_private_data_;
- 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::optional<int32_t> active_slot_id_;
+ struct BufferSlot {
+ BufferInfo bi;
std::shared_ptr<DrmFbIdHandle> fb;
};
+ std::map<int32_t /*slot*/, BufferSlot> slots_;
- bool SwChainGetBufferFromCache(BufferUniqueId unique_id);
- void SwChainReassemble(BufferUniqueId unique_id);
- void SwChainAddCurrentBuffer(BufferUniqueId unique_id);
+ void ImportFb();
+ bool fb_import_failed_{};
- std::map<int /*seq_no*/, SwapChainElement> swchain_cache_;
- std::map<BufferUniqueId, int /*seq_no*/> swchain_lookup_table_;
- bool swchain_reassembled_{};
+ public:
+ void PopulateLayerData();
+ void ClearSlots();
+
+ bool IsLayerUsableAsDevice() const {
+ return !fb_import_failed_ && active_slot_id_.has_value() &&
+ slots_.count(*active_slot_id_) > 0;
+ }
};
} // namespace android