// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "impeller/renderer/context.h"

#include <mutex>
#include <utility>

namespace impeller {

ImpellerContextFuture::ImpellerContextFuture(
    std::future<std::shared_ptr<impeller::Context>> context)
    : future_(std::move(context)) {}

std::shared_ptr<impeller::Context> ImpellerContextFuture::GetContext() {
  std::scoped_lock<std::mutex> lock(mutex_);
  if (!did_wait_ && future_.valid()) {
    context_ = future_.get();
    did_wait_ = true;
  }
  return context_;
}

Context::~Context() = default;

Context::Context(const Flags& flags) : flags_(flags) {}

bool Context::UpdateOffscreenLayerPixelFormat(PixelFormat format) {
  return false;
}

bool Context::EnqueueCommandBuffer(
    std::shared_ptr<CommandBuffer> command_buffer) {
  return GetCommandQueue()->Submit({std::move(command_buffer)}).ok();
}

bool Context::FlushCommandBuffers() {
  return true;
}

std::shared_ptr<const IdleWaiter> Context::GetIdleWaiter() const {
  return nullptr;
}

std::shared_ptr<const GpuSubmissionTracker> Context::GetSubmissionTracker()
    const {
  return nullptr;
}

void Context::ResetThreadLocalState() const {
  // Nothing to do.
}

bool Context::AddTrackingFence(const std::shared_ptr<Texture>& texture) const {
  return false;
}

bool Context::SubmitOnscreen(std::shared_ptr<CommandBuffer> cmd_buffer) {
  return EnqueueCommandBuffer(std::move(cmd_buffer));
}

}  // namespace impeller
