# Copyright 2020 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}/scripts/dawn_features.gni")

###############################################################################
# GLFW wrapping target
###############################################################################

# GLFW does not support ChromeOS, Android or Fuchsia, so provide a small mock
# library that can be linked into the Dawn tests on these platforms. Otherwise,
# use the real library from third_party/.
if (dawn_supports_glfw_for_windowing) {
  group("dawn_glfw") {
    public_deps = [
      "${dawn_root}/third_party/gn/glfw",
    ]
  }
} else if (is_fuchsia) {
  # The mock implementation of GLFW on Fuchsia
  config("dawn_glfw_public_config") {
    # Allow inclusion of <GLFW/glfw3.h>
    include_dirs = [ "${dawn_glfw_dir}/include" ]

    # The GLFW/glfw3.h header includes <GL/gl.h> by default, but the latter
    # does not exist on Fuchsia. Defining GLFW_INCLUDE_NONE helps work around
    # the issue, but it needs to be defined for any file that includes the
    # header.
    defines = [
      "GLFW_INCLUDE_NONE",
      "GLFW_INCLUDE_VULKAN",
    ]
  }

  static_library("dawn_glfw") {
    sources = [
      # NOTE: The header below is required to pass "gn check".
      "${dawn_glfw_dir}/include/GLFW/glfw3.h",
      "Glfw3Fuchsia.cpp",
    ]
    public_configs = [ ":dawn_glfw_public_config" ]
    deps = [
      "${dawn_root}/src/common",
    ]
  }
} else {
  # Just skip GLFW on other systems
  group("dawn_glfw") {
  }
}

###############################################################################
# Utils for tests and samples
###############################################################################

static_library("dawn_utils") {
  configs += [ "${dawn_root}/src/common:dawn_internal" ]

  sources = [
    "ComboRenderBundleEncoderDescriptor.cpp",
    "ComboRenderBundleEncoderDescriptor.h",
    "ComboRenderPipelineDescriptor.cpp",
    "ComboRenderPipelineDescriptor.h",
    "SystemUtils.cpp",
    "SystemUtils.h",
    "TerribleCommandBuffer.cpp",
    "TerribleCommandBuffer.h",
    "TextureFormatUtils.cpp",
    "TextureFormatUtils.h",
    "Timer.h",
    "WGPUHelpers.cpp",
    "WGPUHelpers.h",
  ]
  deps = [
    "${dawn_root}/src/common",
    "${dawn_root}/src/dawn_native",
    "${dawn_root}/src/dawn_wire",
    "${dawn_shaderc_dir}:libshaderc",
  ]
  libs = []

  if (is_win) {
    sources += [ "WindowsTimer.cpp" ]
  } else if (is_mac) {
    sources += [
      "OSXTimer.cpp",
      "ObjCUtils.h",
      "ObjCUtils.mm",
    ]
    libs += [ "QuartzCore.framework" ]
  } else {
    sources += [ "PosixTimer.cpp" ]
  }

  if (dawn_supports_glfw_for_windowing) {
    sources += [
      "GLFWUtils.cpp",
      "GLFWUtils.h",
    ]
    deps += [ ":dawn_glfw" ]

    if (dawn_enable_metal) {
      sources += [ "GLFWUtils_metal.mm" ]
      libs += [ "Metal.framework" ]
    }
  }

  public_deps = [
    "${dawn_root}/src/dawn:dawncpp_headers",
  ]
}

###############################################################################
# Dawn samples, only in standalone builds
###############################################################################

if (dawn_standalone) {
  # Library to handle the interaction of Dawn with GLFW windows in samples
  static_library("dawn_bindings") {
    configs += [ "${dawn_root}/src/common:dawn_internal" ]

    sources = [
      "BackendBinding.cpp",
      "BackendBinding.h",
    ]

    public_deps = [
      "${dawn_root}/src/dawn:dawn_headers",
    ]

    deps = [
      ":dawn_glfw",
      "${dawn_root}/src/common",
      "${dawn_root}/src/dawn_native",
    ]
    libs = []

    if (dawn_enable_d3d12) {
      sources += [ "D3D12Binding.cpp" ]
    }

    if (dawn_enable_metal) {
      sources += [ "MetalBinding.mm" ]
      libs += [
        "Metal.framework",
        "QuartzCore.framework",
      ]

      # Suppress warnings that Metal isn't in the deployment target of Chrome
      if (is_mac) {
        cflags_objcc = [ "-Wno-unguarded-availability" ]
      }
    }

    if (dawn_enable_null) {
      sources += [ "NullBinding.cpp" ]
    }

    if (dawn_enable_opengl) {
      sources += [ "OpenGLBinding.cpp" ]
    }

    if (dawn_enable_vulkan) {
      sources += [ "VulkanBinding.cpp" ]
    }
  }
}
