blob: aa9636290338c0d6d418a6afe3bd2977d11fd4c3 [file] [log] [blame]
// Copyright 2025 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_ARC_SHARED_IMAGE_INTERFACE_H_
#define GPU_IPC_SERVICE_ARC_SHARED_IMAGE_INTERFACE_H_
#include <atomic>
#include "base/task/single_thread_task_runner.h"
#include "gpu/command_buffer/client/shared_image_interface.h"
#include "gpu/command_buffer/service/shared_image/shared_image_factory.h"
#include "gpu/ipc/service/gpu_ipc_service_export.h"
namespace gpu {
class GpuChannelManager;
// Used by ArcVideoEncodeAccelerator to create mappable SharedImages from
// GpuMemoryBufferHandles passed over from ARC.
class GPU_IPC_SERVICE_EXPORT ArcSharedImageInterface
: public SharedImageInterface {
public:
static scoped_refptr<ArcSharedImageInterface> Create(
GpuChannelManager* gpu_channel_manager,
scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner);
ArcSharedImageInterface(
std::unique_ptr<SharedImageFactory> shared_image_factory,
scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner);
ArcSharedImageInterface(const ArcSharedImageInterface&) = delete;
ArcSharedImageInterface& operator=(const ArcSharedImageInterface&) = 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> CreateSharedImageForMLTensor(
std::string debug_label,
viz::SharedImageFormat format,
const gfx::Size& size,
gpu::SharedImageUsageSet usage) 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;
SyncToken GenUnverifiedSyncToken() override;
SyncToken GenVerifiedSyncToken() override;
void VerifySyncToken(SyncToken& sync_token) override;
void WaitSyncToken(const SyncToken& sync_token) override;
bool CanVerifySyncToken(const gpu::SyncToken& sync_token) override;
void VerifyFlush() override;
const SharedImageCapabilities& GetCapabilities() override;
private:
~ArcSharedImageInterface() override;
void CreateSharedImageOnGpuThread(const Mailbox& mailbox,
const SharedImageInfo& si_info,
gfx::BufferUsage buffer_usage,
gfx::GpuMemoryBufferHandle buffer_handle);
void DestroySharedImageOnGpuThread(const Mailbox& mailbox);
bool MakeContextCurrentOnGpuThread(bool needs_gl = false);
std::unique_ptr<gpu::SharedImageFactory> shared_image_factory_;
scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner_;
std::atomic_bool encountered_error_{false};
};
} // namespace gpu
#endif // GPU_IPC_SERVICE_ARC_SHARED_IMAGE_INTERFACE_H_