# Copyright 2016 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("src/Reactor/reactor.gni")

config("swiftshader_config") {
  cflags = []
  defines = []
  asmflags = []

  if (!is_debug) {
    defines += [ "ANGLE_DISABLE_TRACE" ]
  }

  if (!is_win || is_clang) {
    defines +=
        [ "NO_SANITIZE_FUNCTION=__attribute__((no_sanitize(\"function\")))" ]
  } else {
    defines += [ "NO_SANITIZE_FUNCTION=" ]
  }

  if (is_win) {
    # Disable MSVC warnings about std::aligned_storage being broken before
    # VS 2017 15.8
    defines += [ "_ENABLE_EXTENDED_ALIGNED_STORAGE" ]

    # Diable some MSVC warnings.
    if (!is_clang) {
      cflags += [
        "/wd4065",  # switch statement contains 'default' but no 'case' labels
        "/wd4309",  # Truncation of constant value. See PixelRoutine.cpp casts
                    # of signed shorts.
      ]
    }

    cflags_cc = [ "/std:c++17" ]
  } else {
    cflags_cc = [ "-std=c++17" ]

    if (!is_debug) {
      cflags += [ "-Os" ]
    }
  }

  if (build_with_chromium) {
    if (is_clang) {
      if (current_cpu == "arm64") {
        import("//build/config/arm.gni")

        if (arm_control_flow_integrity == "standard") {
          cflags += [ "-mbranch-protection=standard" ]
          asmflags += [ "-mbranch-protection=standard" ]
        } else {
          assert(arm_control_flow_integrity == "none",
                 "Invalid branch protection option!")
        }
      }
    }
  }
}

source_set("vertex_routine_fuzzer") {
  sources = [ "tests/fuzzers/VertexRoutineFuzzer.cpp" ]
  if (is_win) {
    cflags = [
      "/wd4201",  # nameless struct/union
      "/wd4065",  # switch statement contains 'default' but no 'case' labels
      "/wd5030",  # attribute is not recognized
    ]
  }
  include_dirs = [ "src/" ]
  deps = [ "src/OpenGL/libGLESv2:swiftshader_libGLESv2_static" ]
}

group("swiftshader") {
  data_deps = [
    "src/OpenGL/libEGL:swiftshader_libEGL",
    "src/OpenGL/libGLESv2:swiftshader_libGLESv2",
  ]
}

if (build_with_chromium) {
  group("swiftshader_tests") {
    testonly = true

    data_deps = [
      "tests/GLESUnitTests:swiftshader_unittests",
      "tests/SystemUnitTests:swiftshader_system_unittests",
    ]

    if (supports_llvm) {
      data_deps +=
          [ "tests/ReactorUnitTests:swiftshader_reactor_llvm_unittests" ]
    }

    if (supports_subzero) {
      data_deps +=
          [ "tests/ReactorUnitTests:swiftshader_reactor_subzero_unittests" ]
    }
  }
}
