Commit 480f5952 authored by Brandon Jones's avatar Brandon Jones Committed by Chromium LUCI CQ

GPUQueue.writeBuffer takes offset/size in elements with TypedArrays

Previously dataOffset and size were always in bytes, which isn't
consistent with the WebGPU spec.

Corresponding CTS test here: https://github.com/gpuweb/cts/pull/431

Bug: 1163667
Change-Id: I5360cfbd66542c044dcf909b8673d3ed3f5e6724
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2615520Reviewed-by: default avatarCorentin Wallez <cwallez@chromium.org>
Commit-Queue: Brandon Jones <bajones@chromium.org>
Cr-Commit-Position: refs/heads/master@{#841617}
parent 6b1ff0d7
...@@ -178,22 +178,22 @@ GPUFence* GPUQueue::createFence(const GPUFenceDescriptor* descriptor) { ...@@ -178,22 +178,22 @@ GPUFence* GPUQueue::createFence(const GPUFenceDescriptor* descriptor) {
void GPUQueue::writeBuffer(GPUBuffer* buffer, void GPUQueue::writeBuffer(GPUBuffer* buffer,
uint64_t buffer_offset, uint64_t buffer_offset,
const MaybeShared<DOMArrayBufferView>& data, const MaybeShared<DOMArrayBufferView>& data,
uint64_t data_byte_offset, uint64_t data_element_offset,
ExceptionState& exception_state) { ExceptionState& exception_state) {
WriteBufferImpl(buffer, buffer_offset, data->byteLength(), WriteBufferImpl(buffer, buffer_offset, data->byteLength(),
data->BaseAddressMaybeShared(), data->TypeSize(), data->BaseAddressMaybeShared(), data->TypeSize(),
data_byte_offset, {}, exception_state); data_element_offset, {}, exception_state);
} }
void GPUQueue::writeBuffer(GPUBuffer* buffer, void GPUQueue::writeBuffer(GPUBuffer* buffer,
uint64_t buffer_offset, uint64_t buffer_offset,
const MaybeShared<DOMArrayBufferView>& data, const MaybeShared<DOMArrayBufferView>& data,
uint64_t data_byte_offset, uint64_t data_element_offset,
uint64_t byte_size, uint64_t data_element_count,
ExceptionState& exception_state) { ExceptionState& exception_state) {
WriteBufferImpl(buffer, buffer_offset, data->byteLength(), WriteBufferImpl(buffer, buffer_offset, data->byteLength(),
data->BaseAddressMaybeShared(), data->TypeSize(), data->BaseAddressMaybeShared(), data->TypeSize(),
data_byte_offset, byte_size, exception_state); data_element_offset, data_element_count, exception_state);
} }
void GPUQueue::writeBuffer(GPUBuffer* buffer, void GPUQueue::writeBuffer(GPUBuffer* buffer,
...@@ -222,41 +222,38 @@ void GPUQueue::WriteBufferImpl(GPUBuffer* buffer, ...@@ -222,41 +222,38 @@ void GPUQueue::WriteBufferImpl(GPUBuffer* buffer,
uint64_t data_byte_length, uint64_t data_byte_length,
const void* data_base_ptr, const void* data_base_ptr,
unsigned data_bytes_per_element, unsigned data_bytes_per_element,
uint64_t data_byte_offset, uint64_t data_element_offset,
base::Optional<uint64_t> byte_size, base::Optional<uint64_t> data_element_count,
ExceptionState& exception_state) { ExceptionState& exception_state) {
if (buffer_offset % 4 != 0) { if (buffer_offset % 4 != 0) {
exception_state.ThrowDOMException(DOMExceptionCode::kOperationError, exception_state.ThrowDOMException(DOMExceptionCode::kOperationError,
"bufferOffset must be a multiple of 4"); "Buffer offset must be a multiple of 4");
return; return;
} }
if (data_byte_offset % data_bytes_per_element != 0) { uint64_t data_byte_offset = data_element_offset * data_bytes_per_element;
exception_state.ThrowDOMException(
DOMExceptionCode::kOperationError,
"dataByteOffset must be a multiple of data.BYTES_PER_ELEMENT");
return;
}
if (data_byte_offset > data_byte_length) { if (data_byte_offset > data_byte_length) {
exception_state.ThrowDOMException(DOMExceptionCode::kOperationError, exception_state.ThrowDOMException(DOMExceptionCode::kOperationError,
"dataByteOffset is too large"); "Data offset is too large");
return; return;
} }
uint64_t max_write_size = data_byte_length - data_byte_offset; uint64_t max_write_size = data_byte_length - data_byte_offset;
uint64_t write_byte_size = max_write_size; uint64_t write_byte_size = max_write_size;
if (byte_size.has_value()) { if (data_element_count.has_value()) {
write_byte_size = byte_size.value(); write_byte_size = data_element_count.value() * data_bytes_per_element;
if (write_byte_size > max_write_size) { if (write_byte_size > max_write_size) {
exception_state.ThrowDOMException(DOMExceptionCode::kOperationError, exception_state.ThrowDOMException(
"byteSize is too large"); DOMExceptionCode::kOperationError,
"Number of bytes to write is too large");
return; return;
} }
} }
if (write_byte_size % std::max(4u, data_bytes_per_element) != 0) { if (write_byte_size % 4 != 0) {
exception_state.ThrowRangeError( exception_state.ThrowDOMException(
"byteSize must be a multiple of max(4, data.BYTES_PER_ELEMENT)"); DOMExceptionCode::kOperationError,
"Number of bytes to write must be a multiple of 4");
return; return;
} }
......
...@@ -37,13 +37,13 @@ class GPUQueue : public DawnObject<WGPUQueue> { ...@@ -37,13 +37,13 @@ class GPUQueue : public DawnObject<WGPUQueue> {
void writeBuffer(GPUBuffer* buffer, void writeBuffer(GPUBuffer* buffer,
uint64_t buffer_offset, uint64_t buffer_offset,
const MaybeShared<DOMArrayBufferView>& data, const MaybeShared<DOMArrayBufferView>& data,
uint64_t data_byte_offset, uint64_t data_element_offset,
ExceptionState& exception_state); ExceptionState& exception_state);
void writeBuffer(GPUBuffer* buffer, void writeBuffer(GPUBuffer* buffer,
uint64_t buffer_offset, uint64_t buffer_offset,
const MaybeShared<DOMArrayBufferView>& data, const MaybeShared<DOMArrayBufferView>& data,
uint64_t data_byte_offset, uint64_t data_element_offset,
uint64_t byte_size, uint64_t data_element_count,
ExceptionState& exception_state); ExceptionState& exception_state);
void writeBuffer(GPUBuffer* buffer, void writeBuffer(GPUBuffer* buffer,
uint64_t buffer_offset, uint64_t buffer_offset,
......
...@@ -19,8 +19,8 @@ ...@@ -19,8 +19,8 @@
GPUBuffer buffer, GPUBuffer buffer,
GPUSize64 bufferOffset, GPUSize64 bufferOffset,
[AllowShared] ArrayBufferView data, [AllowShared] ArrayBufferView data,
optional GPUSize64 dataByteOffset = 0, optional GPUSize64 dataElementOffset = 0,
optional GPUSize64 byteSize); optional GPUSize64 dataElementCount);
[RaisesException] void writeBuffer( [RaisesException] void writeBuffer(
GPUBuffer buffer, GPUBuffer buffer,
GPUSize64 bufferOffset, GPUSize64 bufferOffset,
......
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