| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/renderer/media/win/dcomp_texture_factory.h" |
| |
| #include "base/task/sequenced_task_runner.h" |
| #include "gpu/ipc/client/client_shared_image_interface.h" |
| #include "gpu/ipc/client/gpu_channel_host.h" |
| #include "media/base/win/mf_helpers.h" |
| #include "mojo/public/cpp/bindings/sync_call_restrictions.h" |
| #include "ui/gfx/geometry/size.h" |
| |
| namespace content { |
| |
| // static |
| scoped_refptr<DCOMPTextureFactory> DCOMPTextureFactory::Create( |
| scoped_refptr<gpu::GpuChannelHost> channel, |
| scoped_refptr<base::SequencedTaskRunner> media_task_runner) { |
| DVLOG(1) << __func__; |
| return WrapRefCounted( |
| new DCOMPTextureFactory(std::move(channel), media_task_runner)); |
| } |
| |
| DCOMPTextureFactory::DCOMPTextureFactory( |
| scoped_refptr<gpu::GpuChannelHost> channel, |
| scoped_refptr<base::SequencedTaskRunner> media_task_runner) |
| : channel_(std::move(channel)), media_task_runner_(media_task_runner) { |
| DVLOG_FUNC(1); |
| DCHECK(channel_); |
| } |
| |
| DCOMPTextureFactory::~DCOMPTextureFactory() = default; |
| |
| std::unique_ptr<DCOMPTextureHost> DCOMPTextureFactory::CreateDCOMPTextureHost( |
| DCOMPTextureHost::Listener* listener) { |
| DVLOG_FUNC(1); |
| DCHECK(media_task_runner_->RunsTasksInCurrentSequence()); |
| |
| int32_t route_id = channel_->GenerateRouteID(); |
| mojo::PendingAssociatedRemote<gpu::mojom::DCOMPTexture> remote; |
| bool succeeded = false; |
| |
| mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync; |
| // Creates a DCOMPTexture in the GPU process. |
| channel_->GetGpuChannel().CreateDCOMPTexture( |
| route_id, remote.InitWithNewEndpointAndPassReceiver(), &succeeded); |
| if (!succeeded) { |
| DLOG(ERROR) << "CreateDCOMPTexture failed"; |
| return nullptr; |
| } |
| |
| return std::make_unique<DCOMPTextureHost>( |
| channel_, route_id, media_task_runner_, std::move(remote), listener); |
| } |
| |
| bool DCOMPTextureFactory::IsLost() const { |
| return channel_->IsLost(); |
| } |
| |
| gpu::SharedImageInterface* DCOMPTextureFactory::SharedImageInterface() { |
| DCHECK(media_task_runner_->RunsTasksInCurrentSequence()); |
| |
| if (!shared_image_interface_) |
| shared_image_interface_ = channel_->CreateClientSharedImageInterface(); |
| |
| DCHECK(shared_image_interface_); |
| return shared_image_interface_.get(); |
| } |
| |
| } // namespace content |