blob: 623259328d37c43dd21a89a4b05f2cd097e0101f [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GPU_IPC_SERVICE_GPU_CHANNEL_SHARED_IMAGE_INTERFACE_H_
#define GPU_IPC_SERVICE_GPU_CHANNEL_SHARED_IMAGE_INTERFACE_H_
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "gpu/command_buffer/client/client_shared_image.h"
#include "gpu/command_buffer/client/shared_image_interface.h"
#include "gpu/command_buffer/common/command_buffer_id.h"
#include "gpu/command_buffer/common/shared_image_capabilities.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
#include "gpu/command_buffer/service/sequence_id.h"
#include "gpu/gpu_gles2_export.h"
#include "gpu/ipc/common/gpu_memory_buffer_handle_info.h"
#include "gpu/ipc/service/shared_image_stub.h"
#include "ui/gfx/gpu_memory_buffer.h"
#if BUILDFLAG(IS_WIN)
#include <d3d11.h>
#include <wrl/client.h>
#include "gpu/command_buffer/service/dxgi_shared_handle_manager.h"
#include "gpu/command_buffer/service/shared_image/d3d_image_backing.h"
#endif
namespace base {
class WaitableEvent;
}
namespace gpu {
class Scheduler;
#if BUILDFLAG(IS_ANDROID)
class StreamTextureSharedImageInterface;
class RefCountedLock;
#endif
class GPU_IPC_SERVICE_EXPORT GpuChannelSharedImageInterface
: public SharedImageInterface {
public:
explicit GpuChannelSharedImageInterface(
base::WeakPtr<SharedImageStub> shared_image_stub);
GpuChannelSharedImageInterface(const GpuChannelSharedImageInterface&) =
delete;
GpuChannelSharedImageInterface& operator=(
const GpuChannelSharedImageInterface&) = delete;
// SharedImageInterface:
scoped_refptr<ClientSharedImage> CreateSharedImage(
const SharedImageInfo& si_info,
gpu::SurfaceHandle surface_handle,
std::optional<SharedImagePoolId> pool_id = std::nullopt) override;
scoped_refptr<ClientSharedImage> CreateSharedImage(
const SharedImageInfo& si_info,
base::span<const uint8_t> pixel_data) override;
scoped_refptr<ClientSharedImage> CreateSharedImage(
const SharedImageInfo& si_info,
SurfaceHandle surface_handle,
gfx::BufferUsage buffer_usage,
std::optional<SharedImagePoolId> pool_id = std::nullopt) override;
scoped_refptr<ClientSharedImage> CreateSharedImage(
const SharedImageInfo& si_info,
gpu::SurfaceHandle surface_handle,
gfx::BufferUsage buffer_usage,
gfx::GpuMemoryBufferHandle buffer_handle) override;
scoped_refptr<ClientSharedImage> CreateSharedImage(
const SharedImageInfo& si_info,
gfx::GpuMemoryBufferHandle buffer_handle) override;
scoped_refptr<ClientSharedImage> CreateSharedImageForSoftwareCompositor(
const SharedImageInfo& si_info) override;
void UpdateSharedImage(const SyncToken& sync_token,
const Mailbox& mailbox) override;
void UpdateSharedImage(const SyncToken& sync_token,
std::unique_ptr<gfx::GpuFence> acquire_fence,
const Mailbox& mailbox) override;
void DestroySharedImage(const SyncToken& sync_token,
const Mailbox& mailbox) override;
void DestroySharedImage(
const SyncToken& sync_token,
scoped_refptr<ClientSharedImage> client_shared_image) override;
scoped_refptr<ClientSharedImage> ImportSharedImage(
ExportedSharedImage exported_shared_image) override;
SwapChainSharedImages CreateSwapChain(viz::SharedImageFormat format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
GrSurfaceOrigin surface_origin,
SkAlphaType alpha_type,
SharedImageUsageSet usage) override;
void PresentSwapChain(const SyncToken& sync_token,
const Mailbox& mailbox) override;
#if BUILDFLAG(IS_FUCHSIA)
void RegisterSysmemBufferCollection(zx::eventpair service_handle,
zx::channel sysmem_token,
const viz::SharedImageFormat& format,
gfx::BufferUsage usage,
bool register_with_image_pipe) override;
#endif // BUILDFLAG(IS_FUCHSIA)
SyncToken GenUnverifiedSyncToken() override;
SyncToken GenVerifiedSyncToken() override;
void VerifySyncToken(SyncToken& sync_token) override;
void WaitSyncToken(const SyncToken& sync_token) override;
const SharedImageCapabilities& GetCapabilities() override;
// Public functions specific to GpuChannelSharedImageInterface:
#if BUILDFLAG(IS_ANDROID)
scoped_refptr<ClientSharedImage> CreateSharedImageForAndroidVideo(
const gfx::Size& size,
const gfx::ColorSpace& color_space,
scoped_refptr<StreamTextureSharedImageInterface> image,
scoped_refptr<RefCountedLock> drdc_lock);
#endif
#if BUILDFLAG(IS_WIN)
scoped_refptr<ClientSharedImage> CreateSharedImageForD3D11Video(
const SharedImageInfo& si_info,
Microsoft::WRL::ComPtr<ID3D11Texture2D> texture,
scoped_refptr<gpu::DXGISharedHandleState> dxgi_shared_handle_state,
size_t array_slice,
const bool is_thread_safe);
#endif
SequenceId sequence() { return sequence_; }
protected:
~GpuChannelSharedImageInterface() override;
private:
SyncToken MakeSyncToken(uint64_t release_id) {
return SyncToken(CommandBufferNamespace::GPU_CHANNEL_SHARED_IMAGE_INTERFACE,
command_buffer_id_, release_id);
}
void ScheduleGpuTask(base::OnceClosure task,
std::vector<SyncToken> sync_token_fences,
const SyncToken& release);
// Only called on the gpu thread.
bool MakeContextCurrent(bool needs_gl = false);
void GetGpuMemoryBufferHandleInfoOnGpuThread(
const Mailbox& mailbox,
gfx::GpuMemoryBufferHandle* handle,
viz::SharedImageFormat* format,
gfx::Size* size,
gfx::BufferUsage* buffer_usage,
base::WaitableEvent* completion);
void CreateSharedImageOnGpuThread(const Mailbox& mailbox,
SharedImageInfo si_info,
gpu::SurfaceHandle surface_handle);
void CreateSharedImageWithDataOnGpuThread(const Mailbox& mailbox,
SharedImageInfo si_info,
std::vector<uint8_t> pixel_data);
void CreateSharedImageWithBufferUsageOnGpuThread(
const Mailbox& mailbox,
SharedImageInfo si_info,
SurfaceHandle surface_handle,
gfx::BufferUsage buffer_usage);
void CreateSharedImageWithBufferOnGpuThread(
const Mailbox& mailbox,
SharedImageInfo si_info,
gfx::GpuMemoryBufferHandle buffer_handle);
void UpdateSharedImageOnGpuThread(const Mailbox& mailbox);
void DestroySharedImageOnGpuThread(const Mailbox& mailbox);
void DestroyClientSharedImageOnGpuThread(
scoped_refptr<ClientSharedImage> client_shared_image);
void WrapTaskWithGpuUrl(base::OnceClosure task);
GpuMemoryBufferHandleInfo GetGpuMemoryBufferHandleInfo(
const Mailbox& mailbox);
base::WeakPtr<SharedImageStub> shared_image_stub_;
// Sequence checker for tasks that run on the gpu "thread".
SEQUENCE_CHECKER(gpu_sequence_checker_);
// Accessed on any thread.
base::Lock lock_;
uint64_t next_fence_sync_release_ GUARDED_BY(lock_) = 1;
const CommandBufferId command_buffer_id_;
raw_ptr<Scheduler> scheduler_;
const SequenceId sequence_;
SharedImageCapabilities shared_image_capabilities_;
};
} // namespace gpu
#endif // GPU_IPC_SERVICE_GPU_CHANNEL_SHARED_IMAGE_INTERFACE_H_