Title: [240180] trunk
Revision
240180
Author
justin_...@apple.com
Date
2019-01-18 15:09:38 -0800 (Fri, 18 Jan 2019)

Log Message

(WIP) [WebGPU] WebGPUProgrammablePassEncoder::setBindGroup prototype
https://bugs.webkit.org/show_bug.cgi?id=193457
<rdar://problem/47296678>

Reviewed by Dean Jackson.

Source/WebCore:

Enable WebGPU developers to assign buffer bind groups and access them via render pipeline.

Test: webgpu/buffer-resource-triangles.html

* Modules/webgpu/WebGPUBindGroup.h:
(WebCore::WebGPUBindGroup::bindGroup const): Added getter.
* Modules/webgpu/WebGPUProgrammablePassEncoder.cpp:
(WebCore::WebGPUProgrammablePassEncoder::setBindGroup const): Added. Delegates call to GPUProgrammablePassEncoder.
* Modules/webgpu/WebGPUProgrammablePassEncoder.h: Enable setBindGroup.
* Modules/webgpu/WebGPUProgrammablePassEncoder.idl: ditto.
* WebCore.xcodeproj/project.pbxproj:
* platform/graphics/gpu/GPUBindGroup.h:
(WebCore::GPUBindGroup::layout const): Added getter.
(WebCore::GPUBindGroup::bindings const): ditto.
* platform/graphics/gpu/GPUBindGroupLayout.h: Added ArgumentEncoderBuffer struct to retain ptr to both MTLArgumentEncoders and their argument MTLBuffers.
(WebCore::GPUBindGroupLayout::ArgumentEncoderBuffer::operator! const):
(WebCore::GPUBindGroupLayout::vertexArguments const): Added. Getter.
(WebCore::GPUBindGroupLayout::fragmentArguments const): ditto.
(WebCore::GPUBindGroupLayout::computeArguments const): ditto.
* platform/graphics/gpu/GPUDevice.cpp: Refactored unnecessary header include.
* platform/graphics/gpu/GPUDevice.h: ditto.
* platform/graphics/gpu/GPUProgrammablePassEncoder.h:
(WebCore::GPUProgrammablePassEncoder::setVertexBuffer): Added. Delegates to MTLCommandEncoder call.
(WebCore::GPUProgrammablePassEncoder::setFragmentBuffer): ditto.
* platform/graphics/gpu/GPURenderPassEncoder.h:
* platform/graphics/gpu/cocoa/GPUBindGroupLayoutMetal.mm:
(WebCore::tryCreateArgumentEncoderAndBuffer): Replace newEncoder(). Now create an ArgumentEncoderBuffer object from an array of MTLArgumentDescriptors, if able.
(WebCore::GPUBindGroupLayout::tryCreate): Refactor to support ArgumentEncoderBuffers, and allocate MTLBuffers for argument encoders.
(WebCore::GPUBindGroupLayout::GPUBindGroupLayout): Support ArgumentEncoderBuffers.
(WebCore::newEncoder): Deleted.
* platform/graphics/gpu/cocoa/GPUCommandBufferMetal.mm:
(WebCore::GPUCommandBuffer::GPUCommandBuffer):
* platform/graphics/gpu/cocoa/GPUProgrammablePassEncoderMetal.mm:
(WebCore::GPUProgrammablePassEncoder::setResourceAsBufferOnEncoder): Set a buffer resource on the MTLArgumentEncoder, and call useResource on the command encoder.
(WebCore::GPUProgrammablePassEncoder::setBindGroup): Parses the bind group to assign each resource on its matching MTLArgumentEncoder.
* platform/graphics/gpu/cocoa/GPURenderPassEncoderMetal.mm:
(WebCore::GPURenderPassEncoder::useResource): Resolves call from GPUProgrammablePassEncoder to call on MTLRenderCommandEncoder.
(WebCore::GPURenderPassEncoder::setVertexBuffer): ditto.
(WebCore::GPURenderPassEncoder::setFragmentBuffer): ditto.

LayoutTests:

Draw 3 triangles via WebGPU to create a green square canvas, with reference.
Each vertex is stored in its own WebGPUBuffer and they are mix/matched per bind group.
This tests multiple resource bindings in one bind group as well as setting multiple
bind groups per draw call and per command encoder.

* webgpu/buffer-resource-triangles-expected.html: Added. Reference generated using 2D canvas.
* webgpu/buffer-resource-triangles.html: Added.
        1) Draw top two triangles using two bind groups in one draw call.
        2) Swap first bind group and issue second draw call to draw middle triangle.
* webgpu/js/webgpu-functions.js:
(createBasicPipeline): Now handles new primitive topologies.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (240179 => 240180)


--- trunk/LayoutTests/ChangeLog	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/LayoutTests/ChangeLog	2019-01-18 23:09:38 UTC (rev 240180)
@@ -1,3 +1,23 @@
+2019-01-18  Justin Fan  <justin_...@apple.com>
+
+        (WIP) [WebGPU] WebGPUProgrammablePassEncoder::setBindGroup prototype
+        https://bugs.webkit.org/show_bug.cgi?id=193457
+        <rdar://problem/47296678>
+
+        Reviewed by Dean Jackson.
+
+        Draw 3 triangles via WebGPU to create a green square canvas, with reference.
+        Each vertex is stored in its own WebGPUBuffer and they are mix/matched per bind group.
+        This tests multiple resource bindings in one bind group as well as setting multiple 
+        bind groups per draw call and per command encoder. 
+
+        * webgpu/buffer-resource-triangles-expected.html: Added. Reference generated using 2D canvas.
+        * webgpu/buffer-resource-triangles.html: Added. 
+                1) Draw top two triangles using two bind groups in one draw call.
+                2) Swap first bind group and issue second draw call to draw middle triangle.
+        * webgpu/js/webgpu-functions.js:
+        (createBasicPipeline): Now handles new primitive topologies.
+
 2019-01-18  Antti Koivisto  <an...@apple.com>
 
         Implement asynchronous frame scrolling for iOS

Added: trunk/LayoutTests/webgpu/buffer-resource-triangles-expected.html (0 => 240180)


--- trunk/LayoutTests/webgpu/buffer-resource-triangles-expected.html	                        (rev 0)
+++ trunk/LayoutTests/webgpu/buffer-resource-triangles-expected.html	2019-01-18 23:09:38 UTC (rev 240180)
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>HTML Reference File</title>
+<p>Pass if square canvas below is completely green.</p>
+<canvas width="400" height="400"></canvas>
+<script>
+const canvas = document.querySelector("canvas");
+const context = canvas.getContext('2d');
+
+context.fillStyle = 'rgb(0, 255, 0)';
+context.fillRect(0, 0, canvas.width, canvas.height);
+</script>
\ No newline at end of file

Added: trunk/LayoutTests/webgpu/buffer-resource-triangles.html (0 => 240180)


