# Copyright 2025 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. load("@chromium-luci//builders.star", "builders", "cpu", "os") load("@chromium-luci//ci.star", "ci") load("@chromium-luci//try.star", "try_") load("./ci_constants.star", "ci_constants") def _apply_gpu_linux_builder_defaults(kwargs): """Applies defaults applicable to all GPU Linux builders % thin testers.""" kwargs.setdefault("cores", 8) kwargs.setdefault("cpu", "x86-64") kwargs.setdefault("free_space", None) kwargs.setdefault("os", os.LINUX_DEFAULT) kwargs.setdefault("ssd", None) return kwargs def _apply_gpu_mac_builder_defaults(kwargs): """Applies defaults applicable to all GPU Mac builders.""" kwargs.setdefault("cores", None) kwargs.setdefault("cpu", cpu.ARM64) kwargs.setdefault("free_space", None) kwargs.setdefault("os", os.MAC_ANY) kwargs.setdefault("ssd", None) return kwargs def _apply_gpu_win_builder_defaults(kwargs): """Applies defaults applicable to all GPU Windows builders.""" kwargs.setdefault("cores", 8) kwargs.setdefault("free_space", None) kwargs.setdefault("os", os.WINDOWS_ANY) kwargs.setdefault("ssd", builders.with_expiration(True, expiration = 5 * time.minute)) return kwargs def _apply_gpu_ci_builder_defaults(kwargs): """Applies defaults applicable to all GPU CI builders % thin testers.""" kwargs.setdefault("builderless", True) kwargs.setdefault("pool", gpu.ci.POOL) # TODO(crbug.com/543082386): Add the service account here once we confirm # that it is okay for the non-FYI builders to use chromium-ci-gpu-builder@. return kwargs def _gpu_ci_linux_builder(*args, **kwargs): """Defines a GPU-related Linux CI builder.""" kwargs = _apply_gpu_linux_builder_defaults(kwargs) kwargs = _apply_gpu_ci_builder_defaults(kwargs) return ci.builder(*args, **kwargs) def _gpu_ci_mac_builder(*args, **kwargs): """Defines a GPU-related Mac CI builder.""" kwargs = _apply_gpu_mac_builder_defaults(kwargs) kwargs = _apply_gpu_ci_builder_defaults(kwargs) return ci.builder(*args, **kwargs) def _gpu_ci_windows_builder(*args, **kwargs): """Defines a GPU-related Windows CI builder.""" kwargs = _apply_gpu_win_builder_defaults(kwargs) kwargs = _apply_gpu_ci_builder_defaults(kwargs) return ci.builder(*args, **kwargs) def _apply_gpu_try_builder_defaults(kwargs): """Applies defaults applicable to all GPU try builders.""" kwargs.setdefault("builderless", True) kwargs.setdefault("pool", gpu.try_.POOL) kwargs.setdefault("service_account", gpu.try_.SERVICE_ACCOUNT) return kwargs def _apply_gpu_manual_try_builder_defaults(kwargs): """Applies defaults applicable to all GPU manual-only try builders.""" kwargs = _apply_gpu_try_builder_defaults(kwargs) kwargs.setdefault("max_concurrent_builds", 1) return kwargs def _gpu_try_manual_linux_builder(*args, **kwargs): """Defines a GPU-related Linux manual-only trybot.""" kwargs = _apply_gpu_manual_try_builder_defaults(kwargs) kwargs = _apply_gpu_linux_builder_defaults(kwargs) return try_.builder(*args, **kwargs) def _gpu_try_manual_mac_builder(*args, **kwargs): """Defines a GPU-related Mac manual-only trybot.""" kwargs = _apply_gpu_manual_try_builder_defaults(kwargs) kwargs = _apply_gpu_mac_builder_defaults(kwargs) return try_.builder(*args, **kwargs) def _gpu_try_manual_win_builder(*args, **kwargs): """Defines a GPU-related Windows manual-only trybot.""" kwargs = _apply_gpu_manual_try_builder_defaults(kwargs) kwargs = _apply_gpu_win_builder_defaults(kwargs) return try_.builder(*args, **kwargs) def _apply_gpu_rate_limited_try_builder_defaults(kwargs): """Applies defaults applicable to all GPU rate limited trybots. Rate limited builders are those that are used more frequently than normal manual-only trybots, but are still not automatically added to CLs like optional trybots are. """ if not try_.defaults.get_value_from_kwargs("max_concurrent_builds", kwargs): fail("max_concurrent_builds not set on a builder that expects it.") kwargs = _apply_gpu_try_builder_defaults(kwargs) return kwargs def _gpu_try_rate_limited_linux_builder(*args, **kwargs): """Defines a GPU-related Linux rate limited trybot.""" kwargs = _apply_gpu_rate_limited_try_builder_defaults(kwargs) kwargs = _apply_gpu_linux_builder_defaults(kwargs) return try_.builder(*args, **kwargs) def _gpu_try_rate_limited_mac_builder(*args, **kwargs): """Defines a GPU-related Mac rate limited trybot.""" kwargs = _apply_gpu_rate_limited_try_builder_defaults(kwargs) kwargs = _apply_gpu_mac_builder_defaults(kwargs) return try_.builder(*args, **kwargs) def _gpu_try_rate_limited_win_builder(*args, **kwargs): """Defines a GPU-related Windows rate limited trybot.""" kwargs = _apply_gpu_rate_limited_try_builder_defaults(kwargs) kwargs = _apply_gpu_win_builder_defaults(kwargs) return try_.builder(*args, **kwargs) def _apply_gpu_optional_try_builder_defaults(kwargs): """Applies defaults applicable to all GPU optional trybots.""" if not kwargs.get("cq_settings"): fail("cq_settings must be set for an optional builder to set location filters.") kwargs = _apply_gpu_rate_limited_try_builder_defaults(kwargs) kwargs.setdefault("execution_timeout", 6 * time.hour) return kwargs def _gpu_try_optional_linux_builder(*args, **kwargs): """Defines a GPU-related Linux optional trybot.""" kwargs = _apply_gpu_optional_try_builder_defaults(kwargs) kwargs = _apply_gpu_linux_builder_defaults(kwargs) return try_.builder(*args, **kwargs) def _gpu_try_optional_mac_builder(*args, **kwargs): """Defines a GPU-related mac optional trybot.""" kwargs = _apply_gpu_optional_try_builder_defaults(kwargs) kwargs = _apply_gpu_mac_builder_defaults(kwargs) return try_.builder(*args, **kwargs) def _gpu_try_optional_win_builder(*args, **kwargs): """Defines a GPU-related Windows optional trybot.""" kwargs = _apply_gpu_optional_try_builder_defaults(kwargs) kwargs = _apply_gpu_win_builder_defaults(kwargs) return try_.builder(*args, **kwargs) _common_location_filters = [ # Inclusion filters. cq.location_filter(path_regexp = "chrome/browser/vr/.+"), cq.location_filter(path_regexp = "content/browser/xr/.+"), cq.location_filter(path_regexp = "content/test/data/gpu/.+"), cq.location_filter(path_regexp = "content/test/gpu/.+"), cq.location_filter(path_regexp = "gpu/.+"), cq.location_filter(path_regexp = "media/audio/.+"), cq.location_filter(path_regexp = "media/base/.+"), cq.location_filter(path_regexp = "media/capture/.+"), cq.location_filter(path_regexp = "media/filters/.+"), cq.location_filter(path_regexp = "media/gpu/.+"), cq.location_filter(path_regexp = "media/mojo/.+"), cq.location_filter(path_regexp = "media/renderers/.+"), cq.location_filter(path_regexp = "media/video/.+"), cq.location_filter(path_regexp = "testing/trigger_scripts/.+"), cq.location_filter(path_regexp = "third_party/blink/renderer/modules/mediastream/.+"), cq.location_filter(path_regexp = "third_party/blink/renderer/modules/webcodecs/.+"), cq.location_filter(path_regexp = "third_party/blink/renderer/modules/webgl/.+"), cq.location_filter(path_regexp = "third_party/blink/renderer/modules/webgpu/.+"), cq.location_filter(path_regexp = "third_party/blink/renderer/platform/graphics/gpu/.+"), cq.location_filter(path_regexp = "tools/clang/scripts/update.py"), cq.location_filter(path_regexp = "ui/gl/.+"), # Exclusion filters. cq.location_filter(exclude = True, path_regexp = ".*\\.md"), ] _android_specific_location_filters = [ # Inclusion filters. cq.location_filter(path_regexp = "cc/.+"), cq.location_filter(path_regexp = "components/viz/.+"), cq.location_filter(path_regexp = "services/viz/.+"), ] _linux_specific_location_filters = [] _mac_specific_location_filters = [ # Inclusion filters. cq.location_filter(path_regexp = "services/shape_detection/.+"), ] _windows_specific_location_filters = [ # Inclusion filters. cq.location_filter(path_regexp = "chrome/browser/media/.+"), cq.location_filter(path_regexp = "components/cdm/renderer/.+"), cq.location_filter(path_regexp = "device/vr/.+"), cq.location_filter(path_regexp = "media/cdm/.+"), cq.location_filter(path_regexp = "services/on_device_model/.+"), cq.location_filter(path_regexp = "services/webnn/.+"), cq.location_filter(path_regexp = "third_party/blink/renderer/modules/vr/.+"), cq.location_filter(path_regexp = "third_party/blink/renderer/modules/xr/.+"), ] def _location_filter_to_sort_key(location_filter): # Put inclusion filters before exclusion filters. prefix = "a" if location_filter.exclude: prefix = "b" return prefix + location_filter.path_regexp def _append_to_common_filters_and_sort(additional_location_filters): return sorted(_common_location_filters + additional_location_filters, key = _location_filter_to_sort_key) _optional_trybot_location_filters = struct( ANDROID = _append_to_common_filters_and_sort(_android_specific_location_filters), LINUX = _append_to_common_filters_and_sort(_linux_specific_location_filters), MAC = _append_to_common_filters_and_sort(_mac_specific_location_filters), WINDOWS = _append_to_common_filters_and_sort(_windows_specific_location_filters), ) gpu = struct( ci = struct( POOL = "luci.chromium.gpu.ci", SERVICE_ACCOUNT = "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", SHADOW_SERVICE_ACCOUNT = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", TREE_CLOSING_NOTIFIERS = ci_constants.DEFAULT_TREE_CLOSING_NOTIFIERS + ["gpu-tree-closer-email"], linux_builder = _gpu_ci_linux_builder, mac_builder = _gpu_ci_mac_builder, windows_builder = _gpu_ci_windows_builder, ), try_ = struct( POOL = "luci.chromium.gpu.try", SERVICE_ACCOUNT = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", linux_manual_builder = _gpu_try_manual_linux_builder, linux_optional_builder = _gpu_try_optional_linux_builder, linux_rate_limited_builder = _gpu_try_rate_limited_linux_builder, mac_manual_builder = _gpu_try_manual_mac_builder, mac_optional_builder = _gpu_try_optional_mac_builder, mac_rate_limited_builder = _gpu_try_rate_limited_mac_builder, optional_trybot_location_filters = _optional_trybot_location_filters, win_manual_builder = _gpu_try_manual_win_builder, win_optional_builder = _gpu_try_optional_win_builder, win_rate_limited_builder = _gpu_try_rate_limited_win_builder, ), )