Commit daca3256 authored by Miguel Casas-Sanchez's avatar Miguel Casas-Sanchez Committed by Commit Bot

VEA mojification: add factory methods to gpu.mojom and gpu_service.mojom

This CL adds a CreateVideoEncodeAccelerator() methods to the gpu.mojom and
gpu_service.mojom files (renderer-to-browser interface and browser-to-gpu
interfaces, resp.), and wires the new mojom::VideoEncodeAcceleratorRequest
pass through.

This is step 0 of VEA mojification, which is currently IPC-based. More
info can be found in the DD https://goo.gl/PbTKnt, concretely this
CL can be better understood in the context of the first diagram in the
document, also here, for conveniency: https://goo.gl/HkwYvA.

A playground with most of the changes pre-review can be found in 
https://crrev.com/c/558846.

Bug: 736517
Change-Id: Id1f6d60d487d97ce3f304bead73738b2ba531408
Reviewed-on: https://chromium-review.googlesource.com/558833
Commit-Queue: Miguel Casas <mcasas@chromium.org>
Reviewed-by: default avatarAntoine Labour <piman@chromium.org>
Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Reviewed-by: default avatarDan Sanders <sandersd@chromium.org>
Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Cr-Commit-Position: refs/heads/master@{#485550}
parent caa7b407
......@@ -58,6 +58,9 @@ class TestGpuService : public ui::mojom::GpuService {
void CloseChannel(int32_t client_id) override {}
void CreateVideoEncodeAccelerator(
media::mojom::VideoEncodeAcceleratorRequest vea_request) override {}
void CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id,
const gfx::Size& size,
......
......@@ -76,6 +76,14 @@ void GpuClient::EstablishGpuChannel(
callback));
}
void GpuClient::CreateVideoEncodeAccelerator(
media::mojom::VideoEncodeAcceleratorRequest vea_request) {
GpuProcessHost* host = GpuProcessHost::Get();
if (!host)
return;
host->gpu_service()->CreateVideoEncodeAccelerator(std::move(vea_request));
}
void GpuClient::CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id,
const gfx::Size& size,
......
......@@ -32,6 +32,8 @@ class GpuClient : public ui::mojom::Gpu {
// ui::mojom::Gpu overrides:
void EstablishGpuChannel(
const EstablishGpuChannelCallback& callback) override;
void CreateVideoEncodeAccelerator(
media::mojom::VideoEncodeAcceleratorRequest vea_request) override;
void CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id,
const gfx::Size& size,
......
......@@ -14,6 +14,7 @@
#include "cc/output/context_provider.h"
#include "components/viz/common/resources/buffer_to_texture_target_map.h"
#include "content/child/child_thread_impl.h"
#include "content/public/common/service_names.mojom.h"
#include "content/renderer/render_thread_impl.h"
#include "gpu/command_buffer/client/gles2_interface.h"
#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
......@@ -24,6 +25,7 @@
#include "media/gpu/ipc/common/media_messages.h"
#include "media/video/video_decode_accelerator.h"
#include "media/video/video_encode_accelerator.h"
#include "services/service_manager/public/cpp/connector.h"
#include "services/ui/public/cpp/gpu/context_provider_command_buffer.h"
namespace content {
......@@ -53,13 +55,14 @@ GpuVideoAcceleratorFactoriesImpl::Create(
const scoped_refptr<ui::ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames,
const viz::BufferToTextureTargetMap& image_texture_targets,
bool enable_video_accelerator) {
bool enable_video_accelerator,
media::mojom::VideoEncodeAcceleratorPtrInfo unbound_vea) {
RecordContextProviderPhaseUmaEnum(
ContextProviderPhase::CONTEXT_PROVIDER_ACQUIRED);
return base::WrapUnique(new GpuVideoAcceleratorFactoriesImpl(
std::move(gpu_channel_host), main_thread_task_runner, task_runner,
context_provider, enable_gpu_memory_buffer_video_frames,
image_texture_targets, enable_video_accelerator));
image_texture_targets, enable_video_accelerator, std::move(unbound_vea)));
}
GpuVideoAcceleratorFactoriesImpl::GpuVideoAcceleratorFactoriesImpl(
......@@ -69,7 +72,8 @@ GpuVideoAcceleratorFactoriesImpl::GpuVideoAcceleratorFactoriesImpl(
const scoped_refptr<ui::ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames,
const viz::BufferToTextureTargetMap& image_texture_targets,
bool enable_video_accelerator)
bool enable_video_accelerator,
media::mojom::VideoEncodeAcceleratorPtrInfo unbound_vea)
: main_thread_task_runner_(main_thread_task_runner),
task_runner_(task_runner),
gpu_channel_host_(std::move(gpu_channel_host)),
......@@ -81,6 +85,7 @@ GpuVideoAcceleratorFactoriesImpl::GpuVideoAcceleratorFactoriesImpl(
video_accelerator_enabled_(enable_video_accelerator),
gpu_memory_buffer_manager_(
RenderThreadImpl::current()->GetGpuMemoryBufferManager()),
unbound_vea_(std::move(unbound_vea)),
thread_safe_sender_(ChildThreadImpl::current()->thread_safe_sender()) {
DCHECK(main_thread_task_runner_);
DCHECK(gpu_channel_host_);
......@@ -153,6 +158,13 @@ GpuVideoAcceleratorFactoriesImpl::CreateVideoEncodeAccelerator() {
if (CheckContextLost())
return nullptr;
media::mojom::VideoEncodeAcceleratorPtr vea;
vea.Bind(std::move(unbound_vea_));
if (vea) {
// TODO(mcasas): Create a mojom::MojoVideoEncodeAcceleratorHost
// implementation and use it, https://crbug.com/736517
}
return std::unique_ptr<media::VideoEncodeAccelerator>(
new media::GpuVideoEncodeAcceleratorHost(
context_provider_->GetCommandBufferProxy()));
......
......@@ -20,6 +20,7 @@
#include "components/viz/common/resources/buffer_to_texture_target_map.h"
#include "content/child/thread_safe_sender.h"
#include "content/common/content_export.h"
#include "media/mojo/interfaces/video_encode_accelerator.mojom.h"
#include "media/renderers/gpu_video_accelerator_factories.h"
#include "ui/gfx/geometry/size.h"
......@@ -55,7 +56,8 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl
const scoped_refptr<ui::ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames,
const viz::BufferToTextureTargetMap& image_texture_targets,
bool enable_video_accelerator);
bool enable_video_accelerator,
media::mojom::VideoEncodeAcceleratorPtrInfo unbound_vea);
// media::GpuVideoAcceleratorFactories implementation.
bool IsGpuVideoAcceleratorEnabled() override;
......@@ -110,7 +112,8 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl
const scoped_refptr<ui::ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames,
const viz::BufferToTextureTargetMap& image_texture_targets,
bool enable_video_accelerator);
bool enable_video_accelerator,
media::mojom::VideoEncodeAcceleratorPtrInfo unbound_vea);
scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
......@@ -133,6 +136,8 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl
gpu::GpuMemoryBufferManager* const gpu_memory_buffer_manager_;
media::mojom::VideoEncodeAcceleratorPtrInfo unbound_vea_;
// For sending requests to allocate shared memory in the Browser process.
scoped_refptr<ThreadSafeSender> thread_safe_sender_;
......
......@@ -1464,11 +1464,15 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl::GetGpuFactories() {
cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames);
#endif
media::mojom::VideoEncodeAcceleratorPtr vea;
gpu_->CreateVideoEncodeAccelerator(mojo::MakeRequest(&vea));
media::mojom::VideoEncodeAcceleratorPtrInfo unbound_vea = vea.PassInterface();
gpu_factories_.push_back(GpuVideoAcceleratorFactoriesImpl::Create(
std::move(gpu_channel_host), base::ThreadTaskRunnerHandle::Get(),
media_task_runner, std::move(media_context_provider),
enable_gpu_memory_buffer_video_frames, buffer_to_texture_target_map_,
enable_video_accelerator));
enable_video_accelerator, std::move(unbound_vea)));
return gpu_factories_.back().get();
}
......
......@@ -20,6 +20,7 @@ mojom("interfaces") {
"provision_fetcher.mojom",
"renderer.mojom",
"video_decoder.mojom",
"video_encode_accelerator.mojom",
]
if (is_android) {
......
// Copyright 2017 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.
module media.mojom;
// TODO(mcasas): Finalize migrating the IPC messages https://crbug.com/736517.
interface VideoEncodeAccelerator{};
......@@ -222,6 +222,13 @@ void GpuService::RecordLogMessage(int severity,
(*gpu_host_)->RecordLogMessage(severity, header, message);
}
void GpuService::CreateVideoEncodeAccelerator(
media::mojom::VideoEncodeAcceleratorRequest vea_request) {
DCHECK(io_runner_->BelongsToCurrentThread());
// TODO(mcasas): Create a mojom::VideoEncodeAccelerator implementation,
// https://crbug.com/736517.
}
void GpuService::CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id,
const gfx::Size& size,
......
......@@ -134,6 +134,8 @@ class GpuService : public gpu::GpuChannelManagerDelegate,
bool is_gpu_host,
const EstablishGpuChannelCallback& callback) override;
void CloseChannel(int32_t client_id) override;
void CreateVideoEncodeAccelerator(
media::mojom::VideoEncodeAcceleratorRequest vea_request) override;
void CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id,
const gfx::Size& size,
......
......@@ -15,6 +15,7 @@ mojom("interfaces") {
public_deps = [
"//cc/ipc:interfaces",
"//gpu/ipc/common:interfaces",
"//media/mojo/interfaces",
"//services/ui/public/interfaces",
"//ui/gfx/geometry/mojo",
"//ui/gfx/mojo",
......
......@@ -8,6 +8,7 @@ import "gpu/ipc/common/gpu_info.mojom";
import "gpu/ipc/common/memory_stats.mojom";
import "gpu/ipc/common/surface_handle.mojom";
import "gpu/ipc/common/sync_token.mojom";
import "media/mojo/interfaces/video_encode_accelerator.mojom";
import "ui/gfx/geometry/mojo/geometry.mojom";
import "ui/gfx/mojo/buffer_types.mojom";
......@@ -23,6 +24,9 @@ interface GpuService {
// If no channel can be identified, do nothing.
CloseChannel(int32 client_id);
// Creates a new VideoEncodeAccelerator and binds it to |vea|.
CreateVideoEncodeAccelerator(media.mojom.VideoEncodeAccelerator& vea);
CreateGpuMemoryBuffer(gfx.mojom.GpuMemoryBufferId id,
gfx.mojom.Size size,
gfx.mojom.BufferFormat format,
......
......@@ -90,6 +90,14 @@ scoped_refptr<cc::ContextProvider> Gpu::CreateContextProvider(
shared_context_provider, ui::command_buffer_metrics::MUS_CLIENT_CONTEXT));
}
void Gpu::CreateVideoEncodeAccelerator(
media::mojom::VideoEncodeAcceleratorRequest vea_request) {
DCHECK(IsMainThread());
if (!gpu_ || !gpu_.is_bound())
gpu_ = factory_.Run();
gpu_->CreateVideoEncodeAccelerator(std::move(vea_request));
}
void Gpu::EstablishGpuChannel(
const gpu::GpuChannelEstablishedCallback& callback) {
DCHECK(IsMainThread());
......@@ -98,11 +106,15 @@ void Gpu::EstablishGpuChannel(
callback.Run(std::move(channel));
return;
}
const bool gpu_channel_request_ongoing = !establish_callbacks_.empty();
// Cache |callback| but don't launch more than one EstablishGpuChannel().
establish_callbacks_.push_back(callback);
if (gpu_)
if (gpu_channel_request_ongoing)
return;
gpu_ = factory_.Run();
if (!gpu_ || !gpu_.is_bound())
gpu_ = factory_.Run();
gpu_->EstablishGpuChannel(
base::Bind(&Gpu::OnEstablishedGpuChannel, base::Unretained(this)));
}
......@@ -111,18 +123,19 @@ scoped_refptr<gpu::GpuChannelHost> Gpu::EstablishGpuChannelSync() {
DCHECK(IsMainThread());
if (GetGpuChannel())
return gpu_channel_;
if (!gpu_ || !gpu_.is_bound())
gpu_ = factory_.Run();
int client_id = 0;
mojo::ScopedMessagePipeHandle channel_handle;
gpu::GPUInfo gpu_info;
gpu_ = factory_.Run();
mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync_call;
if (!gpu_->EstablishGpuChannel(&client_id, &channel_handle, &gpu_info)) {
DLOG(WARNING)
<< "Channel encountered error while establishing gpu channel.";
DLOG(WARNING) << "Encountered error while establishing gpu channel.";
return nullptr;
}
OnEstablishedGpuChannel(client_id, std::move(channel_handle), gpu_info);
return gpu_channel_;
}
......@@ -152,7 +165,6 @@ void Gpu::OnEstablishedGpuChannel(int client_id,
&shutdown_event_, gpu_memory_buffer_manager_.get());
}
gpu_.reset();
auto callbacks = std::move(establish_callbacks_);
establish_callbacks_.clear();
for (const auto& callback : callbacks)
......
......@@ -44,6 +44,9 @@ class Gpu : public gpu::GpuChannelHostFactory,
scoped_refptr<cc::ContextProvider> CreateContextProvider(
scoped_refptr<gpu::GpuChannelHost> gpu_channel);
void CreateVideoEncodeAccelerator(
media::mojom::VideoEncodeAcceleratorRequest vea_request);
// gpu::GpuChannelEstablishFactory:
void EstablishGpuChannel(
const gpu::GpuChannelEstablishedCallback& callback) override;
......
......@@ -46,6 +46,9 @@ class TestGpuImpl : public mojom::Gpu {
}
// ui::mojom::Gpu overrides:
void CreateVideoEncodeAccelerator(
media::mojom::VideoEncodeAcceleratorRequest vea_request) override {}
void EstablishGpuChannel(
const EstablishGpuChannelCallback& callback) override {
establish_channel_callback_ = callback;
......
......@@ -33,6 +33,7 @@ mojom("interfaces") {
":constants",
"//cc/ipc:interfaces",
"//gpu/ipc/common:interfaces",
"//media/mojo/interfaces",
"//services/ui/public/interfaces/cursor",
"//services/ui/public/interfaces/display",
"//services/ui/public/interfaces/ime",
......
......@@ -6,6 +6,7 @@ module ui.mojom;
import "gpu/ipc/common/gpu_info.mojom";
import "gpu/ipc/common/sync_token.mojom";
import "media/mojo/interfaces/video_encode_accelerator.mojom";
import "ui/gfx/geometry/mojo/geometry.mojom";
import "ui/gfx/mojo/buffer_types.mojom";
......@@ -18,6 +19,9 @@ interface Gpu {
handle<message_pipe>? channel_handle,
gpu.mojom.GpuInfo gpu_info);
// Creates a new VideoEncodeAccelerator and binds it to |vea|.
CreateVideoEncodeAccelerator(media.mojom.VideoEncodeAccelerator& vea);
// Tells the GPU service to create a new GPU memory buffer.
CreateGpuMemoryBuffer(gfx.mojom.GpuMemoryBufferId id,
gfx.mojom.Size size,
......
......@@ -56,6 +56,11 @@ void GpuClient::EstablishGpuChannel(
weak_factory_.GetWeakPtr(), callback));
}
void GpuClient::CreateVideoEncodeAccelerator(
media::mojom::VideoEncodeAcceleratorRequest vea_request) {
NOTIMPLEMENTED();
}
void GpuClient::CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id,
const gfx::Size& size,
......
......@@ -44,6 +44,8 @@ class GpuClient : public mojom::Gpu {
// mojom::Gpu overrides:
void EstablishGpuChannel(
const EstablishGpuChannelCallback& callback) override;
void CreateVideoEncodeAccelerator(
media::mojom::VideoEncodeAcceleratorRequest vea_request) override;
void CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id,
const gfx::Size& size,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment