mirror of
https://github.com/electron/electron.git
synced 2026-04-10 03:01:51 -04:00
* chore: bump chromium in DEPS to 78.0.3899.1 * chore: bump chromium in DEPS to 78.0.3900.1 * chore: bump chromium in DEPS to 78.0.3900.2 * chore: bump chromium in DEPS to 78.0.3901.1 * chore: bump chromium in DEPS to 78.0.3902.1 * chore: remove tts.patch https://chromium-review.googlesource.com/c/chromium/src/+/1717595 * build: disable widevine cdm component https://chromium-review.googlesource.com/c/chromium/src/+/1767596 * chore: bump chromium in DEPS to 78.0.3903.1 * build: redo network_context.h mojification187df411f2%5E%21/#F7 * build: disable widevine Disable widevine, atleast for the moment by deleting the patch and removing the build argument. > At the moment its horribly broken, we would have to look into fixing on all > three platforms now that upstream also supports linux. * chore: bump chromium in DEPS to 78.0.3904.1 * update pepper_flash.patch https://chromium-review.googlesource.com/c/chromium/src/+/1771371 * chore: bump chromium in DEPS to 78.0.3905.1 * Update patches * Convert Web Speech Synthesis API over to Mojo https://chromium-review.googlesource.com/c/chromium/src/+/1717595 (cherry picked from commite0163b0185) * Update patches * CookieInclusionStatus: Support warnings and multiple exclusion reasons https://chromium-review.googlesource.com/c/chromium/src/+/1756157 (cherry picked from commitab2f5ac40b) * Pass request_unadjusted_movement to lock mouse https://chromium-review.googlesource.com/c/chromium/src/+/1767098 (cherry picked from commita17daff6f1) * chore: rename thread_pool to thread_pool_instance Refs: https://chromium-review.googlesource.com/c/chromium/src/+/1773663 (cherry picked from commit8547b09de8) * Remove the typemap from network::mojom::URLResponseHead. https://chromium-review.googlesource.com/c/chromium/src/+/1758653 (cherry picked from commita768ad210d) * ServiceWorker: Make Extension WebRequestAPI aware of service worker update check script requests https://chromium-review.googlesource.com/c/chromium/src/+/1782230 (cherry picked from commit615d33517a) * Convert CertVerifierClient to new Mojo types https://bugs.chromium.org/p/chromium/issues/detail?id=955171 (cherry picked from commitac5e8dbce5) * Convert DataPipeGetterPtr and DataPipeGetterRequest to new Mojo types https://chromium-review.googlesource.com/c/chromium/src/+/1787760 https://chromium-review.googlesource.com/c/chromium/src/+/1787659 (cherry picked from commit8611783898) * Add tts patch * build: fix compilation with MSSTL (cherry picked from commit4d8cb7de9b)
637 lines
26 KiB
Diff
637 lines
26 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Heilig Benedek <benecene@gmail.com>
|
|
Date: Wed, 20 Mar 2019 20:30:44 +0100
|
|
Subject: feat_offscreen_rendering_with_viz_compositor.patch
|
|
|
|
|
|
diff --git a/components/viz/host/host_display_client.cc b/components/viz/host/host_display_client.cc
|
|
index f5e18df4e06e24d3bdd51308abde48e217444848..41017d9d53b1c0d563ea0901f5cae407c6cf1560 100644
|
|
--- a/components/viz/host/host_display_client.cc
|
|
+++ b/components/viz/host/host_display_client.cc
|
|
@@ -18,6 +18,10 @@
|
|
|
|
namespace viz {
|
|
|
|
+void HostDisplayClient::IsOffscreen(IsOffscreenCallback callback) {
|
|
+ std::move(callback).Run(false);
|
|
+}
|
|
+
|
|
HostDisplayClient::HostDisplayClient(gfx::AcceleratedWidget widget)
|
|
: binding_(this) {
|
|
#if defined(OS_MACOSX) || defined(OS_WIN)
|
|
@@ -46,9 +50,9 @@ void HostDisplayClient::OnDisplayReceivedCALayerParams(
|
|
}
|
|
#endif
|
|
|
|
-#if defined(OS_WIN)
|
|
void HostDisplayClient::CreateLayeredWindowUpdater(
|
|
mojom::LayeredWindowUpdaterRequest request) {
|
|
+#if defined(OS_WIN)
|
|
if (!NeedsToUseLayerWindow(widget_)) {
|
|
DLOG(ERROR) << "HWND shouldn't be using a layered window";
|
|
return;
|
|
@@ -56,8 +60,12 @@ void HostDisplayClient::CreateLayeredWindowUpdater(
|
|
|
|
layered_window_updater_ =
|
|
std::make_unique<LayeredWindowUpdaterImpl>(widget_, std::move(request));
|
|
-}
|
|
+#else
|
|
+ CHECK(false) << "Chromium is calling CreateLayeredWindowUpdater for non-OSR "
|
|
+ "windows on POSIX platforms, something is wrong with "
|
|
+ "Electron's OSR implementation.";
|
|
#endif
|
|
+}
|
|
|
|
#if defined(USE_X11)
|
|
void HostDisplayClient::DidCompleteSwapWithNewSize(const gfx::Size& size) {
|
|
diff --git a/components/viz/host/host_display_client.h b/components/viz/host/host_display_client.h
|
|
index b8177277ebca471fc147f2d5b53521cbadd8fa2d..72a807e138f80b4ab37cb1d368bc968e299d903f 100644
|
|
--- a/components/viz/host/host_display_client.h
|
|
+++ b/components/viz/host/host_display_client.h
|
|
@@ -30,17 +30,17 @@ class VIZ_HOST_EXPORT HostDisplayClient : public mojom::DisplayClient {
|
|
mojom::DisplayClientPtr GetBoundPtr(
|
|
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
|
|
|
|
- private:
|
|
+ protected:
|
|
// mojom::DisplayClient implementation:
|
|
#if defined(OS_MACOSX)
|
|
void OnDisplayReceivedCALayerParams(
|
|
const gfx::CALayerParams& ca_layer_params) override;
|
|
#endif
|
|
|
|
-#if defined(OS_WIN)
|
|
+ void IsOffscreen(IsOffscreenCallback callback) override;
|
|
+
|
|
void CreateLayeredWindowUpdater(
|
|
mojom::LayeredWindowUpdaterRequest request) override;
|
|
-#endif
|
|
|
|
#if defined(USE_X11)
|
|
void DidCompleteSwapWithNewSize(const gfx::Size& size) override;
|
|
diff --git a/components/viz/host/layered_window_updater_impl.cc b/components/viz/host/layered_window_updater_impl.cc
|
|
index 65c26e2f7ae813e50f6740f73a4d145467da4366..39c04c4d6b644a4ad7b13b4e932b085fad0b8293 100644
|
|
--- a/components/viz/host/layered_window_updater_impl.cc
|
|
+++ b/components/viz/host/layered_window_updater_impl.cc
|
|
@@ -43,7 +43,9 @@ void LayeredWindowUpdaterImpl::OnAllocatedSharedMemory(
|
|
// |region|'s handle will close when it goes out of scope.
|
|
}
|
|
|
|
-void LayeredWindowUpdaterImpl::Draw(DrawCallback draw_callback) {
|
|
+void LayeredWindowUpdaterImpl::Draw(
|
|
+ const gfx::Rect& damage_rect,
|
|
+ DrawCallback draw_callback) {
|
|
TRACE_EVENT0("viz", "LayeredWindowUpdaterImpl::Draw");
|
|
|
|
if (!canvas_) {
|
|
diff --git a/components/viz/host/layered_window_updater_impl.h b/components/viz/host/layered_window_updater_impl.h
|
|
index ced30727ab67e557265c3a61f7c213763da973ce..f422786fe6cd9cab47494fe6028f3c3be8bc763e 100644
|
|
--- a/components/viz/host/layered_window_updater_impl.h
|
|
+++ b/components/viz/host/layered_window_updater_impl.h
|
|
@@ -33,7 +33,7 @@ class VIZ_HOST_EXPORT LayeredWindowUpdaterImpl
|
|
// mojom::LayeredWindowUpdater implementation.
|
|
void OnAllocatedSharedMemory(const gfx::Size& pixel_size,
|
|
base::UnsafeSharedMemoryRegion region) override;
|
|
- void Draw(DrawCallback draw_callback) override;
|
|
+ void Draw(const gfx::Rect& damage_rect, DrawCallback draw_callback) override;
|
|
|
|
private:
|
|
const HWND hwnd_;
|
|
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn
|
|
index a3fc1b3bdc9c22f4ac4b1ae8ddd992f419d04d55..0da7bf23e0f5309887c9038a14c33d2d80095d0b 100644
|
|
--- a/components/viz/service/BUILD.gn
|
|
+++ b/components/viz/service/BUILD.gn
|
|
@@ -118,6 +118,8 @@ viz_component("service") {
|
|
"display_embedder/output_surface_provider_impl.h",
|
|
"display_embedder/server_shared_bitmap_manager.cc",
|
|
"display_embedder/server_shared_bitmap_manager.h",
|
|
+ "display_embedder/software_output_device_proxy.cc",
|
|
+ "display_embedder/software_output_device_proxy.h",
|
|
"display_embedder/software_output_surface.cc",
|
|
"display_embedder/software_output_surface.h",
|
|
"display_embedder/viz_process_context_provider.cc",
|
|
diff --git a/components/viz/service/display_embedder/output_surface_provider_impl.cc b/components/viz/service/display_embedder/output_surface_provider_impl.cc
|
|
index e3c8e9dbca69f2665e8dbbd798d45c3b7199e04c..d9fa2d536e977ac966065a9058661f887e995320 100644
|
|
--- a/components/viz/service/display_embedder/output_surface_provider_impl.cc
|
|
+++ b/components/viz/service/display_embedder/output_surface_provider_impl.cc
|
|
@@ -20,6 +20,7 @@
|
|
#include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
|
|
#include "components/viz/service/display_embedder/skia_output_surface_dependency_impl.h"
|
|
#include "components/viz/service/display_embedder/skia_output_surface_impl.h"
|
|
+#include "components/viz/service/display_embedder/software_output_device_proxy.h"
|
|
#include "components/viz/service/display_embedder/software_output_surface.h"
|
|
#include "components/viz/service/display_embedder/viz_process_context_provider.h"
|
|
#include "components/viz/service/gl/gpu_service_impl.h"
|
|
@@ -33,6 +34,7 @@
|
|
#include "gpu/ipc/scheduler_sequence.h"
|
|
#include "gpu/ipc/service/gpu_channel_manager_delegate.h"
|
|
#include "gpu/ipc/service/image_transport_surface.h"
|
|
+#include "services/viz/privileged/mojom/compositing/layered_window_updater.mojom.h"
|
|
#include "ui/base/ui_base_switches.h"
|
|
#include "ui/gl/gl_context.h"
|
|
#include "ui/gl/init/gl_factory.h"
|
|
@@ -223,6 +225,19 @@ OutputSurfaceProviderImpl::CreateSoftwareOutputDeviceForPlatform(
|
|
if (headless_)
|
|
return std::make_unique<SoftwareOutputDevice>();
|
|
|
|
+#if !defined(OS_MACOSX)
|
|
+ DCHECK(display_client);
|
|
+ bool offscreen = false;
|
|
+ if (display_client->IsOffscreen(&offscreen) && offscreen) {
|
|
+ mojom::LayeredWindowUpdaterPtr layered_window_updater;
|
|
+ display_client->CreateLayeredWindowUpdater(
|
|
+ mojo::MakeRequest(&layered_window_updater));
|
|
+
|
|
+ return std::make_unique<SoftwareOutputDeviceProxy>(
|
|
+ std::move(layered_window_updater));
|
|
+ }
|
|
+#endif
|
|
+
|
|
#if defined(OS_WIN)
|
|
return CreateSoftwareOutputDeviceWin(surface_handle, &output_device_backing_,
|
|
display_client);
|
|
diff --git a/components/viz/service/display_embedder/software_output_device_mac.cc b/components/viz/service/display_embedder/software_output_device_mac.cc
|
|
index b9357082293cc55650144ccbc8bada8fe6d1cac4..b4cb07e26d1504719f80e5835c1cb5f138b9f1ab 100644
|
|
--- a/components/viz/service/display_embedder/software_output_device_mac.cc
|
|
+++ b/components/viz/service/display_embedder/software_output_device_mac.cc
|
|
@@ -102,6 +102,8 @@ void SoftwareOutputDeviceMac::UpdateAndCopyBufferDamage(
|
|
|
|
SkCanvas* SoftwareOutputDeviceMac::BeginPaint(
|
|
const gfx::Rect& new_damage_rect) {
|
|
+ last_damage = new_damage_rect;
|
|
+
|
|
// Record the previous paint buffer.
|
|
Buffer* previous_paint_buffer =
|
|
buffer_queue_.empty() ? nullptr : buffer_queue_.back().get();
|
|
@@ -184,6 +186,7 @@ void SoftwareOutputDeviceMac::EndPaint() {
|
|
ca_layer_params.is_empty = false;
|
|
ca_layer_params.scale_factor = scale_factor_;
|
|
ca_layer_params.pixel_size = pixel_size_;
|
|
+ ca_layer_params.damage = last_damage;
|
|
ca_layer_params.io_surface_mach_port.reset(
|
|
IOSurfaceCreateMachPort(current_paint_buffer_->io_surface));
|
|
client_->SoftwareDeviceUpdatedCALayerParams(ca_layer_params);
|
|
diff --git a/components/viz/service/display_embedder/software_output_device_mac.h b/components/viz/service/display_embedder/software_output_device_mac.h
|
|
index f3867356e3d641416e00e6d115ae9ae2a0be90ab..b1d192d2b20ccb63fba07093101d745e5ffe86dd 100644
|
|
--- a/components/viz/service/display_embedder/software_output_device_mac.h
|
|
+++ b/components/viz/service/display_embedder/software_output_device_mac.h
|
|
@@ -56,6 +56,7 @@ class VIZ_SERVICE_EXPORT SoftwareOutputDeviceMac : public SoftwareOutputDevice {
|
|
void UpdateAndCopyBufferDamage(Buffer* previous_paint_buffer,
|
|
const SkRegion& new_damage_rect);
|
|
|
|
+ gfx::Rect last_damage;
|
|
gfx::Size pixel_size_;
|
|
float scale_factor_ = 1;
|
|
|
|
diff --git a/components/viz/service/display_embedder/software_output_device_proxy.cc b/components/viz/service/display_embedder/software_output_device_proxy.cc
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..c17b03e00089bfd301c63910426bb16afb8cdae7
|
|
--- /dev/null
|
|
+++ b/components/viz/service/display_embedder/software_output_device_proxy.cc
|
|
@@ -0,0 +1,156 @@
|
|
+// Copyright 2014 The Chromium Authors. All rights reserved.
|
|
+// Use of this source code is governed by a BSD-style license that can be
|
|
+// found in the LICENSE file.
|
|
+
|
|
+#include "components/viz/service/display_embedder/software_output_device_proxy.h"
|
|
+
|
|
+#include "base/memory/unsafe_shared_memory_region.h"
|
|
+#include "base/threading/thread_checker.h"
|
|
+#include "components/viz/common/resources/resource_sizes.h"
|
|
+#include "components/viz/service/display_embedder/output_device_backing.h"
|
|
+#include "mojo/public/cpp/system/platform_handle.h"
|
|
+#include "services/viz/privileged/mojom/compositing/layered_window_updater.mojom.h"
|
|
+#include "skia/ext/platform_canvas.h"
|
|
+#include "third_party/skia/include/core/SkCanvas.h"
|
|
+#include "ui/gfx/skia_util.h"
|
|
+
|
|
+#if defined(OS_WIN)
|
|
+#include "skia/ext/skia_utils_win.h"
|
|
+#include "ui/gfx/gdi_util.h"
|
|
+#include "ui/gfx/win/hwnd_util.h"
|
|
+#else
|
|
+#include "mojo/public/cpp/base/shared_memory_utils.h"
|
|
+#endif
|
|
+
|
|
+namespace viz {
|
|
+
|
|
+SoftwareOutputDeviceBase::~SoftwareOutputDeviceBase() {
|
|
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
|
|
+ DCHECK(!in_paint_);
|
|
+}
|
|
+
|
|
+void SoftwareOutputDeviceBase::Resize(const gfx::Size& viewport_pixel_size,
|
|
+ float scale_factor) {
|
|
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
|
|
+ DCHECK(!in_paint_);
|
|
+
|
|
+ if (viewport_pixel_size_ == viewport_pixel_size)
|
|
+ return;
|
|
+
|
|
+ viewport_pixel_size_ = viewport_pixel_size;
|
|
+ ResizeDelegated();
|
|
+}
|
|
+
|
|
+SkCanvas* SoftwareOutputDeviceBase::BeginPaint(
|
|
+ const gfx::Rect& damage_rect) {
|
|
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
|
|
+ DCHECK(!in_paint_);
|
|
+
|
|
+ damage_rect_ = damage_rect;
|
|
+ in_paint_ = true;
|
|
+ return BeginPaintDelegated();
|
|
+}
|
|
+
|
|
+void SoftwareOutputDeviceBase::EndPaint() {
|
|
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
|
|
+ DCHECK(in_paint_);
|
|
+
|
|
+ in_paint_ = false;
|
|
+
|
|
+ gfx::Rect intersected_damage_rect = damage_rect_;
|
|
+ intersected_damage_rect.Intersect(gfx::Rect(viewport_pixel_size_));
|
|
+ if (intersected_damage_rect.IsEmpty())
|
|
+ return;
|
|
+
|
|
+ EndPaintDelegated(intersected_damage_rect);
|
|
+}
|
|
+
|
|
+SoftwareOutputDeviceProxy::~SoftwareOutputDeviceProxy() = default;
|
|
+
|
|
+SoftwareOutputDeviceProxy::SoftwareOutputDeviceProxy(
|
|
+ mojom::LayeredWindowUpdaterPtr layered_window_updater)
|
|
+ : layered_window_updater_(std::move(layered_window_updater)) {
|
|
+ DCHECK(layered_window_updater_.is_bound());
|
|
+}
|
|
+
|
|
+void SoftwareOutputDeviceProxy::OnSwapBuffers(
|
|
+ SoftwareOutputDevice::SwapBuffersCallback swap_ack_callback) {
|
|
+ DCHECK(swap_ack_callback_.is_null());
|
|
+
|
|
+ // We aren't waiting on DrawAck() and can immediately run the callback.
|
|
+ if (!waiting_on_draw_ack_) {
|
|
+ task_runner_->PostTask(FROM_HERE,
|
|
+ base::BindOnce(std::move(swap_ack_callback), viewport_pixel_size_));
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ swap_ack_callback_ = std::move(swap_ack_callback);
|
|
+}
|
|
+
|
|
+void SoftwareOutputDeviceProxy::ResizeDelegated() {
|
|
+ canvas_.reset();
|
|
+
|
|
+ size_t required_bytes;
|
|
+ if (!ResourceSizes::MaybeSizeInBytes(
|
|
+ viewport_pixel_size_, ResourceFormat::RGBA_8888, &required_bytes)) {
|
|
+ DLOG(ERROR) << "Invalid viewport size " << viewport_pixel_size_.ToString();
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ base::UnsafeSharedMemoryRegion region =
|
|
+ base::UnsafeSharedMemoryRegion::Create(required_bytes);
|
|
+ if (!region.IsValid()) {
|
|
+ DLOG(ERROR) << "Failed to allocate " << required_bytes << " bytes";
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ #if defined(WIN32)
|
|
+ canvas_ = skia::CreatePlatformCanvasWithSharedSection(
|
|
+ viewport_pixel_size_.width(), viewport_pixel_size_.height(), false,
|
|
+ region.GetPlatformHandle(), skia::CRASH_ON_FAILURE);
|
|
+ #else
|
|
+ shm_mapping_ = region.Map();
|
|
+ if (!shm_mapping_.IsValid()) {
|
|
+ DLOG(ERROR) << "Failed to map " << required_bytes << " bytes";
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ canvas_ = skia::CreatePlatformCanvasWithPixels(
|
|
+ viewport_pixel_size_.width(), viewport_pixel_size_.height(), false,
|
|
+ static_cast<uint8_t*>(shm_mapping_.memory()), skia::CRASH_ON_FAILURE);
|
|
+ #endif
|
|
+
|
|
+ // Transfer region ownership to the browser process.
|
|
+ layered_window_updater_->OnAllocatedSharedMemory(viewport_pixel_size_,
|
|
+ std::move(region));
|
|
+}
|
|
+
|
|
+SkCanvas* SoftwareOutputDeviceProxy::BeginPaintDelegated() {
|
|
+ return canvas_.get();
|
|
+}
|
|
+
|
|
+void SoftwareOutputDeviceProxy::EndPaintDelegated(
|
|
+ const gfx::Rect& damage_rect) {
|
|
+ DCHECK(!waiting_on_draw_ack_);
|
|
+
|
|
+ if (!canvas_)
|
|
+ return;
|
|
+
|
|
+ layered_window_updater_->Draw(damage_rect, base::BindOnce(
|
|
+ &SoftwareOutputDeviceProxy::DrawAck, base::Unretained(this)));
|
|
+ waiting_on_draw_ack_ = true;
|
|
+
|
|
+ TRACE_EVENT_ASYNC_BEGIN0("viz", "SoftwareOutputDeviceProxy::Draw", this);
|
|
+}
|
|
+
|
|
+void SoftwareOutputDeviceProxy::DrawAck() {
|
|
+ DCHECK(waiting_on_draw_ack_);
|
|
+ DCHECK(!swap_ack_callback_.is_null());
|
|
+
|
|
+ TRACE_EVENT_ASYNC_END0("viz", "SoftwareOutputDeviceProxy::Draw", this);
|
|
+
|
|
+ waiting_on_draw_ack_ = false;
|
|
+ std::move(swap_ack_callback_).Run(viewport_pixel_size_);
|
|
+}
|
|
+
|
|
+} // namespace viz
|
|
diff --git a/components/viz/service/display_embedder/software_output_device_proxy.h b/components/viz/service/display_embedder/software_output_device_proxy.h
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..3865939d0445a23a468770f57207ba5ef23277ed
|
|
--- /dev/null
|
|
+++ b/components/viz/service/display_embedder/software_output_device_proxy.h
|
|
@@ -0,0 +1,88 @@
|
|
+// Copyright 2014 The Chromium Authors. All rights reserved.
|
|
+// Use of this source code is governed by a BSD-style license that can be
|
|
+// found in the LICENSE file.
|
|
+
|
|
+#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SOFTWARE_OUTPUT_DEVICE_PROXY_H_
|
|
+#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SOFTWARE_OUTPUT_DEVICE_PROXY_H_
|
|
+
|
|
+#if defined(OS_WIN)
|
|
+#include <windows.h>
|
|
+#endif
|
|
+
|
|
+#include <memory>
|
|
+
|
|
+#include "components/viz/host/host_display_client.h"
|
|
+#include "components/viz/service/display/software_output_device.h"
|
|
+#include "components/viz/service/viz_service_export.h"
|
|
+#include "services/viz/privileged/mojom/compositing/display_private.mojom.h"
|
|
+#include "services/viz/privileged/mojom/compositing/layered_window_updater.mojom.h"
|
|
+
|
|
+namespace viz {
|
|
+
|
|
+// Shared base class for SoftwareOutputDevice implementations.
|
|
+class SoftwareOutputDeviceBase : public SoftwareOutputDevice {
|
|
+ public:
|
|
+ SoftwareOutputDeviceBase() = default;
|
|
+ ~SoftwareOutputDeviceBase() override;
|
|
+
|
|
+ // SoftwareOutputDevice implementation.
|
|
+ void Resize(const gfx::Size& viewport_pixel_size,
|
|
+ float scale_factor) override;
|
|
+ SkCanvas* BeginPaint(const gfx::Rect& damage_rect) override;
|
|
+ void EndPaint() override;
|
|
+
|
|
+ // Called from Resize() if |viewport_pixel_size_| has changed.
|
|
+ virtual void ResizeDelegated() = 0;
|
|
+
|
|
+ // Called from BeginPaint() and should return an SkCanvas.
|
|
+ virtual SkCanvas* BeginPaintDelegated() = 0;
|
|
+
|
|
+ // Called from EndPaint() if there is damage.
|
|
+ virtual void EndPaintDelegated(const gfx::Rect& damage_rect) = 0;
|
|
+
|
|
+ private:
|
|
+ bool in_paint_ = false;
|
|
+
|
|
+ THREAD_CHECKER(thread_checker_);
|
|
+
|
|
+ DISALLOW_COPY_AND_ASSIGN(SoftwareOutputDeviceBase);
|
|
+};
|
|
+
|
|
+// SoftwareOutputDevice implementation that draws indirectly. An implementation
|
|
+// of mojom::LayeredWindowUpdater in the browser process handles the actual
|
|
+// drawing. Pixel backing is in SharedMemory so no copying between processes
|
|
+// is required.
|
|
+class SoftwareOutputDeviceProxy : public SoftwareOutputDeviceBase {
|
|
+ public:
|
|
+ explicit SoftwareOutputDeviceProxy(
|
|
+ mojom::LayeredWindowUpdaterPtr layered_window_updater);
|
|
+ ~SoftwareOutputDeviceProxy() override;
|
|
+
|
|
+ // SoftwareOutputDevice implementation.
|
|
+ void OnSwapBuffers(SoftwareOutputDevice::SwapBuffersCallback swap_ack_callback) override;
|
|
+
|
|
+ // SoftwareOutputDeviceBase implementation.
|
|
+ void ResizeDelegated() override;
|
|
+ SkCanvas* BeginPaintDelegated() override;
|
|
+ void EndPaintDelegated(const gfx::Rect& rect) override;
|
|
+
|
|
+ private:
|
|
+ // Runs |swap_ack_callback_| after draw has happened.
|
|
+ void DrawAck();
|
|
+
|
|
+ mojom::LayeredWindowUpdaterPtr layered_window_updater_;
|
|
+
|
|
+ std::unique_ptr<SkCanvas> canvas_;
|
|
+ bool waiting_on_draw_ack_ = false;
|
|
+ SoftwareOutputDevice::SwapBuffersCallback swap_ack_callback_;
|
|
+
|
|
+#if !defined(WIN32)
|
|
+ base::WritableSharedMemoryMapping shm_mapping_;
|
|
+#endif
|
|
+
|
|
+ DISALLOW_COPY_AND_ASSIGN(SoftwareOutputDeviceProxy);
|
|
+};
|
|
+
|
|
+} // namespace viz
|
|
+
|
|
+#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SOFTWARE_OUTPUT_DEVICE_PROXY_H_
|
|
diff --git a/components/viz/service/display_embedder/software_output_device_win.cc b/components/viz/service/display_embedder/software_output_device_win.cc
|
|
index 74316edc0e0bd28b1772e9d7cf34327d113462c4..9cbe5400458ce6e0b8ea9edfa3f0969fb936ee1e 100644
|
|
--- a/components/viz/service/display_embedder/software_output_device_win.cc
|
|
+++ b/components/viz/service/display_embedder/software_output_device_win.cc
|
|
@@ -11,6 +11,7 @@
|
|
#include "components/viz/common/display/use_layered_window.h"
|
|
#include "components/viz/common/resources/resource_sizes.h"
|
|
#include "components/viz/service/display_embedder/output_device_backing.h"
|
|
+#include "components/viz/service/display_embedder/software_output_device_proxy.h"
|
|
#include "mojo/public/cpp/system/platform_handle.h"
|
|
#include "services/viz/privileged/mojom/compositing/layered_window_updater.mojom.h"
|
|
#include "skia/ext/platform_canvas.h"
|
|
@@ -265,7 +266,7 @@ void SoftwareOutputDeviceWinProxy::EndPaintDelegated(
|
|
if (!canvas_)
|
|
return;
|
|
|
|
- layered_window_updater_->Draw(base::BindOnce(
|
|
+ layered_window_updater_->Draw(damage_rect, base::BindOnce(
|
|
&SoftwareOutputDeviceWinProxy::DrawAck, base::Unretained(this)));
|
|
waiting_on_draw_ack_ = true;
|
|
|
|
@@ -297,8 +298,13 @@ std::unique_ptr<SoftwareOutputDevice> CreateSoftwareOutputDeviceWin(
|
|
display_client->CreateLayeredWindowUpdater(
|
|
mojo::MakeRequest(&layered_window_updater));
|
|
|
|
- return std::make_unique<SoftwareOutputDeviceWinProxy>(
|
|
- hwnd, std::move(layered_window_updater));
|
|
+ bool offscreen = false;
|
|
+ if (display_client->IsOffscreen(&offscreen) && offscreen)
|
|
+ return std::make_unique<SoftwareOutputDeviceProxy>(
|
|
+ std::move(layered_window_updater));
|
|
+ else
|
|
+ return std::make_unique<SoftwareOutputDeviceWinProxy>(
|
|
+ hwnd, std::move(layered_window_updater));
|
|
} else {
|
|
return std::make_unique<SoftwareOutputDeviceWinDirect>(hwnd, backing);
|
|
}
|
|
diff --git a/services/viz/privileged/mojom/compositing/display_private.mojom b/services/viz/privileged/mojom/compositing/display_private.mojom
|
|
index 5c6292cfb3b8b46802c772d202d19c78e4782488..ed27af3ab0b383553b4d9492d29cec2b91bee807 100644
|
|
--- a/services/viz/privileged/mojom/compositing/display_private.mojom
|
|
+++ b/services/viz/privileged/mojom/compositing/display_private.mojom
|
|
@@ -79,12 +79,14 @@ interface DisplayPrivate {
|
|
};
|
|
|
|
interface DisplayClient {
|
|
+ [Sync]
|
|
+ IsOffscreen() => (bool success);
|
|
+
|
|
[EnableIf=is_mac]
|
|
OnDisplayReceivedCALayerParams(gfx.mojom.CALayerParams ca_layer_params);
|
|
|
|
// Creates a LayeredWindowUpdater implementation to draw into a layered
|
|
// window.
|
|
- [EnableIf=is_win]
|
|
CreateLayeredWindowUpdater(LayeredWindowUpdater& layered_window_updater);
|
|
|
|
// Notifies that a swap has occurred and provides information about the pixel
|
|
diff --git a/services/viz/privileged/mojom/compositing/layered_window_updater.mojom b/services/viz/privileged/mojom/compositing/layered_window_updater.mojom
|
|
index 6b7fbb6cf13dc8ee6ade0878a9a2c1efc5d4d3f1..e2af75168cb914a7b3b4a6c9b6a285498c3f8e72 100644
|
|
--- a/services/viz/privileged/mojom/compositing/layered_window_updater.mojom
|
|
+++ b/services/viz/privileged/mojom/compositing/layered_window_updater.mojom
|
|
@@ -26,5 +26,5 @@ interface LayeredWindowUpdater {
|
|
// Draws to the HWND by copying pixels from shared memory. Callback must be
|
|
// called after draw operation is complete to signal shared memory can be
|
|
// modified.
|
|
- Draw() => ();
|
|
+ Draw(gfx.mojom.Rect damage_rect) => ();
|
|
};
|
|
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
|
|
index ff4562c024be6bc6eb2b975b3a13c6139b89f88e..22ed4f873266143310bf5ef55df3df2a8b9aea93 100644
|
|
--- a/ui/compositor/compositor.h
|
|
+++ b/ui/compositor/compositor.h
|
|
@@ -23,6 +23,7 @@
|
|
#include "cc/trees/layer_tree_host_single_thread_client.h"
|
|
#include "components/viz/common/frame_sinks/begin_frame_args.h"
|
|
#include "components/viz/common/surfaces/frame_sink_id.h"
|
|
+#include "components/viz/host/host_display_client.h"
|
|
#include "components/viz/host/host_frame_sink_client.h"
|
|
#include "services/viz/privileged/mojom/compositing/vsync_parameter_observer.mojom-forward.h"
|
|
#include "third_party/skia/include/core/SkColor.h"
|
|
@@ -194,6 +195,15 @@ class COMPOSITOR_EXPORT ContextFactory {
|
|
virtual bool SyncTokensRequiredForDisplayCompositor() = 0;
|
|
};
|
|
|
|
+class COMPOSITOR_EXPORT CompositorDelegate {
|
|
+ public:
|
|
+ virtual std::unique_ptr<viz::HostDisplayClient> CreateHostDisplayClient(
|
|
+ ui::Compositor* compositor) = 0;
|
|
+
|
|
+ protected:
|
|
+ virtual ~CompositorDelegate() {}
|
|
+};
|
|
+
|
|
// Compositor object to take care of GPU painting.
|
|
// A Browser compositor object is responsible for generating the final
|
|
// displayable form of pixels comprising a single widget's contents. It draws an
|
|
@@ -233,6 +243,9 @@ class COMPOSITOR_EXPORT Compositor : public cc::LayerTreeHostClient,
|
|
// Schedules a redraw of the layer tree associated with this compositor.
|
|
void ScheduleDraw();
|
|
|
|
+ CompositorDelegate* delegate() const { return delegate_; }
|
|
+ void SetDelegate(CompositorDelegate* delegate) { delegate_ = delegate; }
|
|
+
|
|
// Sets the root of the layer tree drawn by this Compositor. The root layer
|
|
// must have no parent. The compositor's root layer is reset if the root layer
|
|
// is destroyed. NULL can be passed to reset the root layer, in which case the
|
|
@@ -450,6 +463,8 @@ class COMPOSITOR_EXPORT Compositor : public cc::LayerTreeHostClient,
|
|
ui::ContextFactory* context_factory_;
|
|
ui::ContextFactoryPrivate* context_factory_private_;
|
|
|
|
+ CompositorDelegate* delegate_ = nullptr;
|
|
+
|
|
// The root of the Layer tree drawn by this compositor.
|
|
Layer* root_layer_ = nullptr;
|
|
|
|
diff --git a/ui/compositor/host/host_context_factory_private.cc b/ui/compositor/host/host_context_factory_private.cc
|
|
index d32c154b965bf9fa90f8ebb2a8dd395302efc57d..f63efc91890af45c5a767bfb892ef252b22c253e 100644
|
|
--- a/ui/compositor/host/host_context_factory_private.cc
|
|
+++ b/ui/compositor/host/host_context_factory_private.cc
|
|
@@ -98,8 +98,12 @@ void HostContextFactoryPrivate::ConfigureCompositor(
|
|
mojo::MakeRequest(&root_params->compositor_frame_sink_client);
|
|
root_params->display_private =
|
|
mojo::MakeRequest(&compositor_data.display_private);
|
|
- compositor_data.display_client =
|
|
- std::make_unique<HostDisplayClient>(compositor);
|
|
+ if (compositor->delegate())
|
|
+ compositor_data.display_client = compositor->delegate()->CreateHostDisplayClient(
|
|
+ compositor);
|
|
+ else
|
|
+ compositor_data.display_client =
|
|
+ std::make_unique<HostDisplayClient>(compositor);
|
|
root_params->display_client =
|
|
compositor_data.display_client->GetBoundPtr(resize_task_runner_)
|
|
.PassInterface();
|
|
diff --git a/ui/gfx/ca_layer_params.h b/ui/gfx/ca_layer_params.h
|
|
index 4014e64a75da88cf66c02e8adb71171c2666cab7..25e57784e1a1ffc546b003daa4cd0059c468432f 100644
|
|
--- a/ui/gfx/ca_layer_params.h
|
|
+++ b/ui/gfx/ca_layer_params.h
|
|
@@ -6,6 +6,7 @@
|
|
#define UI_GFX_CA_LAYER_PARAMS_H_
|
|
|
|
#include "build/build_config.h"
|
|
+#include "ui/gfx/geometry/rect.h"
|
|
#include "ui/gfx/geometry/size.h"
|
|
#include "ui/gfx/gfx_export.h"
|
|
|
|
@@ -41,6 +42,8 @@ struct GFX_EXPORT CALayerParams {
|
|
gfx::ScopedRefCountedIOSurfaceMachPort io_surface_mach_port;
|
|
#endif
|
|
|
|
+ gfx::Rect damage;
|
|
+
|
|
// The geometry of the frame.
|
|
gfx::Size pixel_size;
|
|
float scale_factor = 1.f;
|
|
diff --git a/ui/gfx/mojom/ca_layer_params.mojom b/ui/gfx/mojom/ca_layer_params.mojom
|
|
index a73b2e678ffe0a682d0aa5409724fb441768bec5..6c36626d204c77ef51278b9e8f6fc6ee24a7a9ab 100644
|
|
--- a/ui/gfx/mojom/ca_layer_params.mojom
|
|
+++ b/ui/gfx/mojom/ca_layer_params.mojom
|
|
@@ -18,5 +18,6 @@ struct CALayerParams {
|
|
bool is_empty;
|
|
CALayerContent content;
|
|
gfx.mojom.Size pixel_size;
|
|
+ gfx.mojom.Rect damage;
|
|
float scale_factor;
|
|
};
|
|
diff --git a/ui/gfx/mojom/ca_layer_params_mojom_traits.cc b/ui/gfx/mojom/ca_layer_params_mojom_traits.cc
|
|
index 843d5c24ec33de07c12d4417eb111f91dbcd42fe..0ea594950fcd2686f1b07248dbc8ceb257d89dca 100644
|
|
--- a/ui/gfx/mojom/ca_layer_params_mojom_traits.cc
|
|
+++ b/ui/gfx/mojom/ca_layer_params_mojom_traits.cc
|
|
@@ -52,6 +52,9 @@ bool StructTraits<gfx::mojom::CALayerParamsDataView, gfx::CALayerParams>::Read(
|
|
if (!data.ReadPixelSize(&out->pixel_size))
|
|
return false;
|
|
|
|
+ if (!data.ReadDamage(&out->damage))
|
|
+ return false;
|
|
+
|
|
out->scale_factor = data.scale_factor();
|
|
return true;
|
|
}
|
|
diff --git a/ui/gfx/mojom/ca_layer_params_mojom_traits.h b/ui/gfx/mojom/ca_layer_params_mojom_traits.h
|
|
index 4cac766eae3161baedac4202f694129cd90c80de..0821495ad22944d8856bb750cac8912a2f8328c3 100644
|
|
--- a/ui/gfx/mojom/ca_layer_params_mojom_traits.h
|
|
+++ b/ui/gfx/mojom/ca_layer_params_mojom_traits.h
|
|
@@ -20,6 +20,10 @@ struct StructTraits<gfx::mojom::CALayerParamsDataView, gfx::CALayerParams> {
|
|
return ca_layer_params.pixel_size;
|
|
}
|
|
|
|
+ static gfx::Rect damage(const gfx::CALayerParams& ca_layer_params) {
|
|
+ return ca_layer_params.damage;
|
|
+ }
|
|
+
|
|
static float scale_factor(const gfx::CALayerParams& ca_layer_params) {
|
|
return ca_layer_params.scale_factor;
|
|
}
|