blob: 9297519ee9aa28366d0cc5bef2c8dcb509332dab [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.
#include "gpu/command_buffer/service/shared_image/dawn_image_backing.h"
#include <vector>
#include "gpu/command_buffer/service/shared_context_state.h"
#include "gpu/command_buffer/service/shared_image/shared_image_representation.h"
namespace gpu {
class DawnImageRepresentationImpl : public DawnImageRepresentation {
public:
DawnImageRepresentationImpl(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker,
const wgpu::Device& device,
wgpu::Texture texture)
: DawnImageRepresentation(manager, backing, tracker),
device_(device),
texture_(std::move(texture)) {}
wgpu::Texture BeginAccess(wgpu::TextureUsage usage,
wgpu::TextureUsage internal_usage) final {
return texture_;
}
void EndAccess() final {}
private:
const wgpu::Device device_;
wgpu::Texture texture_;
};
DawnImageBacking::DawnImageBacking(const Mailbox& mailbox,
viz::SharedImageFormat format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
GrSurfaceOrigin surface_origin,
SkAlphaType alpha_type,
SharedImageUsageSet usage,
std::string debug_label)
: SharedImageBacking(mailbox,
format,
size,
color_space,
surface_origin,
alpha_type,
usage,
std::move(debug_label),
format.EstimatedSizeInBytes(size),
/*is_thread_safe=*/false) {}
DawnImageBacking::~DawnImageBacking() {
if (texture_) {
texture_.Destroy();
}
}
bool DawnImageBacking::SupportsAccess(SharedImageAccessStream stream,
const AccessParams& params) const {
// For Dawn access, the `wgpu_device` is essential. Unlike GL or Vulkan, Dawn
// operations are explicitly tied to a specific device, and there is no
// implicit "current" context. Therefore, we must have the device to ensure
// that this backing is compatible with the intended operation.
if (!params.wgpu_device) {
return false;
}
return device_.Get() == params.wgpu_device.Get();
}
SharedImageBackingType DawnImageBacking::GetType() const {
return SharedImageBackingType::kDawn;
}
gfx::Rect DawnImageBacking::ClearedRect() const {
return gfx::Rect(size());
}
void DawnImageBacking::SetClearedRect(const gfx::Rect& cleared_rect) {}
std::unique_ptr<DawnImageRepresentation> DawnImageBacking::ProduceDawn(
SharedImageManager* manager,
MemoryTypeTracker* tracker,
const wgpu::Device& device,
wgpu::BackendType backend_type,
std::vector<wgpu::TextureFormat> view_formats,
scoped_refptr<SharedContextState> context_state) {
if (!device_) {
wgpu::TextureDescriptor descriptor;
descriptor.usage =
static_cast<wgpu::TextureUsage>(wgpu::TextureUsage::RenderAttachment |
wgpu::TextureUsage::TextureBinding);
descriptor.dimension = wgpu::TextureDimension::e2D;
descriptor.size = {static_cast<uint32_t>(size().width()),
static_cast<uint32_t>(size().height()), 1};
descriptor.format = wgpu::TextureFormat::RGBA8Unorm;
descriptor.mipLevelCount = 1;
descriptor.sampleCount = 1;
texture_ = device.CreateTexture(&descriptor);
if (!texture_) {
return nullptr;
}
device_ = device;
} else if (device_.Get() != device.Get()) {
return nullptr;
}
return std::make_unique<DawnImageRepresentationImpl>(manager, this, tracker,
device, texture_);
}
void DawnImageBacking::Update(std::unique_ptr<gfx::GpuFence> in_fence) {}
void DawnImageBacking::InitializeForTesting(const wgpu::Device& device) {
wgpu::TextureDescriptor descriptor;
descriptor.usage =
static_cast<wgpu::TextureUsage>(wgpu::TextureUsage::RenderAttachment |
wgpu::TextureUsage::TextureBinding);
descriptor.dimension = wgpu::TextureDimension::e2D;
descriptor.size = {static_cast<uint32_t>(size().width()),
static_cast<uint32_t>(size().height()), 1};
descriptor.format = wgpu::TextureFormat::RGBA8Unorm;
descriptor.mipLevelCount = 1;
descriptor.sampleCount = 1;
texture_ = device.CreateTexture(&descriptor);
device_ = device;
}
} // namespace gpu