1 /*
2  * Copyright (C) 2021 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  * Idealy IComposerHal should use aidl NativeHandle not native_handle_t/buffer_handle_t.
20  * However current patten is the HWC lib does not own buffer resources (HWC lib
21  * does own the fences).
22  */
23 #include <aidl/android/hardware/common/NativeHandle.h>
24 #include <aidl/android/hardware/drm/HdcpLevels.h>
25 #include <aidl/android/hardware/graphics/common/BlendMode.h>
26 #include <aidl/android/hardware/graphics/common/ColorTransform.h>
27 #include <aidl/android/hardware/graphics/common/Dataspace.h>
28 #include <aidl/android/hardware/graphics/common/DisplayHotplugEvent.h>
29 #include <aidl/android/hardware/graphics/common/FRect.h>
30 #include <aidl/android/hardware/graphics/common/Hdr.h>
31 #include <aidl/android/hardware/graphics/common/HdrConversionCapability.h>
32 #include <aidl/android/hardware/graphics/common/HdrConversionStrategy.h>
33 #include <aidl/android/hardware/graphics/common/PixelFormat.h>
34 #include <aidl/android/hardware/graphics/common/Point.h>
35 #include <aidl/android/hardware/graphics/common/Rect.h>
36 #include <aidl/android/hardware/graphics/common/Transform.h>
37 #include <aidl/android/hardware/graphics/composer3/Buffer.h>
38 #include <aidl/android/hardware/graphics/composer3/Capability.h>
39 #include <aidl/android/hardware/graphics/composer3/ChangedCompositionTypes.h>
40 #include <aidl/android/hardware/graphics/composer3/ClientTarget.h>
41 #include <aidl/android/hardware/graphics/composer3/ClientTargetProperty.h>
42 #include <aidl/android/hardware/graphics/composer3/ClientTargetPropertyWithBrightness.h>
43 #include <aidl/android/hardware/graphics/composer3/Color.h>
44 #include <aidl/android/hardware/graphics/composer3/ColorMode.h>
45 #include <aidl/android/hardware/graphics/composer3/CommandError.h>
46 #include <aidl/android/hardware/graphics/composer3/CommandResultPayload.h>
47 #include <aidl/android/hardware/graphics/composer3/Composition.h>
48 #include <aidl/android/hardware/graphics/composer3/ContentType.h>
49 #include <aidl/android/hardware/graphics/composer3/DimmingStage.h>
50 #include <aidl/android/hardware/graphics/composer3/DisplayAttribute.h>
51 #include <aidl/android/hardware/graphics/composer3/DisplayBrightness.h>
52 #include <aidl/android/hardware/graphics/composer3/DisplayCapability.h>
53 #include <aidl/android/hardware/graphics/composer3/DisplayCommand.h>
54 #include <aidl/android/hardware/graphics/composer3/DisplayConfiguration.h>
55 #include <aidl/android/hardware/graphics/composer3/DisplayConnectionType.h>
56 #include <aidl/android/hardware/graphics/composer3/DisplayContentSample.h>
57 #include <aidl/android/hardware/graphics/composer3/DisplayContentSamplingAttributes.h>
58 #include <aidl/android/hardware/graphics/composer3/DisplayIdentification.h>
59 #include <aidl/android/hardware/graphics/composer3/DisplayRequest.h>
60 #include <aidl/android/hardware/graphics/composer3/FormatColorComponent.h>
61 #include <aidl/android/hardware/graphics/composer3/HdrCapabilities.h>
62 #include <aidl/android/hardware/graphics/composer3/LayerBrightness.h>
63 #include <aidl/android/hardware/graphics/composer3/LayerCommand.h>
64 #include <aidl/android/hardware/graphics/composer3/LayerLifecycleBatchCommandType.h>
65 #include <aidl/android/hardware/graphics/composer3/OverlayProperties.h>
66 #include <aidl/android/hardware/graphics/composer3/ParcelableBlendMode.h>
67 #include <aidl/android/hardware/graphics/composer3/ParcelableComposition.h>
68 #include <aidl/android/hardware/graphics/composer3/ParcelableDataspace.h>
69 #include <aidl/android/hardware/graphics/composer3/ParcelableTransform.h>
70 #include <aidl/android/hardware/graphics/composer3/PerFrameMetadata.h>
71 #include <aidl/android/hardware/graphics/composer3/PerFrameMetadataBlob.h>
72 #include <aidl/android/hardware/graphics/composer3/PerFrameMetadataKey.h>
73 #include <aidl/android/hardware/graphics/composer3/PlaneAlpha.h>
74 #include <aidl/android/hardware/graphics/composer3/PowerMode.h>
75 #include <aidl/android/hardware/graphics/composer3/PresentFence.h>
76 #include <aidl/android/hardware/graphics/composer3/PresentOrValidate.h>
77 #include <aidl/android/hardware/graphics/composer3/ReadbackBufferAttributes.h>
78 #include <aidl/android/hardware/graphics/composer3/RefreshRateChangedDebugData.h>
79 #include <aidl/android/hardware/graphics/composer3/ReleaseFences.h>
80 #include <aidl/android/hardware/graphics/composer3/RenderIntent.h>
81 #include <aidl/android/hardware/graphics/composer3/VirtualDisplay.h>
82 #include <aidl/android/hardware/graphics/composer3/VsyncPeriodChangeConstraints.h>
83 #include <aidl/android/hardware/graphics/composer3/VsyncPeriodChangeTimeline.h>
84 #include <aidl/android/hardware/graphics/composer3/ZOrder.h>
85 #include <cutils/native_handle.h>
86 #include <hardware/hwcomposer2.h>
87 // avoid naming conflict
88 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
89 using AidlNativeHandle = aidl::android::hardware::common::NativeHandle;
90 using DisplayConfiguration = aidl::android::hardware::graphics::composer3::DisplayConfiguration;
91 
92 namespace aidl::android::hardware::graphics::composer3::impl {
93 
94 // Abstraction of ComposerHal. Returned error code is compatible with AIDL
95 // IComposerClient interface.
96 class IComposerHal {
97  public:
98      static std::unique_ptr<IComposerHal> create(int32_t composerInterfaceVersion);
99      virtual ~IComposerHal() = default;
100 
101      virtual void getCapabilities(std::vector<Capability>* caps) = 0;
102      virtual void dumpDebugInfo(std::string* output, const std::vector<std::string>& args = {}) = 0;
103      virtual bool hasCapability(Capability cap) = 0;
104 
105      class EventCallback {
106      public:
107          virtual ~EventCallback() = default;
108          virtual void onHotplug(int64_t display, bool connected) = 0;
109          virtual void onRefresh(int64_t display) = 0;
110          virtual void onVsync(int64_t display, int64_t timestamp, int32_t vsyncPeriodNanos) = 0;
111          virtual void onVsyncPeriodTimingChanged(int64_t display,
112                                                  const VsyncPeriodChangeTimeline& timeline) = 0;
113          virtual void onVsyncIdle(int64_t display) = 0;
114          virtual void onSeamlessPossible(int64_t display) = 0;
115          virtual void onRefreshRateChangedDebug(const RefreshRateChangedDebugData& data) = 0;
116          virtual void onHotplugEvent(int64_t display, common::DisplayHotplugEvent event) = 0;
117          virtual void onHdcpLevelsChanged(int64_t display, drm::HdcpLevels levels) = 0;
118      };
119     virtual void registerEventCallback(EventCallback* callback) = 0;
120     virtual void unregisterEventCallback() = 0;
121 
122     virtual int32_t acceptDisplayChanges(int64_t display) = 0;
123     virtual int32_t createLayer(int64_t display, int64_t* outLayer) = 0;
124     virtual int32_t batchedCreateDestroyLayer(int64_t display, int64_t layer,
125                                               LayerLifecycleBatchCommandType cmd) = 0;
126     virtual int32_t createVirtualDisplay(uint32_t width, uint32_t height, AidlPixelFormat format,
127                                          VirtualDisplay* outDisplay) = 0;
128     virtual int32_t destroyLayer(int64_t display, int64_t layer) = 0;
129     virtual int32_t destroyVirtualDisplay(int64_t display) = 0;
130     virtual int32_t flushDisplayBrightnessChange(int64_t display) = 0;
131     virtual int32_t getActiveConfig(int64_t display, int32_t* outConfig) = 0;
132     virtual int32_t getColorModes(int64_t display, std::vector<ColorMode>* outModes) = 0;
133     virtual int32_t getDataspaceSaturationMatrix(common::Dataspace dataspace,
134                                                  std::vector<float>* matrix) = 0;
135     virtual int32_t getDisplayAttribute(int64_t display, int32_t config,
136                                       DisplayAttribute attribute, int32_t* outValue) = 0;
137     virtual int32_t getDisplayBrightnessSupport(int64_t display, bool& outSupport) = 0;
138     virtual int32_t getDisplayIdleTimerSupport(int64_t display, bool& outSupport) = 0;
139     virtual int32_t getDisplayMultiThreadedPresentSupport(const int64_t& display,
140                                                           bool& outSupport) = 0;
141     virtual int32_t getDisplayCapabilities(int64_t display,
142                                            std::vector<DisplayCapability>* caps) = 0;
143     virtual int32_t getDisplayConfigs(int64_t display, std::vector<int32_t>* configs) = 0;
144     virtual int32_t getDisplayConfigurations(int64_t display, int32_t maxFrameIntervalNs,
145                                              std::vector<DisplayConfiguration>* configs) = 0;
146     virtual int32_t notifyExpectedPresent(int64_t display,
147                                           const ClockMonotonicTimestamp& expectedPresentTime,
148                                           int32_t frameIntervalNs) = 0;
149     virtual int32_t getDisplayConnectionType(int64_t display, DisplayConnectionType* outType) = 0;
150     virtual int32_t getDisplayIdentificationData(int64_t display, DisplayIdentification *id) = 0;
151     virtual int32_t getDisplayName(int64_t display, std::string* outName) = 0;
152     virtual int32_t getDisplayVsyncPeriod(int64_t display, int32_t* outVsyncPeriod) = 0;
153     virtual int32_t getDisplayedContentSample(int64_t display, int64_t maxFrames,
154                                             int64_t timestamp, DisplayContentSample* samples) = 0;
155     virtual int32_t getDisplayedContentSamplingAttributes(
156             int64_t display, DisplayContentSamplingAttributes* attrs) = 0;
157     virtual int32_t getDisplayPhysicalOrientation(int64_t display,
158                                                   common::Transform* orientation) = 0;
159     virtual int32_t getDozeSupport(int64_t display, bool& outSupport) = 0;
160     virtual int32_t getHdrCapabilities(int64_t display, HdrCapabilities* caps) = 0;
161     virtual int32_t getOverlaySupport(OverlayProperties* caps) = 0;
162     virtual int32_t getMaxVirtualDisplayCount(int32_t* count) = 0;
163     virtual int32_t getPerFrameMetadataKeys(int64_t display,
164                                             std::vector<PerFrameMetadataKey>* keys) = 0;
165     virtual int32_t getReadbackBufferAttributes(int64_t display,
166                                                 ReadbackBufferAttributes* attrs) = 0;
167     virtual int32_t getReadbackBufferFence(int64_t display,
168                                            ndk::ScopedFileDescriptor* aqcuireFence) = 0;
169     virtual int32_t getRenderIntents(int64_t display, ColorMode mode,
170                                      std::vector<RenderIntent>* intents) = 0;
171     virtual int32_t getSupportedContentTypes(int64_t display, std::vector<ContentType>* types) = 0;
172     virtual int32_t presentDisplay(int64_t display, ndk::ScopedFileDescriptor& fence,
173                                    std::vector<int64_t>* outLayers,
174                                    std::vector<ndk::ScopedFileDescriptor>* outReleaseFences) = 0;
175     virtual int32_t setActiveConfig(int64_t display, int32_t config) = 0;
176     virtual int32_t setActiveConfigWithConstraints(
177             int64_t display, int32_t config,
178             const VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
179             VsyncPeriodChangeTimeline* timeline) = 0;
180     virtual int32_t setBootDisplayConfig(int64_t display, int32_t config) = 0;
181     virtual int32_t clearBootDisplayConfig(int64_t display) = 0;
182     virtual int32_t getPreferredBootDisplayConfig(int64_t display, int32_t* config) = 0;
183     virtual int32_t getHdrConversionCapabilities(std::vector<common::HdrConversionCapability>*) = 0;
184     virtual int32_t setHdrConversionStrategy(const common::HdrConversionStrategy&,
185                                              common::Hdr*) = 0;
186     virtual int32_t setAutoLowLatencyMode(int64_t display, bool on) = 0;
187     virtual int32_t setClientTarget(int64_t display, buffer_handle_t target,
188                                     const ndk::ScopedFileDescriptor& fence,
189                                     common::Dataspace dataspace,
190                                     const std::vector<common::Rect>& damage) = 0; // cmd
191     virtual int32_t getHasClientComposition(int64_t display, bool& outHasClientComp) = 0;
192     virtual int32_t setColorMode(int64_t display, ColorMode mode, RenderIntent intent) = 0;
193     virtual int32_t setColorTransform(int64_t display, const std::vector<float>& matrix) = 0; // cmd
194     virtual int32_t setContentType(int64_t display, ContentType contentType) = 0;
195     virtual int32_t setDisplayBrightness(int64_t display, float brightness) = 0;
196     virtual int32_t setDisplayedContentSamplingEnabled(int64_t display, bool enable,
197                                                        FormatColorComponent componentMask,
198                                                        int64_t maxFrames) = 0;
199     virtual int32_t setLayerBlendMode(int64_t display, int64_t layer, common::BlendMode mode) = 0;
200     virtual int32_t setLayerBuffer(int64_t display, int64_t layer, buffer_handle_t buffer,
201                                    const ndk::ScopedFileDescriptor& acquireFence) = 0;
202     virtual int32_t uncacheLayerBuffers(int64_t display, int64_t layer,
203                                         const std::vector<buffer_handle_t>& buffers,
204                                         std::vector<buffer_handle_t>& outClearableBuffers) = 0;
205     virtual int32_t setLayerColor(int64_t display, int64_t layer, Color color) = 0;
206     virtual int32_t setLayerColorTransform(int64_t display, int64_t layer,
207                                            const std::vector<float>& matrix) = 0;
208     virtual int32_t setLayerCompositionType(int64_t display, int64_t layer, Composition type) = 0;
209     virtual int32_t setLayerCursorPosition(int64_t display, int64_t layer, int32_t x,
210                                            int32_t y) = 0;
211     virtual int32_t setLayerDataspace(int64_t display, int64_t layer,
212                                       common::Dataspace dataspace) = 0;
213     virtual int32_t setLayerDisplayFrame(int64_t display, int64_t layer,
214                                          const common::Rect& frame) = 0;
215     virtual int32_t setLayerPerFrameMetadata(int64_t display, int64_t layer,
216                             const std::vector<std::optional<PerFrameMetadata>>& metadata) = 0;
217     virtual int32_t setLayerPerFrameMetadataBlobs(int64_t display, int64_t layer,
218                             const std::vector<std::optional<PerFrameMetadataBlob>>& blobs) = 0;
219     virtual int32_t setLayerPlaneAlpha(int64_t display, int64_t layer, float alpha) = 0;
220     virtual int32_t setLayerSidebandStream(int64_t display, int64_t layer,
221                                            buffer_handle_t stream) = 0;
222     virtual int32_t setLayerSourceCrop(int64_t display, int64_t layer,
223                                        const common::FRect& crop) = 0;
224     virtual int32_t setLayerSurfaceDamage(int64_t display, int64_t layer,
225                         const std::vector<std::optional<common::Rect>>& damage) = 0;
226     virtual int32_t setLayerTransform(int64_t display, int64_t layer,
227                                       common::Transform transform) = 0;
228     virtual int32_t setLayerVisibleRegion(int64_t display, int64_t layer,
229                                  const std::vector<std::optional<common::Rect>>& visible) = 0;
230     virtual int32_t setLayerBrightness(int64_t display, int64_t layer, float brightness) = 0;
231     virtual int32_t setLayerZOrder(int64_t display, int64_t layer, uint32_t z) = 0;
232     virtual int32_t setOutputBuffer(int64_t display, buffer_handle_t buffer,
233                                     const ndk::ScopedFileDescriptor& releaseFence) = 0;
234     virtual int32_t setPowerMode(int64_t display, PowerMode mode) = 0;
235     virtual int32_t getPowerMode(int64_t display, std::optional<PowerMode>& outMode) = 0;
236     virtual int32_t setReadbackBuffer(int64_t display, buffer_handle_t buffer,
237                                       const ndk::ScopedFileDescriptor& releaseFence) = 0;
238     virtual int32_t setVsyncEnabled(int64_t display, bool enabled) = 0;
239     virtual int32_t validateDisplay(int64_t display, std::vector<int64_t>* outChangedLayers,
240                                     std::vector<Composition>* outCompositionTypes,
241                                     uint32_t* outDisplayRequestMask,
242                                     std::vector<int64_t>* outRequestedLayers,
243                                     std::vector<int32_t>* outRequestMasks,
244                                     ClientTargetProperty* outClientTargetProperty,
245                                     DimmingStage* outDimmingStage) = 0;
246     virtual int32_t setExpectedPresentTime(
247             int64_t display, const std::optional<ClockMonotonicTimestamp> expectedPresentTime,
248             int frameIntervalNs) = 0;
249     virtual int32_t setIdleTimerEnabled(int64_t display, int32_t timeout) = 0;
250     virtual int32_t getRCDLayerSupport(int64_t display, bool& outSupport) = 0;
251     virtual int32_t setLayerBlockingRegion(
252             int64_t display, int64_t layer,
253             const std::vector<std::optional<common::Rect>>& blockingRegion) = 0;
254     virtual int32_t setRefreshRateChangedCallbackDebugEnabled(int64_t display, bool enabled) = 0;
255     virtual int32_t layerSf2Hwc(int64_t display, int64_t layer, hwc2_layer_t& outMappedLayer) = 0;
256     virtual int32_t getMaxLayerPictureProfiles(int64_t display, int32_t* outMaxProfiles) = 0;
257 };
258 
259 } // namespace aidl::android::hardware::graphics::composer3::detail
260