blob: f1cd037f6d0074b6b77d21ef4d1902f6e1b0b39f (
plain)
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
|
// Copyright 2019 The Chromium Authors. All rights reserved.
// 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/modules/webgpu/gpu_queue.h"
#include "gpu/command_buffer/client/webgpu_interface.h"
#include "third_party/blink/renderer/modules/webgpu/dawn_conversions.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_command_buffer.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_device.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_fence.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_fence_descriptor.h"
namespace blink {
// static
GPUQueue* GPUQueue::Create(GPUDevice* device, DawnQueue queue) {
return MakeGarbageCollected<GPUQueue>(device, queue);
}
GPUQueue::GPUQueue(GPUDevice* device, DawnQueue queue)
: DawnObject<DawnQueue>(device, queue) {}
GPUQueue::~GPUQueue() {
if (IsDawnControlClientDestroyed()) {
return;
}
GetProcs().queueRelease(GetHandle());
}
void GPUQueue::submit(const HeapVector<Member<GPUCommandBuffer>>& buffers) {
std::unique_ptr<DawnCommandBuffer[]> commandBuffers = AsDawnType(buffers);
GetProcs().queueSubmit(GetHandle(), buffers.size(), commandBuffers.get());
// WebGPU guarantees that submitted commands finish in finite time so we
// flush commands to the GPU process now.
device_->GetInterface()->FlushCommands();
}
void GPUQueue::signal(GPUFence* fence, uint64_t signal_value) {
GetProcs().queueSignal(GetHandle(), fence->GetHandle(), signal_value);
// Signaling a fence adds a callback to update the fence value to the
// completed value. WebGPU guarantees that the fence completion is
// observable in finite time so we flush commands to the GPU process now.
device_->GetInterface()->FlushCommands();
}
GPUFence* GPUQueue::createFence(const GPUFenceDescriptor* descriptor) {
DCHECK(descriptor);
DawnFenceDescriptor desc = {};
desc.nextInChain = nullptr;
desc.initialValue = descriptor->initialValue();
return GPUFence::Create(device_,
GetProcs().queueCreateFence(GetHandle(), &desc));
}
} // namespace blink
|