Skip to content

Commit d1376b1

Browse files
authored
cobalt: Move VideoGeometrySetterService on gpu thread (youtube#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
1 parent f84aec6 commit d1376b1

28 files changed

+227
-184
lines changed

cobalt/browser/cobalt_content_browser_client.cc

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,7 @@
4242
#include "cobalt/browser/metrics/cobalt_metrics_services_manager_client.h"
4343
#include "cobalt/browser/user_agent/user_agent_platform_info.h"
4444
#include "cobalt/common/features/starboard_features_initialization.h"
45-
#include "cobalt/media/service/mojom/video_geometry_setter.mojom.h"
4645
#include "cobalt/media/service/platform_window_provider_service.h"
47-
#include "cobalt/media/service/video_geometry_setter_service.h"
4846
#include "cobalt/shell/browser/shell.h"
4947
#include "cobalt/shell/common/shell_paths.h"
5048
#include "cobalt/shell/common/shell_switches.h"
@@ -69,8 +67,6 @@
6967
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
7068
#include "services/network/public/cpp/features.h"
7169
#include "services/network/public/mojom/network_context.mojom.h"
72-
#include "services/service_manager/public/cpp/binder_registry.h"
73-
#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
7470
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
7571

7672
#if BUILDFLAG(IS_ANDROID)
@@ -170,12 +166,7 @@ blink::UserAgentMetadata GetCobaltUserAgentMetadata() {
170166
return metadata;
171167
}
172168

173-
CobaltContentBrowserClient::CobaltContentBrowserClient()
174-
: video_geometry_setter_service_(
175-
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
176-
base::OnTaskRunnerDeleter>(
177-
nullptr,
178-
base::OnTaskRunnerDeleter(nullptr))) {
169+
CobaltContentBrowserClient::CobaltContentBrowserClient() {
179170
COBALT_DETACH_FROM_THREAD(thread_checker_);
180171
#if BUILDFLAG(IS_STARBOARD)
181172
// TODO: b/476434249 - Revisit if Cobalt supports multiple tabs/windows.
@@ -376,40 +367,6 @@ void CobaltContentBrowserClient::RegisterBrowserInterfaceBindersForFrame(
376367
render_frame_host, map);
377368
}
378369

379-
void CobaltContentBrowserClient::CreateVideoGeometrySetterService() {
380-
DCHECK(!video_geometry_setter_service_);
381-
video_geometry_setter_service_ =
382-
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
383-
base::OnTaskRunnerDeleter>(
384-
new media::VideoGeometrySetterService,
385-
base::OnTaskRunnerDeleter(
386-
base::SingleThreadTaskRunner::GetCurrentDefault()));
387-
}
388-
389-
void CobaltContentBrowserClient::ExposeInterfacesToRenderer(
390-
service_manager::BinderRegistry* registry,
391-
blink::AssociatedInterfaceRegistry* associated_registry,
392-
content::RenderProcessHost* render_process_host) {
393-
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
394-
if (!video_geometry_setter_service_) {
395-
CreateVideoGeometrySetterService();
396-
}
397-
registry->AddInterface<cobalt::media::mojom::VideoGeometryChangeSubscriber>(
398-
video_geometry_setter_service_->GetBindSubscriberCallback(),
399-
base::SingleThreadTaskRunner::GetCurrentDefault());
400-
}
401-
402-
void CobaltContentBrowserClient::BindGpuHostReceiver(
403-
mojo::GenericPendingReceiver receiver) {
404-
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
405-
if (!video_geometry_setter_service_) {
406-
CreateVideoGeometrySetterService();
407-
}
408-
if (auto r = receiver.As<media::mojom::VideoGeometrySetter>()) {
409-
video_geometry_setter_service_->GetVideoGeometrySetter(std::move(r));
410-
}
411-
}
412-
413370
void CobaltContentBrowserClient::WillCreateURLLoaderFactory(
414371
content::BrowserContext* browser_context,
415372
content::RenderFrameHost* frame,

cobalt/browser/cobalt_content_browser_client.h

Lines changed: 0 additions & 12 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

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

111102
// Initializes all necessary parameters to create the feature list and calls
112103
// base::FeatureList::SetInstance() to set the global instance.
@@ -148,13 +139,10 @@ class CobaltContentBrowserClient : public content::ShellContentBrowserClient {
148139
#endif // !BUILDFLAG(IS_ANDROIDTV)
149140

150141
private:
151-
void CreateVideoGeometrySetterService();
152142
void DispatchEvent(const std::string&, base::OnceClosure);
153143
void OnSbWindowCreated(SbWindow window);
154144

155145
std::unique_ptr<CobaltWebContentsObserver> web_contents_observer_;
156-
std::unique_ptr<media::VideoGeometrySetterService, base::OnTaskRunnerDeleter>
157-
video_geometry_setter_service_;
158146

159147
uint64_t cached_sb_window_ = 0;
160148
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: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,58 @@
1818

1919
#include "base/memory/ptr_util.h"
2020
#include "base/task/single_thread_task_runner.h"
21+
#include "cobalt/media/service/mojom/video_geometry_setter.mojom.h"
22+
#include "cobalt/media/service/video_geometry_setter_service.h"
2123
#include "components/viz/service/display/starboard/video_geometry_setter.h"
2224
#include "content/public/child/child_thread.h"
2325

2426
namespace cobalt {
2527

26-
CobaltContentGpuClient::CobaltContentGpuClient() = default;
28+
CobaltContentGpuClient::CobaltContentGpuClient()
29+
: video_geometry_setter_service_(
30+
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
31+
base::OnTaskRunnerDeleter>(
32+
nullptr,
33+
base::OnTaskRunnerDeleter(nullptr))) {}
34+
2735
CobaltContentGpuClient::~CobaltContentGpuClient() = default;
2836

2937
void CobaltContentGpuClient::PostCompositorThreadCreated(
3038
base::SingleThreadTaskRunner* task_runner) {
39+
if (!video_geometry_setter_service_) {
40+
CreateVideoGeometrySetterService();
41+
}
3142
// Initialize PendingRemote for VideoGeometrySetter and post it
3243
// to compositor thread (viz service). This is called on gpu thread
3344
// right after the compositor thread is created.
3445
mojo::PendingRemote<cobalt::media::mojom::VideoGeometrySetter>
3546
video_geometry_setter;
36-
content::ChildThread::Get()->BindHostReceiver(
37-
video_geometry_setter.InitWithNewPipeAndPassReceiver());
47+
mojo::PendingReceiver<cobalt::media::mojom::VideoGeometrySetter>
48+
pending_receiver = video_geometry_setter.InitWithNewPipeAndPassReceiver();
49+
video_geometry_setter_service_->GetVideoGeometrySetter(
50+
std::move(pending_receiver));
3851

3952
task_runner->PostTask(FROM_HERE,
4053
base::BindOnce(&viz::ConnectVideoGeometrySetter,
4154
std::move(video_geometry_setter)));
4255
}
4356

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

cobalt/gpu/cobalt_content_gpu_client.h

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

2121
namespace cobalt {
2222

23+
namespace media {
24+
class VideoGeometrySetterService;
25+
} // namespace media
26+
2327
// This class utilizes embedder API for participating in gpu logic.
2428
// It allows Cobalt to interact with viz service and compositor thread.
2529
class CobaltContentGpuClient : public content::ContentGpuClient {
@@ -34,6 +38,13 @@ class CobaltContentGpuClient : public content::ContentGpuClient {
3438
// content::ContentGpuClient:
3539
void PostCompositorThreadCreated(
3640
base::SingleThreadTaskRunner* task_runner) override;
41+
media::VideoGeometrySetterService* GetVideoGeometrySetterService() override;
42+
43+
private:
44+
void CreateVideoGeometrySetterService();
45+
46+
std::unique_ptr<media::VideoGeometrySetterService, base::OnTaskRunnerDeleter>
47+
video_geometry_setter_service_;
3748
};
3849

3950
} // namespace cobalt

cobalt/renderer/cobalt_content_renderer_client.cc

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
#include "media/base/media_log.h"
2020
#include "media/base/renderer_factory.h"
2121
#include "media/mojo/clients/starboard/starboard_renderer_client_factory.h"
22-
#include "media/starboard/bind_host_receiver_callback.h"
23-
#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
2422
#include "starboard/media.h"
2523
#include "starboard/player.h"
2624
#include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
@@ -91,17 +89,8 @@ ::media::SupportedCodecs GetStarboardEmeSupportedCodecs() {
9189
return codecs;
9290
}
9391

94-
void BindHostReceiverWithValuation(mojo::GenericPendingReceiver receiver) {
95-
content::RenderThread::Get()->BindHostReceiver(std::move(receiver));
96-
}
97-
9892
} // namespace
9993

100-
static_assert(std::is_same<::media::BindHostReceiverCallback,
101-
base::RepeatingCallback<
102-
decltype(BindHostReceiverWithValuation)>>::value,
103-
"These two types must be the same");
104-
10594
CobaltContentRendererClient::CobaltContentRendererClient() {
10695
CHECK_CALLED_ON_VALID_THREAD(main_thread_checker_);
10796
}
@@ -233,12 +222,6 @@ void CobaltContentRendererClient::RunScriptsAtDocumentStart(
233222
communication->RunScriptsAtDocumentStart();
234223
}
235224

236-
void CobaltContentRendererClient::BindHostReceiver(
237-
mojo::GenericPendingReceiver receiver) {
238-
CHECK(content::RenderThread::IsMainThread());
239-
BindHostReceiverWithValuation(std::move(receiver));
240-
}
241-
242225
void CobaltContentRendererClient::GetStarboardRendererFactoryTraits(
243226
::media::RendererFactoryTraits* renderer_factory_traits) {
244227
CHECK(content::RenderThread::IsMainThread());
@@ -256,11 +239,6 @@ void CobaltContentRendererClient::GetStarboardRendererFactoryTraits(
256239
renderer_factory_traits->get_sb_window_handle_callback = base::BindRepeating(
257240
&CobaltContentRendererClient::GetSbWindowHandle, base::Unretained(this));
258241
#endif // BUILDFLAG(IS_STARBOARD)
259-
// TODO(b/405424096) - Cobalt: Move VideoGeometrySetterService to Gpu thread.
260-
renderer_factory_traits->bind_host_receiver_callback =
261-
base::BindPostTaskToCurrentDefault(
262-
base::BindRepeating(&CobaltContentRendererClient::BindHostReceiver,
263-
weak_factory_.GetWeakPtr()));
264242
}
265243

266244
void CobaltContentRendererClient::PostSandboxInitialized() {

cobalt/renderer/cobalt_content_renderer_client.h

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

32-
namespace mojo {
33-
class GenericPendingReceiver;
34-
} // namespace mojo
35-
3632
namespace cobalt {
3733
// This class utilizes embedder API for participating in renderer logic.
3834
// It allows Cobalt to customize content Renderer module.
@@ -60,11 +56,6 @@ class CobaltContentRendererClient : public content::ContentRendererClient {
6056
::media::RendererFactoryTraits* traits) override;
6157
void PostSandboxInitialized() override;
6258

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

7061
private:

cobalt/testing/browser_tests/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@ static_library("cobalt_shell_test_lib") {
467467
":cobalt_browsertests_support",
468468
":cobalt_browsertests_support_mojom",
469469
"//cc/base",
470+
"//cobalt/media/service",
470471
"//cobalt/media/service/mojom",
471472
"//cobalt/shell:cobalt_shell_app",
472473
"//cobalt/shell:cobalt_shell_lib",

cobalt/testing/browser_tests/gpu/shell_content_gpu_test_client.cc

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "base/functional/bind.h"
1818
#include "base/task/single_thread_task_runner.h"
1919
#include "cobalt/media/service/mojom/video_geometry_setter.mojom.h"
20+
#include "cobalt/media/service/video_geometry_setter_service.h"
2021
#include "cobalt/testing/browser_tests/common/power_monitor_test_impl.h"
2122
#include "components/viz/service/display/starboard/video_geometry_setter.h"
2223
#include "content/public/child/child_thread.h"
@@ -25,7 +26,12 @@
2526

2627
namespace content {
2728

28-
ShellContentGpuTestClient::ShellContentGpuTestClient() = default;
29+
ShellContentGpuTestClient::ShellContentGpuTestClient()
30+
: video_geometry_setter_service_(
31+
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
32+
base::OnTaskRunnerDeleter>(
33+
nullptr,
34+
base::OnTaskRunnerDeleter(nullptr))) {}
2935

3036
ShellContentGpuTestClient::~ShellContentGpuTestClient() = default;
3137

@@ -50,4 +56,22 @@ void ShellContentGpuTestClient::PostCompositorThreadCreated(
5056
std::move(video_geometry_setter)));
5157
}
5258

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

cobalt/testing/browser_tests/gpu/shell_content_gpu_test_client.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#ifndef COBALT_TESTING_BROWSER_TESTS_GPU_SHELL_CONTENT_GPU_TEST_CLIENT_H_
1616
#define COBALT_TESTING_BROWSER_TESTS_GPU_SHELL_CONTENT_GPU_TEST_CLIENT_H_
1717

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

@@ -38,6 +39,16 @@ class ShellContentGpuTestClient : public ContentGpuClient {
3839

3940
void PostCompositorThreadCreated(
4041
base::SingleThreadTaskRunner* task_runner) override;
42+
43+
cobalt::media::VideoGeometrySetterService* GetVideoGeometrySetterService()
44+
override;
45+
46+
private:
47+
void CreateVideoGeometrySetterService();
48+
49+
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
50+
base::OnTaskRunnerDeleter>
51+
video_geometry_setter_service_;
4152
};
4253

4354
} // namespace content

0 commit comments

Comments
 (0)