blob: 707bc19e6845da928df0926fa5bf62e6645e1f29 [file] [log] [blame]
/*
* Copyright 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_HWC_DISPLAY_H
#define ANDROID_HWC_DISPLAY_H
#include <aidl/android/hardware/graphics/common/DisplayDecorationSupport.h>
#include <aidl/android/hardware/graphics/composer3/ColorMode.h>
#include <aidl/android/hardware/graphics/composer3/ContentType.h>
#include <aidl/android/hardware/graphics/composer3/DisplayAttribute.h>
#include <aidl/android/hardware/graphics/composer3/DisplayCapability.h>
#include <aidl/android/hardware/graphics/composer3/DisplayConnectionType.h>
#include <aidl/android/hardware/graphics/composer3/DisplayContentSample.h>
#include <aidl/android/hardware/graphics/composer3/DisplayIdentification.h>
#include <aidl/android/hardware/graphics/composer3/HdrCapabilities.h>
#include <aidl/android/hardware/graphics/composer3/PerFrameMetadataKey.h>
#include <aidl/android/hardware/graphics/composer3/PowerMode.h>
#include <aidl/android/hardware/graphics/composer3/ReadbackBufferAttributes.h>
#include <aidl/android/hardware/graphics/composer3/RenderIntent.h>
#include <aidl/android/hardware/graphics/composer3/VsyncPeriodChangeConstraints.h>
#include <aidl/android/hardware/graphics/composer3/VsyncPeriodChangeTimeline.h>
#include <android-base/unique_fd.h>
#include <array>
#include <mutex>
#include <optional>
#include <thread>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include "Common.h"
#include "DisplayChanges.h"
#include "DisplayConfig.h"
#include "DisplayFinder.h"
#include "FencedBuffer.h"
#include "FrameComposer.h"
#include "Layer.h"
#include "Time.h"
#include "VsyncThread.h"
namespace aidl::android::hardware::graphics::composer3::impl {
class FrameComposer;
class Display {
public:
Display(FrameComposer* composer, int64_t id);
~Display();
Display(const Display& display) = delete;
Display& operator=(const Display& display) = delete;
Display(Display&& display) = delete;
Display& operator=(Display&& display) = delete;
HWC3::Error init(
const std::vector<DisplayConfig>& configs, int32_t activeConfigId,
const std::optional<std::vector<uint8_t>>& edid = std::nullopt);
HWC3::Error updateParameters(
uint32_t width, uint32_t height, uint32_t dpiX, uint32_t dpiY,
uint32_t refreshRateHz,
const std::optional<std::vector<uint8_t>>& edid = std::nullopt);
// HWComposer3 interface.
HWC3::Error createLayer(int64_t* outLayerId);
HWC3::Error destroyLayer(int64_t layerId);
HWC3::Error getActiveConfig(int32_t* outConfigId);
HWC3::Error getDisplayAttribute(int32_t configId, DisplayAttribute attribute,
int32_t* outValue);
HWC3::Error getColorModes(std::vector<ColorMode>* outColorModes);
HWC3::Error getDisplayCapabilities(std::vector<DisplayCapability>* caps);
HWC3::Error getDisplayConfigs(std::vector<int32_t>* configs);
HWC3::Error getDisplayConnectionType(DisplayConnectionType* outType);
HWC3::Error getDisplayIdentificationData(
DisplayIdentification* outIdentification);
HWC3::Error getDisplayName(std::string* outName);
HWC3::Error getDisplayVsyncPeriod(int32_t* outVsyncPeriod);
HWC3::Error getDisplayedContentSample(int64_t maxFrames, int64_t timestamp,
DisplayContentSample* samples);
HWC3::Error getDisplayedContentSamplingAttributes(
DisplayContentSamplingAttributes* outAttributes);
HWC3::Error getDisplayPhysicalOrientation(common::Transform* outOrientation);
HWC3::Error getHdrCapabilities(HdrCapabilities* outCapabilities);
HWC3::Error getPerFrameMetadataKeys(
std::vector<PerFrameMetadataKey>* outKeys);
HWC3::Error getReadbackBufferAttributes(ReadbackBufferAttributes* attrs);
HWC3::Error getReadbackBufferFence(ndk::ScopedFileDescriptor* acquireFence);
HWC3::Error getRenderIntents(ColorMode mode,
std::vector<RenderIntent>* intents);
HWC3::Error getSupportedContentTypes(std::vector<ContentType>* types);
HWC3::Error getDecorationSupport(
std::optional<common::DisplayDecorationSupport>* support);
HWC3::Error registerCallback(
const std::shared_ptr<IComposerCallback>& callback);
HWC3::Error setActiveConfig(int32_t configId);
HWC3::Error setActiveConfigWithConstraints(
int32_t config, const VsyncPeriodChangeConstraints& constraints,
VsyncPeriodChangeTimeline* outTimeline);
HWC3::Error setBootConfig(int32_t configId);
HWC3::Error clearBootConfig();
HWC3::Error getPreferredBootConfig(int32_t* outConfigId);
HWC3::Error setAutoLowLatencyMode(bool on);
HWC3::Error setColorMode(ColorMode mode, RenderIntent intent);
HWC3::Error setContentType(ContentType contentType);
HWC3::Error setDisplayedContentSamplingEnabled(
bool enable, FormatColorComponent componentMask, int64_t maxFrames);
HWC3::Error setPowerMode(PowerMode mode);
HWC3::Error setReadbackBuffer(const buffer_handle_t buffer,
const ndk::ScopedFileDescriptor& releaseFence);
HWC3::Error setVsyncEnabled(bool enabled);
HWC3::Error setIdleTimerEnabled(int32_t timeoutMs);
HWC3::Error setColorTransform(const std::vector<float>& transform);
HWC3::Error setBrightness(float brightness);
HWC3::Error setClientTarget(buffer_handle_t buffer,
const ndk::ScopedFileDescriptor& fence,
common::Dataspace dataspace,
const std::vector<common::Rect>& damage);
HWC3::Error setOutputBuffer(buffer_handle_t buffer,
const ndk::ScopedFileDescriptor& fence);
HWC3::Error setExpectedPresentTime(
const std::optional<ClockMonotonicTimestamp>& expectedPresentTime);
HWC3::Error validate(DisplayChanges* outChanges);
HWC3::Error acceptChanges();
HWC3::Error present(
::android::base::unique_fd* outDisplayFence,
std::unordered_map<int64_t, ::android::base::unique_fd>* outLayerFences);
// Non HWCComposer3 interface.
int64_t getId() const { return mId; }
Layer* getLayer(int64_t layerHandle);
HWC3::Error setEdid(std::vector<uint8_t> edid);
bool hasColorTransform() const { return mColorTransform.has_value(); }
std::array<float, 16> getColorTransform() const { return *mColorTransform; }
FencedBuffer& getClientTarget() { return mClientTarget; }
buffer_handle_t waitAndGetClientTargetBuffer();
const std::vector<Layer*>& getOrderedLayers() { return mOrderedLayers; }
private:
bool hasConfig(int32_t configId) const;
DisplayConfig* getConfig(int32_t configId);
std::optional<int32_t> getBootConfigId();
void setLegacyEdid();
// The state of this display should only be modified from
// SurfaceFlinger's main loop, with the exception of when dump is
// called. To prevent a bad state from crashing us during a dump
// call, all public calls into Display must acquire this mutex.
mutable std::recursive_mutex mStateMutex;
FrameComposer* mComposer = nullptr;
const int64_t mId;
std::string mName;
PowerMode mPowerMode = PowerMode::OFF;
VsyncThread mVsyncThread;
FencedBuffer mClientTarget;
FencedBuffer mReadbackBuffer;
// Will only be non-null after the Display has been validated and
// before it has been accepted.
enum class PresentFlowState {
WAITING_FOR_VALIDATE,
WAITING_FOR_ACCEPT,
WAITING_FOR_PRESENT,
};
PresentFlowState mPresentFlowState = PresentFlowState::WAITING_FOR_VALIDATE;
DisplayChanges mPendingChanges;
std::optional<TimePoint> mExpectedPresentTime;
std::unordered_map<int64_t, std::unique_ptr<Layer>> mLayers;
// Ordered layers available after validate().
std::vector<Layer*> mOrderedLayers;
std::optional<int32_t> mActiveConfigId;
std::unordered_map<int32_t, DisplayConfig> mConfigs;
std::unordered_set<ColorMode> mColorModes = {ColorMode::NATIVE};
ColorMode mActiveColorMode = ColorMode::NATIVE;
std::optional<std::array<float, 16>> mColorTransform;
std::vector<uint8_t> mEdid;
};
} // namespace aidl::android::hardware::graphics::composer3::impl
#endif