Skip to content

Commit d974f30

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 e8e5b7e commit d974f30

28 files changed

+832
-83
lines changed

cobalt/browser/cobalt_content_browser_client.cc

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,12 @@
3636
#include "cobalt/browser/mojom/h5vcc_settings.mojom.h"
3737
#include "cobalt/browser/user_agent/user_agent_platform_info.h"
3838
#include "cobalt/common/features/starboard_features_initialization.h"
39+
<<<<<<< HEAD
3940
#include "cobalt/media/service/mojom/video_geometry_setter.mojom.h"
4041
#include "cobalt/media/service/video_geometry_setter_service.h"
42+
=======
43+
#include "cobalt/media/service/platform_window_provider_service.h"
44+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
4145
#include "cobalt/shell/browser/shell.h"
4246
#include "cobalt/shell/browser/shell_paths.h"
4347
#include "cobalt/shell/common/shell_switches.h"
@@ -61,8 +65,6 @@
6165
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
6266
#include "services/network/public/cpp/features.h"
6367
#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"
6668
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
6769

6870
#if BUILDFLAG(IS_ANDROID)
@@ -153,13 +155,24 @@ blink::UserAgentMetadata GetCobaltUserAgentMetadata() {
153155
return metadata;
154156
}
155157

158+
<<<<<<< HEAD
156159
CobaltContentBrowserClient::CobaltContentBrowserClient()
157160
: video_geometry_setter_service_(
158161
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
159162
base::OnTaskRunnerDeleter>(
160163
nullptr,
161164
base::OnTaskRunnerDeleter(nullptr))) {
162165
DETACH_FROM_THREAD(thread_checker_);
166+
=======
167+
CobaltContentBrowserClient::CobaltContentBrowserClient() {
168+
COBALT_DETACH_FROM_THREAD(thread_checker_);
169+
#if BUILDFLAG(IS_STARBOARD)
170+
// TODO: b/476434249 - Revisit if Cobalt supports multiple tabs/windows.
171+
ui::PlatformWindowStarboard::SetWindowCreatedCallback(
172+
base::BindRepeating(&CobaltContentBrowserClient::OnSbWindowCreated,
173+
weak_factory_.GetWeakPtr()));
174+
#endif // BUILDFLAG(IS_STARBOARD)
175+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
163176
}
164177

165178
CobaltContentBrowserClient::~CobaltContentBrowserClient() = default;
@@ -340,6 +353,7 @@ void CobaltContentBrowserClient::RegisterBrowserInterfaceBindersForFrame(
340353
render_frame_host, map);
341354
}
342355

