# Copyright 2019 The Dawn Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("../../scripts/dawn_overrides_with_defaults.gni")

import("${dawn_root}/generator/dawn_generator.gni")
import("${dawn_root}/scripts/dawn_component.gni")

###############################################################################
# Dawn headers
###############################################################################

dawn_json_generator("dawn_headers_gen") {
  target = "dawn_headers"
  outputs = [
    "src/include/dawn/dawn_proc_table.h",
    "src/include/dawn/webgpu.h",
  ]
}

dawn_json_generator("emscripten_bits_gen") {
  target = "emscripten_bits"
  outputs = [
    "src/dawn/webgpu_struct_info.json",
    "src/dawn/library_webgpu_enum_tables.js",
  ]
}

source_set("dawn_headers") {
  all_dependent_configs = [ "${dawn_root}/src/common:dawn_public_include_dirs" ]
  public_deps = [ ":dawn_headers_gen" ]

  sources = get_target_outputs(":dawn_headers_gen")
  sources += [ "${dawn_root}/src/include/dawn/dawn_wsi.h" ]
}

###############################################################################
# Dawn C++ headers
###############################################################################

dawn_json_generator("dawncpp_headers_gen") {
  target = "dawncpp_headers"
  outputs = [
    "src/include/dawn/webgpu_cpp.h",
    "src/include/dawn/webgpu_cpp_print.h",
  ]
}

source_set("dawncpp_headers") {
  public_deps = [
    ":dawn_headers",
    ":dawncpp_headers_gen",
  ]

  sources = get_target_outputs(":dawncpp_headers_gen")
  sources += [ "${dawn_root}/src/include/dawn/EnumClassBitmasks.h" ]
}

###############################################################################
# Dawn C++ wrapper
###############################################################################

dawn_json_generator("dawncpp_gen") {
  target = "dawncpp"
  outputs = [ "src/dawn/webgpu_cpp.cpp" ]
}

source_set("dawncpp") {
  deps = [
    ":dawncpp_gen",
    ":dawncpp_headers",
  ]
  sources = get_target_outputs(":dawncpp_gen")
}

###############################################################################
# dawn_proc
###############################################################################

dawn_json_generator("dawn_proc_gen") {
  target = "dawn_proc"
  outputs = [
    "src/dawn/dawn_proc.c",
    "src/dawn/dawn_thread_dispatch_proc.cpp",
  ]
}

dawn_component("dawn_proc") {
  DEFINE_PREFIX = "WGPU"

  public_deps = [ ":dawn_headers" ]
  deps = [ ":dawn_proc_gen" ]
  sources = get_target_outputs(":dawn_proc_gen")
  sources += [
    "${dawn_root}/src/include/dawn/dawn_proc.h",
    "${dawn_root}/src/include/dawn/dawn_thread_dispatch_proc.h",
  ]
}
