# 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/toolchain/toolchain.gni")

# Need a separate config to ensure the warnings are added to the end.
config("swiftshader_libGLESv2_private_config") {
  defines = [
    "GL_API=",
    "GL_GLEXT_PROTOTYPES",
  ]

  if (is_win) {
    cflags = [
      "/wd4201",  # nameless struct/union
      "/wd4324",  # structure was padded due to alignment specifier
      "/wd5030",  # attribute is not recognized
    ]

    defines += [
      "GL_APICALL=",
      "LIBGLESV2_EXPORTS",
    ]

    if (is_clang) {
      defines += [
        "__STDC_CONSTANT_MACROS",
        "__STDC_LIMIT_MACROS",
      ]
    }
  } else {
    cflags = [ "-Wno-sign-compare" ]
    if (!is_clang) {
      cflags += [ "-Wno-unused-but-set-variable" ]
    }

    defines += [
      "LOG_TAG=\"swiftshader_libGLESv2\"",
      "__STDC_CONSTANT_MACROS",
      "__STDC_LIMIT_MACROS",
    ]

    if (is_linux) {
      defines += [ "GL_APICALL=__attribute__((visibility(\"protected\")))" ]
    } else {
      defines += [ "GL_APICALL=__attribute__((visibility(\"default\")))" ]
    }
  }
}

shared_library("swiftshader_libGLESv2") {
  if (!is_mac) {
    output_name = "libGLESv2"
    output_dir = "$root_out_dir/swiftshader"
  }

  deps = [
    "//build/config:exe_and_shlib_deps",
    "../../OpenGL/compiler:swiftshader_opengl_compiler",
    "../../Reactor:swiftshader_reactor",
    "../../Renderer:swiftshader_renderer",
  ]

  sources = [
    "Buffer.cpp",
    "Context.cpp",
    "Device.cpp",
    "Fence.cpp",
    "Framebuffer.cpp",
    "IndexDataManager.cpp",
    "Program.cpp",
    "Query.cpp",
    "Renderbuffer.cpp",
    "ResourceManager.cpp",
    "Shader.cpp",
    "Texture.cpp",
    "TransformFeedback.cpp",
    "VertexArray.cpp",
    "VertexDataManager.cpp",
    "libGLESv2.cpp",
    "libGLESv2.def",
    "libGLESv2.rc",
    "libGLESv3.cpp",
    "main.cpp",
    "resource.h",
    "utilities.cpp",
  ]

  if (is_win) {
    configs -= [ "//build/config/win:unicode" ]
    ldflags = [ "/DEF:" + rebase_path("libGLESv2.def", root_build_dir) ]
  } else if (is_linux) {
    ldflags =
        [ "-Wl,--version-script=" + rebase_path("exports.map", root_build_dir) ]
  }

  if (use_thin_lto) {
    # https://crbug.com/686980
    # This target relies on the linker to be smart and garbage collect unused symbols.
    # It is not the case for LLD + ThinLTO, so we have to use this ugly workaround.
    cflags = [
      "-Xclang",
      "-fno-lto-unit",
      "-fno-whole-program-vtables",
      "-fno-sanitize=cfi",
    ]
  }

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/swiftshader:swiftshader_config",
    ":swiftshader_libGLESv2_private_config",
  ]

  include_dirs = [
    "../../../include",
    "../..",
    "..",
  ]
}
