Skip to content

Commit 8b342a1

Browse files
borongcanonymous1-me
authored andcommitted
cobalt: Move VideoGeometrySetterService on gpu thread (#8962)
Relocate the VideoGeometrySetterService from the browser process to the GPU process. This change instantiates the service within the CobaltContentGpuClient, allowing it to be managed directly on the GPU thread. This improves performance and reduces IPC overhead for video geometry updates by co-locating the service closer to the GPU and compositing operations. The StarboardRendererWrapper now directly subscribes to video geometry changes from this local service. Mojo communications: - Before: viz (gpu) --> browser thread --> StarboardRendererClient (media) --> StarboardRendererWrapper (gpu) - After: viz (gpu) --> StarboardRendererWrapper (gpu) Note this is called nearly per UI frame update. Issue: 405424096 (cherry picked from commit d1376b1)
1 parent f23a73b commit 8b342a1

28 files changed

+623
-117
lines changed

cobalt/browser/cobalt_content_browser_client.cc

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@
3636
#include "cobalt/browser/metrics/cobalt_metrics_services_manager_client.h"
3737
#include "cobalt/browser/user_agent/user_agent_platform_info.h"
3838
#include "cobalt/common/features/starboard_features_initialization.h"
39-
#include "cobalt/media/service/mojom/video_geometry_setter.mojom.h"
4039
#include "cobalt/media/service/platform_window_provider_service.h"
41-
#include "cobalt/media/service/video_geometry_setter_service.h"
4240
#include "cobalt/shell/browser/shell.h"
4341
#include "cobalt/shell/browser/shell_paths.h"
4442
#include "cobalt/shell/common/shell_switches.h"
@@ -61,8 +59,6 @@
6159
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
6260
#include "services/network/public/cpp/features.h"
6361
#include "services/network/public/mojom/network_context.mojom.h"
64-
#include "services/service_manager/public/cpp/binder_registry.h"
65-
#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
6662
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
6763

6864
#if BUILDFLAG(USE_EVERGREEN)
@@ -155,6 +151,7 @@ blink::UserAgentMetadata GetCobaltUserAgentMetadata() {
155151
return metadata;
156152
}
157153

154+
<<<<<<< HEAD
158155
CobaltContentBrowserClient::CobaltContentBrowserClient(bool is_visible)
159156
: is_visible_(is_visible),
160157
video_geometry_setter_service_(
@@ -163,6 +160,10 @@ CobaltContentBrowserClient::CobaltContentBrowserClient(bool is_visible)
163160
nullptr,
164161
base::OnTaskRunnerDeleter(nullptr))) {
165162
DETACH_FROM_THREAD(thread_checker_);
163+
=======
164+
CobaltContentBrowserClient::CobaltContentBrowserClient() {
165+
COBALT_DETACH_FROM_THREAD(thread_checker_);
166+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
166167
#if BUILDFLAG(IS_STARBOARD)
167168
// TODO: b/476434249 - Revisit if Cobalt supports multiple tabs/windows.
168169
ui::PlatformWindowStarboard::SetWindowCreatedCallback(
@@ -378,6 +379,7 @@ void CobaltContentBrowserClient::RegisterBrowserInterfaceBindersForFrame(
378379
render_frame_host, map);
379380
}
380381

382+
<<<<<<< HEAD
381383
void CobaltContentBrowserClient::CreateVideoGeometrySetterService() {
382384
DCHECK(!video_geometry_setter_service_);
383385
video_geometry_setter_service_ =
@@ -413,6 +415,9 @@ void CobaltContentBrowserClient::BindGpuHostReceiver(
413415
}
414416

415417
bool CobaltContentBrowserClient::WillCreateURLLoaderFactory(
418+
=======
419+
void CobaltContentBrowserClient::WillCreateURLLoaderFactory(
420+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
416421
content::BrowserContext* browser_context,
417422
content::RenderFrameHost* frame,
418423
int render_process_id,

cobalt/browser/cobalt_content_browser_client.h

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,6 @@ class BinderMapWithContext;
4848

4949
namespace cobalt {
5050

51-
namespace media {
52-
class VideoGeometrySetterService;
53-
} // namespace media
54-
5551
class CobaltMetricsServicesManagerClient;
5652
class CobaltWebContentsObserver;
5753

@@ -103,11 +99,6 @@ class CobaltContentBrowserClient : public content::ShellContentBrowserClient {
10399
content::RenderFrameHost* render_frame_host,
104100
mojo::BinderMapWithContext<content::RenderFrameHost*>* binder_map)
105101
override;
106-
void ExposeInterfacesToRenderer(
107-
service_manager::BinderRegistry* registry,
108-
blink::AssociatedInterfaceRegistry* associated_registry,
109-
content::RenderProcessHost* render_process_host) override;
110-
void BindGpuHostReceiver(mojo::GenericPendingReceiver receiver) override;
111102

112103
// Initializes all necessary parameters to create the feature list and calls
113104
// base::FeatureList::SetInstance() to set the global instance.
@@ -144,13 +135,15 @@ class CobaltContentBrowserClient : public content::ShellContentBrowserClient {
144135
#endif // !BUILDFLAG(IS_ANDROIDTV)
145136

146137
private:
138+
<<<<<<< HEAD
147139
void CreateVideoGeometrySetterService();
140+
=======
141+
void DispatchEvent(const std::string&, base::OnceClosure);
142+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
148143
void OnSbWindowCreated(SbWindow window);
149144

150145
bool is_visible_;
151146
std::unique_ptr<CobaltWebContentsObserver> web_contents_observer_;
152-
std::unique_ptr<media::VideoGeometrySetterService, base::OnTaskRunnerDeleter>
153-
video_geometry_setter_service_;
154147

155148
uint64_t cached_sb_window_ = 0;
156149
std::vector<

cobalt/gpu/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ source_set("gpu") {
2020

2121
deps = [
2222
"//base",
23+
"//cobalt/media/service",
2324
"//cobalt/media/service/mojom",
2425
"//components/viz/common",
2526
"//components/viz/service",

cobalt/gpu/cobalt_content_gpu_client.cc

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,40 @@
1616

1717
#include "base/memory/ptr_util.h"
1818
#include "base/task/single_thread_task_runner.h"
19+
<<<<<<< HEAD
1920
#include "components/viz/service/display/starboard/overlay_strategy_underlay_starboard.h"
21+
=======
22+
#include "cobalt/media/service/mojom/video_geometry_setter.mojom.h"
23+
#include "cobalt/media/service/video_geometry_setter_service.h"
24+
#include "components/viz/service/display/starboard/video_geometry_setter.h"
25+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
2026
#include "content/public/child/child_thread.h"
2127

2228
namespace cobalt {
2329

24-
CobaltContentGpuClient::CobaltContentGpuClient() = default;
30+
CobaltContentGpuClient::CobaltContentGpuClient()
31+
: video_geometry_setter_service_(
32+
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
33+
base::OnTaskRunnerDeleter>(
34+
nullptr,
35+
base::OnTaskRunnerDeleter(nullptr))) {}
36+
2537
CobaltContentGpuClient::~CobaltContentGpuClient() = default;
2638

2739
void CobaltContentGpuClient::PostCompositorThreadCreated(
2840
base::SingleThreadTaskRunner* task_runner) {
41+
if (!video_geometry_setter_service_) {
42+
CreateVideoGeometrySetterService();
43+
}
2944
// Initialize PendingRemote for VideoGeometrySetter and post it
3045
// to compositor thread (viz service). This is called on gpu thread
3146
// right after the compositor thread is created.
3247
mojo::PendingRemote<cobalt::media::mojom::VideoGeometrySetter>
3348
video_geometry_setter;
34-
content::ChildThread::Get()->BindHostReceiver(
35-
video_geometry_setter.InitWithNewPipeAndPassReceiver());
49+
mojo::PendingReceiver<cobalt::media::mojom::VideoGeometrySetter>
50+
pending_receiver = video_geometry_setter.InitWithNewPipeAndPassReceiver();
51+
video_geometry_setter_service_->GetVideoGeometrySetter(
52+
std::move(pending_receiver));
3653

3754
task_runner->PostTask(
3855
FROM_HERE,
@@ -41,4 +58,22 @@ void CobaltContentGpuClient::PostCompositorThreadCreated(
4158
std::move(video_geometry_setter)));
4259
}
4360

61+
media::VideoGeometrySetterService*
62+
CobaltContentGpuClient::GetVideoGeometrySetterService() {
63+
if (!video_geometry_setter_service_) {
64+
CreateVideoGeometrySetterService();
65+
}
66+
return video_geometry_setter_service_.get();
67+
}
68+
69+
void CobaltContentGpuClient::CreateVideoGeometrySetterService() {
70+
DCHECK(!video_geometry_setter_service_);
71+
video_geometry_setter_service_ =
72+
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
73+
base::OnTaskRunnerDeleter>(
74+
new media::VideoGeometrySetterService,
75+
base::OnTaskRunnerDeleter(
76+
base::SingleThreadTaskRunner::GetCurrentDefault()));
77+
}
78+
4479
} // namespace cobalt

cobalt/gpu/cobalt_content_gpu_client.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222

2323
namespace cobalt {
2424

25+
namespace media {
26+
class VideoGeometrySetterService;
27+
} // namespace media
28+
2529
// This class utilizes embedder API for participating in gpu logic.
2630
// It allows Cobalt to interact with viz service and compositor thread.
2731
class CobaltContentGpuClient : public content::ContentGpuClient {
@@ -36,6 +40,13 @@ class CobaltContentGpuClient : public content::ContentGpuClient {
3640
// content::ContentGpuClient:
3741
void PostCompositorThreadCreated(
3842
base::SingleThreadTaskRunner* task_runner) override;
43+
media::VideoGeometrySetterService* GetVideoGeometrySetterService() override;
44+
45+
private:
46+
void CreateVideoGeometrySetterService();
47+
48+
std::unique_ptr<media::VideoGeometrySetterService, base::OnTaskRunnerDeleter>
49+
video_geometry_setter_service_;
3950
};
4051

4152
} // namespace cobalt

cobalt/renderer/cobalt_content_renderer_client.cc

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
#include "media/base/media_log.h"
1919
#include "media/base/renderer_factory.h"
2020
#include "media/mojo/clients/starboard/starboard_renderer_client_factory.h"
21-
#include "media/starboard/bind_host_receiver_callback.h"
22-
#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
2321
#include "starboard/media.h"
2422
#include "starboard/player.h"
2523
#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
@@ -85,17 +83,8 @@ ::media::SupportedCodecs GetStarboardEmeSupportedCodecs() {
8583
return codecs;
8684
}
8785

88-
void BindHostReceiverWithValuation(mojo::GenericPendingReceiver receiver) {
89-
content::RenderThread::Get()->BindHostReceiver(std::move(receiver));
90-
}
91-
9286
} // namespace
9387

94-
static_assert(std::is_same<::media::BindHostReceiverCallback,
95-
base::RepeatingCallback<
96-
decltype(BindHostReceiverWithValuation)>>::value,
97-
"These two types must be the same");
98-
9988
CobaltContentRendererClient::CobaltContentRendererClient() {
10089
DETACH_FROM_THREAD(thread_checker_);
10190
}
@@ -221,12 +210,15 @@ void CobaltContentRendererClient::RunScriptsAtDocumentStart(
221210
communication->RunScriptsAtDocumentStart();
222211
}
223212

213+
<<<<<<< HEAD
224214
void CobaltContentRendererClient::BindHostReceiver(
225215
mojo::GenericPendingReceiver receiver) {
226216
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
227217
BindHostReceiverWithValuation(std::move(receiver));
228218
}
229219

220+
=======
221+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
230222
void CobaltContentRendererClient::GetStarboardRendererFactoryTraits(
231223
::media::RendererFactoryTraits* renderer_factory_traits) {
232224
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -244,11 +236,6 @@ void CobaltContentRendererClient::GetStarboardRendererFactoryTraits(
244236
renderer_factory_traits->get_sb_window_handle_callback = base::BindRepeating(
245237
&CobaltContentRendererClient::GetSbWindowHandle, base::Unretained(this));
246238
#endif // BUILDFLAG(IS_STARBOARD)
247-
// TODO(b/405424096) - Cobalt: Move VideoGeometrySetterService to Gpu thread.
248-
renderer_factory_traits->bind_host_receiver_callback =
249-
base::BindPostTaskToCurrentDefault(
250-
base::BindRepeating(&CobaltContentRendererClient::BindHostReceiver,
251-
weak_factory_.GetWeakPtr()));
252239
}
253240

254241
void CobaltContentRendererClient::PostSandboxInitialized() {

cobalt/renderer/cobalt_content_renderer_client.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ class MediaLog;
2828
class RendererFactory;
2929
} // namespace media
3030

31-
namespace mojo {
32-
class GenericPendingReceiver;
33-
} // namespace mojo
34-
3531
namespace cobalt {
3632
// This class utilizes embedder API for participating in renderer logic.
3733
// It allows Cobalt to customize content Renderer module.
@@ -57,11 +53,6 @@ class CobaltContentRendererClient : public content::ContentRendererClient {
5753
::media::RendererFactoryTraits* traits) override;
5854
void PostSandboxInitialized() override;
5955

60-
// Bind Host Receiver to VideoGeometryChangeSubscriber on Browser thread.
61-
// This is called from StarboardRenderer with |BindPostTaskToCurrentDefault|
62-
// on media thread to post the task on Renderer thread.
63-
void BindHostReceiver(mojo::GenericPendingReceiver receiver);
64-
6556
uint64_t GetSbWindowHandle() const { return sb_window_handle_; }
6657

6758
private:

cobalt/shell/gpu/shell_content_gpu_client.cc

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,32 @@
1717

1818
#include "base/functional/bind.h"
1919
#include "base/task/single_thread_task_runner.h"
20+
<<<<<<< HEAD:cobalt/shell/gpu/shell_content_gpu_client.cc
2021
#if defined(RUN_BROWSER_TESTS)
2122
#include "cobalt/shell/common/power_monitor_test_impl.h" // nogncheck
2223
#endif // defined(RUN_BROWSER_TESTS)
24+
=======
25+
#include "cobalt/media/service/mojom/video_geometry_setter.mojom.h"
26+
#include "cobalt/media/service/video_geometry_setter_service.h"
27+
#include "cobalt/testing/browser_tests/common/power_monitor_test_impl.h"
28+
#include "components/viz/service/display/starboard/video_geometry_setter.h"
29+
#include "content/public/child/child_thread.h"
30+
#include "mojo/public/cpp/bindings/binder_map.h"
31+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962)):cobalt/testing/browser_tests/gpu/shell_content_gpu_test_client.cc
2332
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
2433

2534
namespace content {
2635

36+
<<<<<<< HEAD:cobalt/shell/gpu/shell_content_gpu_client.cc
2737
ShellContentGpuClient::ShellContentGpuClient() = default;
38+
=======
39+
ShellContentGpuTestClient::ShellContentGpuTestClient()
40+
: video_geometry_setter_service_(
41+
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
42+
base::OnTaskRunnerDeleter>(
43+
nullptr,
44+
base::OnTaskRunnerDeleter(nullptr))) {}
45+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962)):cobalt/testing/browser_tests/gpu/shell_content_gpu_test_client.cc
2846

2947
ShellContentGpuClient::~ShellContentGpuClient() = default;
3048

@@ -40,4 +58,22 @@ void ShellContentGpuClient::ExposeInterfacesToBrowser(
4058
#endif // defined(RUN_BROWSER_TESTS)
4159
}
4260

61+
cobalt::media::VideoGeometrySetterService*
62+
ShellContentGpuTestClient::GetVideoGeometrySetterService() {
63+
if (!video_geometry_setter_service_) {
64+
CreateVideoGeometrySetterService();
65+
}
66+
return video_geometry_setter_service_.get();
67+
}
68+
69+
void ShellContentGpuTestClient::CreateVideoGeometrySetterService() {
70+
DCHECK(!video_geometry_setter_service_);
71+
video_geometry_setter_service_ =
72+
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
73+
base::OnTaskRunnerDeleter>(
74+
new cobalt::media::VideoGeometrySetterService,
75+
base::OnTaskRunnerDeleter(
76+
base::SingleThreadTaskRunner::GetCurrentDefault()));
77+
}
78+
4379
} // namespace content

cobalt/shell/gpu/shell_content_gpu_client.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#ifndef COBALT_SHELL_GPU_SHELL_CONTENT_GPU_CLIENT_H_
1717
#define COBALT_SHELL_GPU_SHELL_CONTENT_GPU_CLIENT_H_
1818

19+
#include "cobalt/media/service/video_geometry_setter_service.h"
1920
#include "content/public/gpu/content_gpu_client.h"
2021
#include "services/network/public/mojom/network_service_test.mojom-forward.h"
2122

@@ -35,6 +36,22 @@ class ShellContentGpuClient : public ContentGpuClient {
3536
const gpu::GpuPreferences& gpu_preferences,
3637
const gpu::GpuDriverBugWorkarounds& gpu_workarounds,
3738
mojo::BinderMap* binders) override;
39+
<<<<<<< HEAD:cobalt/shell/gpu/shell_content_gpu_client.h
40+
=======
41+
42+
void PostCompositorThreadCreated(
43+
base::SingleThreadTaskRunner* task_runner) override;
44+
45+
cobalt::media::VideoGeometrySetterService* GetVideoGeometrySetterService()
46+
override;
47+
48+
private:
49+
void CreateVideoGeometrySetterService();
50+
51+
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
52+
base::OnTaskRunnerDeleter>
53+
video_geometry_setter_service_;
54+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962)):cobalt/testing/browser_tests/gpu/shell_content_gpu_test_client.h
3855
};
3956

4057
} // namespace content

cobalt/testing/browser_tests/BUILD.gn

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,13 @@ static_library("cobalt_shell_test_lib") {
428428

429429
public_deps = [
430430
"//cc/base",
431+
<<<<<<< HEAD
431432
"//cobalt/shell:browsertests_mojom",
433+
=======
434+
"//cobalt/media/service",
435+
"//cobalt/media/service/mojom",
436+
"//cobalt/shell:cobalt_shell_app",
437+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
432438
"//cobalt/shell:cobalt_shell_lib",
433439
"//cobalt/shell:shell_controller_mojom",
434440
"//components/custom_handlers:test_support",

0 commit comments

Comments
 (0)