/*
 * Copyright (C) 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.
 */

#include "ComposerResources.h"

#include <aidlcommonsupport/NativeHandle.h>

namespace aidl::android::hardware::graphics::composer3::impl {
namespace {

HWC3::Error toHwc3Error(
    ::android::hardware::graphics::composer::V2_1::Error error) {
  switch (error) {
    case ::android::hardware::graphics::composer::V2_1::Error::NONE:
      return HWC3::Error::None;
    case ::android::hardware::graphics::composer::V2_1::Error::BAD_CONFIG:
      return HWC3::Error::BadConfig;
    case ::android::hardware::graphics::composer::V2_1::Error::BAD_DISPLAY:
      return HWC3::Error::BadDisplay;
    case ::android::hardware::graphics::composer::V2_1::Error::BAD_LAYER:
      return HWC3::Error::BadLayer;
    case ::android::hardware::graphics::composer::V2_1::Error::BAD_PARAMETER:
      return HWC3::Error::BadParameter;
    case ::android::hardware::graphics::composer::V2_1::Error::NO_RESOURCES:
      return HWC3::Error::NoResources;
    case ::android::hardware::graphics::composer::V2_1::Error::NOT_VALIDATED:
      return HWC3::Error::NotValidated;
    case ::android::hardware::graphics::composer::V2_1::Error::UNSUPPORTED:
      return HWC3::Error::Unsupported;
  }
}

::android::hardware::graphics::composer::V2_1::Display toHwc2Display(
    int64_t displayId) {
  return static_cast<::android::hardware::graphics::composer::V2_1::Display>(
      displayId);
}

::android::hardware::graphics::composer::V2_1::Layer toHwc2Layer(
    int64_t layerId) {
  return static_cast<::android::hardware::graphics::composer::V2_1::Layer>(
      layerId);
}

}  // namespace

std::unique_ptr<ComposerResourceReleaser> ComposerResources::createReleaser(
    bool isBuffer) {
  return std::make_unique<ComposerResourceReleaser>(isBuffer);
}

HWC3::Error ComposerResources::init() {
  mImpl = ::android::hardware::graphics::composer::V2_2::hal::
      ComposerResources::create();
  if (!mImpl) {
    ALOGE("%s: failed to create underlying ComposerResources.", __FUNCTION__);
    return HWC3::Error::NoResources;
  }
  return HWC3::Error::None;
}

void ComposerResources::clear(
    ::android::hardware::graphics::composer::V2_2::hal::ComposerResources::
        RemoveDisplay removeDisplay) {
  mImpl->clear(removeDisplay);
}

bool ComposerResources::hasDisplay(int64_t displayId) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  return mImpl->hasDisplay(display);
}

HWC3::Error ComposerResources::addPhysicalDisplay(int64_t displayId) {
  DEBUG_LOG("%s: display:%" PRId64, __FUNCTION__, displayId);
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  return toHwc3Error(mImpl->addPhysicalDisplay(display));
}

HWC3::Error ComposerResources::addVirtualDisplay(
    int64_t displayId, uint32_t outputBufferCacheSize) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  return toHwc3Error(mImpl->addVirtualDisplay(display, outputBufferCacheSize));
}

HWC3::Error ComposerResources::removeDisplay(int64_t displayId) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  return toHwc3Error(mImpl->removeDisplay(display));
}

HWC3::Error ComposerResources::setDisplayClientTargetCacheSize(
    int64_t displayId, uint32_t clientTargetCacheSize) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  return toHwc3Error(
      mImpl->setDisplayClientTargetCacheSize(display, clientTargetCacheSize));
}

HWC3::Error ComposerResources::getDisplayClientTargetCacheSize(
    int64_t displayId, size_t* outCacheSize) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  return toHwc3Error(
      mImpl->getDisplayClientTargetCacheSize(display, outCacheSize));
}

HWC3::Error ComposerResources::getDisplayOutputBufferCacheSize(
    int64_t displayId, size_t* outCacheSize) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  return toHwc3Error(
      mImpl->getDisplayOutputBufferCacheSize(display, outCacheSize));
}

