# 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_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",
    "async_pixel_transfer_manager.cc",
    "async_pixel_transfer_manager.h",
    "buffer_manager.h",
    "buffer_manager.cc",
    "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.h",
    "context_group.cc",
    "context_state.h",
    "context_state_autogen.h",
    "context_state_impl_autogen.h",
    "context_state.cc",
    "error_state.cc",
    "error_state.h",
    "feature_info.h",
    "feature_info.cc",
    "framebuffer_manager.h",
    "framebuffer_manager.cc",
    "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.h",
    "gles2_cmd_decoder_autogen.h",
    "gles2_cmd_decoder.cc",
    "gles2_cmd_validation.h",
    "gles2_cmd_validation.cc",
    "gles2_cmd_validation_autogen.h",
    "gles2_cmd_validation_implementation_autogen.h",
    "gl_context_virtual.cc",
    "gl_context_virtual.h",
    "gl_state_restorer_impl.cc",
    "gl_state_restorer_impl.h",
    "gl_utils.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.h",
    "id_manager.cc",
    "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.h",
    "memory_program_cache.cc",
    "mocks.h",
    "program_manager.h",
    "program_manager.cc",
    "query_manager.h",
    "query_manager.cc",
    "renderbuffer_manager.h",
    "renderbuffer_manager.cc",
    "program_cache.h",
    "program_cache.cc",
    "shader_manager.h",
    "shader_manager.cc",
    "shader_translator.h",
    "shader_translator.cc",
    "shader_translator_cache.h",
    "shader_translator_cache.cc",
    "stream_texture_manager_in_process_android.h",
    "stream_texture_manager_in_process_android.cc",
    "sync_point_manager.h",
    "sync_point_manager.cc",
    "texture_definition.h",
    "texture_definition.cc",
    "texture_manager.h",
    "texture_manager.cc",
    "transfer_buffer_manager.cc",
    "transfer_buffer_manager.h",
    "valuebuffer_manager.h",
    "valuebuffer_manager.cc",
    "vertex_array_manager.h",
    "vertex_array_manager.cc",
    "vertex_attrib_manager.h",
    "vertex_attrib_manager.cc",
  ]

  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",
  ]
}
