# 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/buildflag_header.gni") import("//build/config/chrome_build.gni") import("//build/config/chromecast_build.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/linux/pkg_config.gni") import("//build/config/ozone.gni") import("//build/config/ui.gni") import("//gpu/vulkan/features.gni") import("//testing/test.gni") import("//third_party/angle/gni/angle.gni") import("//third_party/dawn/scripts/dawn_features.gni") import("//ui/gl/features.gni") declare_args() { # Whether service side logging (actual calls into the GL driver) is enabled # or not. enable_gpu_service_logging = false } use_glx = ozone_platform_x11 if (is_android) { import("//build/config/android/config.gni") import("//build/config/android/rules.gni") } buildflag_header("buildflags") { header = "buildflags.h" flags = [ "DAWN_ENABLE_BACKEND_OPENGLES=$dawn_enable_opengles", "ENABLE_SWIFTSHADER=$enable_swiftshader", "USE_DAWN=$use_dawn", "USE_STATIC_ANGLE=$use_static_angle", "USE_OPENGL_APITRACE=$enable_opengl_apitrace", ] } config("gl_config") { defines = [] if (use_glx) { defines += [ "GL_GLEXT_PROTOTYPES", "USE_GLX", ] } if (use_egl) { defines += [ "USE_EGL" ] } } component("gl") { output_name = "gl_wrapper" # Avoid colliding with OS X"s libGL.dylib. sources = [ "buffer_format_utils.cc", "buffer_format_utils.h", "ca_renderer_layer_params.cc", "ca_renderer_layer_params.h", "dc_renderer_layer_params.cc", "dc_renderer_layer_params.h", "dual_gpu_state.cc", "dual_gpu_state.h", "egl_timestamps.h", "gl_bindings.cc", "gl_bindings.h", "gl_bindings_autogen_gl.cc", "gl_bindings_autogen_gl.h", "gl_context.cc", "gl_context.h", "gl_context_stub.cc", "gl_context_stub.h", "gl_display.cc", "gl_display.h", "gl_display_manager.cc", "gl_display_manager.h", "gl_enums.cc", "gl_enums.h", "gl_enums_implementation_autogen.h", "gl_export.h", "gl_features.cc", "gl_features.h", "gl_fence.cc", "gl_fence.h", "gl_fence_arb.cc", "gl_fence_arb.h", "gl_fence_nv.cc", "gl_fence_nv.h", "gl_gl_api_implementation.cc", "gl_gl_api_implementation.h", "gl_helper.cc", "gl_helper.h", "gl_image.cc", "gl_image.h", "gl_image_memory.cc", "gl_image_memory.h", "gl_image_ref_counted_memory.cc", "gl_image_ref_counted_memory.h", "gl_image_shared_memory.cc", "gl_image_shared_memory.h", "gl_image_stub.cc", "gl_image_stub.h", "gl_implementation.cc", "gl_implementation.h", "gl_implementation_wrapper.h", "gl_share_group.cc", "gl_share_group.h", "gl_state_restorer.cc", "gl_state_restorer.h", "gl_stub_api.cc", "gl_stub_api.h", "gl_stub_api_base.h", "gl_stub_autogen_gl.cc", "gl_stub_autogen_gl.h", "gl_surface.cc", "gl_surface.h", "gl_surface_format.cc", "gl_surface_format.h", "gl_surface_overlay.cc", "gl_surface_overlay.h", "gl_surface_presentation_helper.cc", "gl_surface_presentation_helper.h", "gl_surface_stub.cc", "gl_surface_stub.h", "gl_switches.cc", "gl_switches.h", "gl_utils.cc", "gl_utils.h", "gl_version_info.cc", "gl_version_info.h", "gl_workarounds.h", "gpu_switching_manager.cc", "gpu_switching_manager.h", "gpu_timing.cc", "gpu_timing.h", "progress_reporter.h", "scoped_binders.cc", "scoped_binders.h", "scoped_make_current.cc", "scoped_make_current.h", "shader_tracking.cc", "shader_tracking.h", "sync_control_vsync_provider.cc", "sync_control_vsync_provider.h", "trace_util.cc", "trace_util.h", ] if (is_android) { sources += [ "android/scoped_java_surface.cc", "android/scoped_java_surface.h", "android/surface_texture.cc", "android/surface_texture.h", "android/surface_texture_listener.cc", "android/surface_texture_listener.h", ] } configs += [ "//build/config:precompiled_headers" ] defines = [ "GL_IMPLEMENTATION" ] if (enable_gpu_service_logging) { defines += [ "GPU_ENABLE_SERVICE_LOGGING" ] } include_dirs = [ "//third_party/mesa_headers" ] all_dependent_configs = [ ":gl_config" ] public_configs = [ "//third_party/khronos:khronos_headers" ] deps = [ ":buildflags", "//base/third_party/dynamic_annotations", "//build:chromeos_buildflags", "//mojo/public/cpp/bindings", # ANGLE includes are used cross-platform. "//third_party/angle:includes", "//ui/gfx/mojom", ] public_deps = [ "//base", "//third_party/mesa_headers", "//ui/events/platform", "//ui/gfx", "//ui/gfx/geometry", ] data_deps = [] if (enable_swiftshader) { data_deps += [ "//third_party/swiftshader/src/Vulkan:icd_file", "//third_party/swiftshader/src/Vulkan:swiftshader_libvulkan", ] } if (use_egl) { sources += [ "angle_platform_impl.cc", "angle_platform_impl.h", "egl_util.cc", "egl_util.h", "gl_bindings_autogen_egl.cc", "gl_bindings_autogen_egl.h", "gl_context_egl.cc", "gl_context_egl.h", "gl_display_egl_util.cc", "gl_display_egl_util.h", "gl_egl_api_implementation.cc", "gl_egl_api_implementation.h", "gl_fence_egl.cc", "gl_fence_egl.h", "gl_image_egl.cc", "gl_image_egl.h", "gl_surface_egl.cc", "gl_surface_egl.h", "shared_gl_fence_egl.cc", "shared_gl_fence_egl.h", ] if (enable_vulkan) { sources += [ "gl_angle_util_vulkan.cc", "gl_angle_util_vulkan.h", "gl_image_egl_angle_vulkan.cc", "gl_image_egl_angle_vulkan.h", ] } if (is_linux || is_chromeos || use_ozone) { sources += [ "gl_image_native_pixmap.cc", "gl_image_native_pixmap.h", ] } if (is_android) { sources += [ "gl_image_ahardwarebuffer.cc", "gl_image_ahardwarebuffer.h", "gl_surface_egl_surface_control.cc", "gl_surface_egl_surface_control.h", ] } if (is_posix && !is_fuchsia && !is_mac) { # Windows has USE_EGL but doesn't support base::FileDescriptor. # libsync isn't supported or needed on MacOSX. # Fuchsia is excluded due to a libsync dependency and because it's # unknown if the required EGL_ANDROID_native_fence_sync extension works # there. If it does and there's a use case, this could be revisited. sources += [ "gl_fence_android_native_fence_sync.cc", "gl_fence_android_native_fence_sync.h", ] deps += [ "//third_party/libsync" ] } } if (is_mac || use_egl) { sources += [ "yuv_to_rgb_converter.cc", "yuv_to_rgb_converter.h", ] } if (use_ozone) { deps += [ "//ui/ozone:buildflags" ] if (use_egl && !is_fuchsia) { data_deps += [ "//third_party/angle:libEGL", "//third_party/angle:libGLESv2", ] if (angle_shared_libvulkan && !is_chromeos) { data_deps += [ "//third_party/vulkan-deps/vulkan-loader/src:libvulkan" ] } } } if (ozone_platform_x11) { sources += [ "gl_image_egl_pixmap.cc", "gl_image_egl_pixmap.h", "gl_surface_egl_x11.cc", "gl_surface_egl_x11.h", "gl_surface_egl_x11_gles2.cc", "gl_surface_egl_x11_gles2.h", "gl_surface_glx_x11.cc", "gl_surface_glx_x11.h", ] deps += [ "//ui/base:features", "//ui/base/x", "//ui/events/platform/x11:x11", "//ui/gfx/linux:gpu_memory_buffer_support_x11", ] assert(use_egl) data_deps += [ "//third_party/angle:libEGL", "//third_party/angle:libGLESv2", ] if (angle_shared_libvulkan && !is_chromeos) { data_deps += [ "//third_party/vulkan-deps/vulkan-loader/src:libvulkan" ] } } if (use_glx) { sources += [ "gl_bindings_autogen_glx.cc", "gl_bindings_autogen_glx.h", "gl_context_glx.cc", "gl_context_glx.h", "gl_glx_api_implementation.cc", "gl_glx_api_implementation.h", "gl_image_glx.cc", "gl_image_glx.h", "gl_image_glx_native_pixmap.cc", "gl_image_glx_native_pixmap.h", "gl_surface_glx.cc", "gl_surface_glx.h", "glx_util.cc", "glx_util.h", ] deps += [ "//ui/base/x", "//ui/gfx/x", ] } if (is_win) { sources += [ "child_window_win.cc", "child_window_win.h", "dc_layer_tree.cc", "dc_layer_tree.h", "dcomp_surface_registry.cc", "dcomp_surface_registry.h", "delegated_ink_point_renderer_gpu.h", "direct_composition_child_surface_win.cc", "direct_composition_child_surface_win.h", "direct_composition_support.cc", "direct_composition_support.h", "direct_composition_surface_win.cc", "direct_composition_surface_win.h", "gl_angle_util_win.cc", "gl_angle_util_win.h", "gl_fence_win.cc", "gl_fence_win.h", "gl_image_d3d.cc", "gl_image_d3d.h", "gl_image_dcomp_surface.cc", "gl_image_dcomp_surface.h", "gl_image_dxgi.cc", "gl_image_dxgi.h", "hdr_metadata_helper_win.cc", "hdr_metadata_helper_win.h", "swap_chain_presenter.cc", "swap_chain_presenter.h", "vsync_observer.h", "vsync_provider_win.cc", "vsync_provider_win.h", "vsync_thread_win.cc", "vsync_thread_win.h", ] libs = [ "dxgi.lib", "dwmapi.lib", ] ldflags = [ "/DELAYLOAD:dwmapi.dll", "/DELAYLOAD:dxgi.dll", ] deps += [ "//media/base/win:media_foundation_util", "//ui/gfx/mojom:dxgi_info", ] assert(use_egl) data_deps += [ "//third_party/angle:libEGL", "//third_party/angle:libGLESv2", "//third_party/swiftshader/src/Vulkan:icd_file", "//third_party/swiftshader/src/Vulkan:swiftshader_libvulkan", ] if (angle_shared_libvulkan && !is_chromeos) { data_deps += [ "//third_party/vulkan-deps/vulkan-loader/src:libvulkan" ] } } if (is_mac) { sources += [ "dual_gpu_state_mac.cc", "dual_gpu_state_mac.h", "gl_context_cgl.cc", "gl_context_cgl.h", "gl_fence_apple.cc", "gl_fence_apple.h", "gl_image_io_surface.h", "gl_image_io_surface.mm", "scoped_cgl.cc", "scoped_cgl.h", ] frameworks = [ "CoreFoundation.framework", "IOSurface.framework", "OpenGL.framework", "Quartz.framework", ] if (use_egl) { sources += [ "gl_image_io_surface_egl.h", "gl_image_io_surface_egl.mm", ] data_deps += [ "//third_party/angle:libEGL", "//third_party/angle:libGLESv2", "//third_party/mesa_headers", ] if (enable_swiftshader) { data_deps += [ "//third_party/swiftshader/src/Vulkan:icd_file", "//third_party/swiftshader/src/Vulkan:swiftshader_libvulkan", ] } } } if (is_android) { defines += [ "GL_GLEXT_PROTOTYPES", "EGL_EGLEXT_PROTOTYPES", ] libs = [ "android" ] deps += [ ":gl_jni_headers" ] } } if (is_mac && use_egl) { # We need to copy the ANGLE and SwiftShader libraries so that the # bundle_data dependencies have a "copy" target type. Otherwise for # "shared_library" target types it will try to link things into # Chromium Framework when we want to keep the ANGLE and SwiftShader # libraries separate instead. copy("angle_library_copy") { sources = [ "$root_out_dir/libEGL.dylib", "$root_out_dir/libGLESv2.dylib", ] outputs = [ "$root_out_dir/egl_intermediates/{{source_file_part}}" ] deps = [ "//third_party/angle:libEGL", "//third_party/angle:libGLESv2", ] } if (enable_swiftshader) { copy("swiftshader_vk_library_copy") { sources = [ "$root_out_dir/libvk_swiftshader.dylib", "$root_out_dir/vk_swiftshader_icd.json", ] outputs = [ "$root_out_dir/vk_intermediates/{{source_file_part}}" ] deps = [ "//third_party/swiftshader/src/Vulkan:icd_file", "//third_party/swiftshader/src/Vulkan:swiftshader_libvulkan", ] } } } static_library("gl_unittest_utils") { testonly = true sources = [ "egl_bindings_autogen_mock.cc", "egl_bindings_autogen_mock.h", "egl_mock.cc", "egl_mock.h", "gl_bindings_autogen_mock.cc", "gl_bindings_autogen_mock.h", "gl_mock.cc", "gl_mock.h", "gl_mock_autogen_egl.h", "gl_mock_autogen_gl.h", "gpu_timing_fake.cc", "gpu_timing_fake.h", ] configs += [ "//third_party/khronos:khronos_headers" ] deps = [ ":gl", "//testing/gmock", "//testing/gtest", ] } static_library("test_support") { testonly = true sources = [ "test/gl_image_bind_test_template.h", "test/gl_image_test_support.cc", "test/gl_image_test_support.h", "test/gl_image_test_template.cc", "test/gl_image_test_template.h", "test/gl_image_zero_initialize_test_template.h", "test/gl_surface_test_support.cc", "test/gl_surface_test_support.h", "test/gl_test_helper.cc", "test/gl_test_helper.h", ] configs += [ "//third_party/khronos:khronos_headers" ] public_deps = [ ":gl", "//ui/gl/init", ] deps = [ "//base/test:test_support", "//testing/gtest", "//ui/base", ] if (is_linux || is_chromeos) { deps += [ "//ui/platform_window/common" ] } if (use_ozone) { deps += [ "//ui/ozone" ] } # If the run-time search path isn't set properly when we use ANGLE with its # Vulkan backend, it may end up finding the system libvulkan.so rather than # the one built in the output directory if ((is_linux || is_chromeos) && !is_component_build) { all_dependent_configs = [ "//build/config/gcc:rpath_for_built_shared_libraries" ] } } source_set("run_all_unittests") { testonly = true sources = [ "test/run_all_unittests.cc" ] deps = [ "//base", "//ui/base:features", ] public_deps = [ "//base/test:test_support" ] if (use_ozone) { deps += [ "//mojo/core/embedder", "//services/service_manager/public/cpp/test:test_support", "//ui/ozone", ] } } test("gl_unittests") { use_xvfb = use_xvfb_in_this_config sources = [ "gl_api_unittest.cc", "gl_image_ref_counted_memory_unittest.cc", "gl_image_shared_memory_unittest.cc", "gl_surface_format_unittest.cc", "gl_version_info_unittest.cc", "gpu_timing_unittest.cc", ] if (use_egl && !use_ozone) { sources += [ "gl_surface_egl_unittest.cc" ] } if (use_egl) { sources += [ "egl_api_unittest.cc", "gl_display_manager_unittest.cc", "test/egl_initialization_displays_unittest.cc", ] } if (use_glx) { sources += [ "glx_api_unittest.cc" ] } if (is_mac) { sources += [ "gl_image_io_surface_unittest.cc" ] frameworks = [ "IOSurface.framework" ] } if (is_win) { sources += [ "delegated_ink_point_renderer_gpu_unittest.cc", "direct_composition_surface_win_unittest.cc", "gl_fence_win_unittest.cc", "gl_image_d3d_unittest.cc", "gl_image_dxgi_unittest.cc", "hdr_metadata_helper_win_unittest.cc", ] } if (is_android) { sources += [ "gl_image_ahardwarebuffer_unittest.cc" ] } if (is_linux || is_chromeos_lacros) { sources += [ "gl_image_native_pixmap_unittest.cc" ] } include_dirs = [ "//third_party/khronos" ] deps = [ ":gl", ":gl_unittest_utils", ":run_all_unittests", ":test_support", "//base", "//testing/gmock", "//testing/gtest", "//ui/base:base", "//ui/gfx", "//ui/gfx:test_support", "//ui/gfx/geometry", "//ui/gl/init", "//ui/platform_window", "//ui/platform_window:platform_impls", ] data_deps = [ "//testing/buildbot/filters:gl_unittests_filters", "//third_party/mesa_headers", ] # TODO(https://crbug.com/789065): this must be moved to Ozone. if (ozone_platform_x11) { sources += [ "gl_context_glx_unittest.cc" ] deps += [ "//ui/gfx/x" ] } if (is_win) { deps += [ "//media/base/win:test_support" ] libs = [ "dxguid.lib" ] } } # We can't run this test on real Chrome OS hardware for Ozone, so new target. group("gl_unittests_ozone") { testonly = true data_deps = [ ":gl_unittests" ] } if (is_android) { generate_jar_jni("surface_jni_headers") { classes = [ "android/view/Surface.class" ] always_mangle = true } generate_jni("gl_jni_headers") { sources = [ "../android/java/src/org/chromium/ui/gl/SurfaceTextureListener.java", "../android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java", ] public_deps = [ ":surface_jni_headers" ] } }