diff options
42 files changed, 367 insertions, 452 deletions
diff --git a/Android.bp b/Android.bp index 336f042006..1eee1b63c8 100644 --- a/Android.bp +++ b/Android.bp @@ -1519,7 +1519,6 @@ cc_genrule { "src/common/RingBufferAllocator.h", "src/common/SimpleMutex.cpp", "src/common/SimpleMutex.h", - "src/common/Spinlock.h", "src/common/SynchronizedValue.h", "src/common/WorkerThread.cpp", "src/common/WorkerThread.h", @@ -43,7 +43,7 @@ vars = { 'checkout_angle_mesa': False, # Version of Chromium our Chromium-based DEPS are mirrored from. - 'chromium_revision': '83c70f11490ddf939fee8e9096288c28d4cda227', + 'chromium_revision': 'bc4f0a08ba8d4453fc183d3ef4d59889a3b1cdde', # We never want to checkout chromium, # but need a dummy DEPS entry for the autoroller 'dummy_checkout_chromium': False, @@ -88,16 +88,16 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '835aa3e871f28f6d2635f1ec58e414f39b4d4049', + 'catapult_revision': 'e84a4942dc4ae51442d256009f9d75a98ac680ac', # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:20.20240412.2.1', + 'fuchsia_version': 'version:20.20240430.3.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling luci-go # and whatever else without interference from each other. - 'luci_go': 'git_revision:239be4fd8499df782db6bddb0f55832bf4f01307', + 'luci_go': 'git_revision:01d1863acbd3d4c41da2aa7407a0ea6a195c770f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling android_sdk_build-tools_version @@ -292,6 +292,7 @@ vars = { 'checkout_angle_restricted_trace_mini_block_craft': 'checkout_angle_restricted_traces', 'checkout_angle_restricted_trace_mini_world': 'checkout_angle_restricted_traces', 'checkout_angle_restricted_trace_mobile_legends': 'checkout_angle_restricted_traces', + 'checkout_angle_restricted_trace_modern_combat_5': 'checkout_angle_restricted_traces', 'checkout_angle_restricted_trace_monster_hunter_stories': 'checkout_angle_restricted_traces', 'checkout_angle_restricted_trace_monster_strike': 'checkout_angle_restricted_traces', 'checkout_angle_restricted_trace_monument_valley': 'checkout_angle_restricted_traces', @@ -414,12 +415,12 @@ vars = { deps = { 'build': { - 'url': Var('chromium_git') + '/chromium/src/build.git@dc7e21c7b04270a6b5fae49a0f67e7065d310bb2', + 'url': Var('chromium_git') + '/chromium/src/build.git@0347db4c4f2ea6518b19403284bc31fbb46d1e2a', 'condition': 'not build_with_chromium', }, 'buildtools': { - 'url': Var('chromium_git') + '/chromium/src/buildtools.git@d0f0285d02d788719edb53fa9dcec1584ff83875', + 'url': Var('chromium_git') + '/chromium/src/buildtools.git@9703d9137fff0cb447779de1bfebbe18ea312f89', 'condition': 'not build_with_chromium', }, @@ -473,7 +474,7 @@ deps = { }, 'testing': { - 'url': '{chromium_git}/chromium/src/testing@79213704bc55aa472940085952d33d9b0025e607', + 'url': '{chromium_git}/chromium/src/testing@6ed3b71a7d8bee00517b5fb7d459628ae9661ad9', 'condition': 'not build_with_chromium', }, @@ -543,7 +544,7 @@ deps = { }, 'third_party/android_deps': { - 'url': Var('chromium_git') + '/chromium/src/third_party/android_deps@d64937aec71a4110715b07ce871be294d6e35071', + 'url': Var('chromium_git') + '/chromium/src/third_party/android_deps@8ed0817e402df9edb5d19853af5077406af95c1d', 'condition': 'checkout_android and not build_with_chromium', }, @@ -564,7 +565,7 @@ deps = { }, 'third_party/android_sdk': { - 'url': Var('chromium_git') + '/chromium/src/third_party/android_sdk@2d7b0a17b7ffad6ee60feb21a3a773907e37dcda', + 'url': Var('chromium_git') + '/chromium/src/third_party/android_sdk@f80bca53c2398585538469a4be694fa0feaa30a5', 'condition': 'checkout_android and not build_with_chromium', }, @@ -655,7 +656,7 @@ deps = { }, 'third_party/depot_tools': { - 'url': Var('chromium_git') + '/chromium/tools/depot_tools.git@2c87882a7bacebf523a3df6a76432d0bc47badf8', + 'url': Var('chromium_git') + '/chromium/tools/depot_tools.git@e75b940aeabcca1ea7e38881231e73a32a352753', 'condition': 'not build_with_chromium', }, @@ -871,7 +872,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/r8', - 'version': '7sVFkxumsokMdM4MavgTQKuAVJ2_MQLCkqc9uln8Gl0C', + 'version': 'eec4ZxEvkO7Pa1LUWDkVKiCv0bZjS7ctubjxW94ZYVYC', }, ], 'condition': 'checkout_android and not build_with_chromium', @@ -958,7 +959,7 @@ deps = { }, 'tools/android': { - 'url': Var('chromium_git') + '/chromium/src/tools/android@2451d1d2b62c31416919f437f9aeb43a0ee7edcd', + 'url': Var('chromium_git') + '/chromium/src/tools/android@49bb033593621ee4977cd0dd58e0412035d6bab5', 'condition': 'checkout_android and not build_with_chromium', }, @@ -1009,7 +1010,7 @@ deps = { }, 'tools/perf': { - 'url': Var('chromium_git') + '/chromium/src/tools/perf@6e4e92a394b0b138f01219ebd23102042991e3d4', + 'url': Var('chromium_git') + '/chromium/src/tools/perf@73a1c67b512eb876d032ebfb3b539150a4fcd801', 'condition': 'not build_with_chromium', }, @@ -2513,6 +2514,16 @@ deps = { 'dep_type': 'cipd', 'condition': 'checkout_angle_restricted_trace_mobile_legends', }, + 'src/tests/restricted_traces/modern_combat_5': { + 'packages': [ + { + 'package': 'angle/traces/modern_combat_5', + 'version': 'version:1', + }, + ], + 'dep_type': 'cipd', + 'condition': 'checkout_angle_restricted_trace_modern_combat_5', + }, 'src/tests/restricted_traces/monster_hunter_stories': { 'packages': [ { diff --git a/build/OWNERS b/build/OWNERS index 78049f4037..25b0e7e490 100644 --- a/build/OWNERS +++ b/build/OWNERS @@ -5,14 +5,12 @@ agrieve@chromium.org brucedawson@chromium.org dpranke@google.com jochen@chromium.org -jwata@google.com -philwo@chromium.org -richardwa@google.com sdefresne@chromium.org thakis@chromium.org thomasanderson@chromium.org -tikuta@chromium.org -ukai@google.com + +# Chrome Build Team members +file://infra/config/groups/chrome-build/OWNERS # Clang build config changes: file://tools/clang/scripts/OWNERS diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn index dd9fb9486c..80995f5236 100644 --- a/build/android/BUILD.gn +++ b/build/android/BUILD.gn @@ -93,6 +93,18 @@ if (enable_java_templates) { } } +if (defined(sanitizer_arch)) { + action("generate_wrap_sh") { + script = "generate_wrap_sh.py" + outputs = [ "$target_gen_dir/$target_name/wrap.sh" ] + args = [ + "--arch=$sanitizer_arch", + "--output", + rebase_path(outputs[0], root_build_dir), + ] + } +} + # TODO(go/turn-down-test-results): Remove once we turn down # test-results.appspot.com python_library("test_result_presentations_py") { @@ -195,9 +207,6 @@ group("test_runner_device_support") { if (enable_chrome_android_internal) { data += [ "//clank/tools/android/avd/proto/" ] } - if (is_asan) { - data_deps += [ "//tools/android/asan/third_party:asan_device_setup" ] - } if (use_full_mte) { data_deps += [ "//tools/android/mte:mte_device_setup" ] } diff --git a/build/android/generate_wrap_sh.py b/build/android/generate_wrap_sh.py new file mode 100755 index 0000000000..e40174ca5b --- /dev/null +++ b/build/android/generate_wrap_sh.py @@ -0,0 +1,43 @@ +#! /usr/bin/env python3 +# Copyright 2024 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import argparse +import pathlib + + +def _generate(arch): + return f"""\ +#!/system/bin/sh +# See: https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid/\ +01f8df1ac1a447a8475cdfcb03e8b13140042dbd#running-with-wrapsh-recommended +HERE="$(cd "$(dirname "$0")" && pwd)" +# Options suggested by wiki docs: +_ASAN_OPTIONS="log_to_syslog=false,allow_user_segv_handler=1" +# Chromium-specific option (supposedly for graphics drivers): +_ASAN_OPTIONS="$_ASAN_OPTIONS,strict_memcmp=0,use_sigaltstack=1" +_LD_PRELOAD="$HERE/libclang_rt.asan-{arch}-android.so" +log -t cr_wrap.sh -- "Launching with ASAN enabled." +log -t cr_wrap.sh -- "LD_PRELOAD=$_LD_PRELOAD" +log -t cr_wrap.sh -- "ASAN_OPTIONS=$_ASAN_OPTIONS" +log -t cr_wrap.sh -- "Command: $0 $@" +# Export LD_PRELOAD after running "log" commands to not risk it affecting +# them. +export LD_PRELOAD=$_LD_PRELOAD +export ASAN_OPTIONS=$_ASAN_OPTIONS +exec "$@" +""" + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--arch', required=True) + parser.add_argument('--output', required=True) + args = parser.parse_args() + + pathlib.Path(args.output).write_text(_generate(args.arch)) + + +if __name__ == '__main__': + main() diff --git a/build/android/pylib/gtest/gtest_test_instance.py b/build/android/pylib/gtest/gtest_test_instance.py index 0398facc9b..dbed400181 100644 --- a/build/android/pylib/gtest/gtest_test_instance.py +++ b/build/android/pylib/gtest/gtest_test_instance.py @@ -384,6 +384,9 @@ class GtestTestInstance(test_instance.TestInstance): self._extras = { _EXTRA_NATIVE_TEST_ACTIVITY: self._apk_helper.GetActivityName(), } + if args.timeout_scale and args.timeout_scale != 1: + self._extras[_EXTRA_RUN_IN_SUB_THREAD] = 1 + if self._suite in RUN_IN_SUB_THREAD_TEST_SUITES: self._extras[_EXTRA_RUN_IN_SUB_THREAD] = 1 if self._suite in BROWSER_TEST_SUITES: diff --git a/build/android/pylib/instrumentation/instrumentation_test_instance_test.py b/build/android/pylib/instrumentation/instrumentation_test_instance_test.py index f58bfd4bbe..7d7b58399c 100755 --- a/build/android/pylib/instrumentation/instrumentation_test_instance_test.py +++ b/build/android/pylib/instrumentation/instrumentation_test_instance_test.py @@ -22,10 +22,6 @@ _INSTRUMENTATION_TEST_INSTANCE_PATH = ( class InstrumentationTestInstanceTest(unittest.TestCase): - def setUp(self): - options = mock.Mock() - options.tool = '' - @staticmethod def createTestInstance(): c = _INSTRUMENTATION_TEST_INSTANCE_PATH % 'InstrumentationTestInstance' diff --git a/build/android/pylib/local/device/local_device_environment.py b/build/android/pylib/local/device/local_device_environment.py index a096c7c2f0..4b43c75c54 100644 --- a/build/android/pylib/local/device/local_device_environment.py +++ b/build/android/pylib/local/device/local_device_environment.py @@ -108,7 +108,6 @@ class LocalDeviceEnvironment(environment.Environment): self._preferred_abis = None self._recover_devices = args.recover_devices self._skip_clear_data = args.skip_clear_data - self._tool_name = args.tool self._trace_output = None # Must check if arg exist because this class is used by # //third_party/catapult's browser_options.py @@ -256,10 +255,6 @@ class LocalDeviceEnvironment(environment.Environment): return self._skip_clear_data @property - def tool(self): - return self._tool_name - - @property def trace_output(self): return self._trace_output diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py index 540c03aa7e..8f67ee09f2 100644 --- a/build/android/pylib/local/device/local_device_gtest_run.py +++ b/build/android/pylib/local/device/local_device_gtest_run.py @@ -358,12 +358,7 @@ class _ExeDelegate: return constants.TEST_EXECUTABLE_DIR def Run(self, test, device, flags=None, **kwargs): - tool = self._test_run.GetTool(device).GetTestWrapper() - if tool: - cmd = [tool] - else: - cmd = [] - cmd.append(posixpath.join(self._device_dist_dir, self._exe_file_name)) + cmd = [posixpath.join(self._device_dist_dir, self._exe_file_name)] if test: cmd.append('--gtest_filter=%s' % ':'.join(test)) @@ -373,7 +368,8 @@ class _ExeDelegate: cwd = constants.TEST_EXECUTABLE_DIR env = { - 'LD_LIBRARY_PATH': self._device_dist_dir + 'LD_LIBRARY_PATH': self._device_dist_dir, + 'UBSAN_OPTIONS': constants.UBSAN_OPTIONS, } if self._coverage_dir: @@ -383,8 +379,6 @@ class _ExeDelegate: device_coverage_dir, self._suite, self._coverage_index) self._coverage_index += 1 - if self._env.tool != 'asan': - env['UBSAN_OPTIONS'] = constants.UBSAN_OPTIONS try: gcov_strip_depth = os.environ['NATIVE_COVERAGE_DEPTH_STRIP'] @@ -484,11 +478,7 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun): check_return=True, as_root=self._env.force_main_user) - def init_tool_and_start_servers(dev): - tool = self.GetTool(dev) - tool.CopyFiles(dev) - tool.SetupEnvironment() - + def start_servers(dev): if self._env.disable_test_server: logging.warning('Not starting test server. Some tests may fail.') return @@ -512,7 +502,7 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun): if self.TestPackage() in _SUITE_REQUIRES_TEST_SERVER_SPAWNER: self._servers[str(dev)].append( local_test_server_spawner.LocalTestServerSpawner( - ports.AllocateTestServerPort(), dev, tool)) + ports.AllocateTestServerPort(), dev)) for s in self._servers[str(dev)]: s.SetUp() @@ -522,7 +512,8 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun): steps = [ bind_crash_handler(s, device) - for s in (install_apk, push_test_data, init_tool_and_start_servers)] + for s in (install_apk, push_test_data, start_servers) + ] if self._env.concurrent_adb: reraiser_thread.RunAsync(steps) else: @@ -770,9 +761,7 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun): #override def _RunTest(self, device, test): # Run the test. - timeout = (self._test_instance.shard_timeout * - self.GetTool(device).GetTimeoutScale() * - _GetDeviceTimeoutMultiplier()) + timeout = self._test_instance.shard_timeout * _GetDeviceTimeoutMultiplier() if self._test_instance.wait_for_java_debugger: timeout = None if self._test_instance.store_tombstones: @@ -966,7 +955,4 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun): for s in self._servers.get(str(dev), []): s.TearDown() - tool = self.GetTool(dev) - tool.CleanUpEnvironment() - self._env.parallel_devices.pMap(individual_device_tear_down) diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py index 25aa42a43d..d8ec69ccf8 100644 --- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py +++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py @@ -30,7 +30,6 @@ from devil.android.tools import webview_app from devil.utils import reraiser_thread from incremental_install import installer from pylib import constants -from pylib import valgrind_tools from pylib.base import base_test_result from pylib.base import output_manager from pylib.constants import host_paths @@ -70,7 +69,7 @@ _WPR_GO_LINUX_X86_64_PATH = os.path.join(host_paths.DIR_SOURCE_ROOT, _TAG = 'test_runner_py' TIMEOUT_ANNOTATIONS = [ - ('Manual', 10 * 60 * 60), + ('Manual', 1000 * 60 * 60), ('IntegrationTest', 10 * 60), ('External', 10 * 60), ('EnormousTest', 5 * 60), @@ -96,6 +95,8 @@ EXTRA_CLANG_COVERAGE_DEVICE_FILE = ( EXTRA_SCREENSHOT_FILE = ( 'org.chromium.base.test.ScreenshotOnFailureStatement.ScreenshotFile') +EXTRA_TIMEOUT_SCALE = 'BaseChromiumAndroidJUnitRunner.TimeoutScale' + EXTRA_UI_CAPTURE_DIR = ( 'org.chromium.base.test.util.Screenshooter.ScreenshotDir') @@ -598,9 +599,6 @@ class LocalDeviceInstrumentationTestRun( logging.debug('Attempting to set WebView flags: %r', webview_flags) self._webview_flag_changers[str(dev)].AddFlags(webview_flags) - valgrind_tools.SetChromeTimeoutScale( - dev, self._test_instance.timeout_scale) - install_steps += [push_test_data, create_flag_changer] post_install_steps += [ set_debug_app, approve_app_links, set_vega_permissions, @@ -689,8 +687,6 @@ class LocalDeviceInstrumentationTestRun( logging.info('Running custom teardown shell command: %s', cmd) dev.RunShellCommand(cmd, shell=True, check_return=True) - valgrind_tools.SetChromeTimeoutScale(dev, None) - # If we've force approved app links for a package, undo that now. self._ToggleAppLinks(dev, 'STATE_NO_RESPONSE') @@ -910,7 +906,6 @@ class LocalDeviceInstrumentationTestRun( extras[_EXTRA_PACKAGE_UNDER_TEST] = package_name flags_to_add = [] - test_timeout_scale = None if self._test_instance.coverage_directory: coverage_basename = '%s' % ('%s_%s_group' % (test[0]['class'], test[0]['method']) @@ -1019,11 +1014,10 @@ class LocalDeviceInstrumentationTestRun( timeout = FIXED_TEST_TIMEOUT_OVERHEAD + self._GetTimeoutFromAnnotations( test['annotations'], test_display_name) - test_timeout_scale = self._GetTimeoutScaleFromAnnotations( - test['annotations']) - if test_timeout_scale and test_timeout_scale != 1: - valgrind_tools.SetChromeTimeoutScale( - device, test_timeout_scale * self._test_instance.timeout_scale) + timeout_scale = self._test_instance.timeout_scale * ( + self._GetTimeoutScaleFromAnnotations(test['annotations'])) + if timeout_scale != 1: + extras[EXTRA_TIMEOUT_SCALE] = str(self._test_instance.timeout_scale) if self._test_instance.wait_for_java_debugger: timeout = None @@ -1106,11 +1100,6 @@ class LocalDeviceInstrumentationTestRun( if flags_to_add: self._flag_changers[str(device)].Restore() - def restore_timeout_scale(): - if test_timeout_scale: - valgrind_tools.SetChromeTimeoutScale( - device, self._test_instance.timeout_scale) - def handle_coverage_data(): if self._test_instance.coverage_directory: try: @@ -1225,9 +1214,9 @@ class LocalDeviceInstrumentationTestRun( # the results! Things such as whether the test CRASHED have not yet been # determined. post_test_steps = [ - restore_flags, restore_timeout_scale, stop_chrome_proxy, - handle_coverage_data, handle_render_test_data, - pull_ui_screen_captures, pull_baseline_profile + restore_flags, stop_chrome_proxy, handle_coverage_data, + handle_render_test_data, pull_ui_screen_captures, + pull_baseline_profile ] if self._env.concurrent_adb: reraiser_thread.RunAsync(post_test_steps) @@ -1391,6 +1380,9 @@ class LocalDeviceInstrumentationTestRun( # Workaround for https://github.com/mockito/mockito/issues/922 'notPackage': 'net.bytebuddy', } + if self._test_instance.timeout_scale != 1: + extras[EXTRA_TIMEOUT_SCALE] = str(self._test_instance.timeout_scale) + # BaseChromiumAndroidJUnitRunner ignores this bundle value (and always # adds the listener). This is needed to enable the the listener when # using AndroidJUnitRunner directly. diff --git a/build/android/pylib/local/device/local_device_test_run.py b/build/android/pylib/local/device/local_device_test_run.py index fe631fff0a..c86407a355 100644 --- a/build/android/pylib/local/device/local_device_test_run.py +++ b/build/android/pylib/local/device/local_device_test_run.py @@ -19,7 +19,6 @@ from devil.android import device_errors from devil.android.sdk import version_codes from devil.android.tools import device_recovery from devil.utils import signal_handler -from pylib import valgrind_tools from pylib.base import base_test_result from pylib.base import test_collection from pylib.base import test_exception @@ -48,7 +47,6 @@ class LocalDeviceTestRun(test_run.TestRun): def __init__(self, env, test_instance): super().__init__(env, test_instance) - self._tools = {} # This is intended to be filled by a child class. self._installed_packages = [] env.SetPreferredAbis(test_instance.GetPreferredAbis()) @@ -360,12 +358,6 @@ class LocalDeviceTestRun(test_run.TestRun): return ('Batch' not in annotations or annotations['Batch']['value'] != 'UnitTests') - def GetTool(self, device): - if str(device) not in self._tools: - self._tools[str(device)] = valgrind_tools.CreateTool( - self._env.tool, device) - return self._tools[str(device)] - def _CreateShardsForDevices(self, tests): raise NotImplementedError diff --git a/build/android/pylib/local/local_test_server_spawner.py b/build/android/pylib/local/local_test_server_spawner.py index a37bee5534..a4e10ac5e8 100644 --- a/build/android/pylib/local/local_test_server_spawner.py +++ b/build/android/pylib/local/local_test_server_spawner.py @@ -35,12 +35,12 @@ def _WaitUntil(predicate, max_attempts=5): class PortForwarderAndroid(chrome_test_server_spawner.PortForwarder): - def __init__(self, device, tool): + + def __init__(self, device): self.device = device - self.tool = tool def Map(self, port_pairs): - forwarder.Forwarder.Map(port_pairs, self.device, self.tool) + forwarder.Forwarder.Map(port_pairs, self.device) def GetDevicePortForHostPort(self, host_port): return forwarder.Forwarder.DevicePortForHostPort(host_port) @@ -60,12 +60,11 @@ class PortForwarderAndroid(chrome_test_server_spawner.PortForwarder): class LocalTestServerSpawner(test_server.TestServer): - def __init__(self, port, device, tool): + def __init__(self, port, device): super().__init__() self._device = device self._spawning_server = chrome_test_server_spawner.SpawningServer( - port, PortForwarderAndroid(device, tool), MAX_TEST_SERVER_INSTANCES) - self._tool = tool + port, PortForwarderAndroid(device), MAX_TEST_SERVER_INSTANCES) @property def server_address(self): @@ -85,8 +84,7 @@ class LocalTestServerSpawner(test_server.TestServer): self._device.WriteFile( '%s/net-test-server-config' % self._device.GetExternalStoragePath(), test_server_config) - forwarder.Forwarder.Map( - [(self.port, self.port)], self._device, self._tool) + forwarder.Forwarder.Map([(self.port, self.port)], self._device) self._spawning_server.Start() #override diff --git a/build/android/pylib/valgrind_tools.py b/build/android/pylib/valgrind_tools.py deleted file mode 100644 index 8c00705b72..0000000000 --- a/build/android/pylib/valgrind_tools.py +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright 2012 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# pylint: disable=R0201 - - - - -import logging -import sys - -from devil.android import device_errors -from devil.android.valgrind_tools import base_tool - - -def SetChromeTimeoutScale(device, scale): - """Sets the timeout scale in /data/local/tmp/chrome_timeout_scale to scale.""" - path = '/data/local/tmp/chrome_timeout_scale' - if not scale or scale == 1.0: - # Delete if scale is None/0.0/1.0 since the default timeout scale is 1.0 - device.RemovePath(path, force=True, as_root=True) - else: - device.WriteFile(path, '%f' % scale, as_root=True) - - - -class AddressSanitizerTool(base_tool.BaseTool): - """AddressSanitizer tool.""" - - WRAPPER_NAME = '/system/bin/asanwrapper' - # Disable memcmp overlap check.There are blobs (gl drivers) - # on some android devices that use memcmp on overlapping regions, - # nothing we can do about that. - EXTRA_OPTIONS = 'strict_memcmp=0,use_sigaltstack=1' - - def __init__(self, device): - super().__init__() - self._device = device - - @classmethod - def CopyFiles(cls, device): - """Copies ASan tools to the device.""" - del device - - def GetTestWrapper(self): - return AddressSanitizerTool.WRAPPER_NAME - - def GetUtilWrapper(self): - """Returns the wrapper for utilities, such as forwarder. - - AddressSanitizer wrapper must be added to all instrumented binaries, - including forwarder and the like. This can be removed if such binaries - were built without instrumentation. """ - return self.GetTestWrapper() - - def SetupEnvironment(self): - try: - self._device.EnableRoot() - except device_errors.CommandFailedError as e: - # Try to set the timeout scale anyway. - # TODO(jbudorick) Handle this exception appropriately after interface - # conversions are finished. - logging.error(str(e)) - SetChromeTimeoutScale(self._device, self.GetTimeoutScale()) - - def CleanUpEnvironment(self): - SetChromeTimeoutScale(self._device, None) - - def GetTimeoutScale(self): - # Very slow startup. - return 20.0 - - -TOOL_REGISTRY = { - 'asan': AddressSanitizerTool, -} - - -def CreateTool(tool_name, device): - """Creates a tool with the specified tool name. - - Args: - tool_name: Name of the tool to create. - device: A DeviceUtils instance. - Returns: - A tool for the specified tool_name. - """ - if not tool_name: - return base_tool.BaseTool() - - ctor = TOOL_REGISTRY.get(tool_name) - if ctor: - return ctor(device) - print('Unknown tool %s, available tools: %s' % - (tool_name, ', '.join(sorted(TOOL_REGISTRY.keys())))) - sys.exit(1) - - -def PushFilesForTool(tool_name, device): - """Pushes the files required for |tool_name| to |device|. - - Args: - tool_name: Name of the tool to create. - device: A DeviceUtils instance. - """ - if not tool_name: - return - - clazz = TOOL_REGISTRY.get(tool_name) - if clazz: - clazz.CopyFiles(device) - else: - print('Unknown tool %s, available tools: %s' % (tool_name, ', '.join( - sorted(TOOL_REGISTRY.keys())))) - sys.exit(1) diff --git a/build/android/test_runner.py b/build/android/test_runner.py index cb265e7260..8ec41cdbe3 100755 --- a/build/android/test_runner.py +++ b/build/android/test_runner.py @@ -270,6 +270,9 @@ def AddCommonOptions(parser): help='If present, store test results on this path.') parser.add_argument('--isolated-script-test-perf-output', help='If present, store chartjson results on this path.') + parser.add_argument('--timeout-scale', + type=float, + help='Factor by which timeouts should be scaled.') AddTestLauncherOptions(parser) @@ -329,12 +332,7 @@ def AddDeviceOptions(parser): '--recover-devices', action='store_true', help='Attempt to recover devices prior to the final retry. Warning: ' - 'this will cause all devices to reboot.') - parser.add_argument( - '--tool', - dest='tool', - help='Run the test under a tool ' - '(use --tool help to list them)') + 'this will cause all devices to reboot.') parser.add_argument( '--upload-logcats-file', @@ -651,10 +649,6 @@ def AddInstrumentationTestOptions(parser): 'a proxy for determining if the current run is a retry without ' 'patch.')) parser.add_argument( - '--timeout-scale', - type=float, - help='Factor by which timeouts should be scaled.') - parser.add_argument( '--is-unit-test', action='store_true', help=('Specify the test suite as composed of unit tests, blocking ' diff --git a/build/android/test_runner.pydeps b/build/android/test_runner.pydeps index 38b854f0a4..b58e857c61 100644 --- a/build/android/test_runner.pydeps +++ b/build/android/test_runner.pydeps @@ -228,6 +228,5 @@ pylib/utils/logging_utils.py pylib/utils/repo_utils.py pylib/utils/test_filter.py pylib/utils/time_profile.py -pylib/valgrind_tools.py test_runner.py tombstones.py diff --git a/build/config/android/config.gni b/build/config/android/config.gni index fa0de909a0..502736c4cd 100644 --- a/build/config/android/config.gni +++ b/build/config/android/config.gni @@ -28,6 +28,7 @@ if (is_android || is_chromeos) { import("//build/config/android/channel.gni") import("//build/config/clang/clang.gni") import("//build/config/dcheck_always_on.gni") + import("//build/config/sanitizers/sanitizers.gni") import("//build/toolchain/siso.gni") import("//build_overrides/build.gni") import("abi.gni") @@ -67,6 +68,9 @@ if (is_android || is_chromeos) { # The default to use for android:minSdkVersion for targets that do # not explicitly set it. default_min_sdk_version = 26 + if (is_asan) { + default_min_sdk_version = 27 + } # Static analysis can be either "on" or "off" or "build_server". This # controls how android lint, error-prone, bytecode checks are run. This @@ -89,6 +93,12 @@ if (is_android || is_chromeos) { # Our build system no longer supports legacy multidex. min_supported_sdk_version = 21 + # ASAN requires O MR1. + # https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid/01f8df1ac1a447a8475cdfcb03e8b13140042dbd#running-with-wrapsh-recommended + if (is_asan) { + min_supported_sdk_version = 27 + } + assert( default_min_sdk_version >= min_supported_sdk_version, "default_min_sdk_version ($default_min_sdk_version) must be >= min_supported_sdk_version ($min_supported_sdk_version)") @@ -290,6 +300,11 @@ if (is_android || is_chromeos) { expectations_failure_dir = "$root_build_dir/failed_expectations" } + if (is_asan) { + # Disable lint since increasing min_sdk_version can cause ObsoleteSdkInt warnings. + disable_android_lint = true + } + # We need a second declare_args block to make sure we are using the overridden # value of the arguments set above. declare_args() { diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 6e7e68f7e4..82f30f3c8e 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni @@ -990,7 +990,7 @@ template("test_runner_script") { executable_args += [ "--fast-local-dev" ] } if (_device_test && is_asan) { - executable_args += [ "--tool=asan" ] + executable_args += [ "--timeout-scale=4" ] } if (defined(invoker.modules)) { @@ -2907,6 +2907,7 @@ if (enable_java_templates) { ] } if (defined(invoker.secondary_abi_loadable_modules)) { + _inputs += invoker.secondary_abi_loadable_modules _rebased_secondary_abi_loadable_modules = rebase_path(invoker.secondary_abi_loadable_modules, root_build_dir) _args += diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index e633dcd764..20bd196b8c 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni @@ -33,6 +33,9 @@ if (is_robolectric) { if (use_cfi_diag || is_ubsan || is_ubsan_security || is_ubsan_vptr) { _sanitizer_runtimes += [ "$clang_base_path/lib/clang/$clang_version/lib/linux/libclang_rt.ubsan_standalone-$sanitizer_arch-android.so" ] } + if (is_asan) { + _sanitizer_runtimes += [ "$clang_base_path/lib/clang/$clang_version/lib/linux/libclang_rt.asan-$sanitizer_arch-android.so" ] + } # Creates a dist directory for a native executable. # @@ -2103,6 +2106,9 @@ if (is_robolectric) { if (defined(invoker.min_sdk_version)) { _min_sdk_version = invoker.min_sdk_version } + if (is_asan && _min_sdk_version < min_supported_sdk_version) { + _min_sdk_version = min_supported_sdk_version + } if (defined(invoker.target_sdk_version)) { _target_sdk_version = invoker.target_sdk_version } @@ -2580,9 +2586,16 @@ if (is_robolectric) { if (defined(invoker.loadable_modules)) { _loadable_modules = invoker.loadable_modules } - - if (_native_libs_deps != []) { - _loadable_modules += _sanitizer_runtimes + _sanitizer_loadable_modules = [] + _sanitizer_deps = [] + if (_is_base_module && _native_libs_deps != [] && !_uses_static_library) { + _sanitizer_loadable_modules += _sanitizer_runtimes + } + if (is_asan && _is_base_module && + (_uses_static_library || _native_libs_deps != [])) { + _sanitizer_loadable_modules += + [ "$root_gen_dir/build/android/generate_wrap_sh/wrap.sh" ] + _sanitizer_deps += [ "//build/android:generate_wrap_sh" ] } _assertions_implicitly_enabled = defined(invoker.custom_assertion_handler) @@ -2731,7 +2744,11 @@ if (is_robolectric) { _secondary_abi_shared_library_list_file } - loadable_modules = _loadable_modules + if (!defined(deps)) { + deps = [] + } + deps += _sanitizer_deps + loadable_modules = _loadable_modules + _sanitizer_loadable_modules if (defined(_allowlist_r_txt_path) && _is_bundle_module) { # Used to write the file path to the target's .build_config.json only. @@ -2940,7 +2957,7 @@ if (is_robolectric) { # Need full deps rather than _non_java_deps, because loadable_modules # may include .so files extracted by __unpack_aar targets. - deps = _invoker_deps + [ ":$_build_config_target" ] + deps = _invoker_deps + _sanitizer_deps + [ ":$_build_config_target" ] if (defined(invoker.asset_deps)) { deps += invoker.asset_deps } @@ -2959,15 +2976,19 @@ if (is_robolectric) { # should be clearly named/labeled "incremental". output_apk_path = _incremental_apk_path + loadable_modules = _sanitizer_loadable_modules + # All native libraries are side-loaded, so use a placeholder to force # the proper bitness for the app. _has_native_libs = - defined(_native_libs_filearg) || _loadable_modules != [] - if (_has_native_libs && !defined(native_lib_placeholders)) { + defined(_native_libs_filearg) || _loadable_modules != [] || + _sanitizer_loadable_modules != [] + if (_has_native_libs && loadable_modules == [] && + !defined(native_lib_placeholders)) { native_lib_placeholders = [ "libfix.crbug.384638.so" ] } } else { - loadable_modules = _loadable_modules + loadable_modules = _loadable_modules + _sanitizer_loadable_modules deps += _all_native_libs_deps + [ ":$_compile_resources_target", ":$_merge_manifest_target", @@ -4495,6 +4516,9 @@ if (is_robolectric) { if (defined(invoker.min_sdk_version)) { _min_sdk_version = invoker.min_sdk_version } + if (is_asan && _min_sdk_version < min_supported_sdk_version) { + _min_sdk_version = min_supported_sdk_version + } _bundle_base_path = "$root_build_dir/apks" if (defined(invoker.bundle_base_path)) { diff --git a/build/config/siso/main.star b/build/config/siso/main.star index ed96f857dc..0ec145b31e 100644 --- a/build/config/siso/main.star +++ b/build/config/siso/main.star @@ -57,6 +57,7 @@ def __use_large_b289968566(ctx, step_config): "./obj/chrome/test/browser_tests/chrome_shelf_controller_browsertest.o", "./obj/chrome/test/browser_tests/device_local_account_browsertest.o", "./obj/chrome/test/browser_tests/file_manager_browsertest_base.o", + "./obj/chrome/test/browser_tests/file_tasks_browsertest.o", "./obj/chrome/test/browser_tests/full_restore_app_launch_handler_browsertest.o", "./obj/chrome/test/browser_tests/safe_browsing_blocking_page_test.o", "./obj/chrome/test/browser_tests/scalable_iph_browsertest.o", diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 682c108ea6..b5f7eeadd9 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1 @@ -1 +1 @@ -20.20240414.1.1 +20.20240430.3.1 diff --git a/build/util/LASTCHANGE b/build/util/LASTCHANGE index 00eee97690..6dbe648f19 100644 --- a/build/util/LASTCHANGE +++ b/build/util/LASTCHANGE @@ -1,2 +1,2 @@ -LASTCHANGE=dc7e21c7b04270a6b5fae49a0f67e7065d310bb2-refs/heads/main@{#1294160} +LASTCHANGE=0347db4c4f2ea6518b19403284bc31fbb46d1e2a-refs/heads/main@{#1294809} LASTCHANGE_YEAR=2024 diff --git a/build/util/LASTCHANGE.committime b/build/util/LASTCHANGE.committime index 6e0108eeaf..95451e6425 100644 --- a/build/util/LASTCHANGE.committime +++ b/build/util/LASTCHANGE.committime @@ -1 +1 @@ -1714452551
\ No newline at end of file +1714550162
\ No newline at end of file diff --git a/build/util/ide_query b/build/util/ide_query index 61b1e976ca..5286df4417 100755 --- a/build/util/ide_query +++ b/build/util/ide_query @@ -77,11 +77,17 @@ def main(): targets.append(target) if options.perform_build: - # use `-k=0` to build generated files as much as possible. if _use_reclient(options.out_dir): - args = ['autoninja', '-k=0', '-C', options.out_dir] + args = ['autoninja'] else: - args = ['siso', 'ninja', '-k=0', '-C', options.out_dir] + args = ['siso', 'ninja'] + # use `-k=0` to build generated files as much as possible. + args.extend([ + '-k=0', + '--prepare', + '-C', + options.out_dir, + ]) args.extend(targets) p = subprocess.run(args, cwd=repo_root, stdout=2, stderr=2) if p.returncode != 0: diff --git a/include/platform/autogen/FeaturesVk_autogen.h b/include/platform/autogen/FeaturesVk_autogen.h index 896fa7435e..876f85421b 100644 --- a/include/platform/autogen/FeaturesVk_autogen.h +++ b/include/platform/autogen/FeaturesVk_autogen.h @@ -1431,6 +1431,13 @@ struct FeaturesVk : FeatureSetBase &members, "https://issuetracker.google.com/336844257" }; + FeatureInfo supportsSynchronization2 = { + "supportsSynchronization2", + FeatureCategory::VulkanFeatures, + "VkDevice supports VK_KHR_synchronization2 extension", + &members, "https://issuetracker.google.com/336844257" + }; + }; inline FeaturesVk::FeaturesVk() = default; diff --git a/include/platform/vk_features.json b/include/platform/vk_features.json index a915735d87..8d4529dbfa 100644 --- a/include/platform/vk_features.json +++ b/include/platform/vk_features.json @@ -1562,6 +1562,14 @@ "Uses VkEvent instead of VkCmdPipelineBarrier for image barriers" ], "issue": "https://issuetracker.google.com/336844257" + }, + { + "name": "supports_synchronization2", + "category": "Features", + "description": [ + "VkDevice supports VK_KHR_synchronization2 extension" + ], + "issue": "https://issuetracker.google.com/336844257" } ] } diff --git a/scripts/code_generation_hashes/restricted_traces.json b/scripts/code_generation_hashes/restricted_traces.json index a6fbd2ea22..1f3c46f752 100644 --- a/scripts/code_generation_hashes/restricted_traces.json +++ b/scripts/code_generation_hashes/restricted_traces.json @@ -4,5 +4,5 @@ "src/tests/restricted_traces/gen_restricted_traces.py": "79978de70c2597f249241ed864562149", "src/tests/restricted_traces/restricted_traces.json": - "a9e99de4a370ddb0fa6fbfabd0cdd1e8" + "279bb36e98abc11a6d0d6ff9bf4650e6" } diff --git a/src/common/Spinlock.h b/src/common/Spinlock.h deleted file mode 100644 index b6b4542dab..0000000000 --- a/src/common/Spinlock.h +++ /dev/null @@ -1,80 +0,0 @@ -// -// Copyright 2021 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. -// -// Spinlock.h: -// Spinlock is a lock that loops actively until it gets the resource. -// Only use it when the lock will be granted in reasonably short time. - -#ifndef COMMON_SPINLOCK_H_ -#define COMMON_SPINLOCK_H_ - -#include "common/angleutils.h" - -#ifdef _MSC_VER -# include <intrin.h> // for _mm_pause() and __yield() -#endif - -#if defined(__ARM_ARCH_7__) || defined(__aarch64__) -# if defined(__GNUC__) || defined(__clang__) -# include <arm_acle.h> // for __yield() -# endif -#endif - -#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) -# define ANGLE_SMT_PAUSE() _mm_pause() -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -# define ANGLE_SMT_PAUSE() __asm__ __volatile__("pause;") -#elif defined(_M_ARM) || defined(_M_ARM64) || defined(__ARM_ARCH_7__) || defined(__aarch64__) -# define ANGLE_SMT_PAUSE() __yield() -#else -# define ANGLE_SMT_PAUSE() static_cast<void>(0) -#endif - -namespace angle -{ - -class Spinlock -{ - public: - Spinlock() noexcept; - - bool try_lock() noexcept; - void lock() noexcept; - void unlock() noexcept; - - private: - std::atomic_int mLock; -}; - -ANGLE_INLINE Spinlock::Spinlock() noexcept : mLock(0) {} - -ANGLE_INLINE bool Spinlock::try_lock() noexcept -{ - // Relaxed check first to prevent unnecessary cache misses. - return mLock.load(std::memory_order_relaxed) == 0 && - mLock.exchange(1, std::memory_order_acquire) == 0; -} - -ANGLE_INLINE void Spinlock::lock() noexcept -{ - while (mLock.exchange(1, std::memory_order_acquire) != 0) - { - // Relaxed wait to prevent unnecessary cache misses. - while (mLock.load(std::memory_order_relaxed) != 0) - { - // Optimization for simultaneous multithreading. - ANGLE_SMT_PAUSE(); - } - } -} - -ANGLE_INLINE void Spinlock::unlock() noexcept -{ - mLock.store(0, std::memory_order_release); -} - -} // namespace angle - -#endif // COMMON_SPINLOCK_H_ diff --git a/src/common/SynchronizedValue.h b/src/common/SynchronizedValue.h index 95432cfbcd..2a42dde380 100644 --- a/src/common/SynchronizedValue.h +++ b/src/common/SynchronizedValue.h @@ -11,6 +11,7 @@ #ifndef COMMON_SYNCHRONIZEDVALUE_H_ #define COMMON_SYNCHRONIZEDVALUE_H_ +#include "common/SimpleMutex.h" #include "common/debug.h" #include <mutex> @@ -19,7 +20,7 @@ namespace angle { -template <typename T, typename Lockable = std::mutex> +template <typename T, typename Lockable = angle::SimpleMutex> class ConstStrictLockPtr { public: @@ -35,7 +36,7 @@ class ConstStrictLockPtr : mLock(std::move(other.mLock)), mValue(other.mValue) {} - ConstStrictLockPtr(const ConstStrictLockPtr &) = delete; + ConstStrictLockPtr(const ConstStrictLockPtr &) = delete; ConstStrictLockPtr &operator=(const ConstStrictLockPtr &) = delete; ~ConstStrictLockPtr() = default; @@ -48,7 +49,7 @@ class ConstStrictLockPtr T const &mValue; }; -template <typename T, typename Lockable = std::mutex> +template <typename T, typename Lockable = angle::SimpleMutex> class StrictLockPtr : public ConstStrictLockPtr<T, Lockable> { private: @@ -64,7 +65,7 @@ class StrictLockPtr : public ConstStrictLockPtr<T, Lockable> : BaseType(std::move(static_cast<BaseType &&>(other))) {} - StrictLockPtr(const StrictLockPtr &) = delete; + StrictLockPtr(const StrictLockPtr &) = delete; StrictLockPtr &operator=(const StrictLockPtr &) = delete; ~StrictLockPtr() = default; @@ -85,7 +86,7 @@ struct SynchronizedValueStrictLockPtr<const SV> using type = ConstStrictLockPtr<typename SV::value_type, typename SV::mutex_type>; }; -template <typename T, typename Lockable = std::mutex> +template <typename T, typename Lockable = angle::SimpleMutex> class ConstUniqueLockPtr : public std::unique_lock<Lockable> { private: @@ -110,7 +111,7 @@ class ConstUniqueLockPtr : public std::unique_lock<Lockable> : BaseType(std::move(static_cast<BaseType &&>(other))), mValue(other.mValue) {} - ConstUniqueLockPtr(const ConstUniqueLockPtr &) = delete; + ConstUniqueLockPtr(const ConstUniqueLockPtr &) = delete; ConstUniqueLockPtr &operator=(const ConstUniqueLockPtr &) = delete; ~ConstUniqueLockPtr() = default; @@ -130,7 +131,7 @@ class ConstUniqueLockPtr : public std::unique_lock<Lockable> T const &mValue; }; -template <typename T, typename Lockable = std::mutex> +template <typename T, typename Lockable = angle::SimpleMutex> class UniqueLockPtr : public ConstUniqueLockPtr<T, Lockable> { private: @@ -152,7 +153,7 @@ class UniqueLockPtr : public ConstUniqueLockPtr<T, Lockable> : BaseType(std::move(static_cast<BaseType &&>(other))) {} - UniqueLockPtr(const UniqueLockPtr &) = delete; + UniqueLockPtr(const UniqueLockPtr &) = delete; UniqueLockPtr &operator=(const UniqueLockPtr &) = delete; ~UniqueLockPtr() = default; @@ -181,7 +182,7 @@ struct SynchronizedValueUniqueLockPtr<const SV> using type = ConstUniqueLockPtr<typename SV::value_type, typename SV::mutex_type>; }; -template <typename T, typename Lockable = std::mutex> +template <typename T, typename Lockable = angle::SimpleMutex> class SynchronizedValue { public: @@ -199,7 +200,7 @@ class SynchronizedValue {} template <typename... Args> - SynchronizedValue(Args &&... args) noexcept(noexcept(T(std::forward<Args>(args)...))) + SynchronizedValue(Args &&...args) noexcept(noexcept(T(std::forward<Args>(args)...))) : mValue(std::forward<Args>(args)...) {} @@ -336,7 +337,7 @@ class SynchronizedValue public: DerefValue(DerefValue &&other) : mLock(std::move(other.mLock)), mValue(other.mValue) {} - DerefValue(const DerefValue &) = delete; + DerefValue(const DerefValue &) = delete; DerefValue &operator=(const DerefValue &) = delete; operator T &() { return mValue; } @@ -363,7 +364,7 @@ class SynchronizedValue : mLock(std::move(other.mLock)), mValue(other.mValue) {} - ConstDerefValue(const ConstDerefValue &) = delete; + ConstDerefValue(const ConstDerefValue &) = delete; ConstDerefValue &operator=(const ConstDerefValue &) = delete; operator const T &() { return mValue; } diff --git a/src/libANGLE/CLDevice.h b/src/libANGLE/CLDevice.h index 6cd22f4a94..57dcf391ae 100644 --- a/src/libANGLE/CLDevice.h +++ b/src/libANGLE/CLDevice.h @@ -12,7 +12,6 @@ #include "libANGLE/CLObject.h" #include "libANGLE/renderer/CLDeviceImpl.h" -#include "common/Spinlock.h" #include "common/SynchronizedValue.h" #include <functional> @@ -65,7 +64,7 @@ class Device final : public _cl_device_id, public Object const rx::CLDeviceImpl::Ptr mImpl; const rx::CLDeviceImpl::Info mInfo; - angle::SynchronizedValue<CommandQueue *, angle::Spinlock> mDefaultCommandQueue = nullptr; + angle::SynchronizedValue<CommandQueue *> mDefaultCommandQueue = nullptr; friend class CommandQueue; friend class Platform; diff --git a/src/libANGLE/CLMemory.h b/src/libANGLE/CLMemory.h index 8f30efd438..3c1e227d9a 100644 --- a/src/libANGLE/CLMemory.h +++ b/src/libANGLE/CLMemory.h @@ -12,7 +12,6 @@ #include "libANGLE/CLObject.h" #include "libANGLE/renderer/CLMemoryImpl.h" -#include "common/Spinlock.h" #include "common/SynchronizedValue.h" #include <atomic> @@ -80,7 +79,7 @@ class Memory : public _cl_mem, public Object rx::CLMemoryImpl::Ptr mImpl; size_t mSize; - angle::SynchronizedValue<std::stack<CallbackData>, angle::Spinlock> mDestructorCallbacks; + angle::SynchronizedValue<std::stack<CallbackData>> mDestructorCallbacks; std::atomic<cl_uint> mMapCount; friend class Buffer; diff --git a/src/libANGLE/CLProgram.h b/src/libANGLE/CLProgram.h index bcd7de6840..49cadb1e9a 100644 --- a/src/libANGLE/CLProgram.h +++ b/src/libANGLE/CLProgram.h @@ -13,7 +13,6 @@ #include "libANGLE/cl_utils.h" #include "libANGLE/renderer/CLProgramImpl.h" -#include "common/Spinlock.h" #include "common/SynchronizedValue.h" #include <atomic> @@ -100,7 +99,7 @@ class Program final : public _cl_program, public Object // mCallback might be accessed from implementation initialization // and needs to be initialized first. - angle::SynchronizedValue<CallbackData, angle::Spinlock> mCallback; + angle::SynchronizedValue<CallbackData> mCallback; std::atomic<cl_uint> mNumAttachedKernels; rx::CLProgramImpl::Ptr mImpl; diff --git a/src/libANGLE/renderer/cl/CLContextCL.h b/src/libANGLE/renderer/cl/CLContextCL.h index a57de0638c..3d52c86e45 100644 --- a/src/libANGLE/renderer/cl/CLContextCL.h +++ b/src/libANGLE/renderer/cl/CLContextCL.h @@ -12,7 +12,6 @@ #include "libANGLE/renderer/CLContextImpl.h" -#include "common/Spinlock.h" #include "common/SynchronizedValue.h" #include <unordered_set> @@ -92,7 +91,7 @@ class CLContextCL : public CLContextImpl std::unordered_set<const _cl_sampler *> mSamplers; std::unordered_set<const _cl_command_queue *> mDeviceQueues; }; - using MutableData = angle::SynchronizedValue<Mutable, angle::Spinlock>; + using MutableData = angle::SynchronizedValue<Mutable>; const cl_context mNative; MutableData mData; diff --git a/src/libANGLE/renderer/gl/TextureGL.cpp b/src/libANGLE/renderer/gl/TextureGL.cpp index 2e3d4c8529..485847b244 100644 --- a/src/libANGLE/renderer/gl/TextureGL.cpp +++ b/src/libANGLE/renderer/gl/TextureGL.cpp @@ -664,6 +664,7 @@ angle::Result TextureGL::setCompressedSubImage(const gl::Context *context, nativegl::GetCompressedSubTexImageFormat(functions, features, format); stateManager->bindTexture(getType(), mTextureID); + ANGLE_TRY(stateManager->setPixelUnpackState(context, unpack)); if (nativegl::UseTexImage2D(getType())) { ASSERT(area.z == 0 && area.depth == 1); diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp index 7f9e90fed3..1ad847e359 100644 --- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp +++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp @@ -1497,11 +1497,7 @@ bool RenderPassAttachment::onAccessImpl(ResourceAccess access, uint32_t currentC // CommandBufferHelperCommon implementation. CommandBufferHelperCommon::CommandBufferHelperCommon() - : mPipelineBarriers(), - mPipelineBarrierMask(), - mCommandPool(nullptr), - mHasShaderStorageOutput(false), - mHasGLMemoryBarrierIssued(false) + : mCommandPool(nullptr), mHasShaderStorageOutput(false), mHasGLMemoryBarrierIssued(false) {} CommandBufferHelperCommon::~CommandBufferHelperCommon() {} @@ -1622,10 +1618,7 @@ void CommandBufferHelperCommon::bufferWrite(ContextVk *contextVk, buffer->setWriteQueueSerial(mQueueSerial); VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[writeStage]; - if (buffer->recordWriteBarrier(writeAccessType, stageBits, &mPipelineBarriers[writeStage])) - { - mPipelineBarrierMask.set(writeStage); - } + buffer->recordWriteBarrier(writeAccessType, stageBits, &mPipelineBarriers, writeStage); // Make sure host-visible buffer writes result in a barrier inserted at the end of the frame to // make the results visible to the host. The buffer may be mapped by the application in the @@ -1636,8 +1629,7 @@ void CommandBufferHelperCommon::bufferWrite(ContextVk *contextVk, } } -void CommandBufferHelperCommon::executeBarriers(const angle::FeaturesVk &features, - CommandsState *commandsState) +void CommandBufferHelperCommon::executeBarriers(Renderer *renderer, CommandsState *commandsState) { // Add ANI semaphore to the command submission. if (mAcquireNextImageSemaphore.valid()) @@ -1646,34 +1638,7 @@ void CommandBufferHelperCommon::executeBarriers(const angle::FeaturesVk &feature commandsState->waitSemaphoreStageMasks.emplace_back(kSwapchainAcquireImageWaitStageFlags); } - // make a local copy for faster access - PipelineStagesMask mask = mPipelineBarrierMask; - if (mask.none()) - { - return; - } - - PrimaryCommandBuffer &primary = commandsState->primaryCommands; - - if (features.preferAggregateBarrierCalls.enabled) - { - PipelineStagesMask::Iterator iter = mask.begin(); - PipelineBarrier &barrier = mPipelineBarriers[*iter]; - for (++iter; iter != mask.end(); ++iter) - { - barrier.merge(&mPipelineBarriers[*iter]); - } - barrier.execute(&primary); - } - else - { - for (PipelineStage pipelineStage : mask) - { - PipelineBarrier &barrier = mPipelineBarriers[pipelineStage]; - barrier.execute(&primary); - } - } - mPipelineBarrierMask.reset(); + mPipelineBarriers.execute(renderer, &commandsState->primaryCommands); } void CommandBufferHelperCommon::bufferReadImpl(VkAccessFlags readAccessType, @@ -1681,11 +1646,7 @@ void CommandBufferHelperCommon::bufferReadImpl(VkAccessFlags readAccessType, BufferHelper *buffer) { VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[readStage]; - if (buffer->recordReadBarrier(readAccessType, stageBits, &mPipelineBarriers[readStage])) - { - mPipelineBarrierMask.set(readStage); - } - + buffer->recordReadBarrier(readAccessType, stageBits, &mPipelineBarriers, readStage); ASSERT(!usesBufferForWrite(*buffer)); } @@ -1720,36 +1681,21 @@ void CommandBufferHelperCommon::updateImageLayoutAndBarrier(Context *context, VkImageAspectFlags aspectFlags, ImageLayout imageLayout) { - PipelineStage barrierIndex = kImageMemoryBarrierData[imageLayout].barrierIndex; - ASSERT(barrierIndex != PipelineStage::InvalidEnum); - PipelineBarrier *barrier = &mPipelineBarriers[barrierIndex]; - VkSemaphore semaphore; - if (image->updateLayoutAndBarrier(context, aspectFlags, imageLayout, mQueueSerial, barrier, - &semaphore)) + VkSemaphore semaphore = VK_NULL_HANDLE; + image->updateLayoutAndBarrier(context, aspectFlags, imageLayout, mQueueSerial, + &mPipelineBarriers, &semaphore); + // If image has an ANI semaphore, move it to command buffer so that we can wait for it in + // next submission. + if (semaphore != VK_NULL_HANDLE) { - mPipelineBarrierMask.set(barrierIndex); - - // If image has an ANI semaphore, move it to command buffer so that we can wait for it in - // next submission. - if (semaphore != VK_NULL_HANDLE) - { - ASSERT(!mAcquireNextImageSemaphore.valid()); - mAcquireNextImageSemaphore.setHandle(semaphore); - } + ASSERT(!mAcquireNextImageSemaphore.valid()); + mAcquireNextImageSemaphore.setHandle(semaphore); } } void CommandBufferHelperCommon::addCommandDiagnosticsCommon(std::ostringstream *out) { - *out << "Memory Barrier: "; - for (PipelineBarrier &barrier : mPipelineBarriers) - { - if (!barrier.isEmpty()) - { - barrier.addDiagnosticsString(*out); - } - } - *out << "\\l"; + mPipelineBarriers.addDiagnosticsString(*out); } // OutsideRenderPassCommandBufferHelper implementation. @@ -1845,7 +1791,7 @@ angle::Result OutsideRenderPassCommandBufferHelper::flushToPrimary(Context *cont Renderer *renderer = context->getRenderer(); // Commands that are added to primary before beginRenderPass command - executeBarriers(renderer->getFeatures(), commandsState); + executeBarriers(renderer, commandsState); // When using Vulkan secondary command buffers and "asyncCommandQueue" is enabled, command // buffer MUST be already ended in the detachCommandPool() (called in the CommandProcessor). @@ -2829,7 +2775,7 @@ angle::Result RenderPassCommandBufferHelper::flushToPrimary(Context *context, PrimaryCommandBuffer &primary = commandsState->primaryCommands; // Commands that are added to primary before beginRenderPass command - executeBarriers(context->getRenderer()->getFeatures(), commandsState); + executeBarriers(context->getRenderer(), commandsState); VkRenderPassBeginInfo beginInfo = {}; beginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; @@ -4946,6 +4892,51 @@ void PipelineBarrier::addDiagnosticsString(std::ostringstream &out) const } } +// PipelineBarrierArray implementation. +void PipelineBarrierArray::execute(Renderer *renderer, PrimaryCommandBuffer *primary) +{ + // make a local copy for faster access + PipelineStagesMask mask = mBarrierMask; + if (mask.none()) + { + return; + } + + if (renderer->getFeatures().preferAggregateBarrierCalls.enabled) + { + PipelineStagesMask::Iterator iter = mask.begin(); + PipelineBarrier &barrier = mBarriers[*iter]; + for (++iter; iter != mask.end(); ++iter) + { + barrier.merge(&mBarriers[*iter]); + } + barrier.execute(primary); + } + else + { + for (PipelineStage pipelineStage : mask) + { + PipelineBarrier &barrier = mBarriers[pipelineStage]; + barrier.execute(primary); + } + } + mBarrierMask.reset(); +} + +void PipelineBarrierArray::addDiagnosticsString(std::ostringstream &out) const +{ + out << "Memory Barrier: "; + for (PipelineStage pipelineStage : mBarrierMask) + { + const PipelineBarrier &barrier = mBarriers[pipelineStage]; + if (!barrier.isEmpty()) + { + barrier.addDiagnosticsString(out); + } + } + out << "\\l"; +} + // BufferHelper implementation. BufferHelper::BufferHelper() : mCurrentQueueFamilyIndex(std::numeric_limits<uint32_t>::max()), @@ -5392,32 +5383,30 @@ bool BufferHelper::isReleasedToExternal() const return mIsReleasedToExternal; } -bool BufferHelper::recordReadBarrier(VkAccessFlags readAccessType, +void BufferHelper::recordReadBarrier(VkAccessFlags readAccessType, VkPipelineStageFlags readStage, - PipelineBarrier *barrier) + PipelineBarrierArray *barriers, + PipelineStage stageIndex) { - bool barrierModified = false; // If there was a prior write and we are making a read that is either a new access type or from // a new stage, we need a barrier if (mCurrentWriteAccess != 0 && (((mCurrentReadAccess & readAccessType) != readAccessType) || ((mCurrentReadStages & readStage) != readStage))) { - barrier->mergeMemoryBarrier(mCurrentWriteStages, readStage, mCurrentWriteAccess, - readAccessType); - barrierModified = true; + barriers->mergeMemoryBarrier(stageIndex, mCurrentWriteStages, readStage, + mCurrentWriteAccess, readAccessType); } // Accumulate new read usage. mCurrentReadAccess |= readAccessType; mCurrentReadStages |= readStage; - return barrierModified; } -bool BufferHelper::recordWriteBarrier(VkAccessFlags writeAccessType, +void BufferHelper::recordWriteBarrier(VkAccessFlags writeAccessType, VkPipelineStageFlags writeStage, - PipelineBarrier *barrier) + PipelineBarrierArray *barriers, + PipelineStage stageIndex) { - bool barrierModified = false; // We don't need to check mCurrentReadStages here since if it is not zero, mCurrentReadAccess // must not be zero as well. stage is finer grain than accessType. ASSERT((!mCurrentReadStages && !mCurrentReadAccess) || @@ -5425,8 +5414,8 @@ bool BufferHelper::recordWriteBarrier(VkAccessFlags writeAccessType, if (mCurrentReadAccess != 0 || mCurrentWriteAccess != 0) { VkPipelineStageFlags srcStageMask = mCurrentWriteStages | mCurrentReadStages; - barrier->mergeMemoryBarrier(srcStageMask, writeStage, mCurrentWriteAccess, writeAccessType); - barrierModified = true; + barriers->mergeMemoryBarrier(stageIndex, srcStageMask, writeStage, mCurrentWriteAccess, + writeAccessType); } // Reset usages on the new write. @@ -5434,7 +5423,6 @@ bool BufferHelper::recordWriteBarrier(VkAccessFlags writeAccessType, mCurrentReadAccess = 0; mCurrentWriteStages = writeStage; mCurrentReadStages = 0; - return barrierModified; } void BufferHelper::fillWithColor(const angle::Color<uint8_t> &color, @@ -7121,17 +7109,18 @@ void ImageHelper::recordReadBarrier(Context *context, } } -bool ImageHelper::updateLayoutAndBarrier(Context *context, +void ImageHelper::updateLayoutAndBarrier(Context *context, VkImageAspectFlags aspectMask, ImageLayout newLayout, const QueueSerial &queueSerial, - PipelineBarrier *barrier, + PipelineBarrierArray *pipelineBarriers, VkSemaphore *semaphoreOut) { ASSERT(queueSerial.valid()); ASSERT(!mBarrierQueueSerial.valid() || mBarrierQueueSerial.getIndex() != queueSerial.getIndex() || mBarrierQueueSerial.getSerial() <= queueSerial.getSerial()); + ASSERT(kImageMemoryBarrierData[newLayout].barrierIndex != PipelineStage::InvalidEnum); // Once you transition to ImageLayout::SharedPresent, you never transition out of it. if (mCurrentLayout == ImageLayout::SharedPresent) @@ -7139,15 +7128,15 @@ bool ImageHelper::updateLayoutAndBarrier(Context *context, newLayout = ImageLayout::SharedPresent; } - bool barrierModified = false; if (newLayout == mCurrentLayout) { if (mBarrierQueueSerial == queueSerial) { + ASSERT(!mAcquireNextImageSemaphore.valid()); // If there is no layout change and the previous layout change happened in the same // render pass, then early out do nothing. This can happen when the same image is // attached to the multiple attachments of the framebuffer. - return false; + return; } const ImageMemoryBarrierData &layoutData = kImageMemoryBarrierData[mCurrentLayout]; @@ -7155,10 +7144,10 @@ bool ImageHelper::updateLayoutAndBarrier(Context *context, // changed. The following asserts that such a barrier is not attempted. ASSERT(HasResourceWriteAccess(layoutData.type)); // No layout change, only memory barrier is required - barrier->mergeMemoryBarrier(GetImageLayoutSrcStageMask(context, layoutData), - GetImageLayoutDstStageMask(context, layoutData), - layoutData.srcAccessMask, layoutData.dstAccessMask); - barrierModified = true; + pipelineBarriers->mergeMemoryBarrier(layoutData.barrierIndex, + GetImageLayoutSrcStageMask(context, layoutData), + GetImageLayoutDstStageMask(context, layoutData), + layoutData.srcAccessMask, layoutData.dstAccessMask); mBarrierQueueSerial = queueSerial; } else @@ -7177,18 +7166,19 @@ bool ImageHelper::updateLayoutAndBarrier(Context *context, // against previous non-shaderRead layout. We do not barrier between one shaderRead and // another shaderRead. bool isNewReadStage = (mCurrentShaderReadStageMask & dstStageMask) != dstStageMask; - if (isNewReadStage) + if (!isNewReadStage) { - const ImageMemoryBarrierData &layoutData = - kImageMemoryBarrierData[mLastNonShaderReadOnlyLayout]; - barrier->mergeMemoryBarrier(GetImageLayoutSrcStageMask(context, layoutData), - dstStageMask, layoutData.srcAccessMask, - transitionTo.dstAccessMask); - barrierModified = true; - mBarrierQueueSerial = queueSerial; - // Accumulate new read stage. - mCurrentShaderReadStageMask |= dstStageMask; + ASSERT(!mAcquireNextImageSemaphore.valid()); + return; } + const ImageMemoryBarrierData &layoutData = + kImageMemoryBarrierData[mLastNonShaderReadOnlyLayout]; + pipelineBarriers->mergeMemoryBarrier( + transitionTo.barrierIndex, GetImageLayoutSrcStageMask(context, layoutData), + dstStageMask, layoutData.srcAccessMask, transitionTo.dstAccessMask); + mBarrierQueueSerial = queueSerial; + // Accumulate new read stage. + mCurrentShaderReadStageMask |= dstStageMask; } else { @@ -7205,8 +7195,8 @@ bool ImageHelper::updateLayoutAndBarrier(Context *context, mCurrentShaderReadStageMask = 0; mLastNonShaderReadOnlyLayout = ImageLayout::Undefined; } - barrier->mergeImageBarrier(srcStageMask, dstStageMask, imageMemoryBarrier); - barrierModified = true; + pipelineBarriers->mergeImageBarrier(transitionTo.barrierIndex, srcStageMask, + dstStageMask, imageMemoryBarrier); mBarrierQueueSerial = queueSerial; // If we are transition into shaderRead layout, remember the last @@ -7220,10 +7210,7 @@ bool ImageHelper::updateLayoutAndBarrier(Context *context, mCurrentLayout = newLayout; } - ASSERT(barrierModified || !mAcquireNextImageSemaphore.valid()); *semaphoreOut = mAcquireNextImageSemaphore.release(); - - return barrierModified; } void ImageHelper::clearColor(Context *context, diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.h b/src/libANGLE/renderer/vulkan/vk_helpers.h index 18bdb01305..1d0a79b7f9 100644 --- a/src/libANGLE/renderer/vulkan/vk_helpers.h +++ b/src/libANGLE/renderer/vulkan/vk_helpers.h @@ -762,7 +762,7 @@ class PipelineBarrier : angle::NonCopyable mMemoryBarrierDstAccess(0), mImageMemoryBarriers() {} - ~PipelineBarrier() = default; + ~PipelineBarrier() { ASSERT(mImageMemoryBarriers.empty()); } bool isEmpty() const { return mImageMemoryBarriers.empty() && mMemoryBarrierDstAccess == 0; } @@ -841,7 +841,37 @@ class PipelineBarrier : angle::NonCopyable VkAccessFlags mMemoryBarrierDstAccess; std::vector<VkImageMemoryBarrier> mImageMemoryBarriers; }; -using PipelineBarrierArray = angle::PackedEnumMap<PipelineStage, PipelineBarrier>; + +class PipelineBarrierArray final +{ + public: + void mergeMemoryBarrier(PipelineStage stageIndex, + VkPipelineStageFlags srcStageMask, + VkPipelineStageFlags dstStageMask, + VkAccessFlags srcAccess, + VkAccessFlags dstAccess) + { + mBarriers[stageIndex].mergeMemoryBarrier(srcStageMask, dstStageMask, srcAccess, dstAccess); + mBarrierMask.set(stageIndex); + } + + void mergeImageBarrier(PipelineStage stageIndex, + VkPipelineStageFlags srcStageMask, + VkPipelineStageFlags dstStageMask, + const VkImageMemoryBarrier &imageMemoryBarrier) + { + mBarriers[stageIndex].mergeImageBarrier(srcStageMask, dstStageMask, imageMemoryBarrier); + mBarrierMask.set(stageIndex); + } + + void execute(Renderer *renderer, PrimaryCommandBuffer *primary); + + void addDiagnosticsString(std::ostringstream &out) const; + + private: + angle::PackedEnumMap<PipelineStage, PipelineBarrier> mBarriers; + PipelineStagesMask mBarrierMask; +}; enum class MemoryCoherency : uint8_t { @@ -946,13 +976,15 @@ class BufferHelper : public ReadWriteResource // Returns true if the image is owned by an external API or instance. bool isReleasedToExternal() const; - bool recordReadBarrier(VkAccessFlags readAccessType, + void recordReadBarrier(VkAccessFlags readAccessType, VkPipelineStageFlags readStage, - PipelineBarrier *barrier); + PipelineBarrierArray *barriers, + PipelineStage stageIndex); - bool recordWriteBarrier(VkAccessFlags writeAccessType, + void recordWriteBarrier(VkAccessFlags writeAccessType, VkPipelineStageFlags writeStage, - PipelineBarrier *barrier); + PipelineBarrierArray *barriers, + PipelineStage stageIndex); void fillWithColor(const angle::Color<uint8_t> &color, const gl::InternalFormat &internalFormat); @@ -1268,7 +1300,7 @@ class CommandBufferHelperCommon : angle::NonCopyable return buffer.writtenByCommandBuffer(mQueueSerial); } - void executeBarriers(const angle::FeaturesVk &features, CommandsState *commandsState); + void executeBarriers(Renderer *renderer, CommandsState *commandsState); // The markOpen and markClosed functions are to aid in proper use of the *CommandBufferHelper. // saw invalid use due to threading issues that can be easily caught by marking when it's safe @@ -1362,7 +1394,6 @@ class CommandBufferHelperCommon : angle::NonCopyable // Barriers to be executed before the command buffer. PipelineBarrierArray mPipelineBarriers; - PipelineStagesMask mPipelineBarrierMask; // The command pool *CommandBufferHelper::mCommandBuffer is allocated from. Only used with // Vulkan secondary command buffers (as opposed to ANGLE's SecondaryCommandBuffer). @@ -2469,11 +2500,11 @@ class ImageHelper final : public Resource, public angle::Subject OutsideRenderPassCommandBuffer *commandBuffer); // Returns true if barrier has been generated - bool updateLayoutAndBarrier(Context *context, + void updateLayoutAndBarrier(Context *context, VkImageAspectFlags aspectMask, ImageLayout newLayout, const QueueSerial &queueSerial, - PipelineBarrier *barrier, + PipelineBarrierArray *pipelineBarriers, VkSemaphore *semaphoreOut); // Performs an ownership transfer from an external instance or API. diff --git a/src/libANGLE/renderer/vulkan/vk_renderer.cpp b/src/libANGLE/renderer/vulkan/vk_renderer.cpp index 6ab2a187e9..8b4ef65e27 100644 --- a/src/libANGLE/renderer/vulkan/vk_renderer.cpp +++ b/src/libANGLE/renderer/vulkan/vk_renderer.cpp @@ -2518,6 +2518,11 @@ void Renderer::appendDeviceExtensionFeaturesPromotedTo13( { vk::AddToPNextChain(deviceFeatures, &mExtendedDynamicState2Features); } + + if (ExtensionFound(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, deviceExtensionNames)) + { + vk::AddToPNextChain(deviceFeatures, &mSynchronization2Features); + } } void Renderer::queryDeviceExtensionFeatures(const vk::ExtensionNameList &deviceExtensionNames) @@ -2697,6 +2702,9 @@ void Renderer::queryDeviceExtensionFeatures(const vk::ExtensionNameList &deviceE m16BitStorageFeatures = {}; m16BitStorageFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR; + mSynchronization2Features = {}; + mSynchronization2Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES; + #if defined(ANGLE_PLATFORM_ANDROID) mExternalFormatResolveFeatures = {}; mExternalFormatResolveFeatures.sType = @@ -2773,6 +2781,7 @@ void Renderer::queryDeviceExtensionFeatures(const vk::ExtensionNameList &deviceE mHostImageCopyProperties.pNext = nullptr; m8BitStorageFeatures.pNext = nullptr; m16BitStorageFeatures.pNext = nullptr; + mSynchronization2Features.pNext = nullptr; #if defined(ANGLE_PLATFORM_ANDROID) mExternalFormatResolveFeatures.pNext = nullptr; mExternalFormatResolveProperties.pNext = nullptr; @@ -3230,6 +3239,12 @@ void Renderer::enableDeviceExtensionsPromotedTo13(const vk::ExtensionNameList &d mEnabledDeviceExtensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); vk::AddToPNextChain(&mEnabledFeatures, &mExtendedDynamicState2Features); } + + if (mFeatures.supportsSynchronization2.enabled) + { + mEnabledDeviceExtensions.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); + vk::AddToPNextChain(&mEnabledFeatures, &mSynchronization2Features); + } } angle::Result Renderer::enableDeviceExtensions(vk::Context *context, diff --git a/src/libANGLE/renderer/vulkan/vk_renderer.h b/src/libANGLE/renderer/vulkan/vk_renderer.h index b0ba85ef8e..306482126c 100644 --- a/src/libANGLE/renderer/vulkan/vk_renderer.h +++ b/src/libANGLE/renderer/vulkan/vk_renderer.h @@ -927,6 +927,7 @@ class Renderer : angle::NonCopyable #endif VkPhysicalDevice8BitStorageFeatures m8BitStorageFeatures; VkPhysicalDevice16BitStorageFeatures m16BitStorageFeatures; + VkPhysicalDeviceSynchronization2Features mSynchronization2Features; angle::PackedEnumBitSet<gl::ShadingRate, uint8_t> mSupportedFragmentShadingRates; angle::PackedEnumMap<gl::ShadingRate, VkSampleCountFlags> diff --git a/src/libGLESv2.gni b/src/libGLESv2.gni index d50911160e..8bdcab6faa 100644 --- a/src/libGLESv2.gni +++ b/src/libGLESv2.gni @@ -20,7 +20,6 @@ libangle_common_headers = [ "src/common/PoolAlloc.h", "src/common/RingBufferAllocator.h", "src/common/SimpleMutex.h", - "src/common/Spinlock.h", "src/common/SynchronizedValue.h", "src/common/WorkerThread.h", "src/common/aligned_memory.h", diff --git a/src/tests/restricted_traces/restricted_traces.json b/src/tests/restricted_traces/restricted_traces.json index 40e3c6e4d0..90bd7a4c22 100644 --- a/src/tests/restricted_traces/restricted_traces.json +++ b/src/tests/restricted_traces/restricted_traces.json @@ -152,6 +152,7 @@ "mini_block_craft 1", "mini_world 5", "mobile_legends 5", + "modern_combat_5 1", "monster_hunter_stories 1", "monster_strike 1", "monument_valley 1", diff --git a/src/tests/test_utils/angle_test_instantiate.cpp b/src/tests/test_utils/angle_test_instantiate.cpp index 10e65585d8..45dffbe5f0 100644 --- a/src/tests/test_utils/angle_test_instantiate.cpp +++ b/src/tests/test_utils/angle_test_instantiate.cpp @@ -372,8 +372,8 @@ bool IsNVIDIA() bool IsQualcomm() { - return IsNexus5X() || IsNexus9() || IsPixelXL() || IsPixel2() || IsPixel2XL() || IsPixel4() || - IsPixel4XL(); + return HasSystemVendorID(kVendorID_Qualcomm) || IsNexus5X() || IsNexus9() || IsPixelXL() || + IsPixel2() || IsPixel2XL() || IsPixel4() || IsPixel4XL(); } bool HasMesa() diff --git a/util/autogen/angle_features_autogen.cpp b/util/autogen/angle_features_autogen.cpp index 173269fbbb..89976fadf5 100644 --- a/util/autogen/angle_features_autogen.cpp +++ b/util/autogen/angle_features_autogen.cpp @@ -369,6 +369,7 @@ constexpr PackedEnumMap<Feature, const char *> kFeatureNames = {{ {Feature::SupportsSurfaceProtectedCapabilitiesExtension, "supportsSurfaceProtectedCapabilitiesExtension"}, {Feature::SupportsSurfaceProtectedSwapchains, "supportsSurfaceProtectedSwapchains"}, {Feature::SupportsSwapchainMaintenance1, "supportsSwapchainMaintenance1"}, + {Feature::SupportsSynchronization2, "supportsSynchronization2"}, {Feature::SupportsTimelineSemaphore, "supportsTimelineSemaphore"}, {Feature::SupportsTimestampSurfaceAttribute, "supportsTimestampSurfaceAttribute"}, {Feature::SupportsTransformFeedbackExtension, "supportsTransformFeedbackExtension"}, diff --git a/util/autogen/angle_features_autogen.h b/util/autogen/angle_features_autogen.h index ec9ac8e00b..0cadb2e2e9 100644 --- a/util/autogen/angle_features_autogen.h +++ b/util/autogen/angle_features_autogen.h @@ -369,6 +369,7 @@ enum class Feature SupportsSurfaceProtectedCapabilitiesExtension, SupportsSurfaceProtectedSwapchains, SupportsSwapchainMaintenance1, + SupportsSynchronization2, SupportsTimelineSemaphore, SupportsTimestampSurfaceAttribute, SupportsTransformFeedbackExtension, |