--- trunk/LayoutTests/webgpu/buffer-resource-triangles.html	                        (rev 0)
+++ trunk/LayoutTests/webgpu/buffer-resource-triangles.html	2019-01-18 23:09:38 UTC (rev 240180)
@@ -0,0 +1,176 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>WebGPU Hello Triangles</title>
+<meta name="assert" content="WebGPU correctly renders a green canvas.">
+<link rel="match" href=""
+<p>Pass if square canvas below is completely green.</p>
+<canvas width="400" height="400"></canvas>
+<script src=""
+<script>
+const shaderCode = `
+#include <metal_stdlib>
+    
+using namespace metal;
+
+struct Vertex {
+    float4 position [[position]];
+};
+
+struct VertexArguments {
+    device Vertex* v0;
+    device Vertex* v1;
+    device Vertex* v2;
+};
+
+vertex Vertex vertex_main(
+    const device VertexArguments& args0 [[buffer(0)]],
+    const device VertexArguments& args1 [[buffer(1)]],
+    uint vid [[vertex_id]])
+{
+    switch (vid)
+    {
+        case 0: return args0.v0[0];
+        case 1: return args0.v1[0];
+        case 2: return args0.v2[0];
+        case 3: return args1.v0[0];
+        case 4: return args1.v1[0];
+        default: return args1.v2[0];
+    }
+}
+
+struct FragmentArguments {
+    device float4* color;
+};
+
+fragment float4 fragment_main(const device FragmentArguments& args [[buffer(0)]])
+{
+    return args.color[0];
+}
+`
+
+const bindingNums = {
+    UL: 0,
+    UM: 1,
+    UR: 2,
+    LL: 3,
+    LR: 4,
+    G: 5
+};
+
+function createUniformBufferBindGroupLayout(bindNum, stage = WebGPUShaderStageBit.VERTEX) {
+    return {
+        binding: bindNum,
+        visibility: stage,
+        type: "uniformBuffer"
+    };
+}
+
+const bufferSize = 4 * 4;
+
+// FIXME: Keep up to date with buffer upload decisions.
+function createFloat4Buffer(device, a, b) {
+    const buffer = device.createBuffer({ size: bufferSize, usage: WebGPUBufferUsage.UNIFORM });
+    
+    const arrayBuffer = buffer.mapping;
+    const floatArray = new Float32Array(arrayBuffer);
+
+    floatArray[0] = a;
+    floatArray[1] = b;
+    floatArray[2] = 0;
+    floatArray[3] = 1;
+
+    return buffer;
+}
+
+function createBufferBinding(buffer) {
+    return {
+        buffer: buffer,
+        offset: 0,
+        size: bufferSize
+    };
+}
+
+async function test() {
+    const device = await getBasicDevice();
+    const canvas = document.querySelector("canvas");
+    const context = createBasicContext(canvas, device);
+    // FIXME: Replace with non-MSL shaders.
+    const shaderModule = device.createShaderModule({ code: shaderCode });
+
+    // Create vertex data WebGPUBuffers.
+    const upperLeft = createFloat4Buffer(device, -1, 1);
+    const upperMiddle = createFloat4Buffer(device, 0, 1);
+    const upperRight = createFloat4Buffer(device, 1, 1);
+    const lowerLeft = createFloat4Buffer(device, -1, -1);
+    const lowerRight = createFloat4Buffer(device, 1, -1);
+
+    // Color data buffer.
+    const green = createFloat4Buffer(device, 0, 1);
+
+    // Create buffer WebGPUBindGroupLayoutBindings.
+    const layoutUL = createUniformBufferBindGroupLayout(bindingNums.UL);
+    const layoutUM = createUniformBufferBindGroupLayout(bindingNums.UM);
+    const layoutUR = createUniformBufferBindGroupLayout(bindingNums.UR);
+    const layoutLL = createUniformBufferBindGroupLayout(bindingNums.LL);
+    const layoutLR = createUniformBufferBindGroupLayout(bindingNums.LR);
+    const layoutG = createUniformBufferBindGroupLayout(bindingNums.G, WebGPUShaderStageBit.FRAGMENT);
+
+    // WebGPUBindGroupLayouts
+    const leftTriangleBGLayout = device.createBindGroupLayout({ bindings: [layoutUL, layoutUM, layoutLL, layoutG] });
+    const rightTriangleBGLayout = device.createBindGroupLayout({ bindings: [layoutUR, layoutUM, layoutLR] });
+    const middleTriangleBGLayout = device.createBindGroupLayout({ bindings: [layoutUM, layoutLL, layoutLR, layoutG] });
+
+    // WebGPUPipelineLayout and WebGPURenderPipeline
+    const pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [leftTriangleBGLayout, middleTriangleBGLayout, rightTriangleBGLayout] });
+    const pipeline = createBasicPipeline(shaderModule, device, pipelineLayout, null, "triangleList");
+
+    // WebGPUBufferBindings
+    const bindingUL = createBufferBinding(upperLeft);
+    const bindingUM = createBufferBinding(upperMiddle);
+    const bindingUR = createBufferBinding(upperRight);
+    const bindingLL = createBufferBinding(lowerLeft);
+    const bindingLR = createBufferBinding(lowerRight);
+    const bindingG = createBufferBinding(green);
+    
+    // WebGPUBindGroupBindings
+    const bgBindingUL = { binding: bindingNums.UL, resource: bindingUL };
+    const bgBindingUM = { binding: bindingNums.UM, resource: bindingUM };
+    const bgBindingUR = { binding: bindingNums.UR, resource: bindingUR };
+    const bgBindingLL = { binding: bindingNums.LL, resource: bindingLL };
+    const bgBindingLR = { binding: bindingNums.LR, resource: bindingLR };
+    const bgBindingG = { binding: bindingNums.G, resource: bindingG };
+
+    // WebGPUBindGroups
+    const leftTriangleBG = device.createBindGroup({ 
+        layout: leftTriangleBGLayout, 
+        bindings: [bgBindingUL, bgBindingUM, bgBindingLL, bgBindingG] 
+    });
+    const rightTriangleBG = device.createBindGroup({
+        layout: rightTriangleBGLayout,
+        bindings: [bgBindingUR, bgBindingUM, bgBindingLR]
+    });
+    const middleTriangleBG = device.createBindGroup({
+        layout: middleTriangleBGLayout,
+        bindings: [bgBindingUM, bgBindingLL, bgBindingLR, bgBindingG]
+    });
+
+    const commandBuffer = device.createCommandBuffer();
+    const passEncoder = beginBasicRenderPass(context, commandBuffer);
+    passEncoder.setPipeline(pipeline);
+
+    // Draw upper triangles.
+    passEncoder.setBindGroup(0, leftTriangleBG);
+    passEncoder.setBindGroup(1, rightTriangleBG);
+    passEncoder.draw(6, 1, 0, 0);
+    // Draw lower triangle.
+    passEncoder.setBindGroup(0, middleTriangleBG);
+    passEncoder.draw(3, 1, 0, 0);
+
+    const endCommandBuffer = passEncoder.endPass();
+    const queue = device.getQueue();
+    queue.submit([endCommandBuffer]);
+    context.present();
+}
+
+test();
+</script>
\ No newline at end of file

Modified: trunk/LayoutTests/webgpu/js/webgpu-functions.js (240179 => 240180)


--- trunk/LayoutTests/webgpu/js/webgpu-functions.js	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/LayoutTests/webgpu/js/webgpu-functions.js	2019-01-18 23:09:38 UTC (rev 240180)
@@ -12,7 +12,7 @@
     return context;
 }
 
