blob: f32c66777d15ca8b6f415191230b73f54f070aed [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVICE_VR_ANDROID_MAILBOX_TO_SURFACE_BRIDGE_H_
#define DEVICE_VR_ANDROID_MAILBOX_TO_SURFACE_BRIDGE_H_
#include "base/functional/callback_forward.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
namespace gfx {
enum class BufferFormat : uint8_t;
class ColorSpace;
class GpuFence;
struct GpuMemoryBufferHandle;
class Size;
} // namespace gfx
namespace gpu {
class ClientSharedImage;
struct SyncToken;
} // namespace gpu
namespace viz {
class SharedImageFormat;
} // namespace viz
namespace device {
class MailboxToSurfaceBridge {
public:
virtual ~MailboxToSurfaceBridge() {}
// Returns true if the GPU process connection is established and ready to use.
// Equivalent to waiting for on_initialized to be called.
virtual bool IsConnected() = 0;
// Asynchronously creates and binds context provider to the current thread
// (making it the GL thread) and calls the callback on the GL thread.
virtual void CreateAndBindContextProvider(base::OnceClosure callback) = 0;
// All other public methods below must be called on the GL thread
// (except when marked otherwise).
virtual void GenSyncToken(gpu::SyncToken* out_sync_token) = 0;
virtual void WaitSyncToken(const gpu::SyncToken& sync_token) = 0;
// Copies a GpuFence from the local context to the GPU process,
// and issues a server wait for it.
virtual void WaitForClientGpuFence(gfx::GpuFence&) = 0;
// Creates a GpuFence in the GPU process after the supplied sync_token
// completes, and copies it for use in the local context. This is
// asynchronous, the callback receives the GpuFence once it's available.
virtual void CreateGpuFence(
const gpu::SyncToken& sync_token,
base::OnceCallback<void(std::unique_ptr<gfx::GpuFence>)> callback) = 0;
// Creates a shared image bound to |buffer_handle|. Returns the shared image
// and populates |sync_token|.
// Caller must call DestroySharedImage to free the shared image. Backing keeps
// reference to the |buffer_handle|.
virtual scoped_refptr<gpu::ClientSharedImage> CreateSharedImage(
gfx::GpuMemoryBufferHandle buffer_handle,
viz::SharedImageFormat format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
gpu::SharedImageUsageSet usage,
gpu::SyncToken& sync_token) = 0;
// Destroys a shared image created by CreateSharedImage. The sync_token
// argument must have been updated to a sync token after the last use of the
// shared image.
virtual void DestroySharedImage(
const gpu::SyncToken& sync_token,
scoped_refptr<gpu::ClientSharedImage> shared_image) = 0;
};
class MailboxToSurfaceBridgeFactory {
public:
virtual ~MailboxToSurfaceBridgeFactory() {}
virtual std::unique_ptr<device::MailboxToSurfaceBridge> Create() const = 0;
};
} // namespace device
#endif // DEVICE_VR_ANDROID_MAILBOX_TO_SURFACE_BRIDGE_H_