# Copyright 2019 The Fuchsia 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("../gn/build_rules.gni")
import("../gn/glsl_shader_rules.gni")

# Helper template to define a test program that Vulkan through vk_app_state.h
# Variables:
#    Anything that graphics_compute_vulkan_executable supports, and:
#
#    glsl_shaders: Optional list of GLSL shader files that will be compiled
#       into SPIR-V modules automatically.
#
#    glsl_shaders_c_header_name: If |glsl_shaders| is provided, name of a
#       generated C header that will contain the content of all generated
#       shaders as literal C arrays of uint32_t items.
#
template("vulkan_test_app") {
  if (defined(invoker.glsl_shaders)) {
    assert(defined(invoker.glsl_shaders_c_header_name))

    _shaders_target = "compile_glsl_shaders_${target_name}"
    _shaders_output_dir = "${target_gen_dir}/${target_name}_shaders"

    # Compile the shaders to .spv
    graphics_compute_compile_glsl_shader_foreach(_shaders_target) {
      sources = invoker.glsl_shaders
      output_dir = _shaders_output_dir
      args = [
        "--target-env",
        "vulkan1.1",
      ]
    }

    # Convert all .spv to a single C header.
    _shaders_c_source_target = "gen_shader_c_source_${target_name}"
    _shaders_c_source =
        "${_shaders_output_dir}/${invoker.glsl_shaders_c_header_name}"
    action(_shaders_c_source_target) {
      script =
          "${graphics_compute_dir}/scripts/convert_spirv_files_to_c_arrays.py"
      sources = get_target_outputs(":${_shaders_target}")
      outputs = [ _shaders_c_source ]
      args = [
               "--output",
               rebase_path(outputs[0], root_build_dir),
             ] + rebase_path(sources, root_build_dir)
      deps = [ ":${_shaders_target}" ]
    }
  }

  graphics_compute_vulkan_executable(target_name) {
    testonly = true
    forward_variables_from(invoker,
                           "*",
                           [
                             "glsl_shaders",
                             "glsl_shaders_c_header_name",
                           ])
    if (!defined(deps)) {
      deps = []
    }
    deps += [
      "${graphics_compute_dir}/tests:common",
      "${graphics_compute_dir}/tests:common_vk",
    ]
    if (defined(_shaders_c_source_target)) {
      if (!defined(include_dirs)) {
        include_dirs = []
      }
      include_dirs += [ _shaders_output_dir ]
      deps += [ ":${_shaders_c_source_target}" ]
    }
  }
}