HWC3::Error ComposerResources::addLayer(int64_t displayId, int64_t layerId,
                                        uint32_t bufferCacheSize) {
  DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId,
            layerId);

  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  ::android::hardware::graphics::composer::V2_1::Layer layer =
      toHwc2Layer(layerId);
  return toHwc3Error(mImpl->addLayer(display, layer, bufferCacheSize));
}

HWC3::Error ComposerResources::removeLayer(int64_t displayId, int64_t layerId) {
  DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId,
            layerId);

  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  ::android::hardware::graphics::composer::V2_1::Layer layer =
      toHwc2Layer(layerId);

  return toHwc3Error(mImpl->removeLayer(display, layer));
}

void ComposerResources::setDisplayMustValidateState(int64_t displayId,
                                                    bool mustValidate) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  mImpl->setDisplayMustValidateState(display, mustValidate);
}

bool ComposerResources::mustValidateDisplay(int64_t displayId) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  return mImpl->mustValidateDisplay(display);
}

HWC3::Error ComposerResources::getDisplayReadbackBuffer(
    int64_t displayId,
    const aidl::android::hardware::common::NativeHandle& handle,
    buffer_handle_t* outHandle, ComposerResourceReleaser* releaser) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  return toHwc3Error(mImpl->getDisplayReadbackBuffer(
      display, ::android::makeFromAidl(handle), outHandle,
      releaser->getReplacedHandle()));
}

HWC3::Error ComposerResources::getDisplayClientTarget(
    int64_t displayId, const Buffer& buffer, buffer_handle_t* outHandle,
    ComposerResourceReleaser* releaser) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);

  const bool useCache = !buffer.handle.has_value();

  buffer_handle_t bufferHandle = nullptr;
  if (buffer.handle.has_value()) {
    bufferHandle = ::android::makeFromAidl(*buffer.handle);
  }

  return toHwc3Error(mImpl->getDisplayClientTarget(
      display, buffer.slot, useCache, bufferHandle, outHandle,
      releaser->getReplacedHandle()));
}

HWC3::Error ComposerResources::getDisplayOutputBuffer(
    int64_t displayId, const Buffer& buffer, buffer_handle_t* outHandle,
    ComposerResourceReleaser* releaser) {
  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);

  const bool useCache = !buffer.handle.has_value();

  buffer_handle_t bufferHandle = nullptr;
  if (buffer.handle.has_value()) {
    bufferHandle = ::android::makeFromAidl(*buffer.handle);
  }

  return toHwc3Error(mImpl->getDisplayOutputBuffer(
      display, buffer.slot, useCache, bufferHandle, outHandle,
      releaser->getReplacedHandle()));
}

HWC3::Error ComposerResources::getLayerBuffer(
    int64_t displayId, int64_t layerId, const Buffer& buffer,
    buffer_handle_t* outHandle, ComposerResourceReleaser* releaser) {
  DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId,
            layerId);

  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  ::android::hardware::graphics::composer::V2_1::Layer layer =
      toHwc2Layer(layerId);

  const bool useCache = !buffer.handle.has_value();

  buffer_handle_t bufferHandle = nullptr;
  if (buffer.handle.has_value()) {
    bufferHandle = ::android::makeFromAidl(*buffer.handle);
  }

  DEBUG_LOG("%s fromCache:%s", __FUNCTION__, (useCache ? "yes" : "no"));
  return toHwc3Error(mImpl->getLayerBuffer(display, layer, buffer.slot,
                                           useCache, bufferHandle, outHandle,
                                           releaser->getReplacedHandle()));
}

HWC3::Error ComposerResources::getLayerSidebandStream(
    int64_t displayId, int64_t layerId,
    const aidl::android::hardware::common::NativeHandle& handle,
    buffer_handle_t* outHandle, ComposerResourceReleaser* releaser) {
  DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId,
            layerId);

  ::android::hardware::graphics::composer::V2_1::Display display =
      toHwc2Display(displayId);
  ::android::hardware::graphics::composer::V2_1::Layer layer =
      toHwc2Layer(layerId);
  return toHwc3Error(mImpl->getLayerSidebandStream(
      display, layer, ::android::makeFromAidl(handle), outHandle,
      releaser->getReplacedHandle()));
}

}  // namespace aidl::android::hardware::graphics::composer3::impl