# 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

  # Decide which context to replay, starting with desktop default
  angle_capture_replay_sample_context_id = 1
}

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") {
    _contextid = angle_capture_replay_sample_context_id
    sources =
        rebase_path(
            read_file(
                "capture_replay/angle_capture_context${_contextid}_files.txt",
                "list lines"),
            ".",
            "capture_replay") +
        [
          "capture_replay/CaptureReplay.cpp",
          "capture_replay/angle_capture_context${_contextid}.cpp",
          "capture_replay/angle_capture_context${_contextid}.h",
        ]

    _data_path = rebase_path("capture_replay", root_out_dir)
    defines = [
      "ANGLE_CAPTURE_REPLAY_SAMPLE_DATA_DIR=\"${_data_path}\"",
      "ANGLE_CAPTURE_REPLAY_SAMPLE_CONTEXT_ID=${_contextid}",
      "ANGLE_CAPTURE_REPLAY_SAMPLE_HEADER=angle_capture_context${_contextid}.h",
    ]
    suppressed_configs = [ "$angle_root:constructor_and_destructor_warnings" ]
  }
}

group("angle_samples") {
  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",
  ]
}
