// 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 "flutter/shell/gpu/gpu_surface_noop.h"

#import <Metal/Metal.h>
#import <QuartzCore/QuartzCore.h>

#include "flow/surface.h"
#include "flow/surface_frame.h"
#include "flutter/common/settings.h"
#include "flutter/fml/mapping.h"
#include "flutter/fml/trace_event.h"

static_assert(!__has_feature(objc_arc), "ARC must be disabled.");

namespace flutter {

GPUSurfaceNoop::GPUSurfaceNoop() = default;

GPUSurfaceNoop::~GPUSurfaceNoop() = default;

// |Surface|
bool GPUSurfaceNoop::IsValid() {
  return true;
}

Surface::SurfaceData GPUSurfaceNoop::GetSurfaceData() const {
  return Surface::SurfaceData{};
}

// |Surface|
std::unique_ptr<SurfaceFrame> GPUSurfaceNoop::AcquireFrame(const SkISize& frame_size) {
  auto callback = [](const SurfaceFrame&, DlCanvas*) { return true; };
  auto submit_callback = [](const SurfaceFrame&) { return true; };
  SurfaceFrame::FramebufferInfo framebuffer_info;

  return std::make_unique<SurfaceFrame>(
      /*surface=*/nullptr,
      /*framebuffer_info=*/framebuffer_info,
      /*encode_callback=*/callback,
      /*submit_callback=*/submit_callback,
      /*frame_size=*/frame_size,
      /*context_result=*/nullptr,
      /*display_list_fallback=*/true);
}

std::unique_ptr<SurfaceFrame> GPUSurfaceNoop::AcquireFrameFromMTLTexture(
    const SkISize& frame_size) {
  auto callback = [](const SurfaceFrame&, DlCanvas*) { return true; };
  auto submit_callback = [](const SurfaceFrame&) { return true; };
  SurfaceFrame::FramebufferInfo framebuffer_info;

  return std::make_unique<SurfaceFrame>(
      /*surface=*/nullptr,
      /*framebuffer_info=*/framebuffer_info,
      /*encode_callback=*/callback,
      /*submit_callback=*/submit_callback,
      /*frame_size=*/frame_size,
      /*context_result=*/nullptr,
      /*display_list_fallback=*/true);
}

// |Surface|
SkMatrix GPUSurfaceNoop::GetRootTransformation() const {
  // This backend does not currently support root surface transformations. Just
  // return identity.
  return {};
}

// |Surface|
GrDirectContext* GPUSurfaceNoop::GetContext() {
  return nullptr;
}

// |Surface|
std::unique_ptr<GLContextResult> GPUSurfaceNoop::MakeRenderContextCurrent() {
  // This backend has no such concept.
  return std::make_unique<GLContextDefaultResult>(true);
}

bool GPUSurfaceNoop::AllowsDrawingWhenGpuDisabled() const {
  return true;
}

// |Surface|
bool GPUSurfaceNoop::EnableRasterCache() const {
  return false;
}

// |Surface|
std::shared_ptr<impeller::AiksContext> GPUSurfaceNoop::GetAiksContext() const {
  return nullptr;
}

}  // namespace flutter
