xref: /aosp_15_r20/external/drm_hwcomposer/hwc3/ComposerClient.h (revision 0a9764fe0a15e71ebbeb85e87e10990c23aab47f)
1*0a9764feSAndroid Build Coastguard Worker /*
2*0a9764feSAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
3*0a9764feSAndroid Build Coastguard Worker  *
4*0a9764feSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*0a9764feSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*0a9764feSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*0a9764feSAndroid Build Coastguard Worker  *
8*0a9764feSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*0a9764feSAndroid Build Coastguard Worker  *
10*0a9764feSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*0a9764feSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*0a9764feSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*0a9764feSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*0a9764feSAndroid Build Coastguard Worker  * limitations under the License.
15*0a9764feSAndroid Build Coastguard Worker  */
16*0a9764feSAndroid Build Coastguard Worker 
17*0a9764feSAndroid Build Coastguard Worker #pragma once
18*0a9764feSAndroid Build Coastguard Worker 
19*0a9764feSAndroid Build Coastguard Worker #include <memory>
20*0a9764feSAndroid Build Coastguard Worker 
21*0a9764feSAndroid Build Coastguard Worker #include "aidl/android/hardware/graphics/composer3/BnComposerClient.h"
22*0a9764feSAndroid Build Coastguard Worker #include "aidl/android/hardware/graphics/composer3/LayerCommand.h"
23*0a9764feSAndroid Build Coastguard Worker #include "hwc3/CommandResultWriter.h"
24*0a9764feSAndroid Build Coastguard Worker #include "hwc3/ComposerResources.h"
25*0a9764feSAndroid Build Coastguard Worker #include "hwc3/Utils.h"
26*0a9764feSAndroid Build Coastguard Worker #include "utils/Mutex.h"
27*0a9764feSAndroid Build Coastguard Worker 
28*0a9764feSAndroid Build Coastguard Worker using AidlHdcpLevels = aidl::android::hardware::drm::HdcpLevels;
29*0a9764feSAndroid Build Coastguard Worker using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
30*0a9764feSAndroid Build Coastguard Worker using AidlNativeHandle = aidl::android::hardware::common::NativeHandle;
31*0a9764feSAndroid Build Coastguard Worker 
32*0a9764feSAndroid Build Coastguard Worker namespace android {
33*0a9764feSAndroid Build Coastguard Worker 
34*0a9764feSAndroid Build Coastguard Worker class HwcDisplay;
35*0a9764feSAndroid Build Coastguard Worker class HwcLayer;
36*0a9764feSAndroid Build Coastguard Worker 
37*0a9764feSAndroid Build Coastguard Worker }  // namespace android
38*0a9764feSAndroid Build Coastguard Worker 
39*0a9764feSAndroid Build Coastguard Worker namespace aidl::android::hardware::graphics::composer3::impl {
40*0a9764feSAndroid Build Coastguard Worker 
41*0a9764feSAndroid Build Coastguard Worker class DrmHwcThree;
42*0a9764feSAndroid Build Coastguard Worker 
43*0a9764feSAndroid Build Coastguard Worker class ComposerClient : public BnComposerClient {
44*0a9764feSAndroid Build Coastguard Worker  public:
45*0a9764feSAndroid Build Coastguard Worker   ComposerClient();
46*0a9764feSAndroid Build Coastguard Worker   ~ComposerClient() override;
47*0a9764feSAndroid Build Coastguard Worker 
48*0a9764feSAndroid Build Coastguard Worker   bool Init();
49*0a9764feSAndroid Build Coastguard Worker   std::string Dump();
50*0a9764feSAndroid Build Coastguard Worker 
51*0a9764feSAndroid Build Coastguard Worker   // composer3 interface
52*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus createLayer(int64_t display, int32_t buffer_slot_count,
53*0a9764feSAndroid Build Coastguard Worker                                  int64_t* layer) override;
54*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus createVirtualDisplay(int32_t width, int32_t height,
55*0a9764feSAndroid Build Coastguard Worker                                           AidlPixelFormat format_hint,
56*0a9764feSAndroid Build Coastguard Worker                                           int32_t output_buffer_slot_count,
57*0a9764feSAndroid Build Coastguard Worker                                           VirtualDisplay* display) override;
58*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus destroyLayer(int64_t display, int64_t layer) override;
59*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus destroyVirtualDisplay(int64_t display) override;
60*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus executeCommands(
61*0a9764feSAndroid Build Coastguard Worker       const std::vector<DisplayCommand>& commands,
62*0a9764feSAndroid Build Coastguard Worker       std::vector<CommandResultPayload>* results) override;
63*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getActiveConfig(int64_t display, int32_t* config) override;
64*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getColorModes(
65*0a9764feSAndroid Build Coastguard Worker       int64_t display, std::vector<ColorMode>* color_modes) override;
66*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDataspaceSaturationMatrix(
67*0a9764feSAndroid Build Coastguard Worker       common::Dataspace dataspace, std::vector<float>* matrix) override;
68*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayAttribute(int64_t display, int32_t config,
69*0a9764feSAndroid Build Coastguard Worker                                          DisplayAttribute attribute,
70*0a9764feSAndroid Build Coastguard Worker                                          int32_t* value) override;
71*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayCapabilities(
72*0a9764feSAndroid Build Coastguard Worker       int64_t display, std::vector<DisplayCapability>* caps) override;
73*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayConfigs(int64_t display,
74*0a9764feSAndroid Build Coastguard Worker                                        std::vector<int32_t>* configs) override;
75*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayConnectionType(
76*0a9764feSAndroid Build Coastguard Worker       int64_t display, DisplayConnectionType* type) override;
77*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayIdentificationData(
78*0a9764feSAndroid Build Coastguard Worker       int64_t display, DisplayIdentification* id) override;
79*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayName(int64_t display,
80*0a9764feSAndroid Build Coastguard Worker                                     std::string* name) override;
81*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayVsyncPeriod(int64_t display,
82*0a9764feSAndroid Build Coastguard Worker                                            int32_t* vsync_period) override;
83*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayedContentSample(
84*0a9764feSAndroid Build Coastguard Worker       int64_t display, int64_t max_frames, int64_t timestamp,
85*0a9764feSAndroid Build Coastguard Worker       DisplayContentSample* samples) override;
86*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayedContentSamplingAttributes(
87*0a9764feSAndroid Build Coastguard Worker       int64_t display, DisplayContentSamplingAttributes* attrs) override;
88*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayPhysicalOrientation(
89*0a9764feSAndroid Build Coastguard Worker       int64_t display, common::Transform* orientation) override;
90*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getHdrCapabilities(int64_t display,
91*0a9764feSAndroid Build Coastguard Worker                                         HdrCapabilities* caps) override;
92*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getMaxVirtualDisplayCount(int32_t* count) override;
93*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getPerFrameMetadataKeys(
94*0a9764feSAndroid Build Coastguard Worker       int64_t display, std::vector<PerFrameMetadataKey>* keys) override;
95*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getReadbackBufferAttributes(
96*0a9764feSAndroid Build Coastguard Worker       int64_t display, ReadbackBufferAttributes* attrs) override;
97*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getReadbackBufferFence(
98*0a9764feSAndroid Build Coastguard Worker       int64_t display, ndk::ScopedFileDescriptor* acquire_fence) override;
99*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getRenderIntents(
100*0a9764feSAndroid Build Coastguard Worker       int64_t display, ColorMode mode,
101*0a9764feSAndroid Build Coastguard Worker       std::vector<RenderIntent>* intents) override;
102*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getSupportedContentTypes(
103*0a9764feSAndroid Build Coastguard Worker       int64_t display, std::vector<ContentType>* types) override;
104*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayDecorationSupport(
105*0a9764feSAndroid Build Coastguard Worker       int64_t display,
106*0a9764feSAndroid Build Coastguard Worker       std::optional<common::DisplayDecorationSupport>* support) override;
107*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus registerCallback(
108*0a9764feSAndroid Build Coastguard Worker       const std::shared_ptr<IComposerCallback>& callback) override;
109*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setActiveConfig(int64_t display, int32_t config) override;
110*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setActiveConfigWithConstraints(
111*0a9764feSAndroid Build Coastguard Worker       int64_t display, int32_t config,
112*0a9764feSAndroid Build Coastguard Worker       const VsyncPeriodChangeConstraints& constraints,
113*0a9764feSAndroid Build Coastguard Worker       VsyncPeriodChangeTimeline* timeline) override;
114*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setBootDisplayConfig(int64_t display,
115*0a9764feSAndroid Build Coastguard Worker                                           int32_t config) override;
116*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus clearBootDisplayConfig(int64_t display) override;
117*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getPreferredBootDisplayConfig(int64_t display,
118*0a9764feSAndroid Build Coastguard Worker                                                    int32_t* config) override;
119*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setAutoLowLatencyMode(int64_t display, bool on) override;
120*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setClientTargetSlotCount(int64_t display,
121*0a9764feSAndroid Build Coastguard Worker                                               int32_t count) override;
122*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setColorMode(int64_t display, ColorMode mode,
123*0a9764feSAndroid Build Coastguard Worker                                   RenderIntent intent) override;
124*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setContentType(int64_t display, ContentType type) override;
125*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setDisplayedContentSamplingEnabled(
126*0a9764feSAndroid Build Coastguard Worker       int64_t display, bool enable, FormatColorComponent component_mask,
127*0a9764feSAndroid Build Coastguard Worker       int64_t max_frames) override;
128*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setPowerMode(int64_t display, PowerMode mode) override;
129*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setReadbackBuffer(
130*0a9764feSAndroid Build Coastguard Worker       int64_t display, const AidlNativeHandle& buffer,
131*0a9764feSAndroid Build Coastguard Worker       const ndk::ScopedFileDescriptor& release_fence) override;
132*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setVsyncEnabled(int64_t display, bool enabled) override;
133*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setIdleTimerEnabled(int64_t display,
134*0a9764feSAndroid Build Coastguard Worker                                          int32_t timeout) override;
135*0a9764feSAndroid Build Coastguard Worker 
136*0a9764feSAndroid Build Coastguard Worker #if __ANDROID_API__ >= 34
137*0a9764feSAndroid Build Coastguard Worker 
138*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getOverlaySupport(
139*0a9764feSAndroid Build Coastguard Worker       OverlayProperties* out_overlay_properties) override;
140*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getHdrConversionCapabilities(
141*0a9764feSAndroid Build Coastguard Worker       std::vector<common::HdrConversionCapability>* out_capabilities) override;
142*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setHdrConversionStrategy(
143*0a9764feSAndroid Build Coastguard Worker       const common::HdrConversionStrategy& conversion_strategy,
144*0a9764feSAndroid Build Coastguard Worker       common::Hdr* out_hdr) override;
145*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus setRefreshRateChangedCallbackDebugEnabled(
146*0a9764feSAndroid Build Coastguard Worker       int64_t display, bool enabled) override;
147*0a9764feSAndroid Build Coastguard Worker 
148*0a9764feSAndroid Build Coastguard Worker #endif
149*0a9764feSAndroid Build Coastguard Worker 
150*0a9764feSAndroid Build Coastguard Worker #if __ANDROID_API__ >= 35
151*0a9764feSAndroid Build Coastguard Worker 
152*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getDisplayConfigurations(
153*0a9764feSAndroid Build Coastguard Worker       int64_t display, int32_t max_frame_interval_ns,
154*0a9764feSAndroid Build Coastguard Worker       std::vector<DisplayConfiguration>* configurations) override;
155*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus notifyExpectedPresent(
156*0a9764feSAndroid Build Coastguard Worker       int64_t display, const ClockMonotonicTimestamp& expected_present_time,
157*0a9764feSAndroid Build Coastguard Worker       int32_t frame_interval_ns) override;
158*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus startHdcpNegotiation(int64_t display,
159*0a9764feSAndroid Build Coastguard Worker       const AidlHdcpLevels& levels) override;
160*0a9764feSAndroid Build Coastguard Worker 
161*0a9764feSAndroid Build Coastguard Worker #endif
162*0a9764feSAndroid Build Coastguard Worker 
163*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getMaxLayerPictureProfiles(
164*0a9764feSAndroid Build Coastguard Worker       int64_t display, int32_t* maxProfiles) override;
165*0a9764feSAndroid Build Coastguard Worker   ndk::ScopedAStatus getLuts(int64_t, const std::vector<Buffer>&,
166*0a9764feSAndroid Build Coastguard Worker                              std::vector<Luts>* out_luts) override;
167*0a9764feSAndroid Build Coastguard Worker 
168*0a9764feSAndroid Build Coastguard Worker  protected:
169*0a9764feSAndroid Build Coastguard Worker   ::ndk::SpAIBinder createBinder() override;
170*0a9764feSAndroid Build Coastguard Worker 
171*0a9764feSAndroid Build Coastguard Worker  private:
172*0a9764feSAndroid Build Coastguard Worker   hwc3::Error ImportLayerBuffer(int64_t display_id, int64_t layer_id,
173*0a9764feSAndroid Build Coastguard Worker                                 const Buffer& buffer,
174*0a9764feSAndroid Build Coastguard Worker                                 buffer_handle_t* out_imported_buffer);
175*0a9764feSAndroid Build Coastguard Worker 
176*0a9764feSAndroid Build Coastguard Worker   // Layer commands
177*0a9764feSAndroid Build Coastguard Worker   void DispatchLayerCommand(int64_t display_id, const LayerCommand& command);
178*0a9764feSAndroid Build Coastguard Worker 
179*0a9764feSAndroid Build Coastguard Worker   // Display commands
180*0a9764feSAndroid Build Coastguard Worker   void ExecuteDisplayCommand(const DisplayCommand& command);
181*0a9764feSAndroid Build Coastguard Worker   void ExecuteSetDisplayColorTransform(uint64_t display_id,
182*0a9764feSAndroid Build Coastguard Worker                                        const std::vector<float>& matrix);
183*0a9764feSAndroid Build Coastguard Worker   void ExecuteSetDisplayClientTarget(uint64_t display_id,
184*0a9764feSAndroid Build Coastguard Worker                                      const ClientTarget& command);
185*0a9764feSAndroid Build Coastguard Worker   void ExecuteSetDisplayOutputBuffer(uint64_t display_id, const Buffer& buffer);
186*0a9764feSAndroid Build Coastguard Worker   void ExecuteValidateDisplay(
187*0a9764feSAndroid Build Coastguard Worker       int64_t display_id,
188*0a9764feSAndroid Build Coastguard Worker       std::optional<ClockMonotonicTimestamp> expected_present_time);
189*0a9764feSAndroid Build Coastguard Worker   void ExecuteAcceptDisplayChanges(int64_t display_id);
190*0a9764feSAndroid Build Coastguard Worker   void ExecutePresentDisplay(int64_t display_id);
191*0a9764feSAndroid Build Coastguard Worker   void ExecutePresentOrValidateDisplay(
192*0a9764feSAndroid Build Coastguard Worker       int64_t display_id,
193*0a9764feSAndroid Build Coastguard Worker       std::optional<ClockMonotonicTimestamp> expected_present_time);
194*0a9764feSAndroid Build Coastguard Worker 
195*0a9764feSAndroid Build Coastguard Worker   static hwc3::Error ValidateDisplayInternal(
196*0a9764feSAndroid Build Coastguard Worker       ::android::HwcDisplay& display, std::vector<int64_t>* out_changed_layers,
197*0a9764feSAndroid Build Coastguard Worker       std::vector<Composition>* out_composition_types,
198*0a9764feSAndroid Build Coastguard Worker       int32_t* out_display_request_mask,
199*0a9764feSAndroid Build Coastguard Worker       std::vector<int64_t>* out_requested_layers,
200*0a9764feSAndroid Build Coastguard Worker       std::vector<int32_t>* out_request_masks,
201*0a9764feSAndroid Build Coastguard Worker       ClientTargetProperty* out_client_target_property,
202*0a9764feSAndroid Build Coastguard Worker       DimmingStage* out_dimming_stage);
203*0a9764feSAndroid Build Coastguard Worker 
204*0a9764feSAndroid Build Coastguard Worker   hwc3::Error PresentDisplayInternal(
205*0a9764feSAndroid Build Coastguard Worker       uint64_t display_id, ::android::base::unique_fd& out_display_fence,
206*0a9764feSAndroid Build Coastguard Worker       std::unordered_map<int64_t, ::android::base::unique_fd>&
207*0a9764feSAndroid Build Coastguard Worker           out_release_fences);
208*0a9764feSAndroid Build Coastguard Worker 
209*0a9764feSAndroid Build Coastguard Worker   ::android::HwcDisplay* GetDisplay(uint64_t display_id);
210*0a9764feSAndroid Build Coastguard Worker 
211*0a9764feSAndroid Build Coastguard Worker   std::unique_ptr<CommandResultWriter> cmd_result_writer_;
212*0a9764feSAndroid Build Coastguard Worker 
213*0a9764feSAndroid Build Coastguard Worker   // Manages importing and caching gralloc buffers for displays and layers.
214*0a9764feSAndroid Build Coastguard Worker   std::unique_ptr<ComposerResources> composer_resources_;
215*0a9764feSAndroid Build Coastguard Worker 
216*0a9764feSAndroid Build Coastguard Worker   std::unique_ptr<DrmHwcThree> hwc_;
217*0a9764feSAndroid Build Coastguard Worker };
218*0a9764feSAndroid Build Coastguard Worker 
219*0a9764feSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::graphics::composer3::impl
220