/*
 * 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
