1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
// 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 "third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_buffer.h"
#include "gpu/command_buffer/client/webgpu_interface.h"
#include "third_party/blink/renderer/platform/graphics/gpu/webgpu_cpp.h"
namespace blink {
// static
scoped_refptr<WebGPUMailboxBuffer> WebGPUMailboxBuffer::FromExistingSharedImage(
scoped_refptr<DawnControlClientHolder> dawn_control_client,
const wgpu::Device& device,
const wgpu::BufferDescriptor& desc,
scoped_refptr<gpu::ClientSharedImage> shared_image,
const gpu::SyncToken& sync_token,
base::OnceCallback<void(const gpu::SyncToken&)> finished_access_callback) {
DCHECK(dawn_control_client->GetContextProviderWeakPtr());
return base::AdoptRef(new WebGPUMailboxBuffer(
std::move(dawn_control_client), device, desc, std::move(shared_image),
sync_token, std::move(finished_access_callback)));
}
WebGPUMailboxBuffer::WebGPUMailboxBuffer(
scoped_refptr<DawnControlClientHolder> dawn_control_client,
const wgpu::Device& device,
const wgpu::BufferDescriptor& desc,
scoped_refptr<gpu::ClientSharedImage> shared_image,
const gpu::SyncToken& sync_token,
base::OnceCallback<void(const gpu::SyncToken&)> finished_access_callback)
: dawn_control_client_(std::move(dawn_control_client)),
shared_image_(std::move(shared_image)),
finished_access_callback_(std::move(finished_access_callback)) {
DCHECK(dawn_control_client_->GetContextProviderWeakPtr());
#if BUILDFLAG(USE_DAWN)
gpu::webgpu::WebGPUInterface* webgpu =
dawn_control_client_->GetContextProviderWeakPtr()
->ContextProvider()
.WebGPUInterface();
uint64_t internal_usage = 0;
scoped_access_ = shared_image_->BeginWebGPUBufferAccess(
webgpu, sync_token, device, desc, internal_usage,
gpu::webgpu::WEBGPU_MAILBOX_NONE);
#else
NOTREACHED();
#endif
}
gpu::SyncToken WebGPUMailboxBuffer::Dissociate() {
gpu::SyncToken finished_access_token;
#if BUILDFLAG(USE_DAWN)
if (!dawn_control_client_->GetContextProviderWeakPtr()) {
shared_image_.reset();
return finished_access_token;
}
if (scoped_access_) {
finished_access_token =
gpu::WebGPUBufferScopedAccess::EndAccess(std::move(scoped_access_));
if (finished_access_callback_) {
std::move(finished_access_callback_).Run(finished_access_token);
}
}
shared_image_.reset();
return finished_access_token;
#else
NOTREACHED();
#endif
}
const wgpu::Buffer& WebGPUMailboxBuffer::GetBuffer() {
#if BUILDFLAG(USE_DAWN)
return scoped_access_->buffer();
#else
NOTREACHED();
#endif
}
WebGPUMailboxBuffer::~WebGPUMailboxBuffer() {
Dissociate();
}
} // namespace blink
|