Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package chromium for openSUSE:Factory checked in at 2025-06-05 20:33:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/chromium (Old) and /work/SRC/openSUSE:Factory/.chromium.new.19631 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "chromium" Thu Jun 5 20:33:19 2025 rev:463 rq:1282255 version:137.0.7151.68 Changes: -------- --- /work/SRC/openSUSE:Factory/chromium/chromium.changes 2025-05-20 09:33:20.645310006 +0200 +++ /work/SRC/openSUSE:Factory/.chromium.new.19631/chromium.changes 2025-06-05 20:35:40.944644326 +0200 @@ -1,0 +2,56 @@ +Tue Jun 3 12:48:01 CEST 2025 - r...@suse.de + +- Chromium 137.0.7151.68 + (stable release 2025-06-03) (boo#1244019) + * CVE-2025-5419: Out of bounds read and write in V8 + * CVE-2025-5068: Use after free in Blink + - Google is aware that an exploit for CVE-2025-5419 + exists in the wild. + +------------------------------------------------------------------- +Fri May 30 00:25:43 CEST 2025 - r...@suse.de + +- added patches: + ppc-fedora-0001-add-xnn-ppc64el-support.patch + ppc-fedora-0002-regenerate-xnn-buildgn.patch + +------------------------------------------------------------------- +Wed May 28 01:08:19 CEST 2025 - r...@suse.de + +- Chromium 137.0.7151.55 + (stable release 2025-05-27) (boo#1243741) + * CVE-2025-5063: Use after free in Compositing + * CVE-2025-5280: Out of bounds write in V8 + * CVE-2025-5064: Inappropriate implementation in Background Fetch API + * CVE-2025-5065: Inappropriate implementation in FileSystemAccess API + * CVE-2025-5066: Inappropriate implementation in Messages + * CVE-2025-5281: Inappropriate implementation in BFCache + * CVE-2025-5283: Use after free in libvpx + * CVE-2025-5067: Inappropriate implementation in Tab Strip + +- dropped patches: + chromium-135-gperf-output.patch (upstream) +- modified patches: + chromium-125-compiler.patch (context) + chromium-127-rust-clanglib.patch (context) + ffmpeg-new-channel-layout.patch + (drop one hunk where upstream dropped the code) + system-libdrm.patch (context) + ppc-fedora-fix-partition-alloc-compile.patch (context) + ppc-fedora-0002-third_party-libvpx-Remove-bad-ppc64-config.patch (context) + ppc-fedora-0001-sandbox-Enable-seccomp_bpf-for-ppc64.patch (context) +- added patches: + chromium-137-pdfium_fix_pattribute.patch + (fix typo in pAttribute attributes) + chromium-137-heuristics_missing_includes.patch + (upstream patch 4c736420952f355f18bdc4f4ea2d16e4514fa034) + chromium-137-disruptive_notification_permissions_manager-missing_include.patch + (missing include) + - revert last skia patches for gather_unaligned until we have a port for ppc64le + ppc-skia-revert-1.patch + ppc-skia-revert-2.patch + ppc-skia-revert-3.patch +- keeplibs: + added third_party/compiler-rt + +------------------------------------------------------------------- Old: ---- chromium-135-gperf-output.patch chromium-136.0.7103.113.tar.xz New: ---- chromium-137-disruptive_notification_permissions_manager-missing_include.patch chromium-137-heuristics_missing_includes.patch chromium-137-pdfium_fix_pattribute.patch chromium-137.0.7151.68.tar.xz ppc-fedora-0001-add-xnn-ppc64el-support.patch ppc-fedora-0002-regenerate-xnn-buildgn.patch ppc-skia-revert-1.patch ppc-skia-revert-2.patch ppc-skia-revert-3.patch BETA DEBUG BEGIN: Old:- dropped patches: chromium-135-gperf-output.patch (upstream) - modified patches: BETA DEBUG END: BETA DEBUG BEGIN: New: (upstream patch 4c736420952f355f18bdc4f4ea2d16e4514fa034) chromium-137-disruptive_notification_permissions_manager-missing_include.patch (missing include) New: (fix typo in pAttribute attributes) chromium-137-heuristics_missing_includes.patch (upstream patch 4c736420952f355f18bdc4f4ea2d16e4514fa034) New:- added patches: chromium-137-pdfium_fix_pattribute.patch (fix typo in pAttribute attributes) New:- added patches: ppc-fedora-0001-add-xnn-ppc64el-support.patch ppc-fedora-0002-regenerate-xnn-buildgn.patch New: ppc-fedora-0001-add-xnn-ppc64el-support.patch ppc-fedora-0002-regenerate-xnn-buildgn.patch New: - revert last skia patches for gather_unaligned until we have a port for ppc64le ppc-skia-revert-1.patch ppc-skia-revert-2.patch New: ppc-skia-revert-1.patch ppc-skia-revert-2.patch ppc-skia-revert-3.patch New: ppc-skia-revert-2.patch ppc-skia-revert-3.patch - keeplibs: BETA DEBUG END: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ chromium.spec ++++++ --- /var/tmp/diff_new_pack.AvyN3L/_old 2025-06-05 20:36:07.669755548 +0200 +++ /var/tmp/diff_new_pack.AvyN3L/_new 2025-06-05 20:36:07.669755548 +0200 @@ -33,6 +33,9 @@ %bcond_with qt5 %endif %ifarch aarch64 ppc64le riscv64 +# ERROR Unresolved dependencies. +# //third_party/swiftshader/src/Reactor:swiftshader_reactor(//build/toolchain/linux/unbundle:default) +# needs //third_party/swiftshader/src/Reactor:swiftshader_subzero_reactor(//build/toolchain/linux/unbundle:default) %bcond_with swiftshader %else %bcond_without swiftshader @@ -107,7 +110,7 @@ %define n_suffix %{nil} %endif Name: chromium%{n_suffix} -Version: 136.0.7103.113 +Version: 137.0.7151.68 Release: 0 Summary: Google's open source browser project License: BSD-3-Clause AND LGPL-2.1-or-later @@ -157,7 +160,9 @@ Patch373: chromium-134-type-mismatch-error.patch Patch375: chromium-131-fix-qt-ui.pach Patch376: chromium-135-add_map_droppable.patch -Patch377: chromium-135-gperf-output.patch +Patch377: chromium-137-pdfium_fix_pattribute.patch +Patch378: chromium-137-heuristics_missing_includes.patch +Patch379: chromium-137-disruptive_notification_permissions_manager-missing_include.patch # conditionally applied patches ppc64le only Patch401: ppc-fedora-add-ppc64-architecture-string.patch Patch402: ppc-fedora-0001-linux-seccomp-bpf-ppc64-glibc-workaround-in-SIGSYS-h.patch @@ -216,6 +221,8 @@ Patch455: ppc-fedora-add-ppc64-pthread-stack-size.patch Patch456: ppc-fedora-fix-ppc64-rust_png-build-error.patch Patch457: ppc-chromium-136-clang-config.patch +Patch458: ppc-fedora-0001-add-xnn-ppc64el-support.patch +Patch459: ppc-fedora-0002-regenerate-xnn-buildgn.patch # conditionally applied patches # patch where ffmpeg < 5 Patch1002: chromium-125-ffmpeg-5.x-reordered_opaque.patch @@ -231,6 +238,9 @@ Patch1040: gtk-414.patch # clang is too old Patch1050: chromium-warning-suppression-mappings.patch +#Patch1061: ppc-skia-revert-1.patch +Patch1062: ppc-skia-revert-2.patch +Patch1063: ppc-skia-revert-3.patch # end conditionally applied patches BuildRequires: SDL-devel BuildRequires: bison @@ -522,6 +532,13 @@ %patch -p1 -R -P 1050 fi +%ifarch ppc64le +pushd third_party/skia +%patch -p1 -R -P 1062 +%patch -p1 -R -P 1063 +popd +%endif + %build # esbuild rm third_party/devtools-frontend/src/third_party/esbuild/esbuild @@ -628,6 +645,7 @@ third_party/ced third_party/cld_3 third_party/closure_compiler + third_party/compiler-rt third_party/content_analysis_sdk third_party/cpuinfo third_party/crashpad ++++++ _constraints ++++++ --- /var/tmp/diff_new_pack.AvyN3L/_old 2025-06-05 20:36:07.833762367 +0200 +++ /var/tmp/diff_new_pack.AvyN3L/_new 2025-06-05 20:36:07.837762534 +0200 @@ -21,5 +21,15 @@ </memory> </hardware> </overwrite> + <overwrite> + <conditions> + <arch>ppc64le</arch> + </conditions> + <hardware> + <disk> + <size unit="G">50</size> + </disk> + </hardware> + </overwrite> </constraints> ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.AvyN3L/_old 2025-06-05 20:36:07.853763199 +0200 +++ /var/tmp/diff_new_pack.AvyN3L/_new 2025-06-05 20:36:07.857763365 +0200 @@ -1,6 +1,6 @@ -mtime: 1747267435 -commit: 59433e07513aea31b8cdc823c99d2c5bed10d7ab34db6aa110c2cc8b8355fc29 +mtime: 1748948004 +commit: 92cf0b9d013dd842ba3c39f3ff8e9d418337da8b0ade3539c2d15d4dc1b19dea url: https://src.opensuse.org/chromium/chromium.git -revision: 59433e07513aea31b8cdc823c99d2c5bed10d7ab34db6aa110c2cc8b8355fc29 +revision: 92cf0b9d013dd842ba3c39f3ff8e9d418337da8b0ade3539c2d15d4dc1b19dea projectscmsync: https://src.opensuse.org/chromium/_ObsPrj.git ++++++ build.specials.obscpio ++++++ ++++++ chromium-125-compiler.patch ++++++ --- /var/tmp/diff_new_pack.AvyN3L/_old 2025-06-05 20:36:07.989768854 +0200 +++ /var/tmp/diff_new_pack.AvyN3L/_new 2025-06-05 20:36:07.993769020 +0200 @@ -1,6 +1,6 @@ ---- chromium-136.0.7103.17/build/config/compiler/BUILD.gn 2025/04/04 13:01:25 1.1 -+++ chromium-136.0.7103.17/build/config/compiler/BUILD.gn 2025/04/04 13:02:18 -@@ -307,9 +307,7 @@ +--- chromium-137.0.7151.15/build/config/compiler/BUILD.gn 2025/05/08 22:34:27 1.1 ++++ chromium-137.0.7151.15/build/config/compiler/BUILD.gn 2025/05/08 22:36:47 +@@ -308,9 +308,7 @@ configs += [ # See the definitions below. @@ -10,7 +10,7 @@ ":compiler_codegen", ":compiler_deterministic", ":clang_warning_suppression", -@@ -567,62 +565,6 @@ +@@ -569,69 +567,6 @@ ldflags += [ "-Wl,-z,keep-text-section-prefix" ] } @@ -64,16 +64,23 @@ - - # Enable ELF CREL (see crbug.com/357878242) for all platforms that use ELF - # (excluding toolchains that use an older version of LLVM). -- if (is_linux && !llvm_android_mainline && +- if (is_linux && use_lld && !llvm_android_mainline && - default_toolchain != "//build/toolchain/cros:target") { - cflags += [ "-Wa,--crel,--allow-experimental-crel" ] - } +- +- # TODO(crbug.com/413427035): Remove once +- # https://github.com/llvm/llvm-project/pull/136867/ is landed. +- if (!is_win && !llvm_android_mainline && +- default_toolchain != "//build/toolchain/cros:target") { +- cflags += [ "-fextend-variable-liveness=none" ] +- } - } - # C11/C++11 compiler flags setup. # --------------------------- if (is_linux || is_chromeos || is_android || (is_nacl && is_clang) || -@@ -1554,52 +1496,6 @@ +@@ -1569,52 +1504,6 @@ } } @@ -126,36 +133,88 @@ # Tells the compiler not to use absolute paths when passing the default # paths to the tools it invokes. We don't want this because we don't # really need it and it can mess up the RBE cache entries. -@@ -1618,28 +1514,6 @@ +@@ -1633,80 +1522,6 @@ } } -config("clang_revision") { - if (is_clang && clang_base_path == default_clang_base_path && - current_os != "zos") { -- update_args = [ -- "--print-revision", -- "--verify-version=$clang_version", -- ] +- _perform_consistency_checks = current_toolchain == default_toolchain - if (llvm_force_head_revision) { -- update_args += [ "--llvm-force-head-revision" ] +- _head_revision_stamp_path = "//third_party/llvm-build/force_head_revision" +- _head_revision = "" +- if (path_exists(_head_revision_stamp_path)) { +- _head_revision = read_file(_head_revision_stamp_path, "trim string") +- } +- assert( +- _head_revision != "", +- "llvm_force_head_revision=true, but no locally built version was detected.") +- _clang_revision = _head_revision +- } else { +- _clang_revision = read_file( +- "//third_party/llvm-build/Release+Asserts/cr_build_revision", +- "trim string") +- +- # Ensure that the synced clang version matches what's in git. +- if (_perform_consistency_checks) { +- # Parse the clang version from the Python script. +- _clang_version_lines = filter_include( +- read_file("//tools/clang/scripts/update.py", "list lines"), +- [ "CLANG_*REVISION = *" ]) +- _py_revision = +- string_replace(_clang_version_lines[0], "CLANG_REVISION = '", "") +- _py_revision = string_replace(_py_revision, "'", "") +- _py_subrevision = +- string_replace(_clang_version_lines[1], "CLANG_SUB_REVISION = ", "") +- _expected_clang_revision = "$_py_revision-$_py_subrevision" +- +- assert( +- _clang_revision == _expected_clang_revision, +- "clang_revision=\"$_clang_revision\" but update.py expected \"$_expected_clang_revision\". Did you forget to gclient sync?") +- } +- } +- +- if (_perform_consistency_checks) { +- # Ensure that the revision matches the version major expected by GN. +- _versions_match = filter_include([ _clang_revision ], +- [ "llvmorg-$clang_version-*" ]) != [] +- assert( +- _versions_match, +- "clang_revision=\"$_clang_revision\" but clang_version=\"$clang_version\". clang_version in build/toolchain/toolchain.gni is likely outdated.") +- } +- +- if (toolchain_has_rust && _perform_consistency_checks) { +- # Ensure that the synced rust version matches what's in git. +- _rust_revision_lines = +- filter_include(read_file("//tools/rust/update_rust.py", "list lines"), +- [ "RUST_*REVISION = *" ]) +- _py_revision = +- string_replace(_rust_revision_lines[0], "RUST_REVISION = '", "") +- _py_revision = string_replace(_py_revision, "'", "") +- _py_subrevision = +- string_replace(_rust_revision_lines[1], "RUST_SUB_REVISION = ", "") +- _expected_rust_revision = "$_py_revision-$_py_subrevision" +- +- # Ensure the rust version matches the clang version. +- assert( +- filter_include([ rustc_revision ], +- [ "*-$_expected_rust_revision-*" ]) != [], +- "rustc_revision=\"$rustc_revision\" but update_rust.py expected \"$_expected_rust_revision\". Run \"gclient sync\"?") - } -- clang_revision = exec_script("//tools/clang/scripts/update.py", -- update_args, -- "trim string") - - # This is here so that all files get recompiled after a clang roll and - # when turning clang on or off. (defines are passed via the command line, - # and build system rebuild things when their commandline changes). Nothing - # should ever read this define. -- defines = [ "CR_CLANG_REVISION=\"$clang_revision\"" ] +- defines = [ "CR_CLANG_REVISION=\"$_clang_revision\"" ] - } -} - # Controls the usage of a warning suppression mapping (WSM) file to suppress # warnings based on the path of the file they come from. It's controlled by the # `clang_warning_suppression_file` gn argument , which points to a text file -@@ -2112,10 +1986,6 @@ +@@ -2180,10 +1995,6 @@ } } else { cflags = [ "-Wall" ] @@ -166,7 +225,7 @@ # In Chromium code, we define __STDC_foo_MACROS in order to get the # C99 macros on Mac and Linux. -@@ -2124,24 +1994,6 @@ +@@ -2192,24 +2003,6 @@ "__STDC_FORMAT_MACROS", ] @@ -191,7 +250,7 @@ if (is_apple) { cflags_objc = [ "-Wimplicit-retain-self" ] cflags_objcc = [ "-Wimplicit-retain-self" ] -@@ -2564,7 +2416,8 @@ +@@ -2625,7 +2418,8 @@ # [0]: https://pinpoint-dot-chromeperf.appspot.com/job/147634a8be0000 # [1]: https://pinpoint-dot-chromeperf.appspot.com/job/132bc772be0000 # [2]: https://crrev.com/c/5447532 @@ -201,7 +260,7 @@ if (is_win) { # clang-cl's /O2 corresponds to clang's -O3, and really want -O2 for # consistency with the other platforms. -@@ -2613,7 +2466,8 @@ +@@ -2674,7 +2468,8 @@ } # Turn off optimizations. @@ -211,7 +270,7 @@ if (is_win) { cflags = [ "/Od", # Disable optimization. -@@ -2648,7 +2502,8 @@ +@@ -2709,7 +2504,8 @@ # Turns up the optimization level. Used to explicitly enable -O2 instead of # -Os for select targets on platforms that use optimize_for_size. No-op # elsewhere. @@ -221,7 +280,7 @@ if (is_nacl && is_nacl_irt) { # The NaCl IRT is a special case and always wants its own config. # Various components do: -@@ -2681,7 +2536,8 @@ +@@ -2742,7 +2538,8 @@ # # TODO(crbug.com/41259697) - rework how all of these configs are related # so that we don't need this disclaimer. @@ -231,7 +290,7 @@ if (is_nacl && is_nacl_irt) { # The NaCl IRT is a special case and always wants its own config. # Various components do: -@@ -2710,7 +2566,8 @@ +@@ -2771,7 +2568,8 @@ } } @@ -241,7 +300,7 @@ cflags = [ "-O1" ] + common_optimize_on_cflags rustflags = [ "-Copt-level=1" ] ldflags = common_optimize_on_ldflags -@@ -2841,7 +2698,8 @@ +@@ -2902,7 +2700,8 @@ } # Full symbols. @@ -251,7 +310,7 @@ rustflags = [] configs = [] if (is_win) { -@@ -3003,7 +2861,8 @@ +@@ -3064,7 +2863,8 @@ # Minimal symbols. # This config guarantees to hold symbol for stack trace which are shown to user # when crash happens in unittests running on buildbot. @@ -261,7 +320,7 @@ rustflags = [] if (is_win) { # Functions, files, and line tables only. -@@ -3088,7 +2947,8 @@ +@@ -3149,7 +2949,8 @@ # This configuration contains function names only. That is, the compiler is # told to not generate debug information and the linker then just puts function # names in the final debug information. ++++++ chromium-127-rust-clanglib.patch ++++++ --- /var/tmp/diff_new_pack.AvyN3L/_old 2025-06-05 20:36:08.021770184 +0200 +++ /var/tmp/diff_new_pack.AvyN3L/_new 2025-06-05 20:36:08.025770351 +0200 @@ -1,7 +1,7 @@ diff -up chromium-127.0.6533.72/build/rust/rust_bindgen.gni.me chromium-127.0.6533.72/build/rust/rust_bindgen.gni --- chromium-127.0.6533.72/build/rust/rust_bindgen.gni.me 2024-07-25 16:11:18.754551595 +0200 +++ chromium-127.0.6533.72/build/rust/rust_bindgen.gni 2024-07-25 16:11:33.997837660 +0200 -@@ -22,7 +22,7 @@ _libclang_path = rust_bindgen_root +@@ -23,7 +23,7 @@ if (host_os == "win") { _libclang_path += "/bin" } else { @@ -10,11 +10,10 @@ } # Template to build Rust/C bindings with bindgen. -@@ -105,6 +105,14 @@ - # it's declared. - deps = [ ":${_rust_bindgen_generator_name}_static_fns" ] +@@ -111,6 +111,13 @@ + deps += [ ":${_rust_bindgen_generator_name}_static_fns" ] } -+ + + # Default configs include "-fvisibility=hidden", and for some reason this + # causes bindgen not to emit function bindings. Override it. + args = [] ++++++ chromium-137-disruptive_notification_permissions_manager-missing_include.patch ++++++ --- chromium-137.0.7151.15/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h 2025/05/12 22:24:56 1.1 +++ chromium-137.0.7151.15/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h 2025/05/12 22:25:05 @@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_SAFETY_HUB_DISRUPTIVE_NOTIFICATION_PERMISSIONS_MANAGER_H_ #include <memory> +#include <set> #include "base/scoped_observation.h" #include "base/time/clock.h" ++++++ chromium-137-heuristics_missing_includes.patch ++++++ --- chromium-137.0.7151.15/content/browser/tpcd_heuristics/opener_heuristic_utils.h 2025/05/12 14:08:09 1.1 +++ chromium-137.0.7151.15/content/browser/tpcd_heuristics/opener_heuristic_utils.h 2025/05/12 14:08:21 @@ -6,6 +6,9 @@ #define CONTENT_BROWSER_TPCD_HEURISTICS_OPENER_HEURISTIC_UTILS_H_ #include <map> +#include <set> +#include <string> +#include <utility> #include "base/types/optional_ref.h" #include "content/common/content_export.h" ++++++ chromium-137-pdfium_fix_pattribute.patch ++++++ --- chromium-137.0.7151.15/third_party/pdfium/core/fxcodec/png/png_decoder.cpp 2025/05/12 14:04:10 1.1 +++ chromium-137.0.7151.15/third_party/pdfium/core/fxcodec/png/png_decoder.cpp 2025/05/12 14:04:27 @@ -52,8 +52,8 @@ CFX_DIBAttribute* pAttribute) { if (pAttribute) { #if defined(PNG_pHYs_SUPPORTED) - pAttribute->xdpi_ = png_get_x_pixels_per_meter(png_ptr, info_ptr); - pAttribute->ydpi_ = png_get_y_pixels_per_meter(png_ptr, info_ptr); + pAttribute->x_dpi_ = png_get_x_pixels_per_meter(png_ptr, info_ptr); + pAttribute->y_dpi_ = png_get_y_pixels_per_meter(png_ptr, info_ptr); png_uint_32 res_x, res_y; int unit_type; png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, &unit_type); ++++++ chromium-136.0.7103.113.tar.xz -> chromium-137.0.7151.68.tar.xz ++++++ /work/SRC/openSUSE:Factory/chromium/chromium-136.0.7103.113.tar.xz /work/SRC/openSUSE:Factory/.chromium.new.19631/chromium-137.0.7151.68.tar.xz differ: char 15, line 1 ++++++ ffmpeg-new-channel-layout.patch ++++++ --- /var/tmp/diff_new_pack.AvyN3L/_old 2025-06-05 20:36:08.157775839 +0200 +++ /var/tmp/diff_new_pack.AvyN3L/_new 2025-06-05 20:36:08.161776006 +0200 @@ -269,20 +269,6 @@ if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED && config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE) { channel_layout = CHANNEL_LAYOUT_DISCRETE; -@@ -348,11 +348,11 @@ bool FFmpegAudioDecoder::ConfigureDecoder(const AudioDecoderConfig& config) { - // Success! - av_sample_format_ = codec_context_->sample_fmt; - -- if (codec_context_->channels != config.channels()) { -+ if (codec_context_->ch_layout.nb_channels != config.channels()) { - MEDIA_LOG(ERROR, media_log_) - << "Audio configuration specified " << config.channels() - << " channels, but FFmpeg thinks the file contains " -- << codec_context_->channels << " channels"; -+ << codec_context_->ch_layout.nb_channels << " channels"; - ReleaseFFmpegResources(); - state_ = DecoderState::kUninitialized; - return false; @@ -403,7 +403,7 @@ int FFmpegAudioDecoder::GetAudioBuffer(struct AVCodecContext* s, if (frame->nb_samples <= 0) return AVERROR(EINVAL); ++++++ ppc-fedora-0001-add-xnn-ppc64el-support.patch ++++++ --- a/third_party/xnnpack/generate_build_gn.py +++ b/third_party/xnnpack/generate_build_gn.py @@ -236,7 +236,10 @@ _Platform(gn_cpu='x64', bazel_cpu='k8', bazel_platform='//:linux_x64'), _Platform(gn_cpu='arm64', bazel_cpu='aarch64', - bazel_platform='//:linux_aarch64') + bazel_platform='//:linux_aarch64'), + _Platform(gn_cpu='ppc64', + bazel_cpu='ppc64le', + bazel_platform='//:linux_ppc64le') ] --- a/third_party/xnnpack/bazelroot/BUILD +++ b/third_party/xnnpack/bazelroot/BUILD @@ -21,6 +21,14 @@ ], ) +platform( + name = "linux_ppc64le", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:ppc64le", + ], +) + # A dummy clang toolchain for building them for any arch. filegroup(name = "empty") ++++++ ppc-fedora-0001-sandbox-Enable-seccomp_bpf-for-ppc64.patch ++++++ --- /var/tmp/diff_new_pack.AvyN3L/_old 2025-06-05 20:36:08.233779000 +0200 +++ /var/tmp/diff_new_pack.AvyN3L/_new 2025-06-05 20:36:08.241779332 +0200 @@ -11,14 +11,11 @@ =================================================================== --- chromium-128.0.6613.113.orig/sandbox/features.gni +++ chromium-128.0.6613.113/sandbox/features.gni -@@ -9,7 +9,8 @@ +@@ -9,4 +9,5 @@ use_seccomp_bpf = (is_linux || is_chromeos || is_android) && (current_cpu == "x86" || current_cpu == "x64" || current_cpu == "arm" || current_cpu == "arm64" || - current_cpu == "mipsel" || current_cpu == "mips64el") + current_cpu == "mipsel" || current_cpu == "mips64el" || + current_cpu == "ppc64") - - # SSBD (Speculative Store Bypass Disable) is a mitigation of Spectre Variant 4. - # As Spectre Variant 4 can be mitigated by site isolation, opt-out SSBD on site ++++++ ppc-fedora-0002-regenerate-xnn-buildgn.patch ++++++ ++++ 80682 lines (skipped) ++++++ ppc-fedora-0002-third_party-libvpx-Remove-bad-ppc64-config.patch ++++++ ++++ 3176 lines (skipped) ++++ between /work/SRC/openSUSE:Factory/chromium/ppc-fedora-0002-third_party-libvpx-Remove-bad-ppc64-config.patch ++++ and /work/SRC/openSUSE:Factory/.chromium.new.19631/ppc-fedora-0002-third_party-libvpx-Remove-bad-ppc64-config.patch ++++++ ppc-fedora-fix-partition-alloc-compile.patch ++++++ --- /var/tmp/diff_new_pack.AvyN3L/_old 2025-06-05 20:36:08.405786152 +0200 +++ /var/tmp/diff_new_pack.AvyN3L/_new 2025-06-05 20:36:08.409786318 +0200 @@ -4,14 +4,14 @@ =================================================================== --- chromium-128.0.6613.113.orig/base/allocator/partition_allocator/partition_alloc.gni +++ chromium-128.0.6613.113/base/allocator/partition_allocator/partition_alloc.gni -@@ -69,7 +69,8 @@ - # NaCl targets don't use 64-bit pointers. +@@ -70,7 +70,8 @@ has_64_bit_pointers = false } else if (current_cpu == "x64" || current_cpu == "arm64" || -- current_cpu == "loong64" || current_cpu == "riscv64") { -+ current_cpu == "loong64" || current_cpu == "riscv64" || -+ current_cpu == "ppc64") { + current_cpu == "arm64e" || current_cpu == "loong64" || +- current_cpu == "riscv64") { ++ current_cpu == "riscv64" || current_cpu == "ppc64") { ++ + assert(current_cpu != "arm64e" || (is_ios && target_environment == "device")) has_64_bit_pointers = true } else if (current_cpu == "x86" || current_cpu == "arm" || - current_cpu == "wasm") { ++++++ ppc-fedora-fix-ppc64-linux-syscalls-headers.patch ++++++ --- /var/tmp/diff_new_pack.AvyN3L/_old 2025-06-05 20:36:08.421786817 +0200 +++ /var/tmp/diff_new_pack.AvyN3L/_new 2025-06-05 20:36:08.425786983 +0200 @@ -2,7 +2,7 @@ =================================================================== --- chromium-128.0.6613.113.orig/sandbox/linux/system_headers/ppc64_linux_syscalls.h +++ chromium-128.0.6613.113/sandbox/linux/system_headers/ppc64_linux_syscalls.h -@@ -8,5 +8,18 @@ +@@ -8,5 +8,21 @@ #include <asm/unistd.h> //TODO: is it necessary to redefine syscall numbers for PPC64? @@ -19,6 +19,9 @@ +#if !defined(__NR_shmat) +#define __NR_shmat 397 +#endif ++#if !defined(__NR_mseal) ++#define __NR_mseal 462 ++#endif #endif // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_ ++++++ ppc-skia-revert-1.patch ++++++ >From bb255dd0252e256a28542475b22711346c319030 Mon Sep 17 00:00:00 2001 From: Jason Simmons <jsimm...@google.com> Date: Fri, 16 May 2025 01:08:27 +0000 Subject: [PATCH] Fix shift of the blue component in store_1010102_xr Bug: https://github.com/flutter/flutter/issues/168849 Change-Id: I43c21535fbea6749f644301e162aacb2bbd5f5c3 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/994956 Reviewed-by: Michael Ludwig <michaellud...@google.com> Commit-Queue: Jason Simmons <jsimm...@google.com> diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h index fb644ba5e3..3784ccbde5 100644 --- a/src/opts/SkRasterPipeline_opts.h +++ b/src/opts/SkRasterPipeline_opts.h @@ -3137,7 +3137,7 @@ HIGHP_STAGE(store_1010102_xr, const SkRasterPipelineContexts::MemoryCtx* ctx) { // This is the inverse of from_1010102_xr, e.g. (v * 510 + 384) U32 px = to_unorm(r, /*scale=*/510, /*bias=*/384, /*maxI=*/1023) | to_unorm(g, /*scale=*/510, /*bias=*/384, /*maxI=*/1023) << 10 - | to_unorm(b, /*scale=*/510, /*bias=*/384, /*maxI=*/1023) << 10 + | to_unorm(b, /*scale=*/510, /*bias=*/384, /*maxI=*/1023) << 20 | to_unorm(a, /*scale=*/3) << 30; store(ptr, px); } ++++++ ppc-skia-revert-2.patch ++++++ >From c759c1a4717afadfedab300b6314f428b05741ac Mon Sep 17 00:00:00 2001 From: Kaylee Lubick <kjlub...@google.com> Date: Mon, 21 Apr 2025 14:51:16 -0400 Subject: [PATCH] Remove alignment assumptions in highp gather Follow-up to http://review.skia.org/981638 We didn't have any reports that this was causing a problem but I didn't want to leave the same root cause lurking. Change-Id: I0d42c4abf4d642f5a33e094f88bde7bf387d2f2f Bug: b/409859319 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/983176 Reviewed-by: Daniel Dilan <danieldi...@google.com> diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h index d14df3677c..fb644ba5e3 100644 --- a/src/opts/SkRasterPipeline_opts.h +++ b/src/opts/SkRasterPipeline_opts.h @@ -161,6 +161,8 @@ namespace SK_OPTS_NS { template <typename T> SI T gather(const T* p, U32 ix) { return p[ix]; } + template <typename T> + SI T gather_unaligned(const T* p, U32 ix) { return gather<T>(p, ix); } SI void scatter_masked(I32 src, int* dst, U32 ix, I32 mask) { dst[ix] = mask ? src : dst[ix]; @@ -274,9 +276,23 @@ namespace SK_OPTS_NS { #endif template <typename T> - SI V<T> gather(const T* p, U32 ix) { - return V<T>{p[ix[0]], p[ix[1]], p[ix[2]], p[ix[3]]}; + SI V<T> gather(const T* ptr, U32 ix) { + // The compiler assumes ptr is aligned, which caused crashes on some + // arm32 chips because a register was marked as "aligned to 32 bits" + // incorrectly. https://crbug.com/skia/409859319 + SkASSERTF(reinterpret_cast<uintptr_t>(ptr) % alignof(T) == 0, + "Should use gather_unaligned"); + return V<T>{ptr[ix[0]], ptr[ix[1]], ptr[ix[2]], ptr[ix[3]]}; + } + template <typename T> + SI V<T> gather_unaligned(const T* ptr, U32 ix) { + // This tells the compiler ptr might not be aligned appropriately, so + // it generates better assembly. + typedef T __attribute__ ((aligned (1))) unaligned_ptr; + const unaligned_ptr* uptr = static_cast<const unaligned_ptr*>(ptr); + return V<T>{uptr[ix[0]], uptr[ix[1]], uptr[ix[2]], uptr[ix[3]]}; } + SI void scatter_masked(I32 src, int* dst, U32 ix, I32 mask) { I32 before = gather(dst, ix); I32 after = if_then_else(mask, src, before); @@ -389,6 +405,11 @@ namespace SK_OPTS_NS { }; return sk_bit_cast<U64>(parts); } + template <typename T> + SI V<T> gather_unaligned(const T* p, U32 ix) { + return gather(p, ix); + } + template <typename V, typename S> SI void scatter_masked(V src, S* dst, U32 ix, I32 mask) { V before = gather(dst, ix); @@ -627,6 +648,11 @@ namespace SK_OPTS_NS { }; return sk_bit_cast<U64>(parts); } + template <typename T> + SI V<T> gather_unaligned(const T* p, U32 ix) { + return gather(p, ix); + } + SI void scatter_masked(I32 src, int* dst, U32 ix, I32 mask) { I32 before = gather(dst, ix); I32 after = if_then_else(mask, src, before); @@ -827,6 +853,10 @@ namespace SK_OPTS_NS { SI V<T> gather(const T* p, U32 ix) { return V<T>{p[ix[0]], p[ix[1]], p[ix[2]], p[ix[3]]}; } + template <typename T> + SI V<T> gather_unaligned(const T* p, U32 ix) { + return gather(p, ix); + } SI void scatter_masked(I32 src, int* dst, U32 ix, I32 mask) { I32 before = gather(dst, ix); I32 after = if_then_else(mask, src, before); @@ -988,6 +1018,10 @@ namespace SK_OPTS_NS { return V<T>{ p[ix[0]], p[ix[1]], p[ix[2]], p[ix[3]], p[ix[4]], p[ix[5]], p[ix[6]], p[ix[7]], }; } + template <typename T> + SI V<T> gather_unaligned(const T* p, U32 ix) { + return gather(p, ix); + } template <typename V, typename S> SI void scatter_masked(V src, S* dst, U32 ix, I32 mask) { @@ -1195,6 +1229,10 @@ namespace SK_OPTS_NS { ret = (F)__lsx_vinsgr2vr_w(ret, p[ix3], 3); return ret; } + template <typename T> + SI V<T> gather_unaligned(const T* p, U32 ix) { + return gather(p, ix); + } template <typename V, typename S> SI void scatter_masked(V src, S* dst, U32 ix, I32 mask) { @@ -2854,7 +2892,7 @@ HIGHP_STAGE(load_565_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) { HIGHP_STAGE(gather_565, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint16_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r,g); - from_565(gather(ptr, ix), &r,&g,&b); + from_565(gather_unaligned(ptr, ix), &r,&g,&b); a = F1; } HIGHP_STAGE(store_565, const SkRasterPipelineContexts::MemoryCtx* ctx) { @@ -2877,7 +2915,7 @@ HIGHP_STAGE(load_4444_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) { HIGHP_STAGE(gather_4444, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint16_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r,g); - from_4444(gather(ptr, ix), &r,&g,&b,&a); + from_4444(gather_unaligned(ptr, ix), &r,&g,&b,&a); } HIGHP_STAGE(store_4444, const SkRasterPipelineContexts::MemoryCtx* ctx) { auto ptr = ptr_at_xy<uint16_t>(ctx, dx,dy); @@ -2899,7 +2937,7 @@ HIGHP_STAGE(load_8888_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) { HIGHP_STAGE(gather_8888, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint32_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r,g); - from_8888(gather(ptr, ix), &r,&g,&b,&a); + from_8888(gather_unaligned(ptr, ix), &r,&g,&b,&a); } HIGHP_STAGE(store_8888, const SkRasterPipelineContexts::MemoryCtx* ctx) { auto ptr = ptr_at_xy<uint32_t>(ctx, dx,dy); @@ -2926,7 +2964,7 @@ HIGHP_STAGE(load_rg88_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) { HIGHP_STAGE(gather_rg88, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint16_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r, g); - from_88(gather(ptr, ix), &r, &g); + from_88(gather_unaligned(ptr, ix), &r, &g); b = F0; a = F1; } @@ -2950,7 +2988,7 @@ HIGHP_STAGE(gather_a16, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint16_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r, g); r = g = b = F0; - a = from_short(gather(ptr, ix)); + a = from_short(gather_unaligned(ptr, ix)); } HIGHP_STAGE(store_a16, const SkRasterPipelineContexts::MemoryCtx* ctx) { auto ptr = ptr_at_xy<uint16_t>(ctx, dx,dy); @@ -2974,7 +3012,7 @@ HIGHP_STAGE(load_rg1616_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) { HIGHP_STAGE(gather_rg1616, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint32_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r, g); - from_1616(gather(ptr, ix), &r, &g); + from_1616(gather_unaligned(ptr, ix), &r, &g); b = F0; a = F1; } @@ -2997,7 +3035,7 @@ HIGHP_STAGE(load_16161616_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) { HIGHP_STAGE(gather_16161616, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint64_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r, g); - from_16161616(gather(ptr, ix), &r, &g, &b, &a); + from_16161616(gather_unaligned(ptr, ix), &r, &g, &b, &a); } HIGHP_STAGE(store_16161616, const SkRasterPipelineContexts::MemoryCtx* ctx) { auto ptr = ptr_at_xy<uint16_t>(ctx, 4*dx,4*dy); @@ -3021,7 +3059,7 @@ HIGHP_STAGE(load_10x6_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) { HIGHP_STAGE(gather_10x6, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint64_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r, g); - from_10x6(gather(ptr, ix), &r, &g, &b, &a); + from_10x6(gather_unaligned(ptr, ix), &r, &g, &b, &a); } HIGHP_STAGE(store_10x6, const SkRasterPipelineContexts::MemoryCtx* ctx) { auto ptr = ptr_at_xy<uint16_t>(ctx, 4*dx,4*dy); @@ -3053,17 +3091,17 @@ HIGHP_STAGE(load_1010102_xr_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) HIGHP_STAGE(gather_1010102, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint32_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r,g); - from_1010102(gather(ptr, ix), &r,&g,&b,&a); + from_1010102(gather_unaligned(ptr, ix), &r,&g,&b,&a); } HIGHP_STAGE(gather_1010102_xr, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint32_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r, g); - from_1010102_xr(gather(ptr, ix), &r,&g,&b,&a); + from_1010102_xr(gather_unaligned(ptr, ix), &r,&g,&b,&a); } HIGHP_STAGE(gather_10101010_xr, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint64_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r, g); - from_10101010_xr(gather(ptr, ix), &r, &g, &b, &a); + from_10101010_xr(gather_unaligned(ptr, ix), &r, &g, &b, &a); } HIGHP_STAGE(load_10101010_xr, const SkRasterPipelineContexts::MemoryCtx* ctx) { auto ptr = ptr_at_xy<const uint64_t>(ctx, dx, dy); @@ -3127,7 +3165,7 @@ HIGHP_STAGE(load_f16_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) { HIGHP_STAGE(gather_f16, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint64_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r,g); - auto px = gather(ptr, ix); + auto px = gather_unaligned(ptr, ix); U16 R,G,B,A; load4((const uint16_t*)&px, &R,&G,&B,&A); @@ -3164,7 +3202,7 @@ HIGHP_STAGE(gather_af16, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint16_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r, g); r = g = b = F0; - a = from_half(gather(ptr, ix)); + a = from_half(gather_unaligned(ptr, ix)); } HIGHP_STAGE(store_af16, const SkRasterPipelineContexts::MemoryCtx* ctx) { auto ptr = ptr_at_xy<uint16_t>(ctx, dx,dy); @@ -3194,7 +3232,7 @@ HIGHP_STAGE(load_rgf16_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) { HIGHP_STAGE(gather_rgf16, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint32_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r, g); - auto px = gather(ptr, ix); + auto px = gather_unaligned(ptr, ix); U16 R,G; load2((const uint16_t*)&px, &R, &G); @@ -3220,10 +3258,10 @@ HIGHP_STAGE(load_f32_dst, const SkRasterPipelineContexts::MemoryCtx* ctx) { HIGHP_STAGE(gather_f32, const SkRasterPipelineContexts::GatherCtx* ctx) { const float* ptr; U32 ix = ix_and_ptr(&ptr, ctx, r,g); - r = gather(ptr, 4*ix + 0); - g = gather(ptr, 4*ix + 1); - b = gather(ptr, 4*ix + 2); - a = gather(ptr, 4*ix + 3); + r = gather_unaligned(ptr, 4*ix + 0); + g = gather_unaligned(ptr, 4*ix + 1); + b = gather_unaligned(ptr, 4*ix + 2); + a = gather_unaligned(ptr, 4*ix + 3); } HIGHP_STAGE(store_f32, const SkRasterPipelineContexts::MemoryCtx* ctx) { auto ptr = ptr_at_xy<float>(ctx, 4*dx,4*dy); @@ -5009,7 +5047,7 @@ HIGHP_STAGE(bilerp_clamp_8888, const SkRasterPipelineContexts::GatherCtx* ctx) { U32 ix = ix_and_ptr(&ptr, ctx, x,y); F sr,sg,sb,sa; - from_8888(gather(ptr, ix), &sr,&sg,&sb,&sa); + from_8888(gather_unaligned(ptr, ix), &sr,&sg,&sb,&sa); // In bilinear interpolation, the 4 pixels at +/- 0.5 offsets from the sample pixel center // are combined in direct proportion to their area overlapping that logical query pixel. @@ -5061,7 +5099,7 @@ HIGHP_STAGE(bicubic_clamp_8888, const SkRasterPipelineContexts::GatherCtx* ctx) U32 ix = ix_and_ptr(&ptr, ctx, sample_x, sample_y); F sr,sg,sb,sa; - from_8888(gather(ptr, ix), &sr,&sg,&sb,&sa); + from_8888(gather_unaligned(ptr, ix), &sr,&sg,&sb,&sa); r = mad(scale, sr, r); g = mad(scale, sg, g); @@ -5959,7 +5997,6 @@ SI void store(T* ptr, V v) { } #endif - // ~~~~~~ 32-bit memory loads and stores ~~~~~~ // SI void from_8888(U32 rgba, U16* r, U16* g, U16* b, U16* a) { ++++++ ppc-skia-revert-3.patch ++++++ >From 68e53210b76cadb14e98aaea58e30388f94bc9a1 Mon Sep 17 00:00:00 2001 From: Kaylee Lubick <kjlub...@google.com> Date: Mon, 21 Apr 2025 14:19:04 -0400 Subject: [PATCH] Avoid assumption of 32 bit aligned pixel data in RP's lowp gather() The attached bug has most of the context, but the problem boils down to the compiler assuming that a uint32_t* was aligned to 32 bits and generated instructions like: vld1.32 {d16[0]}, [r4:32] where the :32 means "aligned to 32 bits" [1]. Pixel data is usually aligned to the so-called natural alignment (pointer size) because we allocate it with `new` or `calloc`. However, if we were to call drawRect and use a source starting at x = 1, this eventually leads to SkBitmap::extractSubset creating a SkPixelRef that starts at the original pixel* + 1 (which is now no longer evenly divisible by 4). Certain ARM devices were crashing on this generated assembly. Rather than trying to write the assembly code by hand or use intrinsics, we can tell GCC and Clang that the pointer might be unaligned and then the generated instructions lack the :32 modifier (and make these devices not crash anymore): vld1.32 {d16[0]}, [r4] This fix is in our low precision pipeline code but may also be needed in our high precision code too (which uses similar code). I wanted to be careful with this change because it's pretty critical to performance, so I kept the aligned version for cases where we know the data is aligned (e.g. reading factors and biases for our gradient stages). This solution was inspired by Open CV https://github.com/opencv/opencv/issues/25265 [1] https://developer.arm.com/documentation/ddi0597/2025-03/SIMD-FP-Instructions/VLD1--multiple-single-elements---Load-multiple-single-1-element-structures-to-one--two--three--or-four-registers- Change-Id: I2892740acbb9db7434aab897e11fa41c3548a196 Bug: b/409859319 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/981638 Commit-Queue: Kaylee Lubick <kjlub...@google.com> Commit-Queue: Daniel Dilan <danieldi...@google.com> Auto-Submit: Kaylee Lubick <kjlub...@google.com> Reviewed-by: Daniel Dilan <danieldi...@google.com> diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h index 9573b84baf..d14df3677c 100644 --- a/src/opts/SkRasterPipeline_opts.h +++ b/src/opts/SkRasterPipeline_opts.h @@ -5877,6 +5877,10 @@ SI void store(T* ptr, V v) { return (U32)_mm512_i32gather_epi32((__m512i)ix, ptr, 4); } + template <typename V, typename T> + SI V gather_unaligned(const T* ptr, U32 ix) { + return gather<V, T>(ptr, ix); + } #elif defined(SKRP_CPU_HSW) template <typename V, typename T> SI V gather(const T* ptr, U32 ix) { @@ -5903,6 +5907,11 @@ SI void store(T* ptr, V v) { return join<U32>(_mm256_i32gather_epi32((const int*)ptr, lo, 4), _mm256_i32gather_epi32((const int*)ptr, hi, 4)); } + + template <typename V, typename T> + SI V gather_unaligned(const T* ptr, U32 ix) { + return gather<V, T>(ptr, ix); + } #elif defined(SKRP_CPU_LASX) template <typename V, typename T> SI V gather(const T* ptr, U32 ix) { @@ -5911,12 +5920,43 @@ SI void store(T* ptr, V v) { ptr[ix[ 8]], ptr[ix[ 9]], ptr[ix[10]], ptr[ix[11]], ptr[ix[12]], ptr[ix[13]], ptr[ix[14]], ptr[ix[15]], }; } + + template <typename V, typename T> + SI V gather_unaligned(const T* ptr, U32 ix) { + return gather<V, T>(ptr, ix); + } +#elif defined(SKRP_CPU_NEON) + template <typename V, typename T> + SI V gather(const T* ptr, U32 ix) { + // The compiler assumes ptr is aligned, which caused crashes on some + // arm32 chips because a register was marked as "aligned to 32 bits" + // incorrectly. https://crbug.com/skia/409859319 + SkASSERTF(reinterpret_cast<uintptr_t>(ptr) % alignof(T) == 0, + "Should use gather_unaligned"); + return V{ ptr[ix[ 0]], ptr[ix[ 1]], ptr[ix[ 2]], ptr[ix[ 3]], + ptr[ix[ 4]], ptr[ix[ 5]], ptr[ix[ 6]], ptr[ix[ 7]], }; + } + + template <typename V, typename T> + SI V gather_unaligned(const T* ptr, U32 ix) { + // This tells the compiler ptr might not be aligned appropriately, so + // it generates better assembly. + typedef T __attribute__ ((aligned (1))) unaligned_ptr; + const unaligned_ptr* uptr = static_cast<const unaligned_ptr*>(ptr); + return V{ uptr[ix[ 0]], uptr[ix[ 1]], uptr[ix[ 2]], uptr[ix[ 3]], + uptr[ix[ 4]], uptr[ix[ 5]], uptr[ix[ 6]], uptr[ix[ 7]], }; + } #else template <typename V, typename T> SI V gather(const T* ptr, U32 ix) { return V{ ptr[ix[ 0]], ptr[ix[ 1]], ptr[ix[ 2]], ptr[ix[ 3]], ptr[ix[ 4]], ptr[ix[ 5]], ptr[ix[ 6]], ptr[ix[ 7]], }; } + + template <typename V, typename T> + SI V gather_unaligned(const T* ptr, U32 ix) { + return gather<V, T>(ptr, ix); + } #endif @@ -6049,7 +6089,7 @@ LOWP_STAGE_PP(store_8888, const SkRasterPipelineContexts::MemoryCtx* ctx) { LOWP_STAGE_GP(gather_8888, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint32_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, x,y); - from_8888(gather<U32>(ptr, ix), &r, &g, &b, &a); + from_8888(gather_unaligned<U32>(ptr, ix), &r, &g, &b, &a); } // ~~~~~~ 16-bit memory loads and stores ~~~~~~ // @@ -6099,7 +6139,7 @@ LOWP_STAGE_PP(store_565, const SkRasterPipelineContexts::MemoryCtx* ctx) { LOWP_STAGE_GP(gather_565, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint16_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, x,y); - from_565(gather<U16>(ptr, ix), &r, &g, &b); + from_565(gather_unaligned<U16>(ptr, ix), &r, &g, &b); a = U16_255; } @@ -6149,7 +6189,7 @@ LOWP_STAGE_PP(store_4444, const SkRasterPipelineContexts::MemoryCtx* ctx) { LOWP_STAGE_GP(gather_4444, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint16_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, x,y); - from_4444(gather<U16>(ptr, ix), &r,&g,&b,&a); + from_4444(gather_unaligned<U16>(ptr, ix), &r,&g,&b,&a); } SI void from_88(U16 rg, U16* r, U16* g) { @@ -6198,7 +6238,7 @@ LOWP_STAGE_PP(store_rg88, const SkRasterPipelineContexts::MemoryCtx* ctx) { LOWP_STAGE_GP(gather_rg88, const SkRasterPipelineContexts::GatherCtx* ctx) { const uint16_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, x, y); - from_88(gather<U16>(ptr, ix), &r, &g); + from_88(gather_unaligned<U16>(ptr, ix), &r, &g); b = U16_0; a = U16_255; } @@ -6625,11 +6665,11 @@ LOWP_STAGE_GP(bilerp_clamp_8888, const SkRasterPipelineContexts::GatherCtx* ctx) const uint32_t* ptr; U32 ix = ix_and_ptr(&ptr, ctx, sx, sy); U16 leftR, leftG, leftB, leftA; - from_8888(gather<U32>(ptr, ix), &leftR,&leftG,&leftB,&leftA); + from_8888(gather_unaligned<U32>(ptr, ix), &leftR,&leftG,&leftB,&leftA); ix = ix_and_ptr(&ptr, ctx, sx+1, sy); U16 rightR, rightG, rightB, rightA; - from_8888(gather<U32>(ptr, ix), &rightR,&rightG,&rightB,&rightA); + from_8888(gather_unaligned<U32>(ptr, ix), &rightR,&rightG,&rightB,&rightA); U16 topR = lerpX(leftR, rightR), topG = lerpX(leftG, rightG), @@ -6637,10 +6677,10 @@ LOWP_STAGE_GP(bilerp_clamp_8888, const SkRasterPipelineContexts::GatherCtx* ctx) topA = lerpX(leftA, rightA); ix = ix_and_ptr(&ptr, ctx, sx, sy+1); - from_8888(gather<U32>(ptr, ix), &leftR,&leftG,&leftB,&leftA); + from_8888(gather_unaligned<U32>(ptr, ix), &leftR,&leftG,&leftB,&leftA); ix = ix_and_ptr(&ptr, ctx, sx+1, sy+1); - from_8888(gather<U32>(ptr, ix), &rightR,&rightG,&rightB,&rightA); + from_8888(gather_unaligned<U32>(ptr, ix), &rightR,&rightG,&rightB,&rightA); U16 bottomR = lerpX(leftR, rightR), bottomG = lerpX(leftG, rightG), ++++++ system-libdrm.patch ++++++ --- /var/tmp/diff_new_pack.AvyN3L/_old 2025-06-05 20:36:08.489789645 +0200 +++ /var/tmp/diff_new_pack.AvyN3L/_new 2025-06-05 20:36:08.493789811 +0200 @@ -31,8 +31,8 @@ =================================================================== --- chromium-114.0.5735.90.orig/media/gpu/chromeos/video_decoder_pipeline_unittest.cc +++ chromium-114.0.5735.90/media/gpu/chromeos/video_decoder_pipeline_unittest.cc -@@ -25,7 +25,7 @@ - #include "media/gpu/chromeos/dmabuf_video_frame_pool.h" +@@ -26,7 +26,7 @@ + #include "media/gpu/chromeos/frame_resource_converter.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/libdrm/src/include/drm/drm_fourcc.h"