# 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
    ]

    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 = [
    "../../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) {
    sources += [ "TypeInfo.cpp" ]
    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",
    "../..",
    "..",
  ]
}
