Commit b802a0b4 authored by Austin Eng's avatar Austin Eng Committed by Commit Bot

[WebGPU] Add Uint32Array overload for setBindGroup

Bug: 852089
Change-Id: I427156e90e012a8d1e45f8d9ed24d8daabbdc4ea
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1894495Reviewed-by: default avatarKai Ninomiya <kainino@chromium.org>
Reviewed-by: default avatarKenneth Russell <kbr@chromium.org>
Reviewed-by: default avatarAustin Eng <enga@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
Cr-Commit-Position: refs/heads/master@{#721851}
parent d90bc8c1
......@@ -7,6 +7,7 @@
#include "base/macros.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/typed_arrays/array_buffer/typed_array.h"
#include "third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h"
namespace blink {
......
......@@ -43,6 +43,8 @@ blink_modules_sources("webgpu") {
"gpu_out_of_memory_error.h",
"gpu_pipeline_layout.cc",
"gpu_pipeline_layout.h",
"gpu_programmable_pass_encoder.cc",
"gpu_programmable_pass_encoder.h",
"gpu_queue.cc",
"gpu_queue.h",
"gpu_render_bundle.cc",
......
......@@ -40,6 +40,27 @@ void GPUComputePassEncoder::setBindGroup(
dynamicOffsets.data());
}
void GPUComputePassEncoder::setBindGroup(
uint32_t index,
GPUBindGroup* bind_group,
const FlexibleUint32ArrayView& 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 uint32_t* data =
dynamic_offsets_data.DataMaybeOnStack() + dynamic_offsets_data_start;
GetProcs().computePassEncoderSetBindGroup(GetHandle(), index,
bind_group->GetHandle(),
dynamic_offsets_data_length, data);
}
void GPUComputePassEncoder::pushDebugGroup(String groupLabel) {
GetProcs().computePassEncoderPushDebugGroup(GetHandle(),
groupLabel.Utf8().data());
......
......@@ -6,6 +6,8 @@
#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_COMPUTE_PASS_ENCODER_H_
#include "third_party/blink/renderer/modules/webgpu/dawn_object.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_programmable_pass_encoder.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
namespace blink {
......@@ -13,7 +15,8 @@ class GPUBindGroup;
class GPUBuffer;
class GPUComputePipeline;
class GPUComputePassEncoder : public DawnObject<WGPUComputePassEncoder> {
class GPUComputePassEncoder : public DawnObject<WGPUComputePassEncoder>,
public GPUProgrammablePassEncoder {
DEFINE_WRAPPERTYPEINFO();
public:
......@@ -28,6 +31,12 @@ class GPUComputePassEncoder : public DawnObject<WGPUComputePassEncoder> {
void setBindGroup(uint32_t index,
GPUBindGroup* bindGroup,
const Vector<uint32_t>& dynamicOffsets);
void setBindGroup(uint32_t index,
GPUBindGroup* bind_group,
const FlexibleUint32ArrayView& dynamic_offsets_data,
uint64_t dynamic_offsets_data_start,
uint32_t dynamic_offsets_data_length,
ExceptionState& exception_state);
void pushDebugGroup(String groupLabel);
void popDebugGroup();
void insertDebugMarker(String markerLabel);
......
// 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_programmable_pass_encoder.h"
namespace blink {
bool GPUProgrammablePassEncoder::ValidateSetBindGroupDynamicOffsets(
const FlexibleUint32ArrayView& dynamic_offsets_data,
uint64_t dynamic_offsets_data_start,
uint32_t dynamic_offsets_data_length,
ExceptionState& exception_state) {
const uint64_t src_length =
static_cast<uint64_t>(dynamic_offsets_data.length());
if (dynamic_offsets_data_start > src_length) {
exception_state.ThrowRangeError("dynamicOffsetsDataStart too large");
return false;
}
if (static_cast<uint64_t>(dynamic_offsets_data_length) >
src_length - dynamic_offsets_data_start) {
exception_state.ThrowRangeError("dynamicOffsetsDataLength too large");
return false;
}
return true;
}
} // namespace blink
// 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_PROGRAMMABLE_PASS_ENCODER_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_PROGRAMMABLE_PASS_ENCODER_H_
#include "third_party/blink/renderer/core/typed_arrays/typed_flexible_array_buffer_view.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
namespace blink {
class GPUProgrammablePassEncoder {
protected:
bool ValidateSetBindGroupDynamicOffsets(
const FlexibleUint32ArrayView& dynamic_offsets_data,
uint64_t dynamic_offsets_data_start,
uint32_t dynamic_offsets_data_length,
ExceptionState& exception_state);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_PROGRAMMABLE_PASS_ENCODER_H_
......@@ -10,6 +10,12 @@
void setBindGroup(unsigned long index, GPUBindGroup bindGroup,
optional sequence<unsigned long> dynamicOffsets = []);
[RaisesException] void setBindGroup(
unsigned long index, GPUBindGroup bindGroup,
[ AllowShared, FlexibleArrayBufferView ] Uint32Array dynamicOffsetsData,
unsigned long long dynamicOffsetsDataStart,
unsigned long dynamicOffsetsDataLength);
void pushDebugGroup(DOMString groupLabel);
void popDebugGroup();
void insertDebugMarker(DOMString markerLabel);
......
......@@ -67,6 +67,27 @@ void GPURenderBundleEncoder::setBindGroup(
dynamicOffsets.data());
}
void GPURenderBundleEncoder::setBindGroup(
uint32_t index,
GPUBindGroup* bind_group,
const FlexibleUint32ArrayView& 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 uint32_t* data =
dynamic_offsets_data.DataMaybeOnStack() + dynamic_offsets_data_start;
GetProcs().renderBundleEncoderSetBindGroup(GetHandle(), index,
bind_group->GetHandle(),
dynamic_offsets_data_length, data);
}
void GPURenderBundleEncoder::pushDebugGroup(String groupLabel) {
GetProcs().renderBundleEncoderPushDebugGroup(GetHandle(),
groupLabel.Utf8().data());
......
......@@ -6,6 +6,7 @@
#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_RENDER_BUNDLE_ENCODER_H_
#include "third_party/blink/renderer/modules/webgpu/dawn_object.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_programmable_pass_encoder.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
namespace blink {
......@@ -17,7 +18,8 @@ class GPURenderBundleDescriptor;
class GPURenderBundleEncoderDescriptor;
class GPURenderPipeline;
class GPURenderBundleEncoder : public DawnObject<WGPURenderBundleEncoder> {
class GPURenderBundleEncoder : public DawnObject<WGPURenderBundleEncoder>,
public GPUProgrammablePassEncoder {
DEFINE_WRAPPERTYPEINFO();
public:
......@@ -33,6 +35,12 @@ class GPURenderBundleEncoder : public DawnObject<WGPURenderBundleEncoder> {
void setBindGroup(uint32_t index,
GPUBindGroup* bindGroup,
const Vector<uint32_t>& dynamicOffsets);
void setBindGroup(uint32_t index,
GPUBindGroup* bind_group,
const FlexibleUint32ArrayView& dynamic_offsets_data,
uint64_t dynamic_offsets_data_start,
uint32_t dynamic_offsets_data_length,
ExceptionState& exception_state);
void pushDebugGroup(String groupLabel);
void popDebugGroup();
void insertDebugMarker(String markerLabel);
......
......@@ -5,6 +5,7 @@
#include "third_party/blink/renderer/modules/webgpu/gpu_render_pass_encoder.h"
#include "third_party/blink/renderer/bindings/modules/v8/double_sequence_or_gpu_color_dict.h"
#include "third_party/blink/renderer/core/typed_arrays/typed_flexible_array_buffer_view.h"
#include "third_party/blink/renderer/modules/webgpu/dawn_conversions.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_bind_group.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_buffer.h"
......@@ -43,6 +44,27 @@ void GPURenderPassEncoder::setBindGroup(
dynamicOffsets.data());
}
void GPURenderPassEncoder::setBindGroup(
uint32_t index,
GPUBindGroup* bind_group,
const FlexibleUint32ArrayView& 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 uint32_t* data =
dynamic_offsets_data.DataMaybeOnStack() + dynamic_offsets_data_start;
GetProcs().renderPassEncoderSetBindGroup(GetHandle(), index,
bind_group->GetHandle(),
dynamic_offsets_data_length, data);
}
void GPURenderPassEncoder::pushDebugGroup(String groupLabel) {
GetProcs().renderPassEncoderPushDebugGroup(GetHandle(),
groupLabel.Utf8().data());
......
......@@ -6,6 +6,7 @@
#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_RENDER_PASS_ENCODER_H_
#include "third_party/blink/renderer/modules/webgpu/dawn_object.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_programmable_pass_encoder.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
namespace blink {
......@@ -16,7 +17,8 @@ class DoubleSequenceOrGPUColorDict;
class GPURenderBundle;
class GPURenderPipeline;
class GPURenderPassEncoder : public DawnObject<WGPURenderPassEncoder> {
class GPURenderPassEncoder : public DawnObject<WGPURenderPassEncoder>,
public GPUProgrammablePassEncoder {
DEFINE_WRAPPERTYPEINFO();
public:
......@@ -31,6 +33,12 @@ class GPURenderPassEncoder : public DawnObject<WGPURenderPassEncoder> {
void setBindGroup(uint32_t index,
GPUBindGroup* bindGroup,
const Vector<uint32_t>& dynamicOffsets);
void setBindGroup(uint32_t index,
GPUBindGroup* bind_group,
const FlexibleUint32ArrayView& dynamic_offsets_data,
uint64_t dynamic_offsets_data_start,
uint32_t dynamic_offsets_data_length,
ExceptionState& exception_state);
void pushDebugGroup(String groupLabel);
void popDebugGroup();
void insertDebugMarker(String markerLabel);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment