# Copyright 2017 The Chromium 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("../gni/angle.gni")

declare_args() {
  # Determines if we build the capture_replay sample. Off by default.
  angle_build_capture_replay_sample = false
}

angle_executable("shader_translator") {
  sources = [
    "shader_translator/shader_translator.cpp",
  ]
  include_dirs = [ "../include" ]
  deps = [
    "../:translator",
  ]
}

config("sample_util_config") {
  include_dirs = [ "sample_util" ]
}

angle_static_library("sample_util") {
  sources = [
    "sample_util/SampleApplication.cpp",
    "sample_util/SampleApplication.h",
    "sample_util/texture_utils.cpp",
    "sample_util/texture_utils.h",
    "sample_util/tga_utils.cpp",
    "sample_util/tga_utils.h",
  ]
  data_deps = [
    "../:libEGL",
    "../:libGLESv1_CM",
    "../:libGLESv2",
  ]
  public_deps = [
    "../:angle_common",
    "../:angle_util",
    "../:angle_util_loader_headers",
  ]
  configs += [ "../:library_name_config" ]
  public_configs = [
    ":sample_util_config",
    "../:no_gl_prototypes",
  ]
}

template("angle_sample") {
  if (defined(invoker.data)) {
    copy(target_name + "_data") {
      sources = invoker.data
      outputs = [
        "$root_out_dir/{{source_file_part}}",
      ]
    }
  }

  angle_executable(target_name) {
    forward_variables_from(invoker,
                           [
                             "cflags",
                             "defines",
                             "sources",
                           ])
    deps = [
      ":sample_util",
    ]
    if (defined(invoker.data)) {
      deps += [ ":${target_name}_data" ]
    }

    if (defined(invoker.suppressed_configs)) {
      suppressed_configs += invoker.suppressed_configs
    }
  }
}

angle_sample("hello_triangle") {
  sources = [
    "hello_triangle/HelloTriangle.cpp",
  ]
}

angle_sample("mip_map_2d") {
  sources = [
    "mip_map_2d/MipMap2D.cpp",
  ]
}

angle_sample("multi_texture") {
  sources = [
    "multi_texture/MultiTexture.cpp",
  ]
  data = [
    "multi_texture/basemap.tga",
    "multi_texture/lightmap.tga",
  ]
}

angle_sample("multi_window") {
  sources = [
    "multi_window/MultiWindow.cpp",
  ]
}

angle_sample("multiple_draw_buffers") {
  sources = [
    "multiple_draw_buffers/MultipleDrawBuffers.cpp",
  ]
  data = [
    "multiple_draw_buffers/multiple_draw_buffers_copy_fs.glsl",
    "multiple_draw_buffers/multiple_draw_buffers_fs.glsl",
    "multiple_draw_buffers/multiple_draw_buffers_vs.glsl",
  ]
}

angle_sample("multiview") {
  sources = [
    "multiview/Multiview.cpp",
  ]
}

angle_sample("particle_system") {
  sources = [
    "particle_system/ParticleSystem.cpp",
  ]
  data = [
    "particle_system/smoke.tga",
  ]
}

angle_sample("post_sub_buffer") {
  sources = [
    "post_sub_buffer/PostSubBuffer.cpp",
  ]
}

angle_sample("simple_instancing") {
  sources = [
    "simple_instancing/SimpleInstancing.cpp",
  ]
}

angle_sample("simple_texture_2d") {
  sources = [
    "simple_texture_2d/SimpleTexture2D.cpp",
  ]
}

angle_sample("simple_texture_cubemap") {
  sources = [
    "simple_texture_cubemap/SimpleTextureCubemap.cpp",
  ]
}

angle_sample("simple_vertex_shader") {
  sources = [
    "simple_vertex_shader/SimpleVertexShader.cpp",
  ]
}

angle_sample("stencil_operations") {
  sources = [
    "stencil_operations/StencilOperations.cpp",
  ]
}

angle_sample("tex_redef_microbench") {
  sources = [
    "tex_redef_microbench/TexRedefMicroBench.cpp",
  ]
}

angle_sample("texture_wrap") {
  sources = [
    "texture_wrap/TextureWrap.cpp",
  ]
}

angle_sample("tri_fan_microbench") {
  sources = [
    "tri_fan_microbench/TriFanMicroBench.cpp",
  ]
}

angle_sample("window_test") {
  sources = [
    "WindowTest/WindowTest.cpp",
  ]
}

angle_sample("gles1_hello_triangle") {
  sources = [
    "gles1/HelloTriangle.cpp",
  ]
}

angle_sample("gles1_simple_texture_2d") {
  sources = [
    "gles1/SimpleTexture2D.cpp",
  ]
}

angle_sample("gles1_simple_lighting") {
  sources = [
    "gles1/SimpleLighting.cpp",
  ]
}

angle_sample("gles1_flat_shading") {
  sources = [
    "gles1/FlatShading.cpp",
  ]
}

angle_sample("gles1_draw_texture") {
  sources = [
    "gles1/DrawTexture.cpp",
  ]
}

if (angle_build_capture_replay_sample) {
  # The capture_replay sample is set up to work with a single Context.
  # To use the capture replay sample first move your capture sources into
  # the capture_replay folder and enable the gn arg above.
  angle_sample("capture_replay_sample") {
    sources =
        rebase_path(read_file("capture_replay/angle_capture_context1_files.txt",
                              "list lines"), ".", "capture_replay") +
        [
          "capture_replay/CaptureReplay.cpp",
          "capture_replay/angle_capture_context1.cpp",
          "capture_replay/angle_capture_context1.h",
        ]

    _data_path = rebase_path("capture_replay", root_out_dir)
    defines = [ "ANGLE_CAPTURE_REPLAY_SAMPLE_DATA_DIR=\"${_data_path}\"" ]
    suppressed_configs = [ "$angle_root:constructor_and_destructor_warnings" ]
  }
}

group("all") {
  testonly = true
  deps = [
    ":gles1_draw_texture",
    ":gles1_flat_shading",
    ":gles1_hello_triangle",
    ":gles1_simple_lighting",
    ":gles1_simple_texture_2d",
    ":hello_triangle",
    ":mip_map_2d",
    ":multi_texture",
    ":multi_window",
    ":multiple_draw_buffers",
    ":multiview",
    ":particle_system",
    ":post_sub_buffer",
    ":sample_util",
    ":simple_instancing",
    ":simple_texture_2d",
    ":simple_texture_cubemap",
    ":simple_vertex_shader",
    ":stencil_operations",
    ":tex_redef_microbench",
    ":texture_wrap",
    ":tri_fan_microbench",
    ":window_test",
  ]
}
