Edit

kc3-lang/angle/gni

Branch :

  • Show log

    Commit

  • Author : Roman Lavrov
    Date : 2025-04-01 11:27:02
    Hash : 23c1e11e
    Message : Disable platform trace events by default, except Chromium build Observed overhead in perf builds is too significant, some workloads generate thousands of events per second. There does not seem to be a simple way to get around the overhead - it could be somewhat reduced but the event rate is just too high. ANGLE_TRACE_EVENT*(...) etc become a no-op by default. Can be re-enabled with angle_enable_platform_trace_events=true gn arg Bug: angleproject:404542398 Change-Id: I8d7363ee28d22226f1860e24f2399bb4129cfb84 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6419308 Commit-Queue: Roman Lavrov <romanl@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Feels: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com>

  • angle.gni
  • # Copyright 2019 The ANGLE Project 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_overrides/angle.gni")
    
    declare_args() {
      # Extract native libs in ANGLE apk. Useful for flamegraph generation.
      angle_extract_native_libs = false
    
      # Display mode for ANGLE vulkan display, could be 'simple' or 'headless', default is 'simple'.
      angle_vulkan_display_mode = "simple"
    
      # Defaults to capture building to $root_out_dir/angle_libs/with_capture.
      # Switch on to build capture to $root_out_dir.
      angle_with_capture_by_default = false
    
      # Enables OpenCL support, off by default.
      angle_enable_cl = false
    
      angle_restricted_traces = []
    
      # Don't build dEQP by default.
      build_angle_deqp_tests = false
    
      build_angle_end2end_tests_aosp = false
    
      # List of traces for benchmark mode
      angle_standalone_benchmark_traces = []
    
      # Benchmark mode golden default directory
      angle_standalone_benchmark_goldens_dir = ""
    }
    
    declare_args() {
      # Enable angle standalone benchmark mode if list of traces is provided
      angle_standalone_benchmark =
          is_android && angle_standalone_benchmark_traces != []
    
      # Only bundle traces in the APK if we're building a subset or if standalone benchmark is selected
      restricted_traces_outside_of_apk =
          is_android && angle_restricted_traces == [] &&
          angle_standalone_benchmark_traces == []
    
      # Enables OpenCL testing support
      angle_enable_cl_testing = angle_enable_cl && (is_linux || is_android)
    }
    
    if (angle_has_build) {
      import("//build/config/dcheck_always_on.gni")
      import("//build/config/ozone.gni")  # import the ozone_platform_x11 variable
      import("//build/config/sanitizers/sanitizers.gni")
      import("//build_overrides/build.gni")
      import("//testing/test.gni")
      if (is_android) {
        import("//build/config/android/config.gni")
      }
    
      if (is_win) {
        import("//build/config/win/visual_studio_version.gni")
      }
    
      if (is_chromeos) {
        angle_vulkan_display_mode = "offscreen"
      } else if (is_castos || ozone_platform_headless) {
        angle_vulkan_display_mode = "headless"
      }
    
      declare_args() {
        angle_use_gbm = ozone_platform_gbm
        angle_use_x11 = ozone_platform_x11 && (is_linux || is_chromeos)
        angle_use_wayland = ozone_platform_wayland && is_linux && !is_castos
        angle_use_vulkan_display = is_linux || is_chromeos
      }
    } else {
      declare_args() {
        is_ubsan = false
        is_tsan = false
        is_asan = false
        is_lsan = false
        build_with_chromium = false
        dcheck_always_on = false
        angle_use_x11 = is_linux || is_chromeos
        angle_use_wayland = is_linux
        use_ozone = false
        ozone_platform_gbm = false
        ozone_platform_wayland = false
        ozone_platform_headless = false
        use_fuzzing_engine = false
        is_apple = is_mac || is_ios
        is_desktop_android = false
      }
    
      declare_args() {
        angle_use_vulkan_display = is_linux || is_chromeos
      }
    }
    
    if (!defined(checkout_angle_internal)) {
      checkout_angle_internal = false
    }
    
    if (!defined(checkout_angle_restricted_traces)) {
      checkout_angle_restricted_traces = false
    }
    
    # Subdirectory to place data files (e.g. layer JSON files).
    angle_data_dir = "angledata"
    
    declare_args() {
      angle_assert_always_on = dcheck_always_on
    
      if (current_cpu == "arm64" || current_cpu == "x64" ||
          current_cpu == "mips64el" || current_cpu == "s390x" ||
          current_cpu == "ppc64" || current_cpu == "loong64" ||
          current_cpu == "riscv64") {
        angle_64bit_current_cpu = true
      } else if (current_cpu == "arm" || current_cpu == "x86" ||
                 current_cpu == "mipsel" || current_cpu == "s390" ||
                 current_cpu == "ppc" || current_cpu == "loong32") {
        angle_64bit_current_cpu = false
      } else {
        assert(false, "Unknown current CPU: $current_cpu")
      }
    
      # Indicate if the rapidJSON library is available to build with in third_party/.
      angle_has_rapidjson = angle_has_build
    
      angle_is_winappsdk = false
    
      # Windows App SDK is a separate dependency from nuget.org that needs to
      # be pre-processed before being used.
      winappsdk_dir = ""
    }
    
    declare_args() {
      # By default we enable debug layers when asserts are turned on.
      angle_debug_layers_enabled = is_debug || angle_assert_always_on
    
      if (!is_android) {
        ndk_api_level_at_least_26 = false
      } else {
        ndk_api_level_at_least_26 =
            (!angle_64bit_current_cpu && android32_ndk_api_level >= 26) ||
            (angle_64bit_current_cpu && android64_ndk_api_level >= 26)
      }
    
      # Vulkan loader is statically linked on Mac. http://anglebug.com/40096682
      angle_shared_libvulkan = !is_mac
    
      # There's no "is_winuwp" helper in BUILDCONFIG.gn, so we define one ourselves
      # Windows App SDK is almost UWP but for Win32, so we want all the same things
      angle_is_winuwp = (is_win && target_os == "winuwp") || angle_is_winappsdk
    
      angle_is_msvc = is_win && !is_clang
    
      # Default to using "_angle" suffix on Android
      if (is_android) {
        angle_libs_suffix = "_angle"
      } else {
        angle_libs_suffix = ""
      }
    
      # Currently Windows on Arm doesn't support OpenGL or Vulkan.
      is_win_arm64 = is_win && target_cpu == "arm64"
    
      # Frame capture code is enabled by default if rapidjson is available.
      angle_has_frame_capture = angle_has_rapidjson
    }
    
    declare_args() {
      # By default, ANGLE is using a thread pool for parallel compilation.
      # Activating the delegate worker results in posting the tasks using the
      # embedder API. In Chromium code base, it results in sending tasks to the
      # worker thread pool.
      angle_delegate_workers = build_with_chromium
    
      # True if we are building inside an ANGLE checkout.
      angle_standalone = !build_with_chromium
    
      angle_enable_d3d9 = is_win && !angle_is_winuwp
      angle_enable_d3d11 = is_win
      angle_enable_gl =
          (ozone_platform_gbm || ozone_platform_wayland || !is_linux ||
           ((angle_use_x11 && !is_chromeos) || angle_use_wayland || is_castos)) &&
          !is_fuchsia && !angle_is_winuwp && !is_win_arm64 && !is_ios
    
      angle_enable_vulkan =
          angle_has_build &&
          ((is_win && !angle_is_winuwp) ||
           ((is_linux || is_chromeos) &&
            (angle_use_x11 || angle_use_wayland || angle_use_vulkan_display)) ||
           is_android || is_fuchsia || is_mac)
    
      # When set to true, ANGLE will not use VK_KHR_surface and VK_KHR_swapchain
      # extensions. Content can be rendered only off-screen.
      angle_use_vulkan_null_display = build_with_chromium && is_fuchsia
    
      # Disable null backend to save space for official build.
      angle_enable_null = !is_official_build
      angle_enable_gl_desktop_backend = !is_android && !is_ios
    
      # http://anglebug.com/40096506
      angle_enable_metal = is_apple
    
      # Enables the OpenCL pass-through back end
      angle_enable_cl_passthrough = angle_enable_cl
    
      # Disable WGPU backend.
      # Currently disabled on Android, Fuschia, WinUWP, and Win MSVC. X11 required on Linux.
      # anglebug.com/42266968
      angle_enable_wgpu =
          !is_official_build && !(is_android || is_fuchsia || angle_is_winuwp) &&
          (!is_win || is_clang) && (!is_linux || angle_use_x11) &&
          defined(angle_dawn_dir)
    }
    
    declare_args() {
      # ASTC emulation is only built on standalone non-android builds
      angle_has_astc_encoder = angle_has_build && angle_standalone && !is_android
    }
    
    declare_args() {
      angle_test_enable_system_egl = false
    }
    
    # OpenCL is not supported on Windows UWP, because the CL headers include DX9, which is not
    # supported by UWP. A workaround might be possible if CL support on UWP is required.
    assert(!angle_is_winuwp || !angle_enable_cl,
           "OpenCL is not supported on Windows UWP")
    
    assert(!angle_is_winappsdk || winappsdk_dir != "",
           "No path to Windows App SDK was provided using 'winappsdk_dir'")
    
    if (!angle_enable_cl) {
      angle_enable_cl_passthrough = false
    }
    
    if (!defined(checkout_angle_mesa)) {
      checkout_angle_mesa = false
    }
    
    declare_args() {
      # Currently SwiftShader's Vulkan front-end doesn't build on Android.
      # Disabled by default on MSVC because of compiler warnings/errors.
      angle_enable_swiftshader = angle_enable_vulkan && !is_android && is_clang
    
      # Translator backend support:
      angle_enable_hlsl = angle_enable_d3d9 || angle_enable_d3d11
      angle_enable_essl = angle_enable_gl || use_ozone
      angle_enable_glsl = angle_enable_gl || use_ozone
      angle_enable_trace = false
      angle_enable_trace_android_logcat = false
      angle_enable_trace_events = false
      angle_enable_platform_trace_events = build_with_chromium
      angle_dump_pipeline_cache_graph = false
    
      angle_always_log_info = false
    
      # Unwind backtrace support. This feature is currently only implemented
      # on Android for debugging purposes. Disabled by default.
      angle_enable_unwind_backtrace_support = false
    
      # Memory allocation logging support. This feature is for debugging only.
      # Disabled by default.
      angle_enable_memory_alloc_logging = false
    
      # Disable the layers in ubsan builds because of really slow builds.
      # Vulkan Validation Layers require Android NDK API level 26, i.e. Oreo, due to
      # Vulkan Validation Layers compatibility issues, see http://crrev/c/1405714.
      # This is disabled in the Chromium build because the current build toolchain
      # for APKs and bundles expect a single .so file in trichrome builds. See
      # https://bugs.chromium.org/p/angleproject/issues/detail?id=8398 for details.
      angle_enable_vulkan_validation_layers =
          angle_enable_vulkan && !is_ubsan && !is_tsan && !is_asan &&
          angle_debug_layers_enabled &&
          (!is_android || (ndk_api_level_at_least_26 && !build_with_chromium))
      angle_enable_vulkan_api_dump_layer =
          angle_enable_vulkan && angle_debug_layers_enabled && angle_standalone &&
          !is_apple && (is_linux || is_android)
    
      # ISpriteVisual windows cannot be validated and can lead to crashes if an invalid window is
      # provided to ANGLE. Disable them for non-standalone ANGLE builds. crbug.com/1176118
      angle_enable_d3d11_compositor_native_window =
          angle_enable_d3d11 && angle_standalone
    
      # Disable performance counter output by default
      angle_enable_perf_counter_output = false
    
      # Directory where to find wayland source files
      angle_wayland_dir = "$angle_root/third_party/wayland"
    
      angle_vulkan_headers_dir = "$angle_root/third_party/vulkan-headers/src"
      angle_vulkan_loader_dir = "$angle_root/third_party/vulkan-loader/src"
      angle_vulkan_tools_dir = "$angle_root/third_party/vulkan-tools/src"
      angle_vulkan_validation_layers_dir =
          "$angle_root/third_party/vulkan-validation-layers/src"
      angle_lunarg_vulkantools_dir =
          "$angle_root/third_party/lunarg-vulkantools/src"
    
      angle_build_vulkan_system_info = angle_has_build && !angle_is_winuwp
    
      # Enable overlay by default when debug layers are enabled.  This is currently only implemented on
      # Vulkan.
      angle_enable_overlay = angle_enable_vulkan && angle_debug_layers_enabled
    
      angle_build_mesa = false
    
      # Android platform's addTraceEvent ignores the timestamp and time() is a relatively heavy call.
      angle_trace_events_ignore_timestamp = is_android && angle_standalone
    }
    
    declare_args() {
      angle_enable_cgl = angle_enable_gl && is_mac
    
      angle_enable_apple_translator_workarounds =
          is_apple && (angle_enable_glsl || use_fuzzing_engine)
    
      angle_has_histograms = angle_has_build
    
      # True if we want to build the ANGLE test suites. On by default in most configs.
      angle_build_tests = angle_has_build
    }
    
    declare_args() {
      angle_enable_renderdoc = angle_enable_vulkan_validation_layers
    }
    
    if (!defined(angle_zlib_compression_utils_dir)) {
      angle_zlib_compression_utils_dir = "//third_party/zlib/google"
    }
    
    angle_common_configs = [
      angle_root + ":angle_asserts_config",
      angle_root + ":constructor_and_destructor_warnings",
      angle_root + ":extra_warnings",
      angle_root + ":internal_config",
      angle_root + ":angle_uwp_env",
    ]
    
    angle_remove_configs = []
    
    if (angle_has_build) {
      angle_remove_configs += [ "//build/config/compiler:default_include_dirs" ]
    
      if (is_clang && !is_nacl) {
        angle_remove_configs += [ "//build/config/clang:find_bad_constructs" ]
      }
    
      if (!is_debug && !is_fuchsia) {
        # default->optimize_max (e.g. Android defaults to -Oz, optimize_max is -O2)
        angle_remove_configs += [ "//build/config/compiler:default_optimization" ]
        angle_common_configs += [ "//build/config/compiler:optimize_max" ]
      }
    }
    
    set_defaults("angle_executable") {
      configs = angle_common_configs
      public_configs = []
      suppressed_configs = angle_remove_configs
      data_deps = []
    }
    
    set_defaults("angle_shared_library") {
      configs = angle_common_configs
      public_configs = []
      suppressed_configs = angle_remove_configs
    }
    
    set_defaults("angle_source_set") {
      configs = angle_common_configs
      public_configs = []
      suppressed_configs = angle_remove_configs
    }
    
    set_defaults("angle_static_library") {
      configs = angle_common_configs
      public_configs = []
      suppressed_configs = angle_remove_configs
    }
    
    set_defaults("angle_test") {
      # Gtest itself can't pass all the strict warning filters.
      configs = angle_common_configs - [
                  "$angle_root:constructor_and_destructor_warnings",
                  "$angle_root:extra_warnings",
                ] + [ "$angle_root/src/tests:angle_maybe_has_histograms" ] +
                [ "$angle_root/src/tests:angle_enable_renderdoc" ]
    
      public_configs = []
      public_deps = []
      sources = []
      data = []
      defines = []
      deps = []
      data_deps = []
      suppressed_configs = angle_remove_configs
    }
    
    template("angle_executable") {
      executable(target_name) {
        forward_variables_from(invoker,
                               "*",
                               [
                                 "configs",
                                 "suppressed_configs",
                                 "visibility",
                               ])
    
        # Needed because visibility is global.
        forward_variables_from(invoker, [ "visibility" ])
    
        configs += invoker.configs
        configs -= invoker.suppressed_configs
    
        if (angle_has_build && is_win) {
          data_deps += [ "//build/win:runtime_libs" ]
        }
    
        if (is_ios) {
          check_includes = false
        }
      }
    }
    
    template("angle_shared_library") {
      # On ios, define an ios_framework_bundle instead of a shared library.
      # ios_framework_bundle doesn't automatically link, so we have to create
      # a group that links and bundles the framework as well.
      target_type = "shared_library"
      internal_target_name = target_name
      if (is_ios) {
        target_type = "ios_framework_bundle"
        internal_target_name = target_name + "_framework"
      }
      target(target_type, internal_target_name) {
        forward_variables_from(invoker,
                               "*",
                               [
                                 "configs",
                                 "suppressed_configs",
                                 "visibility",
                               ])
    
        # Needed because visibility is global.
        forward_variables_from(invoker, [ "visibility" ])
    
        configs += invoker.configs
        configs -= invoker.suppressed_configs
    
        if (is_apple) {
          # If a "build with ARC" config is present, remove it.
          if (filter_include(configs, [ "//build/config/compiler:enable_arc" ]) !=
              []) {
            configs -= [ "//build/config/compiler:enable_arc" ]
          }
        }
    
        public_configs += [ angle_root + ":shared_library_public_config" ]
    
        if (is_android) {
          configs += [ angle_root + ":build_id_config" ]
          configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
        }
        if (is_ios) {
          info_plist = "$angle_root/util/ios/Info.plist"
    
          # shared libraries are hidden inside ios_framework_bundle, but we include headers from them
          # Specifically, libGLESv1_CM includes headers from libGLESv2
          check_includes = false
        }
      }
      if (is_ios) {
        group(target_name) {
          forward_variables_from(invoker,
                                 [
                                   "testonly",
                                   "visibility",
                                 ])
          public_deps = [
            ":${internal_target_name}+bundle",
            ":${internal_target_name}+link",
          ]
        }
      }
    }
    
    template("angle_source_set") {
      source_set(target_name) {
        forward_variables_from(invoker,
                               "*",
                               [
                                 "configs",
                                 "suppressed_configs",
                                 "visibility",
                               ])
    
        # Needed because visibility is global.
        forward_variables_from(invoker, [ "visibility" ])
    
        configs += invoker.configs
        configs -= invoker.suppressed_configs
    
        if (is_apple) {
          # If a "build with ARC" config is present, remove it.
          if (filter_include(configs, [ "//build/config/compiler:enable_arc" ]) !=
              []) {
            configs -= [ "//build/config/compiler:enable_arc" ]
          }
        }
      }
    }
    
    template("angle_static_library") {
      static_library(target_name) {
        forward_variables_from(invoker,
                               "*",
                               [
                                 "configs",
                                 "suppressed_configs",
                                 "visibility",
                               ])
    
        # Needed because visibility is global.
        forward_variables_from(invoker, [ "visibility" ])
    
        configs += invoker.configs
        configs -= invoker.suppressed_configs
    
        if (is_apple) {
          # If a "build with ARC" config is present, remove it.
          if (filter_include(configs, [ "//build/config/compiler:enable_arc" ]) !=
              []) {
            configs -= [ "//build/config/compiler:enable_arc" ]
          }
        }
      }
    }
    
    if (angle_standalone || build_with_chromium || build_angle_end2end_tests_aosp) {
      template("angle_test") {
        test(target_name) {
          forward_variables_from(invoker,
                                 "*",
                                 [
                                   "configs",
                                   "data",
                                   "public_deps",
                                 ])
    
          configs += invoker.configs
          configs -= invoker.suppressed_configs
    
          if (is_apple) {
            # If a "build with ARC" config is present, remove it.
            if (filter_include(configs, [ "//build/config/compiler:enable_arc" ]) !=
                []) {
              configs -= [ "//build/config/compiler:enable_arc" ]
            }
          }
    
          if (is_ios) {
            # shared libraries are hidden inside ios_framework_bundle, but we include headers from them
            check_includes = false
          }
    
          public_deps = invoker.public_deps + [
                          "$angle_root:angle_common",
                          "$angle_root:includes",
                          "$angle_root/src/tests:angle_test_expectations",
                          "$angle_root/util:angle_test_utils",
                          "//testing/gmock",
                          "//testing/gtest",
                          "//third_party/googletest:gmock",
                          "//third_party/googletest:gtest",
                        ]
          if (angle_has_rapidjson) {
            public_deps += [ "$angle_root/third_party/rapidjson:rapidjson" ]
          }
    
          data = invoker.data + [
                   "$angle_root/src/tests/py_utils/android_helper.py",
                   "$angle_root/src/tests/py_utils/angle_path_util.py",
                   "$angle_root/src/tests/py_utils/angle_test_util.py",
                   "//testing/scripts/common.py",
                   "//testing/xvfb.py",
                 ]
    
          if (angle_has_rapidjson) {
            sources += [
              "$angle_root/src/tests/test_utils/runner/HistogramWriter.h",
              "$angle_root/src/tests/test_utils/runner/TestSuite.cpp",
              "$angle_root/src/tests/test_utils/runner/TestSuite.h",
            ]
          }
    
          if (angle_has_histograms) {
            sources +=
                [ "$angle_root/src/tests/test_utils/runner/HistogramWriter.cpp" ]
            deps += [
              "//third_party/catapult/tracing/tracing:histogram",
              "//third_party/catapult/tracing/tracing:reserved_infos",
            ]
          }
    
          if (is_mac) {
            if (angle_enable_metal) {
              # On macOS, compiling Metal shader sometimes takes very long time due to internal caching
              # mechanism. This hooking library is a way to bypass this caching mechanism.
              data_deps += [ "$angle_root/src/libANGLE/renderer/metal/file_hooking:metal_shader_cache_file_hooking" ]
            }
            if (angle_enable_cgl) {
              configs += [ "$angle_root:supports_automatic_graphics_switching" ]
            }
          }
    
          if (is_linux && !is_chromeos) {
            use_xvfb = true
          }
    
          if ((is_linux || is_chromeos) && !is_component_build) {
            # Set rpath to find shared libs in a non-component build.
            configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
          }
    
          if (is_android) {
            public_configs += [ "$angle_root:build_id_config" ]
            configs -= [ "//build/config/android:hide_all_but_jni" ]
            use_default_launcher = false
            generate_final_jni = false
            if (angle_standalone_benchmark) {
              android_manifest_template = "$angle_root/src/tests/test_utils/runner/android/java/StandaloneBenchmarkAndroidManifest.xml.jinja2"
            } else {
              android_manifest_template = "$angle_root/src/tests/test_utils/runner/android/java/AndroidManifest.xml.jinja2"
            }
    
            deps += [
              "$angle_root/src/tests:native_test_java",
              "$angle_root/src/tests:native_test_support_android",
            ]
          }
          if (is_ios) {
            # We use a special main function on iOS to initialize UIKit before the normal main runs.
            ldflags = [
              "-e",
              "_ios_main",
            ]
            sources += [ "$angle_root/util/ios/ios_main.mm" ]
          }
    
          if (angle_has_build && is_win) {
            data_deps += [ "//build/win:runtime_libs" ]
          }
        }
      }
    }
    
    if (angle_enable_cl) {
      # need the llvm build flags
      import("$angle_clspv_dir/gn/build/llvm_buildflags.gni")
    }