# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

declare_args() {
  # Set to true to compile with the OpenGL ES 2.0 conformance tests.
  internal_gles2_conform_tests = false
}

config("gles2_conform_test_warnings") {
  if (is_clang) {
    cflags = [
      "-Wno-array-bounds",
      "-Wno-implicit-function-declaration",
      "-Wno-logical-op-parentheses",

      # Many struct initializers in the GTF_ES code are missing braces.
      "-Wno-missing-braces",
      "-Wno-parentheses-equality",
      "-Wno-pointer-sign",
      "-Wno-return-type",
      "-Wno-sign-compare",
      "-Wno-sizeof-pointer-memaccess",

      # A few variables are unitialized if GLVersion != 2.0.
      "-Wno-sometimes-uninitialized",
      "-Wno-tautological-compare",

      # GTFVecBase.h contains static no-inline functions in a header :-/
      "-Wno-unused-function",
      "-Wno-unused-variable",

      # There are some implicit conversions from "int" to "char" in
      # GTFExtensionTestSurfacelessContext.c.
      "-Wno-constant-conversion",
    ]
  }
}

import("//testing/test.gni")

# GYP version: gpu/gles2_conform_support/gles2_conform_support.gyp:gles2_conform_support
executable("gles2_conform_support") {
  sources = [
    "gles2_conform_support.c",
    "native/egl_native.cc",
    "native/egl_native_win.cc",
    "native/main.cc",
  ]
  defines = [
    "GLES2_CONFORM_SUPPORT_ONLY",
    "GTF_GLES20",
    "EGLAPI=",
    "EGLAPIENTRY=",
  ]
  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//build/config/sanitizers:deps",
    "//build/win:default_exe_manifest",
    "//gpu/command_buffer/client:gles2_c_lib_nocheck",
    "//gpu/gles2_conform_support/egl",
    "//ui/gl",
  ]
  if (is_linux) {
    sources += [
      "native/egl_native_aura.cc",
      "native/egl_native_x11.cc",
    ]
  }
}

if (internal_gles2_conform_tests) {
  action("generate_gles2_conform_embedded_data") {
    script = "generate_gles2_embedded_data.py"
    outputs = [
      "$target_gen_dir/gles2_conform_test_embedded_data/FilesDATA.c",
      "$target_gen_dir/gles2_conform_test_embedded_data/FilesDATA.h",
      "$target_gen_dir/gles2_conform_test_embedded_data/FilesTOC.c",
    ]
    args = [
      rebase_path("//third_party/gles2_conform/GTF_ES/glsl/GTF"),
      rebase_path("$target_gen_dir/gles2_conform_test_embedded_data"),
    ]
  }
  action("generate_gles2_conform_tests") {
    script = "generate_gles2_conform_tests.py"
    outputs = [
      "$target_gen_dir/gles2_conform_test_autogen.cc",
    ]
    args = [ rebase_path("$target_gen_dir") ]
  }
  gles2_conform_gypi =
      exec_script("//build/gypi_to_gn.py",
                  [
                    rebase_path("gles2_conform.gypi"),
                    "--replace=<(DEPTH)=../..",
                    "--replace=<(SHARED_INTERMEDIATE_DIR)=$target_gen_dir",
                  ],
                  "scope",
                  [ "gles2_conform.gypi" ])
  executable("gles2_conform_test_windowless") {
    testonly = true

    # Include a dummy c++ file to force linking of libstdc++.
    sources = [
      "dummy.cc",
    ]
    sources += gles2_conform_gypi.gtf_es_sources
    sources += gles2_conform_gypi.gl2_extension_test_sources
    sources += gles2_conform_gypi.gl2_fixed_test_sources
    sources += gles2_conform_gypi.gl2_test_sources
    defines = [
      "GTF_API=GTF_GLES20",
      "HKEMBEDDEDFILESYSTEM",
    ]
    include_dirs = [
      rebase_path("$target_gen_dir/gles2_conform_test_embedded_data"),
      "//third_party/gles2_conform/GTF_ES/glsl/GTF/Source",
    ]
    deps = [
      ":generate_gles2_conform_embedded_data",
      "//build/config/sanitizers:deps",
      "//gpu/command_buffer/client:gles2_c_lib_nocheck",
      "//gpu/gles2_conform_support/egl",
      "//gpu/gles2_conform_support/native:windowless",
      "//third_party/expat:expat",
    ]
    configs += [
      "//build/config/compiler:no_incompatible_pointer_warnings",

      # Must be done this way for warning flags to be ordered correctly.
      ":gles2_conform_test_warnings",
    ]
    if (is_linux) {
      if (!is_chromeos) {
        deps += [ "//build/config/linux/gtk2" ]
      }
    }
    if (is_win) {
      deps += [
        "//third_party/angle:libEGL",
        "//third_party/angle:libGLESv2",
      ]
      defines = [
        "EGLAPI=",
        "EGLAPIENTRY=",
      ]
      defines -= [ "NOMINMAX" ]
      cflags = [
        "/wd4018",  # signed/unsigned mismatch
        "/wd4101",  # unreferenced local variable
        "/wd4715",  # not all control paths return a value
        "/wd4267",  # size_t/unsigned int conversion
      ]
    }
    if (is_mac) {
      defines = [
        "_STDINT",
        "_STDINT_H",
      ]
    }

    #'run_as': {
    #     'conditions': [
    #       ['OS=="win"', {
    #         'action': [
    #           '$(TargetPath)',
    #           '-noimagefileio',
    #           '-run=<(DEPTH)/third_party/gles2_conform/GTF_ES/glsl/GTF/mustpass.run',
    #         ],
    #       }],
    #     ],
    #    },
  }
}

test("gles2_conform_test") {
  sources = [
    "gles2_conform_test.cc",
  ]
  deps = [
    "//base",
    "//base/test:test_support",
    "//gpu/config",
    "//testing/gtest",
  ]

  data = [
    "gles2_conform_test_expectations.txt",
  ]

  if (internal_gles2_conform_tests) {
    data_deps = [
      ":gles2_conform_test_windowless",
    ]
    deps += [ ":generate_gles2_conform_tests" ]
    sources += [ "$target_gen_dir/gles2_conform_test_autogen.cc" ]
    data += [ "//third_party/gles2_conform/GTF_ES/" ]

    # TODO: Make these tests pull in the correct data dependencies once they
    # are exported in GN. Maybe from  //third_party/gles2_conform/GTF_ES/
  }
}
