[WHLSL] read modify write expressions do no work as expected
authormmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 21 Jun 2019 16:59:15 +0000 (16:59 +0000)
committermmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 21 Jun 2019 16:59:15 +0000 (16:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=195864

Reviewed by Saam Barati.

Source/WebCore:

Turns out https://bugs.webkit.org/show_bug.cgi?id=199037 already fixed everything.
This patch just adds a test.

Test: webgpu/whlsl-read-modify-write.html

* Modules/webgpu/WHLSL/WHLSLStandardLibrary.txt:

LayoutTests:

* webgpu/whlsl-read-modify-write.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@246681 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/webgpu/whlsl-read-modify-write.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/Modules/webgpu/WHLSL/WHLSLStandardLibrary.txt

index d9cd62f..a78b14b 100644 (file)
@@ -1,3 +1,12 @@
+2019-06-21  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [WHLSL] read modify write expressions do no work as expected
+        https://bugs.webkit.org/show_bug.cgi?id=195864
+
+        Reviewed by Saam Barati.
+
+        * webgpu/whlsl-read-modify-write.html: Added.
+
 2019-06-21  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         Unreviewed GTK gardening. Rebaseline css-dark-mode/default-colors.html.
diff --git a/LayoutTests/webgpu/whlsl-read-modify-write.html b/LayoutTests/webgpu/whlsl-read-modify-write.html
new file mode 100644 (file)
index 0000000..118eacc
--- /dev/null
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../resources/js-test-pre.js"></script>
+</head>
+<body>
+<script>
+const shaderSource = `
+[numthreads(1, 1, 1)]
+compute void computeShader(device int[] buffer : register(u0)) {
+    buffer[0] = 1;
+    buffer[1] = buffer[0]++;
+
+    buffer[2] = 1;
+    buffer[3] = ++buffer[2];
+
+    buffer[4] = 1;
+    buffer[4] += 5;
+
+    buffer[5] = 1;
+    buffer[5] *= 7;
+
+    int total = 14;
+    for (int i = 0; i < 10; i += 2) {
+        total += i;
+    }
+    buffer[6] = total;
+
+    total = 14;
+    for (int i = 0; i < 10; ++i) {
+        total += i;
+    }
+    buffer[7] = total;
+}
+`;
+let results;
+async function start() {
+    const adapter = await navigator.gpu.requestAdapter();
+    const device = await adapter.requestDevice();
+
+    const shaderModule = device.createShaderModule({code: shaderSource, isWHLSL: true});
+    const computeStage = {module: shaderModule, entryPoint: "computeShader"};
+
+    const bindGroupLayoutDescriptor = {bindings: [{binding: 0, visibility: 7, type: "storage-buffer"}]};
+    const bindGroupLayout = device.createBindGroupLayout(bindGroupLayoutDescriptor);
+    const pipelineLayoutDescriptor = {bindGroupLayouts: [bindGroupLayout]};
+    const pipelineLayout = device.createPipelineLayout(pipelineLayoutDescriptor);
+
+    const computePipelineDescriptor = {computeStage, layout: pipelineLayout};
+    const computePipeline = device.createComputePipeline(computePipelineDescriptor);
+
+    const size = Int32Array.BYTES_PER_ELEMENT * 8;
+
+    const bufferDescriptor = {size, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.MAP_READ};
+    const buffer = device.createBuffer(bufferDescriptor);
+
+    const bufferBinding = {buffer: buffer, size};
+    const bindGroupBinding = {binding: 0, resource: bufferBinding};
+    const bindGroupDescriptor = {layout: bindGroupLayout, bindings: [bindGroupBinding]};
+    const bindGroup = device.createBindGroup(bindGroupDescriptor);
+
+    const commandEncoder = device.createCommandEncoder(); // {}
+    const computePassEncoder = commandEncoder.beginComputePass();
+    computePassEncoder.setPipeline(computePipeline);
+    computePassEncoder.setBindGroup(0, bindGroup);
+    computePassEncoder.dispatch(1, 1, 1);
+    computePassEncoder.endPass();
+    const commandBuffer = commandEncoder.finish();
+    device.getQueue().submit([commandBuffer]);
+
+    const resultsArrayBuffer = await buffer.mapReadAsync();
+    results = new Int32Array(resultsArrayBuffer);
+    shouldBe("results[0]", "2");
+    shouldBe("results[1]", "1");
+    shouldBe("results[2]", "2");
+    shouldBe("results[3]", "2");
+    shouldBe("results[4]", "6");
+    shouldBe("results[5]", "7");
+    shouldBe("results[6]", "34");
+    shouldBe("results[7]", "59");
+    buffer.unmap();
+}
+window.jsTestIsAsync = true;
+window.addEventListener("load", function() {
+    start().then(function() {
+        finishJSTest();
+    }, function() {
+        finishJSTest();
+    });
+});
+</script>
+<script src="../resources/js-test-post.js"></script>
+</body>
+</html>
index 83a6a95..66f274e 100644 (file)
@@ -1,3 +1,17 @@
+2019-06-21  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [WHLSL] read modify write expressions do no work as expected
+        https://bugs.webkit.org/show_bug.cgi?id=195864
+
+        Reviewed by Saam Barati.
+
+        Turns out https://bugs.webkit.org/show_bug.cgi?id=199037 already fixed everything.
+        This patch just adds a test.
+
+        Test: webgpu/whlsl-read-modify-write.html
+
+        * Modules/webgpu/WHLSL/WHLSLStandardLibrary.txt:
+
 2019-06-21  Zalan Bujtas  <zalan@apple.com>
 
         [LFC][IFC] Adjust baseline top when the baseline moves.
index 1b77292..ed5dcf4 100644 (file)
@@ -310,17 +310,6 @@ native operator float(short);
 native operator float(int);
 native operator float(half);
 
-native float operator+(float, float);
-native float operator-(float, float);
-native int operator+(int, int);
-native uint operator+(uint, uint);
-native bool operator<(int, int);
-native bool operator<(uint, uint);
-native bool operator<(float, float);
-native bool operator==(float, float);
-native bool operator==(int, int);
-native float operator*(float, float);
-
 // FIXME: These should be auto generated by the compiler.
 // https://bugs.webkit.org/show_bug.cgi?id=198861
 native bool operator==(thread int*, thread int*);
@@ -755,6 +744,55 @@ operator uint2(uint x, uint y) {
     return result;
 }
 
+native int operator+(int, int);
+native int operator-(int, int);
+native int operator*(int, int);
+native int operator/(int, int);
+native bool operator==(int, int);
+native bool operator<(int, int);
+native bool operator<=(int, int);
+native bool operator>(int, int);
+native bool operator>=(int, int);
+native uint operator+(uint, uint);
+native uint operator-(uint, uint);
+native uint operator*(uint, uint);
+native uint operator/(uint, uint);
+native bool operator==(uint, uint);
+native bool operator<(uint, uint);
+native bool operator<=(uint, uint);
+native bool operator>(uint, uint);
+native bool operator>=(uint, uint);
+
+native float operator+(float, float);
+native float operator-(float, float);
+native float operator*(float, float);
+native float operator/(float, float);
+native bool operator==(float, float);
+native bool operator<(float, float);
+native bool operator<=(float, float);
+native bool operator>(float, float);
+native bool operator>=(float, float);
+
+native int operator&(int, int);
+native int operator|(int, int);
+native int operator^(int, int);
+native int operator~(int);
+native int operator<<(int, uint);
+native int operator>>(int, uint);
+native uint operator&(uint, uint);
+native uint operator|(uint, uint);
+native uint operator^(uint, uint);
+native uint operator~(uint);
+native uint operator<<(uint, uint);
+native uint operator>>(uint, uint);
+
+int operator++(int value) {
+    return value + 1;
+}
+int operator--(int value) {
+    return value - 1;
+}
+
 native ushort Sample(Texture1D<ushort>, sampler, float location);
 native ushort Sample(Texture1DArray<ushort>, sampler, float2 location);
 native ushort Sample(Texture2D<ushort>, sampler, float2 location);