diff --git a/infra/PATCHES.md b/infra/PATCHES.md
index f55e5d3f..f3bc0811 100644
--- a/infra/PATCHES.md
+++ b/infra/PATCHES.md
@@ -29,8 +29,8 @@ V8 Font Rendering Patch > https://github.com/saiarcot895/chromium-ubuntu-build/b
VAAPI Patch > https://github.com/saiarcot895/chromium-ubuntu-build/blob/master/debian/patches/enable-vaapi-on-linux.diff
- Modified by me.
-VAAPI on Wayland Patch > https://github.com/ungoogled-software/ungoogled-chromium-archlinux/blob/master/ozone-add-va-api-support-to-wayland.patch
- - From Arch AUR
+~~ VAAPI on Wayland Patch > https://github.com/ungoogled-software/ungoogled-chromium-archlinux/blob/master/ozone-add-va-api-support-to-wayland.patch ~~ REMOVED
+ - From Arch AUR ~~
Use default search icon instead of search engine icon in omnibox patch > https://github.com/ungoogled-software/contrib/blob/master/tweaks/visual/default-search-icon.patch
diff --git a/other/CrOS/chrome/BUILD.gn b/other/CrOS/chrome/BUILD.gn
index 8d491b10..dc14e739 100644
--- a/other/CrOS/chrome/BUILD.gn
+++ b/other/CrOS/chrome/BUILD.gn
@@ -117,6 +117,15 @@ group("assert_no_deps") {
# for no reason and is easy to mess up. See the comment at the top of
# //chrome/installer/util/BUILD.gn.
assert_no_deps = [ "//chrome/installer/util:strings" ]
+
+ if (is_fuchsia) {
+ assert_no_deps += [
+ # Chrome should use Perfetto instead of libtrace. Vulkan depends on
+ # trace-engine, but there should be no dependencies on trace-provider.
+ "//third_party/fuchsia-sdk/sdk/pkg/trace",
+ "//third_party/fuchsia-sdk/sdk/pkg/trace-provider-so",
+ ]
+ }
}
if (!is_android && !is_mac) {
@@ -533,13 +542,16 @@ if (is_win) {
":chrome_app_strings_bundle_data",
":chrome_resources",
":chrome_versioned_bundle_data",
- ":chromium_updater_privileged_helper",
"//base/allocator:early_zone_registration_mac",
"//build:branding_buildflags",
"//chrome/common:buildflags",
"//chrome/common:version_header",
]
+ if (enable_updater) {
+ deps += [ ":chromium_updater_privileged_helper" ]
+ }
+
if (enable_stripping) {
# At link time, preserve the global symbols specified in the .exports
# file. All other global symbols will be marked as private. The default
@@ -688,13 +700,15 @@ if (is_win) {
}
}
- bundle_data("chromium_updater_privileged_helper") {
- sources = [ "$root_out_dir/$privileged_helper_name" ]
- outputs = [
- "{{bundle_contents_dir}}/Library/LaunchServices/{{source_file_part}}",
- ]
+ if (enable_updater) {
+ bundle_data("chromium_updater_privileged_helper") {
+ sources = [ "$root_out_dir/$privileged_helper_name" ]
+ outputs = [
+ "{{bundle_contents_dir}}/Library/LaunchServices/{{source_file_part}}",
+ ]
- public_deps = [ "//chrome/updater/mac:privileged_helper" ]
+ public_deps = [ "//chrome/updater/mac:privileged_helper" ]
+ }
}
action("clean_up_old_versions") {
@@ -1182,7 +1196,10 @@ if (is_win) {
"-ObjC",
]
- configs += [ "//build/config/compiler:wexit_time_destructors" ]
+ configs += [
+ "//build/config/compiler:enable_arc",
+ "//build/config/compiler:wexit_time_destructors",
+ ]
}
mac_framework_bundle("chrome_framework") {
diff --git a/src/chrome/BUILD.gn b/src/chrome/BUILD.gn
index 6d9ab420..a066da32 100644
--- a/src/chrome/BUILD.gn
+++ b/src/chrome/BUILD.gn
@@ -117,6 +117,15 @@ group("assert_no_deps") {
# for no reason and is easy to mess up. See the comment at the top of
# //chrome/installer/util/BUILD.gn.
assert_no_deps = [ "//chrome/installer/util:strings" ]
+
+ if (is_fuchsia) {
+ assert_no_deps += [
+ # Chrome should use Perfetto instead of libtrace. Vulkan depends on
+ # trace-engine, but there should be no dependencies on trace-provider.
+ "//third_party/fuchsia-sdk/sdk/pkg/trace",
+ "//third_party/fuchsia-sdk/sdk/pkg/trace-provider-so",
+ ]
+ }
}
if (!is_android && !is_mac) {
@@ -533,13 +542,16 @@ if (is_win) {
":chrome_app_strings_bundle_data",
":chrome_resources",
":chrome_versioned_bundle_data",
- ":chromium_updater_privileged_helper",
"//base/allocator:early_zone_registration_mac",
"//build:branding_buildflags",
"//chrome/common:buildflags",
"//chrome/common:version_header",
]
+ if (enable_updater) {
+ deps += [ ":chromium_updater_privileged_helper" ]
+ }
+
if (enable_stripping) {
# At link time, preserve the global symbols specified in the .exports
# file. All other global symbols will be marked as private. The default
@@ -688,13 +700,15 @@ if (is_win) {
}
}
- bundle_data("chromium_updater_privileged_helper") {
- sources = [ "$root_out_dir/$privileged_helper_name" ]
- outputs = [
- "{{bundle_contents_dir}}/Library/LaunchServices/{{source_file_part}}",
- ]
+ if (enable_updater) {
+ bundle_data("chromium_updater_privileged_helper") {
+ sources = [ "$root_out_dir/$privileged_helper_name" ]
+ outputs = [
+ "{{bundle_contents_dir}}/Library/LaunchServices/{{source_file_part}}",
+ ]
- public_deps = [ "//chrome/updater/mac:privileged_helper" ]
+ public_deps = [ "//chrome/updater/mac:privileged_helper" ]
+ }
}
action("clean_up_old_versions") {
@@ -1182,7 +1196,10 @@ if (is_win) {
"-ObjC",
]
- configs += [ "//build/config/compiler:wexit_time_destructors" ]
+ configs += [
+ "//build/config/compiler:enable_arc",
+ "//build/config/compiler:wexit_time_destructors",
+ ]
}
mac_framework_bundle("chrome_framework") {
diff --git a/src/chrome/app/theme/theme_resources.grd b/src/chrome/app/theme/theme_resources.grd
index d8bdbd57..f47b8b2c 100644
--- a/src/chrome/app/theme/theme_resources.grd
+++ b/src/chrome/app/theme/theme_resources.grd
@@ -279,6 +279,8 @@
+
+
@@ -360,12 +362,14 @@
+
+
diff --git a/src/media/base/media_switches.cc b/src/media/base/media_switches.cc
index ec439179..a6a73116 100644
--- a/src/media/base/media_switches.cc
+++ b/src/media/base/media_switches.cc
@@ -238,6 +238,12 @@ MEDIA_EXPORT extern const char kLacrosUseChromeosProtectedMedia[] =
"lacros-use-chromeos-protected-media";
MEDIA_EXPORT extern const char kLacrosUseChromeosProtectedAv1[] =
"lacros-use-chromeos-protected-av1";
+
+// Allows remote attestation (RA) in dev mode for testing purpose. Usually RA
+// is disabled in dev mode because it will always fail. However, there are cases
+// in testing where we do want to go through the permission flow even in dev
+// mode. This can be enabled by this flag.
+const char kAllowRAInDevMode[] = "allow-ra-in-dev-mode";
#endif // BUILDFLAG(IS_CHROMEOS)
namespace autoplay {
@@ -285,11 +291,10 @@ const char kCastStreamingForceEnableHardwareH264[] =
const char kCastStreamingForceEnableHardwareVp8[] =
"cast-streaming-force-enable-hardware-vp8";
-// Disables the code path that makes Pepper use the MojoVideoDecoder for
-// hardware accelerated video decoding. It overrides the value of the
-// kUseMojoVideoDecoderForPepper feature flag.
-const char kDisableUseMojoVideoDecoderForPepper[] =
- "disable-use-mojo-video-decoder-for-pepper";
+#if !BUILDFLAG(IS_ANDROID)
+const char kCastMirroringTargetPlayoutDelay[] =
+ "cast-mirroring-target-playout-delay";
+#endif // !BUILDFLAG(IS_ANDROID)
} // namespace switches
@@ -534,7 +539,12 @@ BASE_FEATURE(kMemoryPressureBasedSourceBufferGC,
// hardware video decoders.
BASE_FEATURE(kUseMultiPlaneFormatForHardwareVideo,
"UseMultiPlaneFormatForHardwareVideo",
- base::FEATURE_DISABLED_BY_DEFAULT);
+#if BUILDFLAG(IS_ANDROID)
+ base::FEATURE_ENABLED_BY_DEFAULT
+#else
+ base::FEATURE_DISABLED_BY_DEFAULT
+#endif
+);
// Enables creating single shared image and mailbox for multi-planar formats for
// software video decoders.
@@ -569,6 +579,12 @@ BASE_FEATURE(kOpenscreenCastStreamingSession,
"OpenscreenCastStreamingSession",
base::FEATURE_DISABLED_BY_DEFAULT);
+// Controls whether or not frame drops are included in the video bitrate
+// calculation for the OpenscreenFrameSender backed VideoSender implementation.
+BASE_FEATURE(kOpenscreenVideoBitrateFactorInFrameDrops,
+ "OpenscreenVideoBitrateFactorInFrameDrops",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
// Controls whether the Mirroring Service will fetch, analyze, and store
// information on the quality of the session using RTCP logs.
BASE_FEATURE(kEnableRtcpReporting,
@@ -643,26 +659,13 @@ BASE_FEATURE(kGlobalMediaControlsCrOSUpdatedUI,
// If enabled, users can request Media Remoting without fullscreen-in-tab.
BASE_FEATURE(kMediaRemotingWithoutFullscreen,
"MediaRemotingWithoutFullscreen",
- base::FEATURE_DISABLED_BY_DEFAULT);
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+ base::FEATURE_ENABLED_BY_DEFAULT
+#else
+ base::FEATURE_DISABLED_BY_DEFAULT
+#endif
+);
#endif
-
-// Allow Global Media Controls in system tray of CrOS.
-BASE_FEATURE(kGlobalMediaControlsForChromeOS,
- "GlobalMediaControlsForChromeOS",
- base::FEATURE_ENABLED_BY_DEFAULT);
-
-constexpr base::FeatureParam::Option
- kCrosGlobalMediaControlsParamOptions[] = {
- {kCrosGlobalMediaControlsPinOptions::kPin, "default-pinned"},
- {kCrosGlobalMediaControlsPinOptions::kNotPin, "default-unpinned"},
- {kCrosGlobalMediaControlsPinOptions::kHeuristic, "heuristic"}};
-
-constexpr base::FeatureParam
- kCrosGlobalMediaControlsPinParam(
- &kGlobalMediaControlsForChromeOS,
- "CrosGlobalMediaControlsPinParam",
- kCrosGlobalMediaControlsPinOptions::kHeuristic,
- &kCrosGlobalMediaControlsParamOptions);
// Show picture-in-picture button in Global Media Controls.
BASE_FEATURE(kGlobalMediaControlsPictureInPicture,
@@ -724,9 +727,10 @@ BASE_FEATURE(kVaapiVideoDecodeLinuxGL,
"VaapiVideoDecodeLinuxGL",
base::FEATURE_DISABLED_BY_DEFAULT);
+// Temporary fix TODO: Alex313031
BASE_FEATURE(kVaapiVideoEncodeLinux,
"VaapiVideoEncoder",
- base::FEATURE_ENABLED_BY_DEFAULT);
+ base::FEATURE_DISABLED_BY_DEFAULT);
// Ignore the non-intel driver blacklist for VaapiVideoDecoder implementations.
// Intended for manual usage only in order to gague the status of newer driver
@@ -787,12 +791,23 @@ BASE_FEATURE(kVaapiH264TemporalLayerHWEncoding,
// Enable VP8 temporal layer encoding with HW encoder on ChromeOS.
BASE_FEATURE(kVaapiVp8TemporalLayerHWEncoding,
"VaapiVp8TemporalLayerEncoding",
- base::FEATURE_DISABLED_BY_DEFAULT);
+ base::FEATURE_ENABLED_BY_DEFAULT);
// Enable VP9 k-SVC encoding with HW encoder for webrtc use case on ChromeOS.
BASE_FEATURE(kVaapiVp9kSVCHWEncoding,
"VaapiVp9kSVCHWEncoding",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif // defined(ARCH_CPU_X86_FAMILY) && BUILDFLAG(IS_CHROMEOS)
+#if defined(ARCH_CPU_ARM_FAMILY) && BUILDFLAG(IS_CHROMEOS)
+// Enables the new V4L2StatefulVideoDecoder instead of V4L2VideoDecoder.
+BASE_FEATURE(kV4L2FlatStatelessVideoDecoder,
+ "V4L2FlatStatelessVideoDecoder",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
+// Enables the new V4L2StatefulVideoDecoder instead of V4L2VideoDecoder.
+BASE_FEATURE(kV4L2FlatStatefulVideoDecoder,
+ "V4L2FlatStatefulVideoDecoder",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+#endif
// Inform video blitter of video color space.
BASE_FEATURE(kVideoBlitColorAccuracy,
@@ -867,6 +882,11 @@ BASE_FEATURE(kLiveCaptionRightClick,
"LiveCaptionRightClick",
base::FEATURE_DISABLED_BY_DEFAULT);
+// Enable or disable Live Caption support for WebAudio.
+BASE_FEATURE(kLiveCaptionWebAudio,
+ "LiveCaptionWebAudio",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
// Live Caption runs system-wide on ChromeOS, as opposed to just in the browser.
BASE_FEATURE(kLiveCaptionSystemWideOnChromeOS,
"LiveCaptionSystemWideOnChromeOS",
@@ -929,7 +949,7 @@ const base::FeatureParam
// while capturing a low-resolution tab.
BASE_FEATURE(kWebContentsCaptureHiDpi,
"WebContentsCaptureHiDPI",
- base::FEATURE_DISABLED_BY_DEFAULT);
+ base::FEATURE_ENABLED_BY_DEFAULT);
// Enables handling of hardware media keys for controlling media.
BASE_FEATURE(kHardwareMediaKeyHandling,
@@ -1041,11 +1061,13 @@ BASE_FEATURE(kUsePooledSharedImageVideoProvider,
"UsePooledSharedImageVideoProvider",
base::FEATURE_ENABLED_BY_DEFAULT);
-// Historically we hardcoded sRGB for color space. This flags controls if we
-// pass real color space to VideoFrame/SharedImages.
-BASE_FEATURE(kUseRealColorSpaceForAndroidVideo,
- "UseRealColorSpaceForAndroidVideo",
- base::FEATURE_ENABLED_BY_DEFAULT);
+// Allow the media pipeline to prioritize the software decoder provided by
+// MediaCodec, instead of the built-in software decoders. This is only enabled
+// for platforms which shows worse performance when using the built-in software
+// decoders, e.g. Cast on ATV.
+BASE_FEATURE(kAllowMediaCodecSoftwareDecoder,
+ "AllowMediaCodecSoftwareDecoder",
+ base::FEATURE_DISABLED_BY_DEFAULT);
#endif // BUILDFLAG(IS_ANDROID)
@@ -1262,13 +1284,6 @@ const base::Feature MEDIA_EXPORT kUseOutOfProcessVideoEncoding{
"UseOutOfProcessVideoEncoding", base::FEATURE_DISABLED_BY_DEFAULT};
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
-// Make the PepperVideoDecoderHost use the MojoVideoDecoder to talk to hardware
-// decoders instead of using the GpuVideoDecodeAcceleratorHost. Note: this
-// doesn't affect the PPB_VideoDecoder_Impl which will continue to use the
-// GpuVideoDecodeAcceleratorHost for the PPB_VideoDecoder_Dev interface.
-const base::Feature MEDIA_EXPORT kUseMojoVideoDecoderForPepper{
- "UseMojoVideoDecoderForPepper", base::FEATURE_ENABLED_BY_DEFAULT};
-
// Use SequencedTaskRunner for MediaService.
BASE_FEATURE(kUseSequencedTaskRunnerForMediaService,
"UseSequencedTaskRunnerForMediaService",
diff --git a/src/media/gpu/gpu_video_decode_accelerator_factory.cc b/src/media/gpu/gpu_video_decode_accelerator_factory.cc
index 1be5c22b..8fba738b 100644
--- a/src/media/gpu/gpu_video_decode_accelerator_factory.cc
+++ b/src/media/gpu/gpu_video_decode_accelerator_factory.cc
@@ -29,8 +29,8 @@
#elif BUILDFLAG(USE_V4L2_CODEC) && \
(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH))
#include "media/gpu/v4l2/v4l2_device.h"
-#include "media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h"
-#include "media/gpu/v4l2/v4l2_video_decode_accelerator.h"
+#include "media/gpu/v4l2/legacy/v4l2_slice_video_decode_accelerator.h"
+#include "media/gpu/v4l2/legacy/v4l2_video_decode_accelerator.h"
#include "ui/gl/gl_surface_egl.h"
#endif
diff --git a/src/media/gpu/vaapi/vaapi_picture_factory.cc b/src/media/gpu/vaapi/vaapi_picture_factory.cc
deleted file mode 100644
index 676b557f..00000000
--- a/src/media/gpu/vaapi/vaapi_picture_factory.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2023 The Chromium Authors and Alex313031
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "media/gpu/vaapi/vaapi_picture_factory.h"
-
-#include "base/containers/contains.h"
-#include "build/build_config.h"
-#include "media/gpu/vaapi/vaapi_wrapper.h"
-#include "media/video/picture.h"
-#include "ui/gl/gl_bindings.h"
-
-#if BUILDFLAG(IS_OZONE)
-#include "media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h"
-#endif // BUILDFLAG(IS_OZONE)
-#if BUILDFLAG(USE_VAAPI_X11)
-#include "media/gpu/vaapi/vaapi_picture_native_pixmap_angle.h"
-#endif // BUILDFLAG(USE_VAAPI_X11)
-#if defined(USE_EGL)
-#include "media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h"
-#endif
-
-namespace media {
-
-namespace {
-
-template
-std::unique_ptr CreateVaapiPictureNativeImpl(
- scoped_refptr vaapi_wrapper,
- const MakeGLContextCurrentCallback& make_context_current_cb,
- const BindGLImageCallback& bind_image_cb,
- const PictureBuffer& picture_buffer,
- const gfx::Size& visible_size,
- uint32_t client_texture_id,
- uint32_t service_texture_id) {
- return std::make_unique(
- std::move(vaapi_wrapper), make_context_current_cb, bind_image_cb,
- picture_buffer.id(), picture_buffer.size(), visible_size,
- service_texture_id, client_texture_id, picture_buffer.texture_target());
-}
-
-} // namespace
-
-VaapiPictureFactory::VaapiPictureFactory() {
- vaapi_impl_pairs_.insert(
- std::make_pair(gl::kGLImplementationEGLGLES2,
- VaapiPictureFactory::kVaapiImplementationDrm));
-#if BUILDFLAG(USE_VAAPI_X11)
- vaapi_impl_pairs_.insert(
- std::make_pair(gl::kGLImplementationEGLANGLE,
- VaapiPictureFactory::kVaapiImplementationAngle));
-#elif BUILDFLAG(IS_OZONE)
- vaapi_impl_pairs_.insert(
- std::make_pair(gl::kGLImplementationEGLANGLE,
- VaapiPictureFactory::kVaapiImplementationDrm));
-#endif
-
- DeterminePictureCreationAndDownloadingMechanism();
-}
-
-VaapiPictureFactory::~VaapiPictureFactory() = default;
-
-std::unique_ptr VaapiPictureFactory::Create(
- scoped_refptr vaapi_wrapper,
- const MakeGLContextCurrentCallback& make_context_current_cb,
- const BindGLImageCallback& bind_image_cb,
- const PictureBuffer& picture_buffer,
- const gfx::Size& visible_size) {
- // ARC++ sends |picture_buffer| with no texture_target().
- DCHECK(picture_buffer.texture_target() == GetGLTextureTarget() ||
- picture_buffer.texture_target() == 0u);
-
- // |client_texture_ids| and |service_texture_ids| are empty from ARC++.
- const uint32_t client_texture_id =
- !picture_buffer.client_texture_ids().empty()
- ? picture_buffer.client_texture_ids()[0]
- : 0;
- const uint32_t service_texture_id =
- !picture_buffer.service_texture_ids().empty()
- ? picture_buffer.service_texture_ids()[0]
- : 0;
-
- return CreateVaapiPictureNative(vaapi_wrapper, make_context_current_cb,
- bind_image_cb, picture_buffer, visible_size,
- client_texture_id, service_texture_id);
-}
-
-VaapiPictureFactory::VaapiImplementation
-VaapiPictureFactory::GetVaapiImplementation(gl::GLImplementation gl_impl) {
- if (base::Contains(vaapi_impl_pairs_, gl_impl))
- return vaapi_impl_pairs_[gl_impl];
- return kVaapiImplementationNone;
-}
-
-uint32_t VaapiPictureFactory::GetGLTextureTarget() {
-#if BUILDFLAG(USE_VAAPI_X11)
- return GL_TEXTURE_2D;
-#else
- return GL_TEXTURE_EXTERNAL_OES;
-#endif
-}
-
-gfx::BufferFormat VaapiPictureFactory::GetBufferFormat() {
-#if BUILDFLAG(IS_LINUX)
- return gfx::BufferFormat::RGBX_8888;
-#else
- return gfx::BufferFormat::YUV_420_BIPLANAR;
-#endif
-}
-
-void VaapiPictureFactory::DeterminePictureCreationAndDownloadingMechanism() {
- switch (GetVaapiImplementation(gl::GetGLImplementation())) {
-#if BUILDFLAG(IS_OZONE)
- // We can be called without GL initialized, which is valid if we use Ozone.
- case kVaapiImplementationNone:
- create_picture_cb_ = base::BindRepeating(
- &CreateVaapiPictureNativeImpl);
- needs_vpp_for_downloading_ = true;
- break;
-#endif // BUILDFLAG(IS_OZONE)
-#if BUILDFLAG(USE_VAAPI_X11)
- case kVaapiImplementationAngle:
- create_picture_cb_ = base::BindRepeating(
- &CreateVaapiPictureNativeImpl);
- // Neither VaapiTFPPicture or VaapiPictureNativePixmapAngle needs the VPP.
- needs_vpp_for_downloading_ = false;
- break;
-#endif // BUILDFLAG(USE_VAAPI_X11)
- case kVaapiImplementationDrm:
-#if BUILDFLAG(IS_OZONE)
- create_picture_cb_ = base::BindRepeating(
- &CreateVaapiPictureNativeImpl);
- needs_vpp_for_downloading_ = true;
- break;
-#elif defined(USE_EGL)
- create_picture_cb_ = base::BindRepeating(
- &CreateVaapiPictureNativeImpl);
- needs_vpp_for_downloading_ = true;
- break;
-#else
- // ozone or egl must be used to use the DRM implementation.
- [[fallthrough]];
-#endif
- default:
- NOTREACHED();
- break;
- }
-}
-
-bool VaapiPictureFactory::NeedsProcessingPipelineForDownloading() const {
- return needs_vpp_for_downloading_;
-}
-
-std::unique_ptr VaapiPictureFactory::CreateVaapiPictureNative(
- scoped_refptr vaapi_wrapper,
- const MakeGLContextCurrentCallback& make_context_current_cb,
- const BindGLImageCallback& bind_image_cb,
- const PictureBuffer& picture_buffer,
- const gfx::Size& visible_size,
- uint32_t client_texture_id,
- uint32_t service_texture_id) {
- CHECK(create_picture_cb_);
- return create_picture_cb_.Run(
- std::move(vaapi_wrapper), make_context_current_cb, bind_image_cb,
- picture_buffer, visible_size, client_texture_id, service_texture_id);
-}
-
-} // namespace media
diff --git a/src/media/gpu/vaapi/vaapi_picture_native_pixmap.cc b/src/media/gpu/vaapi/vaapi_picture_native_pixmap.cc
deleted file mode 100644
index ea48aceb..00000000
--- a/src/media/gpu/vaapi/vaapi_picture_native_pixmap.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2023 The Chromium Authors and Alex313031
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "media/gpu/vaapi/vaapi_picture_native_pixmap.h"
-
-#include "media/gpu/macros.h"
-#include "media/gpu/vaapi/va_surface.h"
-#include "media/gpu/vaapi/vaapi_wrapper.h"
-
-namespace media {
-
-VaapiPictureNativePixmap::VaapiPictureNativePixmap(
- scoped_refptr vaapi_wrapper,
- const MakeGLContextCurrentCallback& make_context_current_cb,
- const BindGLImageCallback& bind_image_cb,
- int32_t picture_buffer_id,
- const gfx::Size& size,
- const gfx::Size& visible_size,
- uint32_t texture_id,
- uint32_t client_texture_id,
- uint32_t texture_target)
- : VaapiPicture(std::move(vaapi_wrapper),
- make_context_current_cb,
- bind_image_cb,
- picture_buffer_id,
- size,
- visible_size,
- texture_id,
- client_texture_id,
- texture_target) {}
-
-VaapiPictureNativePixmap::~VaapiPictureNativePixmap() = default;
-
-bool VaapiPictureNativePixmap::DownloadFromSurface(
- scoped_refptr va_surface) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (!vaapi_wrapper_->SyncSurface(va_surface->id())) {
- VLOGF(1) << "Cannot sync VPP input surface";
- return false;
- }
- if (!vaapi_wrapper_->BlitSurface(*va_surface, *va_surface_)) {
- VLOGF(1) << "Cannot convert decoded image into output buffer";
- return false;
- }
-
- // Sync target surface since the buffer is returning to client.
- if (!vaapi_wrapper_->SyncSurface(va_surface_->id())) {
- VLOGF(1) << "Cannot sync VPP output surface";
- return false;
- }
- return true;
-}
-
-bool VaapiPictureNativePixmap::AllowOverlay() const {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- return true;
-}
-
-VASurfaceID VaapiPictureNativePixmap::va_surface_id() const {
- return va_surface_->id();
-}
-
-} // namespace media
diff --git a/src/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/src/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
index a04386f9..3341e1e7 100644
--- a/src/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
+++ b/src/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -561,12 +561,12 @@ void VaapiVideoDecodeAccelerator::InitiateSurfaceSetChange(
requested_visible_rect_ = visible_rect;
if (buffer_allocation_mode_ == BufferAllocationMode::kSuperReduced) {
// Add one to the reference frames for the one being currently egressed.
- requested_num_reference_frames_ = num_reference_frames + 4;
+ requested_num_reference_frames_ = num_reference_frames + 1;
requested_num_pics_ = num_pics - num_reference_frames;
} else if (buffer_allocation_mode_ == BufferAllocationMode::kReduced) {
// Add one to the reference frames for the one being currently egressed,
// and an extra allocation for both |client_| and |decoder_|.
- requested_num_reference_frames_ = num_reference_frames + 5;
+ requested_num_reference_frames_ = num_reference_frames + 2;
requested_num_pics_ = num_pics - num_reference_frames + 1;
} else {
requested_num_reference_frames_ = 0;
diff --git a/src/net/dns/dns_transaction.cc b/src/net/dns/dns_transaction.cc
index 9fce71cb..aba85fa6 100644
--- a/src/net/dns/dns_transaction.cc
+++ b/src/net/dns/dns_transaction.cc
@@ -57,6 +57,7 @@
#include "net/dns/dns_udp_tracker.h"
#include "net/dns/dns_util.h"
#include "net/dns/host_cache.h"
+#include "net/dns/host_resolver_internal_result.h"
#include "net/dns/public/dns_over_https_config.h"
#include "net/dns/public/dns_over_https_server_config.h"
#include "net/dns/public/dns_protocol.h"
@@ -1078,31 +1079,36 @@ class DnsOverHttpsProbeRunner : public DnsProbeRunner {
probe_stats->probe_attempts[attempt_number].get();
const DnsResponse* response = attempt->GetResponse();
if (response) {
- DnsResponseResultExtractor extractor(response);
- HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN);
- DnsResponseResultExtractor::ExtractionError extraction_error =
+ DnsResponseResultExtractor extractor(*response);
+ DnsResponseResultExtractor::ResultsOrError results =
extractor.ExtractDnsResults(
DnsQueryType::A,
/*original_domain_name=*/kDohProbeHostname,
- /*request_port=*/0, &results);
+ /*request_port=*/0);
- if (extraction_error ==
- DnsResponseResultExtractor::ExtractionError::kOk &&
- results.ip_endpoints() && !results.ip_endpoints()->empty()) {
- // The DoH probe queries don't go through the standard DnsAttempt
- // path, so the ServerStats have not been updated yet.
- context_->RecordServerSuccess(
- doh_server_index, true /* is_doh_server */, session_.get());
- context_->RecordRtt(doh_server_index, true /* is_doh_server */,
- base::TimeTicks::Now() - query_start_time, rv,
- session_.get());
- success = true;
+ if (!results.has_value()) {
+ return;
+ }
- // Do not delete the ProbeStats and cancel the probe sequence. It will
- // cancel itself on the next scheduled ContinueProbe() call if the
- // server is still available. This way, the backoff schedule will be
- // maintained if a server quickly becomes unavailable again before
- // that scheduled call.
+ for (const auto& result : results.value()) {
+ if (result->type() == HostResolverInternalResult::Type::kData &&
+ !result->AsData().endpoints().empty()) {
+ // The DoH probe queries don't go through the standard DnsAttempt
+ // path, so the ServerStats have not been updated yet.
+ context_->RecordServerSuccess(
+ doh_server_index, /*is_doh_server=*/true, session_.get());
+ context_->RecordRtt(doh_server_index, /*is_doh_server=*/true,
+ base::TimeTicks::Now() - query_start_time, rv,
+ session_.get());
+ success = true;
+
+ // Do not delete the ProbeStats and cancel the probe sequence. It
+ // will cancel itself on the next scheduled ContinueProbe() call if
+ // the server is still available. This way, the backoff schedule
+ // will be maintained if a server quickly becomes unavailable again
+ // before that scheduled call.
+ return;
+ }
}
}
}
diff --git a/src/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc b/src/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
deleted file mode 100644
index 8f28b4cd..00000000
--- a/src/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright 2023 The Chromium Authors and Alex313031
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h"
-
-#include
-#include
-#include
-
-#include
-
-#include "base/files/platform_file.h"
-#include "base/logging.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/trace_event/trace_event.h"
-#include "ui/gfx/buffer_format_util.h"
-#include "ui/gfx/buffer_usage_util.h"
-#include "ui/gfx/geometry/size_conversions.h"
-#include "ui/gfx/linux/drm_util_linux.h"
-#include "ui/gfx/linux/gbm_device.h"
-#include "ui/gfx/linux/gbm_util.h"
-#include "ui/gfx/native_pixmap_handle.h"
-#include "ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h"
-#include "ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h"
-#include "ui/ozone/public/ozone_platform.h"
-
-namespace ui {
-
-GbmPixmapWayland::GbmPixmapWayland(WaylandBufferManagerGpu* buffer_manager)
- : buffer_manager_(buffer_manager),
- buffer_id_(buffer_manager->AllocateBufferID()) {}
-
-GbmPixmapWayland::~GbmPixmapWayland() {
- // gfx::BufferUsage::SCANOUT_VDA_WRITE doesn't result in creation of
- // wl_buffers.
- if (created_wl_buffer_ && usage_ != gfx::BufferUsage::SCANOUT_VDA_WRITE)
- buffer_manager_->DestroyBuffer(buffer_id_);
-}
-
-bool GbmPixmapWayland::InitializeBuffer(
- gfx::AcceleratedWidget widget,
- gfx::Size size,
- gfx::BufferFormat format,
- gfx::BufferUsage usage,
- absl::optional visible_area_size) {
- DCHECK(!visible_area_size ||
- ((visible_area_size.value().width() <= size.width()) &&
- (visible_area_size.value().height() <= size.height())));
- TRACE_EVENT0("wayland", "GbmPixmapWayland::InitializeBuffer");
-
- widget_ = widget;
-
- auto* gbm_device = buffer_manager_->GetGbmDevice();
- if (!gbm_device)
- return false;
-
- const uint32_t fourcc_format = GetFourCCFormatFromBufferFormat(format);
- const uint32_t gbm_flags = ui::BufferUsageToGbmFlags(usage);
- auto modifiers = buffer_manager_->GetModifiersForBufferFormat(format);
-
- // Create buffer object without format modifiers unless they are explicitly
- // advertised by the Wayland compositor, via linux-dmabuf protocol.
- if (modifiers.empty()) {
- gbm_bo_ = gbm_device->CreateBuffer(fourcc_format, size, gbm_flags);
- } else {
- // When buffer |usage| implies on GBM_BO_USE_LINEAR, pass in
- // DRM_FORMAT_MOD_LINEAR, i.e: no tiling, when creating gbm buffers,
- // otherwise it fails to create BOs.
- if (gbm_flags & GBM_BO_USE_LINEAR)
- modifiers = {DRM_FORMAT_MOD_LINEAR};
- gbm_bo_ = gbm_device->CreateBufferWithModifiers(fourcc_format, size,
- gbm_flags, modifiers);
- }
-
- if (!gbm_bo_) {
- LOG(ERROR) << "Cannot create bo with format= "
- << gfx::BufferFormatToString(format)
- << " and usage=" << gfx::BufferUsageToString(usage);
- return false;
- }
-
- DVLOG(3) << "Created gbm bo. format= " << gfx::BufferFormatToString(format)
- << " usage=" << gfx::BufferUsageToString(usage);
-
- visible_area_size_ = visible_area_size ? visible_area_size.value() : size;
- return true;
-}
-
-bool GbmPixmapWayland::InitializeBufferFromHandle(
- gfx::AcceleratedWidget widget,
- gfx::Size size,
- gfx::BufferFormat format,
- gfx::NativePixmapHandle handle) {
- TRACE_EVENT0("wayland", "GbmPixmapWayland::InitializeBufferFromHandle");
- auto* gbm_device = buffer_manager_->GetGbmDevice();
- if (!gbm_device)
- return false;
-
- widget_ = widget;
-
- // Create a buffer object from handle.
- gbm_bo_ = gbm_device->CreateBufferFromHandle(
- GetFourCCFormatFromBufferFormat(format), size, std::move(handle));
- if (!gbm_bo_) {
- LOG(ERROR) << "Cannot create bo with format= "
- << gfx::BufferFormatToString(format);
- return false;
- }
-
- DVLOG(3) << "Created gbm bo. format= " << gfx::BufferFormatToString(format);
-
- visible_area_size_ = size;
- return true;
-}
-
-bool GbmPixmapWayland::AreDmaBufFdsValid() const {
- return gbm_bo_->AreFdsValid();
-}
-
-int GbmPixmapWayland::GetDmaBufFd(size_t plane) const {
- return gbm_bo_->GetPlaneFd(plane);
-}
-
-uint32_t GbmPixmapWayland::GetDmaBufPitch(size_t plane) const {
- return gbm_bo_->GetPlaneStride(plane);
-}
-
-size_t GbmPixmapWayland::GetDmaBufOffset(size_t plane) const {
- return gbm_bo_->GetPlaneOffset(plane);
-}
-
-size_t GbmPixmapWayland::GetDmaBufPlaneSize(size_t plane) const {
- return gbm_bo_->GetPlaneSize(plane);
-}
-
-size_t GbmPixmapWayland::GetNumberOfPlanes() const {
- return gbm_bo_->GetNumPlanes();
-}
-
-bool GbmPixmapWayland::SupportsZeroCopyWebGPUImport() const {
- // TODO(crbug.com/1258986): Figure out how to import multi-planar pixmap into
- // WebGPU without copy.
- return false;
-}
-
-uint64_t GbmPixmapWayland::GetBufferFormatModifier() const {
- return gbm_bo_->GetFormatModifier();
-}
-
-gfx::BufferFormat GbmPixmapWayland::GetBufferFormat() const {
- return gbm_bo_->GetBufferFormat();
-}
-
-gfx::Size GbmPixmapWayland::GetBufferSize() const {
- return gbm_bo_->GetSize();
-}
-
-uint32_t GbmPixmapWayland::GetUniqueId() const {
- return gbm_bo_->GetHandle();
-}
-
-bool GbmPixmapWayland::ScheduleOverlayPlane(
- gfx::AcceleratedWidget widget,
- const gfx::OverlayPlaneData& overlay_plane_data,
- std::vector acquire_fences,
- std::vector release_fences) {
- DCHECK_NE(widget, gfx::kNullAcceleratedWidget);
-
- if (!created_wl_buffer_)
- CreateDmabufBasedWlBuffer();
-
- widget_ = widget;
-
- auto* surface = buffer_manager_->GetSurface(widget);
- // This must never be hit.
- DCHECK(surface);
- GbmSurfacelessWayland* surfaceless =
- static_cast(surface);
- DCHECK(surfaceless);
-
- DCHECK(acquire_fences.empty() || acquire_fences.size() == 1u);
- surfaceless->QueueWaylandOverlayConfig(
- {overlay_plane_data,
- acquire_fences.empty()
- ? nullptr
- : std::make_unique(std::move(acquire_fences[0])),
- buffer_id_, surfaceless->surface_scale_factor()});
- return true;
-}
-
-gfx::NativePixmapHandle GbmPixmapWayland::ExportHandle() {
- gfx::NativePixmapHandle handle;
-
- const size_t num_planes = gbm_bo_->GetNumPlanes();
- std::vector scoped_fds(num_planes);
- for (size_t i = 0; i < num_planes; ++i) {
- scoped_fds[i] = base::ScopedFD(HANDLE_EINTR(dup(GetDmaBufFd(i))));
- if (!scoped_fds[i].is_valid()) {
- PLOG(ERROR) << "dup";
- return gfx::NativePixmapHandle();
- }
- }
-
- for (size_t i = 0; i < num_planes; ++i) {
- handle.planes.emplace_back(GetDmaBufPitch(i), GetDmaBufOffset(i),
- gbm_bo_->GetPlaneSize(i),
- std::move(scoped_fds[i]));
- }
- handle.modifier = GetBufferFormatModifier();
- return handle;
-}
-
-void GbmPixmapWayland::CreateDmabufBasedWlBuffer() {
- uint64_t modifier = gbm_bo_->GetFormatModifier();
-
- std::vector strides;
- std::vector offsets;
- std::vector modifiers;
-
- size_t plane_count = gbm_bo_->GetNumPlanes();
- for (size_t i = 0; i < plane_count; ++i) {
- strides.push_back(GetDmaBufPitch(i));
- offsets.push_back(GetDmaBufOffset(i));
- modifiers.push_back(modifier);
- }
-
- base::ScopedFD fd(HANDLE_EINTR(dup(GetDmaBufFd(0))));
- if (!fd.is_valid()) {
- PLOG(FATAL) << "dup";
- return;
- }
-
- // The wl_buffer must be destroyed once this pixmap is destroyed.
- created_wl_buffer_ = true;
-
- // Asks Wayland to create a wl_buffer based on the |file| fd.
- buffer_manager_->CreateDmabufBasedBuffer(
- std::move(fd), visible_area_size_, strides, offsets, modifiers,
- gbm_bo_->GetFormat(), plane_count, buffer_id_);
-}
-
-} // namespace ui
diff --git a/src/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h b/src/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
deleted file mode 100644
index d837a5ac..00000000
--- a/src/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2023 The Chromium Authors and Alex313031
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_OZONE_PLATFORM_WAYLAND_GPU_GBM_PIXMAP_WAYLAND_H_
-#define UI_OZONE_PLATFORM_WAYLAND_GPU_GBM_PIXMAP_WAYLAND_H_
-
-#include
-#include
-
-#include "base/files/scoped_file.h"
-#include "base/memory/raw_ptr.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-#include "ui/gfx/buffer_types.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/linux/gbm_buffer.h"
-#include "ui/gfx/native_pixmap.h"
-#include "ui/gfx/native_pixmap_handle.h"
-#include "ui/gfx/native_widget_types.h"
-
-namespace ui {
-
-class WaylandBufferManagerGpu;
-
-class GbmPixmapWayland : public gfx::NativePixmap {
- public:
- explicit GbmPixmapWayland(WaylandBufferManagerGpu* buffer_manager);
-
- GbmPixmapWayland(const GbmPixmapWayland&) = delete;
- GbmPixmapWayland& operator=(const GbmPixmapWayland&) = delete;
-
- // Creates a buffer object and initializes the pixmap buffer.
- // |visible_area_size| represents a 'visible size', i.e., a buffer
- // of size |size| may actually contain visible data only in the
- // subregion of size |visible_area_size|. If |visible_area_size| is
- // not provided, |size| is used. If |widget| is provided, browser
- // side wl_buffer is also created. Otherwise, this pixmap
- // behaves as a staging pixmap and mustn't be scheduled as an overlay.
- bool InitializeBuffer(
- gfx::AcceleratedWidget widget,
- gfx::Size size,
- gfx::BufferFormat format,
- gfx::BufferUsage usage,
- absl::optional visible_area_size = absl::nullopt);
-
- // Creates a buffer object from native pixmap handle and initializes the
- // pixmap buffer. If |widget| is provided, browser side wl_buffer is also
- // created. Otherwise, this pixmap behaves as a staging pixmap and mustn't be
- // scheduled as an overlay.
- bool InitializeBufferFromHandle(gfx::AcceleratedWidget widget,
- gfx::Size size,
- gfx::BufferFormat format,
- gfx::NativePixmapHandle handle);
-
- // gfx::NativePixmap overrides:
- bool AreDmaBufFdsValid() const override;
- int GetDmaBufFd(size_t plane) const override;
- uint32_t GetDmaBufPitch(size_t plane) const override;
- size_t GetDmaBufOffset(size_t plane) const override;
- size_t GetDmaBufPlaneSize(size_t plane) const override;
- size_t GetNumberOfPlanes() const override;
- bool SupportsZeroCopyWebGPUImport() const override;
- uint64_t GetBufferFormatModifier() const override;
- gfx::BufferFormat GetBufferFormat() const override;
- gfx::Size GetBufferSize() const override;
- uint32_t GetUniqueId() const override;
- bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
- const gfx::OverlayPlaneData& overlay_plane_data,
- std::vector acquire_fences,
- std::vector release_fences) override;
- gfx::NativePixmapHandle ExportHandle() override;
-
- private:
- ~GbmPixmapWayland() override;
-
- // Asks Wayland to create a dmabuf based wl_buffer.
- void CreateDmabufBasedWlBuffer();
-
- // gbm_bo wrapper for struct gbm_bo.
- std::unique_ptr gbm_bo_;
-
- // Represents a connection to Wayland.
- const raw_ptr buffer_manager_;
-
- // Represents widget this pixmap backs.
- gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget;
-
- // A unique ID to identify the buffer for this pixmap.
- const uint32_t buffer_id_;
-
- // Size of the visible area of the buffer.
- gfx::Size visible_area_size_;
-
- // Says a wl_buffer has been created and must removed.
- bool created_wl_buffer_ = false;
-
- // Tells the usage of this pixmap.
- gfx::BufferUsage usage_ = gfx::BufferUsage::SCANOUT;
-};
-
-} // namespace ui
-
-#endif // UI_OZONE_PLATFORM_WAYLAND_GPU_GBM_PIXMAP_WAYLAND_H_
diff --git a/src/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/src/ui/ozone/platform/wayland/ozone_platform_wayland.cc
deleted file mode 100644
index 54e1b619..00000000
--- a/src/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ /dev/null
@@ -1,489 +0,0 @@
-// Copyright 2023 The Chromium Authors and Alex313031
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/ozone/platform/wayland/ozone_platform_wayland.h"
-
-#include
-#include
-#include
-#include
-
-#include
-
-#include "base/command_line.h"
-#include "base/functional/bind.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_pump_type.h"
-#include "base/no_destructor.h"
-#include "base/task/single_thread_task_runner.h"
-#include "build/build_config.h"
-#include "ui/base/buildflags.h"
-#include "ui/base/cursor/cursor_factory.h"
-#include "ui/base/dragdrop/os_exchange_data_provider_factory_ozone.h"
-#include "ui/base/ime/linux/input_method_auralinux.h"
-#include "ui/base/ime/linux/linux_input_method_context_factory.h"
-#include "ui/base/ui_base_features.h"
-#include "ui/display/display_switches.h"
-#include "ui/events/devices/device_data_manager.h"
-#include "ui/events/event.h"
-#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
-#include "ui/gfx/buffer_format_util.h"
-#include "ui/gfx/linux/client_native_pixmap_dmabuf.h"
-#include "ui/gfx/native_widget_types.h"
-#include "ui/ozone/common/base_keyboard_hook.h"
-#include "ui/ozone/common/features.h"
-#include "ui/ozone/platform/wayland/common/wayland_util.h"
-#include "ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h"
-#include "ui/ozone/platform/wayland/gpu/wayland_gl_egl_utility.h"
-#include "ui/ozone/platform/wayland/gpu/wayland_overlay_manager.h"
-#include "ui/ozone/platform/wayland/gpu/wayland_surface_factory.h"
-#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_connector.h"
-#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
-#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
-#include "ui/ozone/platform/wayland/host/wayland_exchange_data_provider.h"
-#include "ui/ozone/platform/wayland/host/wayland_input_controller.h"
-#include "ui/ozone/platform/wayland/host/wayland_input_method_context.h"
-#include "ui/ozone/platform/wayland/host/wayland_menu_utils.h"
-#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
-#include "ui/ozone/platform/wayland/host/wayland_seat.h"
-#include "ui/ozone/platform/wayland/host/wayland_window.h"
-#include "ui/ozone/platform/wayland/host/wayland_window_manager.h"
-#include "ui/ozone/platform/wayland/host/wayland_zaura_shell.h"
-#include "ui/ozone/platform/wayland/wayland_utils.h"
-#include "ui/ozone/public/gpu_platform_support_host.h"
-#include "ui/ozone/public/ozone_platform.h"
-#include "ui/ozone/public/platform_menu_utils.h"
-#include "ui/ozone/public/system_input_injector.h"
-#include "ui/platform_window/platform_window_init_properties.h"
-
-#if BUILDFLAG(USE_XKBCOMMON)
-#include "ui/events/ozone/layout/xkb/xkb_evdev_codes.h"
-#include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h"
-#else
-#include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS)
-#include "ui/ozone/common/bitmap_cursor_factory.h"
-#else
-#include "ui/ozone/platform/wayland/host/wayland_cursor_factory.h"
-#endif
-
-#if BUILDFLAG(IS_LINUX)
-#include "ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.h"
-#endif
-
-#if defined(WAYLAND_GBM)
-#include "ui/ozone/platform/wayland/gpu/drm_render_node_path_finder.h"
-#endif
-
-namespace ui {
-
-namespace {
-
-class OzonePlatformWayland : public OzonePlatform,
- public OSExchangeDataProviderFactoryOzone {
- public:
- OzonePlatformWayland()
- : old_synthesize_key_repeat_enabled_(
- KeyEvent::IsSynthesizeKeyRepeatEnabled()) {
- // Forcing the device scale factor on Wayland is not fully/well supported
- // and is provided for test purposes only.
- // See https://crbug.com/1241546
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- if (command_line->HasSwitch(switches::kForceDeviceScaleFactor)) {
- LOG(WARNING) << "--" << switches::kForceDeviceScaleFactor
- << " on Wayland is TEST ONLY. Use it at your own risk.";
- }
-
- // Disable key-repeat flag synthesizing. On Wayland, key repeat events are
- // generated inside Chrome, and the flag is properly set.
- // See also WaylandEventSource.
- KeyEvent::SetSynthesizeKeyRepeatEnabled(false);
-
- OSExchangeDataProviderFactoryOzone::SetInstance(this);
- }
-
- OzonePlatformWayland(const OzonePlatformWayland&) = delete;
- OzonePlatformWayland& operator=(const OzonePlatformWayland&) = delete;
-
- ~OzonePlatformWayland() override {
- KeyEvent::SetSynthesizeKeyRepeatEnabled(old_synthesize_key_repeat_enabled_);
- GetInputMethodContextFactoryForOzone() = LinuxInputMethodContextFactory();
- }
-
- // OzonePlatform
- SurfaceFactoryOzone* GetSurfaceFactoryOzone() override {
- return surface_factory_.get();
- }
-
- OverlayManagerOzone* GetOverlayManager() override {
- return overlay_manager_.get();
- }
-
- CursorFactory* GetCursorFactory() override { return cursor_factory_.get(); }
-
- InputController* GetInputController() override {
- return input_controller_.get();
- }
-
- GpuPlatformSupportHost* GetGpuPlatformSupportHost() override {
- return buffer_manager_connector_ ? buffer_manager_connector_.get()
- : gpu_platform_support_host_.get();
- }
-
- std::unique_ptr CreateSystemInputInjector() override {
- return nullptr;
- }
-
- std::unique_ptr CreatePlatformWindow(
- PlatformWindowDelegate* delegate,
- PlatformWindowInitProperties properties) override {
- return WaylandWindow::Create(delegate, connection_.get(),
- std::move(properties));
- }
-
- std::unique_ptr CreateNativeDisplayDelegate()
- override {
- return nullptr;
- }
-
- std::unique_ptr CreateScreen() override {
- // The WaylandConnection and the WaylandOutputManager must be created
- // before PlatformScreen.
- DCHECK(connection_ && connection_->wayland_output_manager());
- return connection_->wayland_output_manager()->CreateWaylandScreen();
- }
-
- void InitScreen(PlatformScreen* screen) override {
- DCHECK(connection_ && connection_->wayland_output_manager());
- // InitScreen is always called with the same screen that CreateScreen
- // hands back, so it is safe to cast here.
- connection_->wayland_output_manager()->InitWaylandScreen(
- static_cast(screen));
- }
-
- PlatformClipboard* GetPlatformClipboard() override {
- DCHECK(connection_);
- return connection_->clipboard();
- }
-
- PlatformGLEGLUtility* GetPlatformGLEGLUtility() override {
- if (!gl_egl_utility_)
- gl_egl_utility_ = std::make_unique();
- return gl_egl_utility_.get();
- }
-
- std::unique_ptr CreateInputMethod(
- ImeKeyEventDispatcher* ime_key_event_dispatcher,
- gfx::AcceleratedWidget widget) override {
- return std::make_unique(ime_key_event_dispatcher);
- }
-
- PlatformMenuUtils* GetPlatformMenuUtils() override {
- return menu_utils_.get();
- }
-
- WaylandUtils* GetPlatformUtils() override { return wayland_utils_.get(); }
-
- bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
- gfx::BufferUsage usage) const override {
-#if defined(WAYLAND_GBM)
- // If there is no drm render node device available, native pixmaps are not
- // supported.
- if (path_finder_.GetDrmRenderNodePath().empty())
- return false;
-
- if (supported_buffer_formats_.find(format) ==
- supported_buffer_formats_.end()) {
- return false;
- }
-
- return gfx::ClientNativePixmapDmaBuf::IsConfigurationSupported(format,
- usage);
-#else
- return false;
-#endif
- }
-
- bool ShouldUseCustomFrame() override {
- return connection_->xdg_decoration_manager_v1() == nullptr;
- }
-
- bool InitializeUI(const InitParams& args) override {
- if (ShouldFailInitializeUIForTest()) {
- LOG(ERROR) << "Failing for test";
- return false;
- }
- // Initialize DeviceDataManager early as devices are set during
- // WaylandConnection::Initialize().
- DeviceDataManager::CreateInstance();
-#if BUILDFLAG(USE_XKBCOMMON)
- keyboard_layout_engine_ =
- std::make_unique(xkb_evdev_code_converter_);
-#else
- keyboard_layout_engine_ = std::make_unique();
-#endif
- KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
- keyboard_layout_engine_.get());
- connection_ = std::make_unique();
- if (!connection_->Initialize()) {
- LOG(ERROR) << "Failed to initialize Wayland platform";
- return false;
- }
-
- buffer_manager_connector_ = std::make_unique(
- connection_->buffer_manager_host());
-#if BUILDFLAG(IS_CHROMEOS)
- cursor_factory_ = std::make_unique();
-#else
- cursor_factory_ = std::make_unique(connection_.get());
-#endif
- input_controller_ = CreateWaylandInputController(connection_.get());
- gpu_platform_support_host_.reset(CreateStubGpuPlatformSupportHost());
-
- supported_buffer_formats_ =
- connection_->buffer_manager_host()->GetSupportedBufferFormats();
-#if BUILDFLAG(IS_LINUX)
- linux_ui_delegate_ =
- std::make_unique(connection_.get());
-#endif
-
- menu_utils_ = std::make_unique(connection_.get());
- wayland_utils_ = std::make_unique(connection_.get());
-
- GetInputMethodContextFactoryForOzone() = base::BindRepeating(
- [](WaylandConnection* connection,
- WaylandKeyboard::Delegate* key_delegate,
- LinuxInputMethodContextDelegate* ime_delegate)
- -> std::unique_ptr {
- return std::make_unique(
- connection, key_delegate, ime_delegate);
- },
- base::Unretained(connection_.get()),
- base::Unretained(connection_->event_source()));
-
- return true;
- }
-
- void InitializeGPU(const InitParams& args) override {
- base::FilePath drm_node_path;
-#if defined(WAYLAND_GBM)
- drm_node_path = path_finder_.GetDrmRenderNodePath();
- if (drm_node_path.empty())
- LOG(WARNING) << "Failed to find drm render node path.";
-#endif
- buffer_manager_ = std::make_unique(drm_node_path);
- surface_factory_ = std::make_unique(
- connection_.get(), buffer_manager_.get());
- overlay_manager_ =
- std::make_unique(buffer_manager_.get());
- }
-
- const PlatformProperties& GetPlatformProperties() override {
- static base::NoDestructor properties;
- static bool initialised = false;
- if (!initialised) {
- // Server-side decorations on Wayland require support of xdg-decoration or
- // some other protocol extensions specific for the particular environment.
- // Whether the environment has any support only gets known at run time, so
- // we use the custom frame by default. If there is support, the user will
- // be able to enable the system frame.
- properties->custom_frame_pref_default = true;
-
- // Wayland uses sub-surfaces to show tooltips, and sub-surfaces must be
- // bound to their root surfaces always, but finding the correct root
- // surface at the moment of creating the tooltip is not always possible
- // due to how Wayland handles focus and activation.
- // Therefore, the platform should be given a hint at the moment when the
- // surface is initialised, where it is known for sure which root surface
- // shows the tooltip.
- properties->set_parent_for_non_top_level_windows = true;
- properties->app_modal_dialogs_use_event_blocker = true;
-
- // Xdg/Wl shell protocol does not disallow clients to manipulate global
- // screen coordinates, instead only surface-local ones are supported.
- // Non-toplevel surfaces, for example, must be positioned relative to
- // their parents. As for toplevel surfaces, clients simply don't know
- // their position on screens and always assume they are located at some
- // arbitrary position.
- properties->supports_global_screen_coordinates =
- features::IsWaylandScreenCoordinatesEnabled();
-
- // Let the media know this platform supports va-api.
- properties->supports_vaapi = true;
-
- initialised = true;
- }
-
- return *properties;
- }
-
- const PlatformRuntimeProperties& GetPlatformRuntimeProperties() override {
- using SupportsSsdForTest =
- OzonePlatform::PlatformRuntimeProperties::SupportsSsdForTest;
- const auto& override_supports_ssd_for_test = OzonePlatform::
- PlatformRuntimeProperties::override_supports_ssd_for_test;
-
- static OzonePlatform::PlatformRuntimeProperties properties;
- if (connection_) {
- DCHECK(has_initialized_ui());
- // These properties are set when GetPlatformRuntimeProperties is called on
- // the browser process side.
- properties.supports_server_side_window_decorations =
- (connection_->xdg_decoration_manager_v1() != nullptr &&
- override_supports_ssd_for_test == SupportsSsdForTest::kNotSet) ||
- override_supports_ssd_for_test == SupportsSsdForTest::kYes;
- properties.supports_overlays =
- connection_->ShouldUseOverlayDelegation() &&
- connection_->viewporter();
- properties.supports_non_backed_solid_color_buffers =
- connection_->ShouldUseOverlayDelegation() &&
- connection_->buffer_manager_host()
- ->SupportsNonBackedSolidColorBuffers();
- // Primary planes can be transluscent due to underlay strategy. As a
- // result Wayland server draws contents occluded by an accelerated widget.
- // To prevent this, an opaque background image is stacked below the
- // accelerated widget to occlude contents below.
- properties.needs_background_image =
- connection_->ShouldUseOverlayDelegation() &&
- connection_->viewporter();
- if (connection_->zaura_shell()) {
- properties.supports_activation =
- zaura_shell_get_version(connection_->zaura_shell()->wl_object()) >=
- ZAURA_TOPLEVEL_ACTIVATE_SINCE_VERSION;
- properties.supports_tooltip =
- (wl::get_version_of_object(
- connection_->zaura_shell()->wl_object()) >=
- ZAURA_SURFACE_SHOW_TOOLTIP_SINCE_VERSION) &&
- connection_->zaura_shell()->HasBugFix(1402158) &&
- connection_->zaura_shell()->HasBugFix(1410676);
- }
-
- if (surface_factory_) {
- DCHECK(has_initialized_gpu());
- properties.supports_native_pixmaps =
- surface_factory_->SupportsNativePixmaps();
- }
- } else if (buffer_manager_) {
- DCHECK(has_initialized_gpu());
- // These properties are set when the GetPlatformRuntimeProperties is
- // called on the gpu process side.
- properties.supports_non_backed_solid_color_buffers =
- buffer_manager_->supports_overlays() &&
- buffer_manager_->supports_non_backed_solid_color_buffers();
- // See the comment above.
- properties.needs_background_image =
- buffer_manager_->supports_overlays() &&
- buffer_manager_->supports_viewporter();
- properties.supports_native_pixmaps =
- surface_factory_->SupportsNativePixmaps();
- properties.supports_clip_rect = buffer_manager_->supports_clip_rect();
- }
- return properties;
- }
-
- void AddInterfaces(mojo::BinderMap* binders) override {
- // It's preferred to reuse the same task runner where the
- // WaylandBufferManagerGpu has been created. However, when tests are
- // executed, the task runner might not have been set at that time. Thus, use
- // the current one. See the comment in WaylandBufferManagerGpu why it takes
- // a task runner.
- //
- // Please note this call happens on the gpu.
- auto gpu_task_runner = buffer_manager_->gpu_thread_runner();
- if (!gpu_task_runner)
- gpu_task_runner = base::SingleThreadTaskRunner::GetCurrentDefault();
-
- binders->Add(
- base::BindRepeating(
- &OzonePlatformWayland::CreateWaylandBufferManagerGpuBinding,
- base::Unretained(this)),
- gpu_task_runner);
- }
-
- void CreateWaylandBufferManagerGpuBinding(
- mojo::PendingReceiver receiver) {
- buffer_manager_->AddBindingWaylandBufferManagerGpu(std::move(receiver));
- }
-
- void PostCreateMainMessageLoop(
- base::OnceCallback shutdown_cb,
- scoped_refptr) override {
- DCHECK(connection_);
- connection_->SetShutdownCb(std::move(shutdown_cb));
- }
-
- std::unique_ptr CreateKeyboardHook(
- PlatformKeyboardHookTypes type,
- base::RepeatingCallback callback,
- absl::optional> dom_codes,
- gfx::AcceleratedWidget accelerated_widget) override {
- DCHECK(connection_);
- auto* seat = connection_->seat();
- auto* window = connection_->window_manager()->GetWindow(accelerated_widget);
- if (!seat || !seat->keyboard() || !window) {
- return nullptr;
- }
- switch (type) {
- case PlatformKeyboardHookTypes::kModifier:
- return seat->keyboard()->CreateKeyboardHook(
- window, std::move(dom_codes), std::move(callback));
- case PlatformKeyboardHookTypes::kMedia:
- return nullptr;
- }
- }
-
- // OSExchangeDataProviderFactoryOzone:
- std::unique_ptr CreateProvider() override {
- return std::make_unique();
- }
-
- private:
- // Keeps the old value of KeyEvent::IsSynthesizeKeyRepeatEnabled(), to
- // restore it on destruction.
- const bool old_synthesize_key_repeat_enabled_;
-
-#if BUILDFLAG(USE_XKBCOMMON)
- XkbEvdevCodes xkb_evdev_code_converter_;
-#endif
-
- std::unique_ptr keyboard_layout_engine_;
- std::unique_ptr connection_;
- std::unique_ptr surface_factory_;
- std::unique_ptr cursor_factory_;
- std::unique_ptr input_controller_;
- std::unique_ptr gpu_platform_support_host_;
- std::unique_ptr buffer_manager_connector_;
- std::unique_ptr menu_utils_;
- std::unique_ptr wayland_utils_;
-
- // Objects, which solely live in the GPU process.
- std::unique_ptr buffer_manager_;
- std::unique_ptr overlay_manager_;
- std::unique_ptr gl_egl_utility_;
-
- // Provides supported buffer formats for native gpu memory buffers
- // framework.
- wl::BufferFormatsWithModifiersMap supported_buffer_formats_;
-
-#if defined(WAYLAND_GBM)
- // This is used both in the gpu and browser processes to find out if a drm
- // render node is available.
- DrmRenderNodePathFinder path_finder_;
-#endif
-
-#if BUILDFLAG(IS_LINUX)
- std::unique_ptr linux_ui_delegate_;
-#endif
-};
-
-} // namespace
-
-OzonePlatform* CreateOzonePlatformWayland() {
- return new OzonePlatformWayland;
-}
-
-} // namespace ui