blob: ace7f45ece8fb401e727db628689c4160bd84bd7 [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.
#include "gpu/command_buffer/client/shared_image_interface.h"
#include <GLES2/gl2.h>
#include "base/functional/callback_helpers.h"
#include "base/notreached.h"
#include "gpu/command_buffer/client/client_shared_image.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
#if BUILDFLAG(IS_WIN)
#include "ui/gfx/win/d3d_shared_fence.h"
#endif
namespace gpu {
SharedImageInterface::SwapChainSharedImages::SwapChainSharedImages(
scoped_refptr<gpu::ClientSharedImage> front_buffer,
scoped_refptr<gpu::ClientSharedImage> back_buffer)
: front_buffer(std::move(front_buffer)),
back_buffer(std::move(back_buffer)) {}
SharedImageInterface::SwapChainSharedImages::SwapChainSharedImages(
const SwapChainSharedImages& shared_images) = default;
SharedImageInterface::SwapChainSharedImages::~SwapChainSharedImages() = default;
SharedImageInterface::SharedImageInterface()
: holder_(base::MakeRefCounted<SharedImageInterfaceHolder>(this)) {}
SharedImageInterface::~SharedImageInterface() = default;
scoped_refptr<ClientSharedImage> SharedImageInterface::CreateSharedImage(
const SharedImageInfo& si_info,
gpu::SurfaceHandle surface_handle,
gfx::BufferUsage buffer_usage) {
NOTREACHED_IN_MIGRATION();
return base::MakeRefCounted<ClientSharedImage>(Mailbox(), si_info.meta,
GenUnverifiedSyncToken(),
holder_, gfx::EMPTY_BUFFER);
}
SharedImageUsageSet SharedImageInterface::UsageForMailbox(
const Mailbox& mailbox) {
return SharedImageUsageSet();
}
scoped_refptr<ClientSharedImage>
SharedImageInterface::AddReferenceToSharedImage(
const SyncToken& sync_token,
const Mailbox& mailbox,
viz::SharedImageFormat format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
GrSurfaceOrigin surface_origin,
SkAlphaType alpha_type,
SharedImageUsageSet usage,
uint32_t texture_target) {
return ImportSharedImage(ExportedSharedImage(
mailbox,
SharedImageMetadata{format, size, color_space, surface_origin, alpha_type,
usage},
sync_token, texture_target));
}
scoped_refptr<ClientSharedImage> SharedImageInterface::NotifyMailboxAdded(
const Mailbox& /*mailbox*/,
viz::SharedImageFormat /*format*/,
const gfx::Size& /*size*/,
const gfx::ColorSpace& /*color_space*/,
GrSurfaceOrigin /*surface_origin*/,
SkAlphaType /*alpha_type*/,
SharedImageUsageSet /*usage*/) {
return nullptr;
}
scoped_refptr<ClientSharedImage> SharedImageInterface::NotifyMailboxAdded(
const Mailbox& /*mailbox*/,
viz::SharedImageFormat /*format*/,
const gfx::Size& /*size*/,
const gfx::ColorSpace& /*color_space*/,
GrSurfaceOrigin /*surface_origin*/,
SkAlphaType /*alpha_type*/,
SharedImageUsageSet /*usage*/,
uint32_t /*texture_target*/) {
return nullptr;
}
void SharedImageInterface::CopyToGpuMemoryBuffer(const SyncToken& sync_token,
const Mailbox& mailbox) {
NOTREACHED_IN_MIGRATION();
}
void SharedImageInterface::CopyToGpuMemoryBufferAsync(
const SyncToken& sync_token,
const Mailbox& mailbox,
base::OnceCallback<void(bool)> callback) {
NOTREACHED_IN_MIGRATION();
}
bool SharedImageInterface::CopyNativeGmbToSharedMemorySync(
gfx::GpuMemoryBufferHandle buffer_handle,
base::UnsafeSharedMemoryRegion memory_region) {
NOTREACHED();
}
void SharedImageInterface::CopyNativeGmbToSharedMemoryAsync(
gfx::GpuMemoryBufferHandle buffer_handle,
base::UnsafeSharedMemoryRegion memory_region,
base::OnceCallback<void(bool)> callback) {
NOTREACHED();
}
void SharedImageInterface::Release() const {
bool should_destroy = false;
{
base::AutoLock auto_lock(holder_->lock_);
if (base::subtle::RefCountedThreadSafeBase::Release()) {
ANALYZER_SKIP_THIS_PATH();
holder_->OnDestroy();
should_destroy = true;
}
}
if (should_destroy) {
delete this;
}
}
#if BUILDFLAG(IS_WIN)
void SharedImageInterface::UpdateSharedImage(
const SyncToken& sync_token,
scoped_refptr<gfx::D3DSharedFence> d3d_shared_fence,
const Mailbox& mailbox) {
NOTIMPLEMENTED_LOG_ONCE();
}
#endif // BUILDFLAG(IS_WIN)
SharedImageInterface::SharedImageMapping::SharedImageMapping() = default;
SharedImageInterface::SharedImageMapping::SharedImageMapping(
SharedImageInterface::SharedImageMapping&& mapped) = default;
SharedImageInterface::SharedImageMapping::SharedImageMapping(
scoped_refptr<ClientSharedImage> shared_image,
base::WritableSharedMemoryMapping mapping)
: shared_image(std::move(shared_image)), mapping(std::move(mapping)) {}
SharedImageInterface::SharedImageMapping&
SharedImageInterface::SharedImageMapping::operator=(
SharedImageInterface::SharedImageMapping&& mapped) = default;
SharedImageInterface::SharedImageMapping::~SharedImageMapping() = default;
SharedImageInterfaceHolder::SharedImageInterfaceHolder(
SharedImageInterface* sii)
: sii_(sii) {}
SharedImageInterfaceHolder::~SharedImageInterfaceHolder() = default;
scoped_refptr<SharedImageInterface> SharedImageInterfaceHolder::Get() {
base::AutoLock auto_lock(lock_);
return scoped_refptr<SharedImageInterface>(sii_);
}
void SharedImageInterfaceHolder::OnDestroy() {
lock_.AssertAcquired();
sii_ = nullptr;
}
} // namespace gpu