1 // SPDX-License-Identifier: Apache-2.0
2 // Copyright (C) 2019 Stephan Gerhold
6 #include <unordered_map>
7 #include <composer-hal/2.1/ComposerHal.h>
19 using hal::PixelFormat;
22 struct DrmComposerHal : public hal::ComposerHal, DrmCallback {
23 DrmComposerHal(std::unique_ptr<DrmDevice> device);
25 bool hasCapability(hwc2_capability_t capability) override;
26 std::string dumpDebugInfo() override;
28 void registerEventCallback(EventCallback* callback) override;
29 void unregisterEventCallback() override;
31 void onHotplug(const DrmDisplay& display, bool connected) override;
32 void onVsync(const DrmDisplay& display, int64_t timestamp) override;
34 uint32_t getMaxVirtualDisplayCount() override;
35 Error createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
36 Display* outDisplay) override;
37 Error destroyVirtualDisplay(Display display) override;
38 Error createLayer(Display display, Layer* outLayer) override;
39 Error destroyLayer(Display display, Layer layer) override;
41 Error getActiveConfig(Display display, Config* outConfig) override;
42 Error getClientTargetSupport(Display display, uint32_t width, uint32_t height,
43 PixelFormat format, Dataspace dataspace) override;
44 Error getColorModes(Display display, hidl_vec<ColorMode>* outModes) override;
45 Error getDisplayAttribute(Display display, Config config,
46 IComposerClient::Attribute attribute, int32_t* outValue) override;
47 Error getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) override;
48 Error getDisplayName(Display display, hidl_string* outName) override;
49 Error getDisplayType(Display display, IComposerClient::DisplayType* outType) override;
50 Error getDozeSupport(Display display, bool* outSupport) override;
51 Error getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes,
52 float* outMaxLuminance, float* outMaxAverageLuminance,
53 float* outMinLuminance) override;
55 Error setActiveConfig(Display display, Config config) override;
56 Error setColorMode(Display display, ColorMode mode) override;
57 Error setPowerMode(Display display, IComposerClient::PowerMode mode) override;
58 Error setVsyncEnabled(Display display, IComposerClient::Vsync enabled) override;
60 Error setColorTransform(Display display, const float* matrix, int32_t hint) override;
61 Error setClientTarget(Display display, buffer_handle_t target, int32_t acquireFence,
62 int32_t dataspace, const std::vector<hwc_rect_t>& damage) override;
63 Error setOutputBuffer(Display display, buffer_handle_t buffer,
64 int32_t releaseFence) override;
65 Error validateDisplay(Display display, std::vector<Layer>* outChangedLayers,
66 std::vector<IComposerClient::Composition>* outCompositionTypes,
67 uint32_t* outDisplayRequestMask,
68 std::vector<Layer>* outRequestedLayers,
69 std::vector<uint32_t>* outRequestMasks) override;
70 Error acceptDisplayChanges(Display display) override;
71 Error presentDisplay(Display display, int32_t* outPresentFence,
72 std::vector<Layer>* outLayers,
73 std::vector<int32_t>* outReleaseFences) override;
75 Error setLayerCursorPosition(Display display, Layer layer, int32_t x, int32_t y) override;
76 Error setLayerBuffer(Display display, Layer layer, buffer_handle_t buffer,
77 int32_t acquireFence) override;
78 Error setLayerSurfaceDamage(Display display, Layer layer,
79 const std::vector<hwc_rect_t>& damage) override;
80 Error setLayerBlendMode(Display display, Layer layer, int32_t mode) override;
81 Error setLayerColor(Display display, Layer layer, IComposerClient::Color color) override;
82 Error setLayerCompositionType(Display display, Layer layer, int32_t type) override;
83 Error setLayerDataspace(Display display, Layer layer, int32_t dataspace) override;
84 Error setLayerDisplayFrame(Display display, Layer layer, const hwc_rect_t& frame) override;
85 Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) override;
86 Error setLayerSidebandStream(Display display, Layer layer, buffer_handle_t stream) override;
87 Error setLayerSourceCrop(Display display, Layer layer, const hwc_frect_t& crop) override;
88 Error setLayerTransform(Display display, Layer layer, int32_t transform) override;
89 Error setLayerVisibleRegion(Display display, Layer layer,
90 const std::vector<hwc_rect_t>& visible) override;
91 Error setLayerZOrder(Display display, Layer layer, uint32_t z) override;
95 HwcLayer(Display displayId) : displayId(displayId) {}
96 const Display displayId;
97 IComposerClient::Composition composition = IComposerClient::Composition::INVALID;
100 std::unique_ptr<DrmDevice> mDevice; // TODO: Support multiple GPUs?
101 EventCallback *mCallback = nullptr;
103 std::unordered_map<Layer, HwcLayer> mLayers;
104 Layer mNextLayer = 0;
106 // The next client target buffer to be displayed
107 buffer_handle_t mBuffer = nullptr;
113 } // namespace composer
114 } // namespace graphics
115 } // namespace hardware
116 } // namespace android