# Copyright 2019 The SwiftShader Authors. All Rights Reserved.
#
# 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("../swiftshader.gni")
import("//build_overrides/wayland.gni")
import("//build/config/ozone.gni")

config("WSI_metal_weak_framework") {
  if (is_mac) {
    ldflags = [
      "-weak_framework",
      "Metal",
    ]
  }
}

swiftshader_source_set("WSI") {
  sources = [
    "HeadlessSurfaceKHR.cpp",
    "HeadlessSurfaceKHR.hpp",
    "VkSurfaceKHR.cpp",
    "VkSurfaceKHR.hpp",
    "VkSwapchainKHR.cpp",
    "VkSwapchainKHR.hpp",
  ]

  if (is_linux) {
    if (ozone_platform_x11) {
      sources += [
        "XcbSurfaceKHR.cpp",
        "XcbSurfaceKHR.hpp",
        "libXCB.cpp",
        "libXCB.hpp",
      ]
    }

    if (ozone_platform_wayland) {
      sources += [
        "WaylandSurfaceKHR.cpp",
        "WaylandSurfaceKHR.hpp",
        "libWaylandClient.cpp",
        "libWaylandClient.hpp",
      ]
    }
  }

  if (is_win) {
    sources += [
      "Win32SurfaceKHR.cpp",
      "Win32SurfaceKHR.hpp",
    ]
  }

  if (is_mac) {
    sources += [
      "MetalSurface.hpp",
      "MetalSurface.mm",
    ]
    frameworks = [
      "Cocoa.framework",
      "QuartzCore.framework",
    ]
    public_configs = [ ":WSI_metal_weak_framework" ]
  }

  include_dirs = [
    "..",
    "../../include",
    "../../third_party/SPIRV-Headers/include",
  ]

  deps = [
    "../../third_party/SPIRV-Tools:spvtools_headers",
    "../../third_party/marl:Marl_headers",
    "../System",
    "../Vulkan:swiftshader_libvulkan_headers",
  ]

  # Do not try to depend on Wayland if the |wayland_gn_dir| is not set.
  if (is_linux && ozone_platform_wayland && wayland_gn_dir != "") {
    # Use third-party targets
    deps += [ "$wayland_gn_dir:wayland_client" ]
  }

  configs = [ "../Vulkan:swiftshader_libvulkan_private_config" ]
}
