aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp1
-rw-r--r--DEPS37
-rw-r--r--build/OWNERS8
-rw-r--r--build/android/BUILD.gn15
-rwxr-xr-xbuild/android/generate_wrap_sh.py43
-rw-r--r--build/android/pylib/gtest/gtest_test_instance.py3
-rwxr-xr-xbuild/android/pylib/instrumentation/instrumentation_test_instance_test.py4
-rw-r--r--build/android/pylib/local/device/local_device_environment.py5
-rw-r--r--build/android/pylib/local/device/local_device_gtest_run.py30
-rw-r--r--build/android/pylib/local/device/local_device_instrumentation_test_run.py34
-rw-r--r--build/android/pylib/local/device/local_device_test_run.py8
-rw-r--r--build/android/pylib/local/local_test_server_spawner.py14
-rw-r--r--build/android/pylib/valgrind_tools.py116
-rwxr-xr-xbuild/android/test_runner.py14
-rw-r--r--build/android/test_runner.pydeps1
-rw-r--r--build/config/android/config.gni15
-rw-r--r--build/config/android/internal_rules.gni3
-rw-r--r--build/config/android/rules.gni40
-rw-r--r--build/config/siso/main.star1
-rw-r--r--build/fuchsia/linux_internal.sdk.sha12
-rw-r--r--build/util/LASTCHANGE2
-rw-r--r--build/util/LASTCHANGE.committime2
-rwxr-xr-xbuild/util/ide_query12
-rw-r--r--include/platform/autogen/FeaturesVk_autogen.h7
-rw-r--r--include/platform/vk_features.json8
-rw-r--r--scripts/code_generation_hashes/restricted_traces.json2
-rw-r--r--src/common/Spinlock.h80
-rw-r--r--src/common/SynchronizedValue.h25
-rw-r--r--src/libANGLE/CLDevice.h3
-rw-r--r--src/libANGLE/CLMemory.h3
-rw-r--r--src/libANGLE/CLProgram.h3
-rw-r--r--src/libANGLE/renderer/cl/CLContextCL.h3
-rw-r--r--src/libANGLE/renderer/gl/TextureGL.cpp1
-rw-r--r--src/libANGLE/renderer/vulkan/vk_helpers.cpp199
-rw-r--r--src/libANGLE/renderer/vulkan/vk_helpers.h51
-rw-r--r--src/libANGLE/renderer/vulkan/vk_renderer.cpp15
-rw-r--r--src/libANGLE/renderer/vulkan/vk_renderer.h1
-rw-r--r--src/libGLESv2.gni1
-rw-r--r--src/tests/restricted_traces/restricted_traces.json1
-rw-r--r--src/tests/test_utils/angle_test_instantiate.cpp4
-rw-r--r--util/autogen/angle_features_autogen.cpp1
-rw-r--r--util/autogen/angle_features_autogen.h1
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",
diff --git a/DEPS b/DEPS
index cf640ee730..eaeacbbb0d 100644
--- a/DEPS
+++ b/DEPS
@@ -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,