# 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("//build/config/ui.gni")
import("//third_party/protobuf/proto_library.gni")

source_set("service") {
  sources = [
    "async_pixel_transfer_delegate.cc",
    "async_pixel_transfer_delegate.h",
    "async_pixel_transfer_manager.cc",
    "async_pixel_transfer_manager.h",
    "async_pixel_transfer_manager_android.cc",
    "async_pixel_transfer_manager_idle.cc",
    "async_pixel_transfer_manager_idle.h",
    "async_pixel_transfer_manager_linux.cc",
    "async_pixel_transfer_manager_mac.cc",
    "async_pixel_transfer_manager_share_group.cc",
    "async_pixel_transfer_manager_share_group.h",
    "async_pixel_transfer_manager_stub.cc",
    "async_pixel_transfer_manager_stub.h",
    "async_pixel_transfer_manager_sync.cc",
    "async_pixel_transfer_manager_sync.h",
    "async_pixel_transfer_manager_win.cc",
    "buffer_manager.cc",
    "buffer_manager.h",
    "cmd_buffer_engine.h",
    "cmd_parser.cc",
    "cmd_parser.h",
    "command_buffer_service.cc",
    "command_buffer_service.h",
    "common_decoder.cc",
    "common_decoder.h",
    "context_group.cc",
    "context_group.h",
    "context_state.cc",
    "context_state.h",
    "context_state_autogen.h",
    "context_state_impl_autogen.h",
    "error_state.cc",
    "error_state.h",
    "feature_info.cc",
    "feature_info.h",
    "framebuffer_manager.cc",
    "framebuffer_manager.h",
    "gl_context_virtual.cc",
    "gl_context_virtual.h",
    "gl_state_restorer_impl.cc",
    "gl_state_restorer_impl.h",
    "gl_utils.h",
    "gles2_cmd_clear_framebuffer.cc",
    "gles2_cmd_clear_framebuffer.h",
    "gles2_cmd_copy_texture_chromium.cc",
    "gles2_cmd_copy_texture_chromium.h",
    "gles2_cmd_decoder.cc",
    "gles2_cmd_decoder.h",
    "gles2_cmd_decoder_autogen.h",
    "gles2_cmd_validation.cc",
    "gles2_cmd_validation.h",
    "gles2_cmd_validation_autogen.h",
    "gles2_cmd_validation_implementation_autogen.h",
    "gpu_scheduler.cc",
    "gpu_scheduler.h",
    "gpu_scheduler_mock.h",
    "gpu_state_tracer.cc",
    "gpu_state_tracer.h",
    "gpu_switches.cc",
    "gpu_switches.h",
    "gpu_tracer.cc",
    "gpu_tracer.h",
    "id_manager.cc",
    "id_manager.h",
    "image_factory.cc",
    "image_factory.h",
    "image_manager.cc",
    "image_manager.h",
    "in_process_command_buffer.cc",
    "in_process_command_buffer.h",
    "logger.cc",
    "logger.h",
    "mailbox_manager.h",
    "mailbox_manager_impl.cc",
    "mailbox_manager_impl.h",
    "mailbox_manager_sync.cc",
    "mailbox_manager_sync.h",
    "memory_program_cache.cc",
    "memory_program_cache.h",
    "mocks.h",
    "program_cache.cc",
    "program_cache.h",
    "program_manager.cc",
    "program_manager.h",
    "query_manager.cc",
    "query_manager.h",
    "renderbuffer_manager.cc",
    "renderbuffer_manager.h",
    "shader_manager.cc",
    "shader_manager.h",
    "shader_translator.cc",
    "shader_translator.h",
    "shader_translator_cache.cc",
    "shader_translator_cache.h",
    "stream_texture_manager_in_process_android.cc",
    "stream_texture_manager_in_process_android.h",
    "sync_point_manager.cc",
    "sync_point_manager.h",
    "texture_definition.cc",
    "texture_definition.h",
    "texture_manager.cc",
    "texture_manager.h",
    "transfer_buffer_manager.cc",
    "transfer_buffer_manager.h",
    "valuebuffer_manager.cc",
    "valuebuffer_manager.h",
    "vertex_array_manager.cc",
    "vertex_array_manager.h",
    "vertex_attrib_manager.cc",
    "vertex_attrib_manager.h",
  ]

  defines = [ "GPU_IMPLEMENTATION" ]

  configs += [ "//third_party/khronos:khronos_headers" ]

  # Prefer mesa GL headers to system headers, which cause problems on Win.
  include_dirs = [ "//third_party/mesa/src/include" ]

  public_deps = [
    "//gpu/command_buffer/common",
  ]
  deps = [
    ":disk_cache_proto",
    "//base",
    "//base/third_party/dynamic_annotations",
    "//crypto",
    "//third_party/angle:translator",
    "//third_party/protobuf:protobuf_lite",
    "//third_party/re2",
    "//third_party/smhasher:cityhash",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
  ]

  if (ui_compositor_image_transport) {
    include_dirs += [ "//third_party/khronos" ]
  }

  if (is_win || is_android || (is_linux && use_x11)) {
    sources += [
      "async_pixel_transfer_manager_egl.cc",
      "async_pixel_transfer_manager_egl.h",
    ]
  }

  if (is_android && !is_debug) {
    # On Android optimize more since this component can be a bottleneck.
    configs -= [ "//build/config/compiler:optimize" ]
    configs += [ "//build/config/compiler:optimize_max" ]
  }
}

proto_library("disk_cache_proto") {
  sources = [
    "disk_cache_proto.proto",
  ]
}
