#include "gpu/command_buffer/service/shared_image_interface_in_process.h"
#include <optional>
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "base/process/memory.h"
#include "base/synchronization/waitable_event.h"
#include "build/build_config.h"
#include "components/viz/common/resources/shared_image_format_utils.h"
#include "gpu/command_buffer/client/client_shared_image.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
#include "gpu/command_buffer/common/sync_token.h"
#include "gpu/command_buffer/service/command_buffer_task_executor.h"
#include "gpu/command_buffer/service/display_compositor_memory_and_task_controller_on_gpu.h"
#include "gpu/command_buffer/service/gpu_command_buffer_memory_tracker.h"
#include "gpu/command_buffer/service/gr_shader_cache.h"
#include "gpu/command_buffer/service/shared_image/shared_image_factory.h"
#include "gpu/command_buffer/service/single_task_sequence.h"
#include "gpu/command_buffer/service/sync_point_manager.h"
#include "gpu/config/gpu_driver_bug_workarounds.h"
#include "gpu/config/gpu_feature_info.h"
#include "gpu/config/gpu_preferences.h"
#include "gpu/ipc/common/gpu_client_ids.h"
#include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
#include "ui/gfx/buffer_format_util.h"
#include "ui/gfx/gpu_fence.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_implementation.h"
namespace gpu {
struct SharedImageInterfaceInProcess::SetUpOnGpuParams { … };
SharedImageInterfaceInProcess::SharedImageInterfaceInProcess(
SingleTaskSequence* task_sequence,
DisplayCompositorMemoryAndTaskControllerOnGpu* display_controller)
: … { … }
SharedImageInterfaceInProcess::SharedImageInterfaceInProcess(
SingleTaskSequence* task_sequence,
SyncPointManager* sync_point_manager,
const GpuPreferences& gpu_preferences,
const GpuDriverBugWorkarounds& gpu_workarounds,
const GpuFeatureInfo& gpu_feature_info,
gpu::SharedContextState* context_state,
SharedImageManager* shared_image_manager,
bool is_for_display_compositor,
OwnerThread owner_thread)
: … { … }
SharedImageInterfaceInProcess::~SharedImageInterfaceInProcess() { … }
const SharedImageCapabilities&
SharedImageInterfaceInProcess::GetCapabilities() { … }
void SharedImageInterfaceInProcess::GetCapabilitiesOnGpu(
base::WaitableEvent* completion,
SharedImageCapabilities* out_capabilities) { … }
void SharedImageInterfaceInProcess::SetUpOnGpu(
std::unique_ptr<SetUpOnGpuParams> params) { … }
void SharedImageInterfaceInProcess::DestroyOnGpu(
base::WaitableEvent* completion) { … }
bool SharedImageInterfaceInProcess::MakeContextCurrent(bool needs_gl) { … }
bool SharedImageInterfaceInProcess::LazyCreateSharedImageFactory() { … }
scoped_refptr<ClientSharedImage>
SharedImageInterfaceInProcess::CreateSharedImage(
const SharedImageInfo& si_info,
gpu::SurfaceHandle surface_handle) { … }
void SharedImageInterfaceInProcess::CreateSharedImageOnGpuThread(
const Mailbox& mailbox,
SharedImageInfo si_info,
gpu::SurfaceHandle surface_handle,
const SyncToken& sync_token) { … }
scoped_refptr<ClientSharedImage>
SharedImageInterfaceInProcess::CreateSharedImage(
const SharedImageInfo& si_info,
base::span<const uint8_t> pixel_data) { … }
void SharedImageInterfaceInProcess::CreateSharedImageWithDataOnGpuThread(
const Mailbox& mailbox,
SharedImageInfo si_info,
const SyncToken& sync_token,
std::vector<uint8_t> pixel_data) { … }
scoped_refptr<ClientSharedImage>
SharedImageInterfaceInProcess::CreateSharedImage(
const SharedImageInfo& si_info,
SurfaceHandle surface_handle,
gfx::BufferUsage buffer_usage) { … }
void SharedImageInterfaceInProcess::CreateSharedImageWithBufferUsageOnGpuThread(
const Mailbox& mailbox,
SharedImageInfo si_info,
SurfaceHandle surface_handle,
gfx::BufferUsage buffer_usage,
const SyncToken& sync_token) { … }
GpuMemoryBufferHandleInfo
SharedImageInterfaceInProcess::GetGpuMemoryBufferHandleInfo(
const Mailbox& mailbox) { … }
void SharedImageInterfaceInProcess::GetGpuMemoryBufferHandleInfoOnGpuThread(
const Mailbox& mailbox,
gfx::GpuMemoryBufferHandle* handle,
viz::SharedImageFormat* format,
gfx::Size* size,
gfx::BufferUsage* buffer_usage,
base::WaitableEvent* completion) { … }
scoped_refptr<ClientSharedImage>
SharedImageInterfaceInProcess::CreateSharedImage(
const SharedImageInfo& si_info,
gpu::SurfaceHandle surface_handle,
gfx::BufferUsage buffer_usage,
gfx::GpuMemoryBufferHandle buffer_handle) { … }
scoped_refptr<ClientSharedImage>
SharedImageInterfaceInProcess::CreateSharedImage(
const SharedImageInfo& si_info,
gfx::GpuMemoryBufferHandle buffer_handle) { … }
SharedImageInterface::SharedImageMapping
SharedImageInterfaceInProcess::CreateSharedImage(
const SharedImageInfo& si_info) { … }
void SharedImageInterfaceInProcess::CreateSharedImageWithBufferOnGpuThread(
const Mailbox& mailbox,
SharedImageInfo si_info,
gfx::GpuMemoryBufferHandle buffer_handle,
const SyncToken& sync_token) { … }
SharedImageInterface::SwapChainSharedImages
SharedImageInterfaceInProcess::CreateSwapChain(
viz::SharedImageFormat format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
GrSurfaceOrigin surface_origin,
SkAlphaType alpha_type,
gpu::SharedImageUsageSet usage) { … }
void SharedImageInterfaceInProcess::PresentSwapChain(
const SyncToken& sync_token,
const Mailbox& mailbox) { … }
#if BUILDFLAG(IS_FUCHSIA)
void SharedImageInterfaceInProcess::RegisterSysmemBufferCollection(
zx::eventpair service_handle,
zx::channel sysmem_token,
const viz::SharedImageFormat& format,
gfx::BufferUsage usage,
bool register_with_image_pipe) {
NOTREACHED_IN_MIGRATION();
}
#endif
void SharedImageInterfaceInProcess::UpdateSharedImage(
const SyncToken& sync_token,
const Mailbox& mailbox) { … }
void SharedImageInterfaceInProcess::UpdateSharedImage(
const SyncToken& sync_token,
std::unique_ptr<gfx::GpuFence> acquire_fence,
const Mailbox& mailbox) { … }
void SharedImageInterfaceInProcess::UpdateSharedImageOnGpuThread(
const Mailbox& mailbox,
const SyncToken& sync_token) { … }
void SharedImageInterfaceInProcess::DestroySharedImage(
const SyncToken& sync_token,
const Mailbox& mailbox) { … }
void SharedImageInterfaceInProcess::DestroySharedImage(
const SyncToken& sync_token,
scoped_refptr<ClientSharedImage> client_shared_image) { … }
void SharedImageInterfaceInProcess::DestroySharedImageOnGpuThread(
const Mailbox& mailbox) { … }
void SharedImageInterfaceInProcess::WaitSyncTokenOnGpuThread(
const SyncToken& sync_token) { … }
SyncToken SharedImageInterfaceInProcess::GenUnverifiedSyncToken() { … }
SyncToken SharedImageInterfaceInProcess::GenVerifiedSyncToken() { … }
void SharedImageInterfaceInProcess::VerifySyncToken(SyncToken& sync_token) { … }
void SharedImageInterfaceInProcess::WaitSyncToken(const SyncToken& sync_token) { … }
void SharedImageInterfaceInProcess::Flush() { … }
scoped_refptr<gfx::NativePixmap> SharedImageInterfaceInProcess::GetNativePixmap(
const gpu::Mailbox& mailbox) { … }
void SharedImageInterfaceInProcess::ScheduleGpuTask(
base::OnceClosure task,
std::vector<SyncToken> sync_token_fences) { … }
scoped_refptr<ClientSharedImage>
SharedImageInterfaceInProcess::ImportSharedImage(
const ExportedSharedImage& exported_shared_image) { … }
}