-function createBasicPipeline(shaderModule, device, pipelineLayout, inputStateDescriptor) {
+function createBasicPipeline(shaderModule, device, pipelineLayout, inputStateDescriptor, primitiveTopology = "triangleStrip") {
     const vertexStageDescriptor = {
         module: shaderModule,
         entryPoint: "vertex_main" 
@@ -26,13 +26,15 @@
     const pipelineDescriptor = {
         vertexStage: vertexStageDescriptor,
         fragmentStage: fragmentStageDescriptor,
-        primitiveTopology: "triangleStrip",
-        inputState: inputStateDescriptor
+        primitiveTopology: primitiveTopology
     };
 
     if (pipelineLayout)
         pipelineDescriptor.layout = pipelineLayout;
 
+    if (inputStateDescriptor)
+        pipelineDescriptor.inputState = inputStateDescriptor;
+
     return device.createRenderPipeline(pipelineDescriptor);
 }
 

Modified: trunk/Source/WebCore/ChangeLog (240179 => 240180)


--- trunk/Source/WebCore/ChangeLog	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/ChangeLog	2019-01-18 23:09:38 UTC (rev 240180)
@@ -1,3 +1,51 @@
+2019-01-18  Justin Fan  <justin_...@apple.com>
+
+        (WIP) [WebGPU] WebGPUProgrammablePassEncoder::setBindGroup prototype
+        https://bugs.webkit.org/show_bug.cgi?id=193457
+        <rdar://problem/47296678>
+
+        Reviewed by Dean Jackson.
+
+        Enable WebGPU developers to assign buffer bind groups and access them via render pipeline. 
+
+        Test: webgpu/buffer-resource-triangles.html
+
+        * Modules/webgpu/WebGPUBindGroup.h:
+        (WebCore::WebGPUBindGroup::bindGroup const): Added getter.
+        * Modules/webgpu/WebGPUProgrammablePassEncoder.cpp: 
+        (WebCore::WebGPUProgrammablePassEncoder::setBindGroup const): Added. Delegates call to GPUProgrammablePassEncoder.
+        * Modules/webgpu/WebGPUProgrammablePassEncoder.h: Enable setBindGroup.
+        * Modules/webgpu/WebGPUProgrammablePassEncoder.idl: ditto.
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/graphics/gpu/GPUBindGroup.h: 
+        (WebCore::GPUBindGroup::layout const): Added getter.
+        (WebCore::GPUBindGroup::bindings const): ditto.
+        * platform/graphics/gpu/GPUBindGroupLayout.h: Added ArgumentEncoderBuffer struct to retain ptr to both MTLArgumentEncoders and their argument MTLBuffers.
+        (WebCore::GPUBindGroupLayout::ArgumentEncoderBuffer::operator! const):
+        (WebCore::GPUBindGroupLayout::vertexArguments const): Added. Getter.
+        (WebCore::GPUBindGroupLayout::fragmentArguments const): ditto.
+        (WebCore::GPUBindGroupLayout::computeArguments const): ditto.
+        * platform/graphics/gpu/GPUDevice.cpp: Refactored unnecessary header include.
+        * platform/graphics/gpu/GPUDevice.h: ditto.
+        * platform/graphics/gpu/GPUProgrammablePassEncoder.h:
+        (WebCore::GPUProgrammablePassEncoder::setVertexBuffer): Added. Delegates to MTLCommandEncoder call.
+        (WebCore::GPUProgrammablePassEncoder::setFragmentBuffer): ditto.
+        * platform/graphics/gpu/GPURenderPassEncoder.h: 
+        * platform/graphics/gpu/cocoa/GPUBindGroupLayoutMetal.mm:
+        (WebCore::tryCreateArgumentEncoderAndBuffer): Replace newEncoder(). Now create an ArgumentEncoderBuffer object from an array of MTLArgumentDescriptors, if able.
+        (WebCore::GPUBindGroupLayout::tryCreate): Refactor to support ArgumentEncoderBuffers, and allocate MTLBuffers for argument encoders.
+        (WebCore::GPUBindGroupLayout::GPUBindGroupLayout): Support ArgumentEncoderBuffers.
+        (WebCore::newEncoder): Deleted.
+        * platform/graphics/gpu/cocoa/GPUCommandBufferMetal.mm:
+        (WebCore::GPUCommandBuffer::GPUCommandBuffer):
+        * platform/graphics/gpu/cocoa/GPUProgrammablePassEncoderMetal.mm:
+        (WebCore::GPUProgrammablePassEncoder::setResourceAsBufferOnEncoder): Set a buffer resource on the MTLArgumentEncoder, and call useResource on the command encoder.
+        (WebCore::GPUProgrammablePassEncoder::setBindGroup): Parses the bind group to assign each resource on its matching MTLArgumentEncoder.
+        * platform/graphics/gpu/cocoa/GPURenderPassEncoderMetal.mm: 
+        (WebCore::GPURenderPassEncoder::useResource): Resolves call from GPUProgrammablePassEncoder to call on MTLRenderCommandEncoder.
+        (WebCore::GPURenderPassEncoder::setVertexBuffer): ditto.
+        (WebCore::GPURenderPassEncoder::setFragmentBuffer): ditto.
+
 2019-01-18  Daniel Bates  <daba...@apple.com>
 
         Another attempt to fix the iOS build following <https://trac.webkit.org/changeset/240174>

Modified: trunk/Source/WebCore/Modules/webgpu/WebGPUBindGroup.h (240179 => 240180)


--- trunk/Source/WebCore/Modules/webgpu/WebGPUBindGroup.h	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/Modules/webgpu/WebGPUBindGroup.h	2019-01-18 23:09:38 UTC (rev 240180)
@@ -37,6 +37,8 @@
 public:
     static Ref<WebGPUBindGroup> create(RefPtr<GPUBindGroup>&&);
 
+    const GPUBindGroup* bindGroup() const { return m_bindGroup.get(); }
+
 private:
     explicit WebGPUBindGroup(RefPtr<GPUBindGroup>&&);
 

Modified: trunk/Source/WebCore/Modules/webgpu/WebGPUProgrammablePassEncoder.cpp (240179 => 240180)


--- trunk/Source/WebCore/Modules/webgpu/WebGPUProgrammablePassEncoder.cpp	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/Modules/webgpu/WebGPUProgrammablePassEncoder.cpp	2019-01-18 23:09:38 UTC (rev 240180)
@@ -29,6 +29,7 @@
 #if ENABLE(WEBGPU)
 
 #include "GPUProgrammablePassEncoder.h"
+#include "WebGPUBindGroup.h"
 #include "WebGPURenderPipeline.h"
 
 namespace WebCore {
@@ -44,6 +45,16 @@
     return m_commandBuffer.copyRef();
 }
 
+void WebGPUProgrammablePassEncoder::setBindGroup(unsigned long index, const WebGPUBindGroup& bindGroup) const
+{
+    if (!bindGroup.bindGroup()) {
+        LOG(WebGPU, "WebGPUProgrammablePassEncoder::setBindGroup(): Invalid WebGPUBindGroup!");
+        return;
+    }
+    // FIXME: Any validation (e.g. index duplicates, not in pipeline layout).
+    passEncoder().setBindGroup(index, *bindGroup.bindGroup());
+}
+
 void WebGPUProgrammablePassEncoder::setPipeline(Ref<WebGPURenderPipeline>&& pipeline)
 {
     passEncoder().setPipeline(pipeline->renderPipeline());

Modified: trunk/Source/WebCore/Modules/webgpu/WebGPUProgrammablePassEncoder.h (240179 => 240180)


--- trunk/Source/WebCore/Modules/webgpu/WebGPUProgrammablePassEncoder.h	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/Modules/webgpu/WebGPUProgrammablePassEncoder.h	2019-01-18 23:09:38 UTC (rev 240180)
@@ -28,12 +28,12 @@
 #if ENABLE(WEBGPU)
 
 #include "WebGPUCommandBuffer.h"
-
 #include <wtf/RefCounted.h>
 
 namespace WebCore {
 
 class GPUProgrammablePassEncoder;
+class WebGPUBindGroup;
 class WebGPURenderPipeline;
 
 class WebGPUProgrammablePassEncoder : public RefCounted<WebGPUProgrammablePassEncoder> {
@@ -41,6 +41,7 @@
     virtual ~WebGPUProgrammablePassEncoder() = default;
 
     Ref<WebGPUCommandBuffer> endPass();
+    void setBindGroup(unsigned long, const WebGPUBindGroup&) const;
     void setPipeline(Ref<WebGPURenderPipeline>&&);
 
 protected:

Modified: trunk/Source/WebCore/Modules/webgpu/WebGPUProgrammablePassEncoder.idl (240179 => 240180)


--- trunk/Source/WebCore/Modules/webgpu/WebGPUProgrammablePassEncoder.idl	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/Modules/webgpu/WebGPUProgrammablePassEncoder.idl	2019-01-18 23:09:38 UTC (rev 240180)
@@ -24,6 +24,8 @@
  */
 // https://github.com/gpuweb/gpuweb/blob/master/design/sketch.webidl
 
+typedef unsigned long u32;
+
 [
     Conditional=WEBGPU,
     EnabledAtRuntime=WebGPU,
@@ -30,12 +32,6 @@
     SkipVTableValidation
 ] interface WebGPUProgrammablePassEncoder {
     WebGPUCommandBuffer endPass();
-
-    // FIXME: Only support render pipelines for prototype.
-    void setPipeline(WebGPURenderPipeline pipeline);
-/* Not Yet Implemented
-    // Allowed in both compute and render passes
-    // TODO: setPushConstants() ?
-    void setBindGroup(u32 index, WebGPUBindGroup bindGroup);
-*/
+    void setBindGroup(u32 index, WebGPUBindGroup bindGroup/*, optional sequence<u32> dynamicOffsets*/);
+    void setPipeline(WebGPURenderPipeline pipeline); // FIXME: Support WebGPUComputePipelines.
 };

Modified: trunk/Source/WebCore/Modules/webgpu/WebGPURenderPassEncoder.h (240179 => 240180)


--- trunk/Source/WebCore/Modules/webgpu/WebGPURenderPassEncoder.h	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/Modules/webgpu/WebGPURenderPassEncoder.h	2019-01-18 23:09:38 UTC (rev 240180)
@@ -44,7 +44,7 @@
 
     // FIXME: Last argument should be Vector<unsigned long>. Why is the generated code incorrectly assuming the IDL wants a sequence<unsigned int>?
     void setVertexBuffers(unsigned long, Vector<RefPtr<WebGPUBuffer>>&&, Vector<unsigned>&&);
-    void draw(unsigned long, unsigned long, unsigned long, unsigned long);
+    void draw(unsigned long vertexCount, unsigned long instanceCount, unsigned long firstVertex, unsigned long firstInstance);
 
 private:
     WebGPURenderPassEncoder(Ref<WebGPUCommandBuffer>&&, Ref<GPURenderPassEncoder>&&);

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (240179 => 240180)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2019-01-18 23:09:38 UTC (rev 240180)
@@ -6427,17 +6427,16 @@
 		1C840B9A21EC400900D0500D /* WHLSLGatherEntryPointItems.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WHLSLGatherEntryPointItems.h; sourceTree = "<group>"; };
 		1C840B9B21EC400900D0500D /* WHLSLChecker.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WHLSLChecker.cpp; sourceTree = "<group>"; };
 		1C904DF90BA9D2C80081E9D0 /* Version.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Version.xcconfig; sourceTree = "<group>"; };
+		1C9AE5CA21ED9DF50069D5F2 /* WHLSLHighZombieFinder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WHLSLHighZombieFinder.cpp; sourceTree = "<group>"; };
+		1C9AE5CB21ED9DF50069D5F2 /* WHLSLHighZombieFinder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WHLSLHighZombieFinder.h; sourceTree = "<group>"; };
+		1CA0C2DE21EEB5F400A11860 /* WHLSLRecursionChecker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WHLSLRecursionChecker.h; sourceTree = "<group>"; };
+		1CA0C2E021EEB5F500A11860 /* WHLSLRecursionChecker.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WHLSLRecursionChecker.cpp; sourceTree = "<group>"; };
 		1CA0C2E421EED12A00A11860 /* WHLSLFunctionStageChecker.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WHLSLFunctionStageChecker.cpp; sourceTree = "<group>"; };
 		1CA0C2E521EED12A00A11860 /* WHLSLFunctionStageChecker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WHLSLFunctionStageChecker.h; sourceTree = "<group>"; };
-		1CA0C2DE21EEB5F400A11860 /* WHLSLRecursionChecker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WHLSLRecursionChecker.h; sourceTree = "<group>"; };
-		1CA0C2E021EEB5F500A11860 /* WHLSLRecursionChecker.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WHLSLRecursionChecker.cpp; sourceTree = "<group>"; };
 		1CA0C2EA21EED6F500A11860 /* WHLSLLiteralTypeChecker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WHLSLLiteralTypeChecker.h; sourceTree = "<group>"; };
 		1CA0C2EC21EED6F600A11860 /* WHLSLLiteralTypeChecker.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WHLSLLiteralTypeChecker.cpp; sourceTree = "<group>"; };
-		1C9AE5CA21ED9DF50069D5F2 /* WHLSLHighZombieFinder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WHLSLHighZombieFinder.cpp; sourceTree = "<group>"; };
-		1C9AE5CB21ED9DF50069D5F2 /* WHLSLHighZombieFinder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WHLSLHighZombieFinder.h; sourceTree = "<group>"; };
 		1CA0C2F421EEDAD000A11860 /* WHLSLLoopChecker.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WHLSLLoopChecker.cpp; sourceTree = "<group>"; };
 		1CA0C2F521EEDAD100A11860 /* WHLSLLoopChecker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WHLSLLoopChecker.h; sourceTree = "<group>"; };
-		1CA0C2F621EEDAD200A11860 /* AST */ = {isa = PBXFileReference; lastKnownFileType = folder; path = AST; sourceTree = "<group>"; };
 		1CA19E030DC255950065A994 /* EventLoopMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EventLoopMac.mm; sourceTree = "<group>"; };
 		1CA19E150DC255CA0065A994 /* EventLoop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventLoop.h; sourceTree = "<group>"; };
 		1CAF347E0A6C405200ABE06E /* WebScriptObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebScriptObject.h; sourceTree = "<group>"; };
@@ -17037,6 +17036,100 @@
 			tabWidth = 8;
 			usesTabs = 0;
 		};
+		1CA0C2F621EEDAD200A11860 /* AST */ = {
+			isa = PBXGroup;
+			children = (
+				1C840B9021EC30F900D0500D /* WHLSLAddressSpace.h */,
+				C21BF72521CD89E200227979 /* WHLSLArrayReferenceType.h */,
+				C21BF70921CD89CA00227979 /* WHLSLArrayType.h */,
+				C21BF73021CD89ED00227979 /* WHLSLAssignmentExpression.h */,
+				C21BF70A21CD89CB00227979 /* WHLSLBaseFunctionAttribute.h */,
+				C21BF6FA21CD89BE00227979 /* WHLSLBaseSemantic.h */,
+				C21BF71E21CD89DC00227979 /* WHLSLBlock.h */,
+				C21BF6F621CD89B700227979 /* WHLSLBooleanLiteral.h */,
+				C21BF71A21CD89D800227979 /* WHLSLBreak.h */,
+				C2138A1321DDECD300F516BA /* WHLSLBuiltInSemantic.cpp */,
+				C21BF72221CD89DF00227979 /* WHLSLBuiltInSemantic.h */,
+				C21BF71621CD89D500227979 /* WHLSLCallExpression.h */,
+				C21BF70621CD89C700227979 /* WHLSLCommaExpression.h */,
+				C21BF73321CD89F000227979 /* WHLSLConstantExpression.h */,
+				C21BF6F521CD89B500227979 /* WHLSLContinue.h */,
+				C21BF70121CD89C400227979 /* WHLSLDereferenceExpression.h */,
+				C21BF71821CD89D700227979 /* WHLSLDotExpression.h */,
+				C21BF6FB21CD89BE00227979 /* WHLSLDoWhileLoop.h */,
+				C21BF72821CD89E500227979 /* WHLSLEffectfulExpressionStatement.h */,
+				1C840B7D21EBE0B800D0500D /* WHLSLEntryPointType.h */,
+				C21BF72021CD89DD00227979 /* WHLSLEnumerationDefinition.h */,
+				C21BF72621CD89E300227979 /* WHLSLEnumerationMember.h */,
+				C21BF70221CD89C400227979 /* WHLSLEnumerationMemberLiteral.h */,
+				C21BF70C21CD89CC00227979 /* WHLSLExpression.h */,
+				C21BF70021CD89C200227979 /* WHLSLFallthrough.h */,
+				C21BF73521CD89F200227979 /* WHLSLFloatLiteral.h */,
+				1CB69B3821DF03E1006E846A /* WHLSLFloatLiteralType.cpp */,
+				1CB69B3421DED63A006E846A /* WHLSLFloatLiteralType.h */,
+				C21BF73421CD89F100227979 /* WHLSLForLoop.h */,
+				C21BF70521CD89C700227979 /* WHLSLFunctionAttribute.h */,
+				C21BF6FD21CD89C000227979 /* WHLSLFunctionDeclaration.h */,
+				C21BF6F421CD89B300227979 /* WHLSLFunctionDefinition.h */,
+				C21BF6FF21CD89C200227979 /* WHLSLIfStatement.h */,
+				C21BF6F721CD89B900227979 /* WHLSLIndexExpression.h */,
+				C20F4F6621DFF2360070C45A /* WHLSLIntegerLiteral.cpp */,
+				C21BF6F821CD89BB00227979 /* WHLSLIntegerLiteral.h */,
+				1CB69B3921DF03F3006E846A /* WHLSLIntegerLiteralType.cpp */,
+				1CB69B3521DED649006E846A /* WHLSLIntegerLiteralType.h */,
+				C21BF73221CD89EF00227979 /* WHLSLLogicalExpression.h */,
+				C21BF71521CD89D400227979 /* WHLSLLogicalNotExpression.h */,
+				C21BF72D21CD89E900227979 /* WHLSLMakeArrayReferenceExpression.h */,
+				C21BF72C21CD89E900227979 /* WHLSLMakePointerExpression.h */,
+				1C33277121CF0BE1000DC9F2 /* WHLSLNamedType.h */,
+				C21BF72321CD89E100227979 /* WHLSLNativeFunctionDeclaration.h */,
+				C21BF72A21CD89E700227979 /* WHLSLNativeTypeDeclaration.h */,
+				C21BF72421CD89E100227979 /* WHLSLNode.h */,
+				C21BF70721CD89C800227979 /* WHLSLNullLiteral.h */,
+				1CB69B3A21DF0403006E846A /* WHLSLNullLiteralType.cpp */,
+				1CB69B3621DED657006E846A /* WHLSLNullLiteralType.h */,
+				C21BF72121CD89DE00227979 /* WHLSLNumThreadsFunctionAttribute.h */,
+				C21BF72F21CD89EC00227979 /* WHLSLPointerType.h */,
+				C21BF72E21CD89EA00227979 /* WHLSLPropertyAccessExpression.h */,
+				C21BF70B21CD89CC00227979 /* WHLSLQualifier.h */,
+				C21BF71B21CD89D900227979 /* WHLSLReadModifyWriteExpression.h */,
+				C21BF70D21CD89CD00227979 /* WHLSLReferenceType.h */,
+				1CB69B3221DED40B006E846A /* WHLSLResolvableType.h */,
+				C2138A1521DDECE900F516BA /* WHLSLResourceSemantic.cpp */,
+				C21BF70821CD89C900227979 /* WHLSLResourceSemantic.h */,
+				C21BF70321CD89C500227979 /* WHLSLReturn.h */,
+				C21BF6F921CD89BD00227979 /* WHLSLSemantic.h */,
+				C2138A1621DDECFB00F516BA /* WHLSLSpecializationConstantSemantic.cpp */,
+				C21BF73621CD89F300227979 /* WHLSLSpecializationConstantSemantic.h */,
+				C2138A1721DDED0D00F516BA /* WHLSLStageInOutSemantic.cpp */,
+				C21BF70E21CD89CE00227979 /* WHLSLStageInOutSemantic.h */,
+				C21BF71221CD89D100227979 /* WHLSLStatement.h */,
+				C21BF72721CD89E400227979 /* WHLSLStructureDefinition.h */,
+				C21BF6FE21CD89C100227979 /* WHLSLStructureElement.h */,
+				C21BF71921CD89D700227979 /* WHLSLSwitchCase.h */,
+				C21BF73121CD89EE00227979 /* WHLSLSwitchStatement.h */,
+				C21BF71C21CD89DA00227979 /* WHLSLTernaryExpression.h */,
+				C21BF6F321CD89AD00227979 /* WHLSLTrap.h */,
+				C21BF71D21CD89DB00227979 /* WHLSLType.h */,
+				C288C72D21C991DA002DF5CA /* WHLSLTypeArgument.cpp */,
+				C21BF71121CD89D100227979 /* WHLSLTypeArgument.h */,
+				C21BF72921CD89E600227979 /* WHLSLTypeDefinition.h */,
+				C20F4F6421DFBE5C0070C45A /* WHLSLTypeReference.cpp */,
+				C21BF71F21CD89DC00227979 /* WHLSLTypeReference.h */,
+				1C33277221CF0D2E000DC9F2 /* WHLSLUnnamedType.h */,
+				C20F4F6721DFF3A70070C45A /* WHLSLUnsignedIntegerLiteral.cpp */,
+				C21BF72B21CD89E800227979 /* WHLSLUnsignedIntegerLiteral.h */,
+				1CB69B3B21DF041E006E846A /* WHLSLUnsignedIntegerLiteralType.cpp */,
+				1CB69B3721DED66B006E846A /* WHLSLUnsignedIntegerLiteralType.h */,
+				C21BF6FC21CD89BF00227979 /* WHLSLValue.h */,
+				C21BF71021CD89D000227979 /* WHLSLVariableDeclaration.h */,
+				C21BF71421CD89D300227979 /* WHLSLVariableDeclarationsStatement.h */,
+				C21BF71321CD89D200227979 /* WHLSLVariableReference.h */,
+				C21BF70421CD89C600227979 /* WHLSLWhileLoop.h */,
+			);
+			path = AST;
+			sourceTree = "<group>";
+		};
 		1CDD44660BA9C80000F90147 /* Configurations */ = {
 			isa = PBXGroup;
 			children = (
@@ -25516,100 +25609,6 @@
 			path = WHLSL;
 			sourceTree = "<group>";
 		};
-		1CA0C2F621EEDAD200A11860 /* AST */ = {
-			isa = PBXGroup;
-			children = (
-				1C840B9021EC30F900D0500D /* WHLSLAddressSpace.h */,
-				C21BF72521CD89E200227979 /* WHLSLArrayReferenceType.h */,
-				C21BF70921CD89CA00227979 /* WHLSLArrayType.h */,
-				C21BF73021CD89ED00227979 /* WHLSLAssignmentExpression.h */,
-				C21BF70A21CD89CB00227979 /* WHLSLBaseFunctionAttribute.h */,
-				C21BF6FA21CD89BE00227979 /* WHLSLBaseSemantic.h */,
-				C21BF71E21CD89DC00227979 /* WHLSLBlock.h */,
-				C21BF6F621CD89B700227979 /* WHLSLBooleanLiteral.h */,
-				C21BF71A21CD89D800227979 /* WHLSLBreak.h */,
-				C2138A1321DDECD300F516BA /* WHLSLBuiltInSemantic.cpp */,
-				C21BF72221CD89DF00227979 /* WHLSLBuiltInSemantic.h */,
-				C21BF71621CD89D500227979 /* WHLSLCallExpression.h */,
-				C21BF70621CD89C700227979 /* WHLSLCommaExpression.h */,
-				C21BF73321CD89F000227979 /* WHLSLConstantExpression.h */,
-				C21BF6F521CD89B500227979 /* WHLSLContinue.h */,
-				C21BF70121CD89C400227979 /* WHLSLDereferenceExpression.h */,
-				C21BF71821CD89D700227979 /* WHLSLDotExpression.h */,
-				C21BF6FB21CD89BE00227979 /* WHLSLDoWhileLoop.h */,
-				C21BF72821CD89E500227979 /* WHLSLEffectfulExpressionStatement.h */,
-				1C840B7D21EBE0B800D0500D /* WHLSLEntryPointType.h */,
-				C21BF72021CD89DD00227979 /* WHLSLEnumerationDefinition.h */,
-				C21BF72621CD89E300227979 /* WHLSLEnumerationMember.h */,
-				C21BF70221CD89C400227979 /* WHLSLEnumerationMemberLiteral.h */,
-				C21BF70C21CD89CC00227979 /* WHLSLExpression.h */,
-				C21BF70021CD89C200227979 /* WHLSLFallthrough.h */,
-				C21BF73521CD89F200227979 /* WHLSLFloatLiteral.h */,
-				1CB69B3821DF03E1006E846A /* WHLSLFloatLiteralType.cpp */,
-				1CB69B3421DED63A006E846A /* WHLSLFloatLiteralType.h */,
-				C21BF73421CD89F100227979 /* WHLSLForLoop.h */,
-				C21BF70521CD89C700227979 /* WHLSLFunctionAttribute.h */,
-				C21BF6FD21CD89C000227979 /* WHLSLFunctionDeclaration.h */,
-				C21BF6F421CD89B300227979 /* WHLSLFunctionDefinition.h */,
-				C21BF6FF21CD89C200227979 /* WHLSLIfStatement.h */,
-				C21BF6F721CD89B900227979 /* WHLSLIndexExpression.h */,
-				C20F4F6621DFF2360070C45A /* WHLSLIntegerLiteral.cpp */,
-				C21BF6F821CD89BB00227979 /* WHLSLIntegerLiteral.h */,
-				1CB69B3921DF03F3006E846A /* WHLSLIntegerLiteralType.cpp */,
-				1CB69B3521DED649006E846A /* WHLSLIntegerLiteralType.h */,
-				C21BF73221CD89EF00227979 /* WHLSLLogicalExpression.h */,
-				C21BF71521CD89D400227979 /* WHLSLLogicalNotExpression.h */,
-				C21BF72D21CD89E900227979 /* WHLSLMakeArrayReferenceExpression.h */,
-				C21BF72C21CD89E900227979 /* WHLSLMakePointerExpression.h */,
-				1C33277121CF0BE1000DC9F2 /* WHLSLNamedType.h */,
-				C21BF72321CD89E100227979 /* WHLSLNativeFunctionDeclaration.h */,
-				C21BF72A21CD89E700227979 /* WHLSLNativeTypeDeclaration.h */,
-				C21BF72421CD89E100227979 /* WHLSLNode.h */,
-				C21BF70721CD89C800227979 /* WHLSLNullLiteral.h */,
-				1CB69B3A21DF0403006E846A /* WHLSLNullLiteralType.cpp */,
-				1CB69B3621DED657006E846A /* WHLSLNullLiteralType.h */,
-				C21BF72121CD89DE00227979 /* WHLSLNumThreadsFunctionAttribute.h */,
-				C21BF72F21CD89EC00227979 /* WHLSLPointerType.h */,
-				C21BF72E21CD89EA00227979 /* WHLSLPropertyAccessExpression.h */,
-				C21BF70B21CD89CC00227979 /* WHLSLQualifier.h */,
-				C21BF71B21CD89D900227979 /* WHLSLReadModifyWriteExpression.h */,
-				C21BF70D21CD89CD00227979 /* WHLSLReferenceType.h */,
-				1CB69B3221DED40B006E846A /* WHLSLResolvableType.h */,
-				C2138A1521DDECE900F516BA /* WHLSLResourceSemantic.cpp */,
-				C21BF70821CD89C900227979 /* WHLSLResourceSemantic.h */,
-				C21BF70321CD89C500227979 /* WHLSLReturn.h */,
-				C21BF6F921CD89BD00227979 /* WHLSLSemantic.h */,
-				C2138A1621DDECFB00F516BA /* WHLSLSpecializationConstantSemantic.cpp */,
-				C21BF73621CD89F300227979 /* WHLSLSpecializationConstantSemantic.h */,
-				C2138A1721DDED0D00F516BA /* WHLSLStageInOutSemantic.cpp */,
-				C21BF70E21CD89CE00227979 /* WHLSLStageInOutSemantic.h */,
-				C21BF71221CD89D100227979 /* WHLSLStatement.h */,
-				C21BF72721CD89E400227979 /* WHLSLStructureDefinition.h */,
-				C21BF6FE21CD89C100227979 /* WHLSLStructureElement.h */,
-				C21BF71921CD89D700227979 /* WHLSLSwitchCase.h */,
-				C21BF73121CD89EE00227979 /* WHLSLSwitchStatement.h */,
-				C21BF71C21CD89DA00227979 /* WHLSLTernaryExpression.h */,
-				C21BF6F321CD89AD00227979 /* WHLSLTrap.h */,
-				C21BF71D21CD89DB00227979 /* WHLSLType.h */,
-				C288C72D21C991DA002DF5CA /* WHLSLTypeArgument.cpp */,
-				C21BF71121CD89D100227979 /* WHLSLTypeArgument.h */,
-				C21BF72921CD89E600227979 /* WHLSLTypeDefinition.h */,
-				C20F4F6421DFBE5C0070C45A /* WHLSLTypeReference.cpp */,
-				C21BF71F21CD89DC00227979 /* WHLSLTypeReference.h */,
-				1C33277221CF0D2E000DC9F2 /* WHLSLUnnamedType.h */,
-				C20F4F6721DFF3A70070C45A /* WHLSLUnsignedIntegerLiteral.cpp */,
-				C21BF72B21CD89E800227979 /* WHLSLUnsignedIntegerLiteral.h */,
-				1CB69B3B21DF041E006E846A /* WHLSLUnsignedIntegerLiteralType.cpp */,
-				1CB69B3721DED66B006E846A /* WHLSLUnsignedIntegerLiteralType.h */,
-				C21BF6FC21CD89BF00227979 /* WHLSLValue.h */,
-				C21BF71021CD89D000227979 /* WHLSLVariableDeclaration.h */,
-				C21BF71421CD89D300227979 /* WHLSLVariableDeclarationsStatement.h */,
-				C21BF71321CD89D200227979 /* WHLSLVariableReference.h */,
-				C21BF70421CD89C600227979 /* WHLSLWhileLoop.h */,
-			);
-			path = AST;
-			sourceTree = "<group>";
-		};
 		C96F5EBF1B5872260091EA9D /* mediasession */ = {
 			isa = PBXGroup;
 			children = (

Modified: trunk/Source/WebCore/platform/graphics/gpu/GPUBindGroup.h (240179 => 240180)


--- trunk/Source/WebCore/platform/graphics/gpu/GPUBindGroup.h	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/platform/graphics/gpu/GPUBindGroup.h	2019-01-18 23:09:38 UTC (rev 240180)
@@ -41,6 +41,9 @@
 public:
     static Ref<GPUBindGroup> create(GPUBindGroupDescriptor&&);
 
+    const GPUBindGroupLayout& layout() const { return m_layout.get(); }
+    const Vector<GPUBindGroupBinding>& bindings() const { return m_bindings; }
+
 private:
     explicit GPUBindGroup(GPUBindGroupDescriptor&&);
 

Modified: trunk/Source/WebCore/platform/graphics/gpu/GPUBindGroupLayout.h (240179 => 240180)


--- trunk/Source/WebCore/platform/graphics/gpu/GPUBindGroupLayout.h	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/platform/graphics/gpu/GPUBindGroupLayout.h	2019-01-18 23:09:38 UTC (rev 240180)
@@ -34,7 +34,10 @@
 #include <wtf/RefPtr.h>
 #include <wtf/RetainPtr.h>
 
+#if USE(METAL)
 OBJC_PROTOCOL(MTLArgumentEncoder);
+OBJC_PROTOCOL(MTLBuffer);
+#endif // USE(METAL)
 
 namespace WebCore {
 
@@ -42,22 +45,31 @@
 
 class GPUBindGroupLayout : public RefCounted<GPUBindGroupLayout> {
 public:
-    struct ArgumentEncoders {
-        RetainPtr<MTLArgumentEncoder> vertex;
-        RetainPtr<MTLArgumentEncoder> fragment;
-        RetainPtr<MTLArgumentEncoder> compute;
-    };
-
     static RefPtr<GPUBindGroupLayout> tryCreate(const GPUDevice&, GPUBindGroupLayoutDescriptor&&);
 
     using BindingsMapType = HashMap<unsigned long long, GPUBindGroupLayoutBinding, WTF::IntHash<unsigned long long>, WTF::UnsignedWithZeroKeyHashTraits<unsigned long long>>;
     const BindingsMapType& bindingsMap() const { return m_bindingsMap; }
+#if USE(METAL)
+    struct ArgumentEncoderBuffer {
+        RetainPtr<MTLArgumentEncoder> encoder;
+        RetainPtr<MTLBuffer> buffer;
 
+        bool isValid() const { return encoder && buffer; }
+    };
+    const ArgumentEncoderBuffer& vertexArguments() const { return m_vertexArguments; }
+    const ArgumentEncoderBuffer& fragmentArguments() const { return m_fragmentArguments; }
+    const ArgumentEncoderBuffer& computeArguments() const { return m_computeArguments; }
+#endif // USE(METAL)
+
 private:
-    GPUBindGroupLayout(BindingsMapType&&, ArgumentEncoders&&);
+#if USE(METAL)
+    GPUBindGroupLayout(BindingsMapType&&, ArgumentEncoderBuffer&& vertex, ArgumentEncoderBuffer&& fragment, ArgumentEncoderBuffer&& compute);
 
+    ArgumentEncoderBuffer m_vertexArguments;
+    ArgumentEncoderBuffer m_fragmentArguments;
+    ArgumentEncoderBuffer m_computeArguments;
+#endif // USE(METAL)
     const BindingsMapType m_bindingsMap;
-    ArgumentEncoders m_argumentEncoders;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/graphics/gpu/GPUDevice.cpp (240179 => 240180)


--- trunk/Source/WebCore/platform/graphics/gpu/GPUDevice.cpp	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/platform/graphics/gpu/GPUDevice.cpp	2019-01-18 23:09:38 UTC (rev 240180)
@@ -32,6 +32,7 @@
 #include "GPUBindGroupLayoutDescriptor.h"
 #include "GPUBuffer.h"
 #include "GPUBufferDescriptor.h"
+#include "GPUCommandBuffer.h"
 #include "GPUPipelineLayout.h"
 #include "GPUPipelineLayoutDescriptor.h"
 #include "GPURenderPipeline.h"

Modified: trunk/Source/WebCore/platform/graphics/gpu/GPUDevice.h (240179 => 240180)


--- trunk/Source/WebCore/platform/graphics/gpu/GPUDevice.h	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/platform/graphics/gpu/GPUDevice.h	2019-01-18 23:09:38 UTC (rev 240180)
@@ -27,9 +27,7 @@
 
 #if ENABLE(WEBGPU)
 
-#include "GPUCommandBuffer.h"
 #include "GPUQueue.h"
-
 #include <wtf/RefCounted.h>
 #include <wtf/RefPtr.h>
 #include <wtf/RetainPtr.h>
@@ -43,6 +41,7 @@
 
 class GPUBindGroupLayout;
 class GPUBuffer;
+class GPUCommandBuffer;
 class GPUPipelineLayout;
 class GPURenderPipeline;
 class GPUShaderModule;

Modified: trunk/Source/WebCore/platform/graphics/gpu/GPUProgrammablePassEncoder.h (240179 => 240180)


--- trunk/Source/WebCore/platform/graphics/gpu/GPUProgrammablePassEncoder.h	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/platform/graphics/gpu/GPUProgrammablePassEncoder.h	2019-01-18 23:09:38 UTC (rev 240180)
@@ -27,12 +27,19 @@
 
 #if ENABLE(WEBGPU)
 
+#include "GPUBindGroupBinding.h"
 #include <wtf/RefCounted.h>
 
+OBJC_PROTOCOL(MTLArgumentEncoder);
+#if USE(METAL)
+OBJC_PROTOCOL(MTLBuffer);
 OBJC_PROTOCOL(MTLCommandEncoder);
+OBJC_PROTOCOL(MTLResource);
+#endif // USE(METAL)
 
 namespace WebCore {
 
+class GPUBindGroup;
 class GPURenderPipeline;
 
 using PlatformProgrammablePassEncoder = MTLCommandEncoder;
@@ -42,7 +49,7 @@
     virtual ~GPUProgrammablePassEncoder() = default;
 
     void endPass();
-
+    void setBindGroup(unsigned long, const GPUBindGroup&);
     virtual void setPipeline(Ref<GPURenderPipeline>&&) = 0;
 
 protected:
@@ -49,6 +56,15 @@
     virtual PlatformProgrammablePassEncoder* platformPassEncoder() const = 0;
 
 private:
+#if USE(METAL)
+    void setResourceAsBufferOnEncoder(MTLArgumentEncoder *, const GPUBindingResource&, unsigned long, const char* const);
+    virtual void useResource(MTLResource *, unsigned long) = 0;
+
+    // Render command encoder methods.
+    virtual void setVertexBuffer(MTLBuffer *, unsigned long, unsigned long) { }
+    virtual void setFragmentBuffer(MTLBuffer *, unsigned long, unsigned long) { }
+#endif // USE(METAL)
+
     bool m_isEncoding { true };
 };
 

Modified: trunk/Source/WebCore/platform/graphics/gpu/GPURenderPassEncoder.h (240179 => 240180)


--- trunk/Source/WebCore/platform/graphics/gpu/GPURenderPassEncoder.h	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/platform/graphics/gpu/GPURenderPassEncoder.h	2019-01-18 23:09:38 UTC (rev 240180)
@@ -54,7 +54,7 @@
     void setPipeline(Ref<GPURenderPipeline>&&) final;
 
     void setVertexBuffers(unsigned long, Vector<Ref<const GPUBuffer>>&&, Vector<unsigned>&&);
-    void draw(unsigned long, unsigned long, unsigned long, unsigned long);
+    void draw(unsigned long vertexCount, unsigned long instanceCount, unsigned long firstVertex, unsigned long firstInstance);
 
 private:
     GPURenderPassEncoder(PlatformRenderPassEncoderSmartPtr&&);
@@ -62,6 +62,13 @@
 
     PlatformProgrammablePassEncoder* platformPassEncoder() const final;
 
+#if USE(METAL)
+    // GPUProgrammablePassEncoder
+    void useResource(MTLResource *, unsigned long usage) final;
+    void setVertexBuffer(MTLBuffer *, unsigned long offset, unsigned long index) final;
+    void setFragmentBuffer(MTLBuffer *, unsigned long offset, unsigned long index) final;
+#endif // USE(METAL)
+
     PlatformRenderPassEncoderSmartPtr m_platformRenderPassEncoder;
     RefPtr<GPURenderPipeline> m_pipeline;
 };

Modified: trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUBindGroupLayoutMetal.mm (240179 => 240180)


--- trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUBindGroupLayoutMetal.mm	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUBindGroupLayoutMetal.mm	2019-01-18 23:09:38 UTC (rev 240180)
@@ -61,21 +61,38 @@
     END_BLOCK_OBJC_EXCEPTIONS;
 }
 
-static RetainPtr<MTLArgumentEncoder> newEncoder(const GPUDevice& device, ArgumentArray array)
+static GPUBindGroupLayout::ArgumentEncoderBuffer tryCreateArgumentEncoderAndBuffer(const GPUDevice& device, ArgumentArray array)
 {
-    RetainPtr<MTLArgumentEncoder> encoder;
+    GPUBindGroupLayout::ArgumentEncoderBuffer args;
+
     BEGIN_BLOCK_OBJC_EXCEPTIONS;
-    encoder = adoptNS([device.platformDevice() newArgumentEncoderWithArguments:array.get()]);
+    args.encoder = adoptNS([device.platformDevice() newArgumentEncoderWithArguments:array.get()]);
     END_BLOCK_OBJC_EXCEPTIONS;
-    if (!encoder)
+    if (!args.encoder) {
         LOG(WebGPU, "GPUBindGroupLayout::tryCreate(): Unable to create MTLArgumentEncoder!");
+        return { };
+    }
 
-    return encoder;
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    args.buffer = adoptNS([device.platformDevice() newBufferWithLength:args.encoder.get().encodedLength options:0]);
+    [args.encoder setArgumentBuffer:args.buffer.get() offset:0];
+    END_BLOCK_OBJC_EXCEPTIONS;
+    if (!args.buffer) {
+        LOG(WebGPU, "GPUBindGroupLayout::tryCreate(): Unable to create MTLBuffer from MTLArgumentEncoder!");
+        return { };
+    }
+
+    return args;
 };
 
 RefPtr<GPUBindGroupLayout> GPUBindGroupLayout::tryCreate(const GPUDevice& device, GPUBindGroupLayoutDescriptor&& descriptor)
 {
-    ArgumentArray vertexArguments, fragmentArguments, computeArguments;
+    if (!device.platformDevice()) {
+        LOG(WebGPU, "GPUBindGroupLayout::tryCreate(): Invalid MTLDevice!");
+        return nullptr;
+    }
+
+    ArgumentArray vertexArgsArray, fragmentArgsArray, computeArgsArray;
     BindingsMapType bindingsMap;
 
     for (const auto& binding : descriptor.bindings) {
@@ -99,34 +116,36 @@
         mtlArgument.get().index = binding.binding;
 
         if (binding.visibility & GPUShaderStageBit::VERTEX)
-            appendArgumentToArray(vertexArguments, mtlArgument);
+            appendArgumentToArray(vertexArgsArray, mtlArgument);
         if (binding.visibility & GPUShaderStageBit::FRAGMENT)
-            appendArgumentToArray(fragmentArguments, mtlArgument);
+            appendArgumentToArray(fragmentArgsArray, mtlArgument);
         if (binding.visibility & GPUShaderStageBit::COMPUTE)
-            appendArgumentToArray(computeArguments, mtlArgument);
+            appendArgumentToArray(computeArgsArray, mtlArgument);
     }
 
-    ArgumentEncoders encoders;
+    ArgumentEncoderBuffer vertex, fragment, compute;
 
-    if (vertexArguments) {
-        if (!(encoders.vertex = newEncoder(device, vertexArguments)))
+    if (vertexArgsArray) {
+        if (!(vertex = tryCreateArgumentEncoderAndBuffer(device, vertexArgsArray)).isValid())
             return nullptr;
     }
-    if (fragmentArguments) {
-        if (!(encoders.fragment = newEncoder(device, fragmentArguments)))
+    if (fragmentArgsArray) {
+        if (!(fragment = tryCreateArgumentEncoderAndBuffer(device, fragmentArgsArray)).isValid())
             return nullptr;
     }
-    if (computeArguments) {
-        if (!(encoders.compute = newEncoder(device, computeArguments)))
+    if (computeArgsArray) {
+        if (!(compute = tryCreateArgumentEncoderAndBuffer(device, computeArgsArray)).isValid())
             return nullptr;
     }
 
-    return adoptRef(new GPUBindGroupLayout(WTFMove(bindingsMap), WTFMove(encoders)));
+    return adoptRef(new GPUBindGroupLayout(WTFMove(bindingsMap), WTFMove(vertex), WTFMove(fragment), WTFMove(compute)));
 }
 
-GPUBindGroupLayout::GPUBindGroupLayout(BindingsMapType&& bindingsMap, ArgumentEncoders&& encoders)
-    : m_bindingsMap(WTFMove(bindingsMap))
-    , m_argumentEncoders(WTFMove(encoders))
+GPUBindGroupLayout::GPUBindGroupLayout(BindingsMapType&& bindingsMap, ArgumentEncoderBuffer&& vertex, ArgumentEncoderBuffer&& fragment, ArgumentEncoderBuffer&& compute)
+    : m_vertexArguments(WTFMove(vertex))
+    , m_fragmentArguments(WTFMove(fragment))
+    , m_computeArguments(WTFMove(compute))
+    , m_bindingsMap(WTFMove(bindingsMap))
 {
 }
 

Modified: trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUCommandBufferMetal.mm (240179 => 240180)


--- trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUCommandBufferMetal.mm	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUCommandBufferMetal.mm	2019-01-18 23:09:38 UTC (rev 240180)
@@ -69,7 +69,6 @@
 GPUCommandBuffer::GPUCommandBuffer(PlatformCommandBufferSmartPtr&& buffer)
     : m_platformCommandBuffer(WTFMove(buffer))
 {
-    UNUSED_PARAM(m_platformCommandBuffer);
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUProgrammablePassEncoderMetal.mm (240179 => 240180)


--- trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUProgrammablePassEncoderMetal.mm	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUProgrammablePassEncoderMetal.mm	2019-01-18 23:09:38 UTC (rev 240180)
@@ -28,7 +28,11 @@
 
 #if ENABLE(WEBGPU)
 
+#import "GPUBindGroup.h"
+#import "GPUBindGroupLayoutBinding.h"
+#import "Logging.h"
 #import <Metal/Metal.h>
+#import <wtf/BlockObjCExceptions.h>
 
 namespace WebCore {
 
@@ -41,6 +45,84 @@
     m_isEncoding = false;
 }
 
+void GPUProgrammablePassEncoder::setResourceAsBufferOnEncoder(MTLArgumentEncoder *argumentEncoder, const GPUBindingResource& resource, unsigned long index, const char* const functionName)
+{
+#if LOG_DISABLED
+    UNUSED_PARAM(functionName);
+#endif
+    if (!argumentEncoder) {
+        LOG(WebGPU, "%s: No argument encoder for requested stage found!", functionName);
+        return;
+    }
+
+    if (!WTF::holds_alternative<GPUBufferBinding>(resource)) {
+        LOG(WebGPU, "%s: Resource is not a buffer type!", functionName);
+        return;
+    }
+
+    auto& bufferBinding = WTF::get<GPUBufferBinding>(resource);
+    auto buffer = bufferBinding.buffer->platformBuffer();
+
+    if (!buffer) {
+        LOG(WebGPU, "%s: Invalid MTLBuffer in GPUBufferBinding!", functionName);
+        return;
+    }
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+
+    [argumentEncoder setBuffer:buffer offset:bufferBinding.offset atIndex:index];
+    useResource(buffer, MTLResourceUsageRead);
+
+    END_BLOCK_OBJC_EXCEPTIONS;
+}
+
+void GPUProgrammablePassEncoder::setBindGroup(unsigned long index, const GPUBindGroup& bindGroup)
+{
+    const char* const functionName = "GPUProgrammablePassEncoder::setBindGroup()";
+#if LOG_DISABLED
+    UNUSED_PARAM(functionName);
+#endif
+
+    const auto& vertexArgs = bindGroup.layout().vertexArguments();
+    const auto& fragmentArgs = bindGroup.layout().fragmentArguments();
+    // FIXME: Finish support for compute.
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+
+    if (vertexArgs.buffer)
+        setVertexBuffer(vertexArgs.buffer.get(), 0, index);
+    if (fragmentArgs.buffer)
+        setFragmentBuffer(fragmentArgs.buffer.get(), 0, index);
+
+    END_BLOCK_OBJC_EXCEPTIONS;
+
+    // Set each resource on each MTLArgumentEncoder it should be visible on.
+    const auto& bindingsMap = bindGroup.layout().bindingsMap();
+    for (const auto& binding : bindGroup.bindings()) {
+        auto iterator = bindingsMap.find(binding.binding);
+        if (iterator == bindingsMap.end()) {
+            LOG(WebGPU, "%s: GPUBindGroupBinding %lu not found in GPUBindGroupLayout!", functionName, binding.binding);
+            return;
+        }
+        auto bindGroupLayoutBinding = iterator->value;
+
+        switch (bindGroupLayoutBinding.type) {
+        // FIXME: Support more resource types.
+        case GPUBindGroupLayoutBinding::BindingType::UniformBuffer:
+        case GPUBindGroupLayoutBinding::BindingType::StorageBuffer: {
+            if (bindGroupLayoutBinding.visibility & GPUShaderStageBit::VERTEX)
+                setResourceAsBufferOnEncoder(vertexArgs.encoder.get(), binding.resource, binding.binding, functionName);
+            if (bindGroupLayoutBinding.visibility & GPUShaderStageBit::FRAGMENT)
+                setResourceAsBufferOnEncoder(fragmentArgs.encoder.get(), binding.resource, binding.binding, functionName);
+            break;
+        }
+        default:
+            LOG(WebGPU, "%s: Resource type not yet implemented.", functionName);
+            return;
+        }
+    }
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(WEBGPU)

Modified: trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPURenderPassEncoderMetal.mm (240179 => 240180)


--- trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPURenderPassEncoderMetal.mm	2019-01-18 23:05:57 UTC (rev 240179)
+++ trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPURenderPassEncoderMetal.mm	2019-01-18 23:09:38 UTC (rev 240180)
@@ -118,6 +118,25 @@
         baseInstance:firstInstance];
 }
 
+#if USE(METAL)
+
+void GPURenderPassEncoder::useResource(MTLResource *resource, unsigned long usage)
+{
+    [m_platformRenderPassEncoder useResource:resource usage:usage];
+}
+
+void GPURenderPassEncoder::setVertexBuffer(MTLBuffer *buffer, unsigned long offset, unsigned long index)
+{
+    [m_platformRenderPassEncoder setVertexBuffer:buffer offset:offset atIndex:index];
+}
+
+void GPURenderPassEncoder::setFragmentBuffer(MTLBuffer *buffer, unsigned long offset, unsigned long index)
+{
+    [m_platformRenderPassEncoder setFragmentBuffer:buffer offset:offset atIndex:index];
+}
+
+#endif // USE(METAL)
+
 } // namespace WebCore
 
 #endif // ENABLE(WEBGPU)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to