# Copyright 2014 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.

import("../../mojo_sdk.gni")
import("../../mojo_application.gni")

mojo_sdk_source_set("system") {
  sources = [
    "system_thunks.c",
    "system_thunks.h",
  ]
  mojo_sdk_deps = [ "mojo/public/c/system" ]

  # The GYP target analogous to this one builds this code into a
  # static library.  When building for Android, both the GYP and GN
  # builds add --exclude-libs=ALL globally, which means that all
  # symbols in static libraries are excluded from export.  That's a
  # problem, as code outside this target needs to be able to call
  # MojoSetSystemThunks(). Therefore, the GYP target needs to specifiy
  # that all dependent targets remove that link flag. Since GN uses a
  # source_set here, this flag change is not needed.
}

# For internal use only.
mojo_sdk_source_set("system_impl_private") {
  sources = [
    "system_impl_private_thunks.c",
    "system_impl_private_thunks.h",
  ]
  deps = [
    ":system_impl_private_api",
  ]
  mojo_sdk_deps = [ "mojo/public/c/system" ]
}

# For internal use only.
mojo_sdk_source_set("system_impl_private_api") {
  sources = [
    "system_impl_private.h",
  ]
  mojo_sdk_deps = [ "mojo/public/c/system" ]
}

mojo_sdk_source_set("system_impl_private_tests") {
  testonly = true

  sources = [
    "system_impl_private_unittest.cc",
  ]

  deps = [
    ":system_impl_private_api",
    "//testing/gtest",
  ]

  mojo_sdk_deps = [ "mojo/public/c/system" ]
}

mojo_sdk_source_set("gles2") {
  sources = [
    "gles2_impl_chromium_bind_uniform_location_thunks.c",
    "gles2_impl_chromium_bind_uniform_location_thunks.h",
    "gles2_impl_chromium_map_sub_thunks.c",
    "gles2_impl_chromium_map_sub_thunks.h",
    "gles2_impl_chromium_miscellaneous_thunks.c",
    "gles2_impl_chromium_miscellaneous_thunks.h",
    "gles2_impl_chromium_resize_thunks.c",
    "gles2_impl_chromium_resize_thunks.h",
    "gles2_impl_chromium_sync_point_thunks.c",
    "gles2_impl_chromium_sync_point_thunks.h",
    "gles2_impl_chromium_texture_mailbox_thunks.c",
    "gles2_impl_chromium_texture_mailbox_thunks.h",
    "gles2_impl_ext_debug_marker_thunks.c",
    "gles2_impl_ext_debug_marker_thunks.h",
    "gles2_impl_ext_discard_framebuffer_thunks.c",
    "gles2_impl_ext_discard_framebuffer_thunks.h",
    "gles2_impl_ext_multisampled_render_to_texture_thunks.c",
    "gles2_impl_ext_multisampled_render_to_texture_thunks.h",
    "gles2_impl_ext_occlusion_query_thunks.c",
    "gles2_impl_ext_occlusion_query_thunks.h",
    "gles2_impl_ext_texture_storage_thunks.c",
    "gles2_impl_ext_texture_storage_thunks.h",
    "gles2_impl_khr_blend_equation_advanced_thunks.c",
    "gles2_impl_khr_blend_equation_advanced_thunks.h",
    "gles2_impl_oes_vertex_array_object_thunks.c",
    "gles2_impl_oes_vertex_array_object_thunks.h",
    "gles2_impl_thunks.c",
    "gles2_impl_thunks.h",
  ]

  defines = [ "MOJO_GLES2_IMPLEMENTATION" ]

  configs = [ "../../c/gpu:gpu_configs" ]

  mojo_sdk_deps = [
    "mojo/public/c/gpu:GLES2",
    "mojo/public/c/environment",
    "mojo/public/c/system",
  ]
}

mojo_sdk_source_set("gpu_thunks") {
  sources = []
}

mojo_sdk_source_set("mgl_thunks") {
  sources = [
    "mgl_echo_thunks.c",
    "mgl_echo_thunks.h",
    "mgl_signal_sync_point_thunks.c",
    "mgl_signal_sync_point_thunks.h",
    "mgl_thunks.c",
    "mgl_thunks.h",
  ]

  mojo_sdk_deps = [
    "mojo/public/c/gpu:MGL",
    "mojo/public/c/gpu:MGL_signal_sync_point",
    "mojo/public/c/gpu:MGL_echo",
  ]
}

mojo_sdk_source_set("mgl_onscreen_thunks") {
  sources = [
    "mgl_onscreen_thunks.c",
    "mgl_onscreen_thunks.h",
  ]

  mojo_sdk_deps = [ "mojo/public/c/gpu:MGL_onscreen" ]
}

mojo_sdk_source_set("platform_handle") {
  sources = [
    "platform_handle_private_thunks.c",
    "platform_handle_private_thunks.h",
  ]

  mojo_sdk_deps = [
    "mojo/public/platform/native:platform_handle_api",
    "mojo/public/c/system",
  ]
}

# Only targets that are calling the thunks should depend upon this.
mojo_sdk_source_set("platform_handle_api") {
  sources = [
    "platform_handle_private.h",
  ]
  mojo_sdk_deps = [ "mojo/public/c/system:system" ]
}

mojo_native_application("platform_handle_private_apptest") {
  output_name = "platform_handle_private_apptests"

  testonly = true

  sources = [
    "platform_handle_private_apptest.cc",
  ]

  deps = [
    ":platform_handle",
    ":platform_handle_api",
    "../../cpp/application:standalone",
    "../../cpp/application:test_support_standalone",
    "../../cpp/environment",
    "../../cpp/system",
  ]
}

group("tests") {
  testonly = true

  deps = [
    ":platform_handle_private_apptest",
    ":system_impl_private_tests",
  ]
}
