# 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("//build/config/c++/c++.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/mips.gni")
import("//build/config/sysroot.gni")
import("src/Reactor/reactor.gni")

config("swiftshader_config") {
  defines = []

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

  if (is_win) {
    defines += [
      "_WINDLL",
      "NO_SANITIZE_FUNCTION=",

      # Disable MSVC warnings about std::aligned_storage being broken before
      # VS 2017 15.8
      "_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 = [ "-fno-operator-names" ]
    cflags_cc = [ "-std=c++17" ]

    defines +=
        [ "NO_SANITIZE_FUNCTION=__attribute__((no_sanitize(\"function\")))" ]

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

    if (current_cpu == "x64") {  # 64 bit version
      cflags += [
        "-m64",
        "-fPIC",
        "-march=x86-64",
        "-mtune=generic",
      ]
    } else if (current_cpu == "x86") {  # 32 bit version
      cflags += [
        "-m32",
        "-mfpmath=sse",
        "-march=pentium4",
        "-mtune=generic",
      ]
    }

    if (is_linux || is_chromeos) {
      # A bug in the gold linker prevents using ICF on 32-bit (crbug.com/729532)
      if (use_gold && (current_cpu == "x86" || current_cpu == "mipsel")) {
        ldflags += [ "-Wl,--icf=none" ]
      }
    }
  }
}

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" ]
    }
  }
}
