910e62b5创建于 1月15日历史提交
// 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_