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
|
// Copyright 2019 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/modules/webgpu/gpu_compute_pass_encoder.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_bind_group.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_buffer.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_device.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_query_set.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_supported_features.h"
namespace blink {
GPUComputePassEncoder::GPUComputePassEncoder(
GPUDevice* device,
wgpu::ComputePassEncoder compute_pass_encoder,
const String& label)
: DawnObject<wgpu::ComputePassEncoder>(device,
compute_pass_encoder,
label) {}
void GPUComputePassEncoder::setBindGroup(
uint32_t index,
GPUBindGroup* bindGroup,
const Vector<uint32_t>& dynamicOffsets) {
GetHandle().SetBindGroup(
index, bindGroup ? bindGroup->GetHandle() : wgpu::BindGroup(nullptr),
dynamicOffsets.size(), dynamicOffsets.data());
}
void GPUComputePassEncoder::setBindGroup(
uint32_t index,
GPUBindGroup* bind_group,
base::span<const uint32_t> dynamic_offsets_data,
uint64_t dynamic_offsets_data_start,
uint32_t dynamic_offsets_data_length,
ExceptionState& exception_state) {
if (!ValidateSetBindGroupDynamicOffsets(
dynamic_offsets_data, dynamic_offsets_data_start,
dynamic_offsets_data_length, exception_state)) {
return;
}
const base::span<const uint32_t> data_span = dynamic_offsets_data.subspan(
base::checked_cast<size_t>(dynamic_offsets_data_start),
dynamic_offsets_data_length);
GetHandle().SetBindGroup(
index, bind_group ? bind_group->GetHandle() : wgpu::BindGroup(nullptr),
data_span.size(), data_span.data());
}
void GPUComputePassEncoder::writeTimestamp(
const DawnObject<wgpu::QuerySet>* querySet,
uint32_t queryIndex,
ExceptionState& exception_state) {
V8GPUFeatureName::Enum requiredFeatureEnum =
V8GPUFeatureName::Enum::kChromiumExperimentalTimestampQueryInsidePasses;
if (!device_->features()->Has(requiredFeatureEnum)) {
exception_state.ThrowTypeError(String::Format(
"Use of the writeTimestamp() method on compute pass requires the '%s' "
"feature to be enabled on %s.",
V8GPUFeatureName(requiredFeatureEnum).AsCStr(),
device_->GetFormattedLabel().c_str()));
return;
}
GetHandle().WriteTimestamp(querySet->GetHandle(), queryIndex);
}
} // namespace blink
|