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