356+
<<<<<<< HEAD
343357
void CobaltContentBrowserClient::CreateVideoGeometrySetterService() {
344358
DCHECK(!video_geometry_setter_service_);
345359
video_geometry_setter_service_ =
@@ -378,6 +392,9 @@ void CobaltContentBrowserClient::BindGpuHostReceiver(
378392
}
379393

380394
bool CobaltContentBrowserClient::WillCreateURLLoaderFactory(
395+
=======
396+
void CobaltContentBrowserClient::WillCreateURLLoaderFactory(
397+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
381398
content::BrowserContext* browser_context,
382399
content::RenderFrameHost* frame,
383400
int render_process_id,

cobalt/browser/cobalt_content_browser_client.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,6 @@ class BinderMapWithContext;
4141

4242
namespace cobalt {
4343

44-
namespace media {
45-
class VideoGeometrySetterService;
46-
} // namespace media
47-
4844
class CobaltMetricsServicesManagerClient;
4945
class CobaltWebContentsObserver;
5046

@@ -94,11 +90,6 @@ class CobaltContentBrowserClient : public content::ShellContentBrowserClient {
9490
content::RenderFrameHost* render_frame_host,
9591
mojo::BinderMapWithContext<content::RenderFrameHost*>* binder_map)
9692
override;
97-
void ExposeInterfacesToRenderer(
98-
service_manager::BinderRegistry* registry,
99-
blink::AssociatedInterfaceRegistry* associated_registry,
100-
content::RenderProcessHost* render_process_host) override;
101-
void BindGpuHostReceiver(mojo::GenericPendingReceiver receiver) override;
10293

10394
// Initializes all necessary parameters to create the feature list and calls
10495
// base::FeatureList::SetInstance() to set the global instance.
@@ -128,11 +119,14 @@ class CobaltContentBrowserClient : public content::ShellContentBrowserClient {
128119
void DispatchFocus();
129120

130121
private:
122+
<<<<<<< HEAD
131123
void CreateVideoGeometrySetterService();
124+
=======
125+
void DispatchEvent(const std::string&, base::OnceClosure);
126+
void OnSbWindowCreated(SbWindow window);
127+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
132128

133129
std::unique_ptr<CobaltWebContentsObserver> web_contents_observer_;
134-
std::unique_ptr<media::VideoGeometrySetterService, base::OnTaskRunnerDeleter>
135-
video_geometry_setter_service_;
136130

137131
THREAD_CHECKER(thread_checker_);
138132
};

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: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@
2323
#include "media/base/media_switches.h"
2424
#include "media/base/renderer_factory.h"
2525
#include "media/mojo/clients/starboard/starboard_renderer_client_factory.h"
26+
<<<<<<< HEAD
2627
#include "media/starboard/bind_host_receiver_callback.h"
2728
#include "media/starboard/decoder_buffer_allocator.h"
2829
#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
30+
=======
31+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
2932
#include "starboard/media.h"
3033
#include "starboard/player.h"
3134
#include "third_party/blink/public/platform/web_string.h"
@@ -121,6 +124,7 @@ ::media::SupportedCodecs GetStarboardEmeSupportedCodecs() {
121124
return codecs;
122125
}
123126

127+
<<<<<<< HEAD
124128
void BindHostReceiverWithValuation(mojo::GenericPendingReceiver receiver) {
125129
content::RenderThread::Get()->BindHostReceiver(std::move(receiver));
126130
}
@@ -252,13 +256,10 @@ ExperimentalFeatures ProcessH5vccSettings(
252256
return parsed;
253257
}
254258

259+
=======
260+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
255261
} // namespace
256262

257-
static_assert(std::is_same<::media::BindHostReceiverCallback,
258-
base::RepeatingCallback<
259-
decltype(BindHostReceiverWithValuation)>>::value,
260-
"These two types must be the same");
261-
262263
CobaltContentRendererClient::CobaltContentRendererClient() {
263264
DETACH_FROM_THREAD(thread_checker_);
264265
}
@@ -363,12 +364,15 @@ void CobaltContentRendererClient::RunScriptsAtDocumentStart(
363364
communication->RunScriptsAtDocumentStart();
364365
}
365366

367+
<<<<<<< HEAD
366368
void CobaltContentRendererClient::BindHostReceiver(
367369
mojo::GenericPendingReceiver receiver) {
368370
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
369371
BindHostReceiverWithValuation(std::move(receiver));
370372
}
371373

374+
=======
375+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
372376
void CobaltContentRendererClient::GetStarboardRendererFactoryTraits(
373377
media::RendererFactoryTraits* renderer_factory_traits) {
374378
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -392,11 +396,22 @@ void CobaltContentRendererClient::GetStarboardRendererFactoryTraits(
392396
renderer_factory_traits->experimental_features = experimental_features;
393397

394398
renderer_factory_traits->viewport_size = viewport_size_;
399+
<<<<<<< HEAD
395400
// TODO(b/405424096) - Cobalt: Move VideoGeometrySetterService to Gpu thread.
396401
renderer_factory_traits->bind_host_receiver_callback =
397402
base::BindPostTaskToCurrentDefault(
398403
base::BindRepeating(&CobaltContentRendererClient::BindHostReceiver,
399404
weak_factory_.GetWeakPtr()));
405+
=======
406+
#if BUILDFLAG(IS_STARBOARD)
407+
// Using base::Unretained(this) is safe here because
408+
// CobaltContentRendererClient is a process-global singleton that outlives
409+
// the media pipeline, and GetSbWindowHandle() only accesses an atomic
410+
// member variable.
411+
renderer_factory_traits->get_sb_window_handle_callback = base::BindRepeating(
412+
&CobaltContentRendererClient::GetSbWindowHandle, base::Unretained(this));
413+
#endif // BUILDFLAG(IS_STARBOARD)
414+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
400415
}
401416

402417
void CobaltContentRendererClient::PostSandboxInitialized() {

cobalt/renderer/cobalt_content_renderer_client.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ class MediaLog;
2626
class RendererFactory;
2727
} // namespace media
2828

29-
namespace mojo {
30-
class GenericPendingReceiver;
31-
} // namespace mojo
32-
3329
namespace cobalt {
3430
// This class utilizes embedder API for participating in renderer logic.
3531
// It allows Cobalt to customize content Renderer module.
@@ -55,10 +51,14 @@ class CobaltContentRendererClient : public content::ContentRendererClient {
5551
::media::RendererFactoryTraits* traits) override;
5652
void PostSandboxInitialized() override;
5753

54+
<<<<<<< HEAD
5855
// Bind Host Receiver to VideoGeometryChangeSubscriber on Browser thread.
5956
// This is called from StarboardRenderer with |BindPostTaskToCurrentDefault|
6057
// on media thread to post the task on Renderer thread.
6158
void BindHostReceiver(mojo::GenericPendingReceiver receiver);
59+
=======
60+
uint64_t GetSbWindowHandle() const { return sb_window_handle_; }
61+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
6262

6363
private:
6464
// Registers a custom content::AudioDeviceFactory

cobalt/testing/browser_tests/BUILD.gn

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,53 @@ static_library("cobalt_shell_test_lib") {
424424
sources = [
425425
"common/shell_content_test_client.cc",
426426
"common/shell_content_test_client.h",
427+
<<<<<<< HEAD
428+
=======
429+
"gpu/shell_content_gpu_test_client.cc",
430+
"gpu/shell_content_gpu_test_client.h",
431+
"renderer/shell_content_renderer_test_client.cc",
432+
"renderer/shell_content_renderer_test_client.h",
433+
"utility/shell_content_utility_client.cc",
434+
"utility/shell_content_utility_client.h",
435+
]
436+
437+
deps = [
438+
":cobalt_browsertests_support",
439+
":cobalt_browsertests_support_mojom",
440+
"//cc/base",
441+
"//cobalt/media/service",
442+
"//cobalt/media/service/mojom",
443+
"//cobalt/shell:cobalt_shell_app",
444+
"//cobalt/shell:cobalt_shell_lib",
445+
"//components/prefs",
446+
"//components/prefs:test_support",
447+
"//components/variations",
448+
"//components/variations/service",
449+
"//components/viz/service",
450+
"//services/network/public/cpp",
451+
]
452+
453+
if (use_aura) {
454+
sources += [
455+
"browser/shell_platform_test_data_aura.cc",
456+
"browser/shell_platform_test_data_aura.h",
457+
]
458+
deps += [ "//ui/aura" ]
459+
}
460+
461+
if (shell_use_toolkit_views) {
462+
deps += [ "//ui/views:test_support" ]
463+
}
464+
}
465+
466+
source_set("cobalt_browsertests_support") {
467+
testonly = true
468+
sources = [
469+
"common/main_frame_counter_test_impl.cc",
470+
"common/main_frame_counter_test_impl.h",
471+
"common/power_monitor_test_impl.cc",
472+
"common/power_monitor_test_impl.h",
473+
>>>>>>> d1376b13b0 (cobalt: Move VideoGeometrySetterService on gpu thread (#8962))
427474
"common/shell_test_switches.cc",
428475
"common/shell_test_switches.h",
429476
"shell/test_shell.cc",

0 commit comments

Comments
 (0)