# 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.

import("//flutter/impeller/tools/impeller.gni")

if (impeller_enable_compute) {
  impeller_shaders("compute_shaders") {
    name = "compute"
    enable_opengles = false

    if (impeller_enable_vulkan) {
      vulkan_language_version = 130
    }

    if (is_ios) {
      metal_version = "2.4"
    } else if (is_mac) {
      metal_version = "2.1"
    }

    shaders = [
      "stroke.comp",
      "path_polyline.comp",
      "prefix_sum_test.comp",
      "threadgroup_sizing_test.comp",
    ]
  }

  impeller_component("compute_tessellation_unittests") {
    testonly = true
    sources = [ "compute_subgroup_unittests.cc" ]

    deps = [
      ":compute_shaders",
      ":renderer",
      "../display_list:skia_conversions",
      "../entity",
      "../fixtures",
      "../playground:playground_test",
      "//flutter/testing:testing_lib",
    ]
  }
}

impeller_component("renderer") {
  sources = [
    "blit_command.cc",
    "blit_command.h",
    "blit_pass.cc",
    "blit_pass.h",
    "capabilities.cc",
    "capabilities.h",
    "command.cc",
    "command.h",
    "command_buffer.cc",
    "command_buffer.h",
    "command_queue.cc",
    "command_queue.h",
    "compute_pass.cc",
    "compute_pass.h",
    "compute_pipeline_builder.cc",
    "compute_pipeline_builder.h",
    "compute_pipeline_descriptor.cc",
    "compute_pipeline_descriptor.h",
    "context.cc",
    "context.h",
    "pipeline.cc",
    "pipeline.h",
    "pipeline_builder.cc",
    "pipeline_builder.h",
    "pipeline_descriptor.cc",
    "pipeline_descriptor.h",
    "pipeline_library.cc",
    "pipeline_library.h",
    "pool.h",
    "render_pass.cc",
    "render_pass.h",
    "render_target.cc",
    "render_target.h",
    "renderer.cc",
    "renderer.h",
    "sampler_library.cc",
    "sampler_library.h",
    "shader_function.cc",
    "shader_function.h",
    "shader_key.cc",
    "shader_key.h",
    "shader_library.cc",
    "shader_library.h",
    "snapshot.cc",
    "snapshot.h",
    "surface.cc",
    "surface.h",
    "texture_mipmap.cc",
    "texture_mipmap.h",
    "vertex_buffer_builder.cc",
    "vertex_buffer_builder.h",
    "vertex_descriptor.cc",
    "vertex_descriptor.h",
  ]

  public_deps = [
    "../base",
    "../core",
    "../geometry",
    "../image",
    "../runtime_stage",
    "../tessellator",
  ]

  if (impeller_enable_compute) {
    sources += [
      "compute_tessellator.cc",
      "compute_tessellator.h",
    ]
    public_deps += [ ":compute_shaders" ]
  }

  deps = [ "//flutter/fml" ]
}

impeller_component("renderer_unittests") {
  testonly = true

  sources = [
    "blit_pass_unittests.cc",
    "capabilities_unittests.cc",
    "device_buffer_unittests.cc",
    "pipeline_descriptor_unittests.cc",
    "pool_unittests.cc",
    "renderer_unittests.cc",
  ]

  deps = [
    ":renderer",
    "../fixtures",
    "../playground:playground_test",
    "//flutter/testing:testing_lib",
  ]

  if (impeller_enable_compute) {
    sources += [ "compute_unittests.cc" ]
  }
}

impeller_component("renderer_dart_unittests") {
  testonly = true

  sources = [ "renderer_dart_unittests.cc" ]

  public_configs = [ "//flutter:export_dynamic_symbols" ]

  deps = [
    ":renderer",
    "../fixtures:flutter_gpu_fixtures",
    "../fixtures:flutter_gpu_shaders",
    "../playground:playground_test",
    "//flutter/lib/gpu",
    "//flutter/lib/snapshot",
    "//flutter/runtime:runtime",
    "//flutter/testing:fixture_test",
    "//flutter/testing:testing",
  ]
}
