Title: [290264] trunk/Source/WebGPU
Revision
290264
Author
[email protected]
Date
2022-02-21 13:27:46 -0800 (Mon, 21 Feb 2022)

Log Message

[WebGPU] Tracer bullet part 9: Basic implementation of bindings
https://bugs.webkit.org/show_bug.cgi?id=236903

Reviewed by Dean Jackson.

This is a basic implementation of the BindGroup, BindGroupLayout, and PipelineLayout methods.
Eventually we'll want to suballocate multiple BindGroups so they coexist within the same Buffer,
but this is an initial simple implementation that doesn't do that.

* WebGPU/BindGroup.h:
(WebGPU::BindGroup::vertexArgumentBuffer const):
(WebGPU::BindGroup::fragmentArgumentBuffer const):
(WebGPU::BindGroup::computeArgumentBuffer const):
* WebGPU/BindGroup.mm:
(WebGPU::bufferIsPresent):
(WebGPU::samplerIsPresent):
(WebGPU::textureViewIsPresent):
(WebGPU::Device::createBindGroup):
(WebGPU::BindGroup::BindGroup):
(WebGPU::BindGroup::setLabel):
* WebGPU/BindGroupLayout.h:
(WebGPU::BindGroupLayout::vertexArgumentEncoder const):
(WebGPU::BindGroupLayout::fragmentArgumentEncoder const):
(WebGPU::BindGroupLayout::computeArgumentEncoder const):
* WebGPU/BindGroupLayout.mm:
(WebGPU::isPresent):
(WebGPU::createArgumentDescriptor):
(WebGPU::Device::createBindGroupLayout):
(WebGPU::BindGroupLayout::BindGroupLayout):
(WebGPU::BindGroupLayout::setLabel):
(WebGPU::BindGroupLayout::encodedLength const):
* WebGPU/Buffer.h:
(WebGPU::Buffer::buffer const):
* WebGPU/Buffer.mm:
(WebGPU::Buffer::Buffer):
* WebGPU/PipelineLayout.h:
(WebGPU::PipelineLayout::create):
(WebGPU::PipelineLayout::numberOfBindGroupLayouts const):
(WebGPU::PipelineLayout::bindGroupLayout const):
* WebGPU/PipelineLayout.mm:
(WebGPU::Device::createPipelineLayout):
(WebGPU::PipelineLayout::PipelineLayout):
(WebGPU::PipelineLayout::setLabel):
* WebGPU/Sampler.h:
(WebGPU::Sampler::samplerState const):
* WebGPU/Sampler.mm:
(WebGPU::Sampler::Sampler):
* WebGPU/TextureView.h:
(WebGPU::TextureView::texture const):
* WebGPU/TextureView.mm:
(WebGPU::TextureView::TextureView):

Modified Paths

Diff

Modified: trunk/Source/WebGPU/ChangeLog (290263 => 290264)


--- trunk/Source/WebGPU/ChangeLog	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/ChangeLog	2022-02-21 21:27:46 UTC (rev 290264)
@@ -1,5 +1,59 @@
 2022-02-21  Myles C. Maxfield  <[email protected]>
 
+        [WebGPU] Tracer bullet part 9: Basic implementation of bindings
+        https://bugs.webkit.org/show_bug.cgi?id=236903
+
+        Reviewed by Dean Jackson.
+
+        This is a basic implementation of the BindGroup, BindGroupLayout, and PipelineLayout methods.
+        Eventually we'll want to suballocate multiple BindGroups so they coexist within the same Buffer,
+        but this is an initial simple implementation that doesn't do that.
+
+        * WebGPU/BindGroup.h:
+        (WebGPU::BindGroup::vertexArgumentBuffer const):
+        (WebGPU::BindGroup::fragmentArgumentBuffer const):
+        (WebGPU::BindGroup::computeArgumentBuffer const):
+        * WebGPU/BindGroup.mm:
+        (WebGPU::bufferIsPresent):
+        (WebGPU::samplerIsPresent):
+        (WebGPU::textureViewIsPresent):
+        (WebGPU::Device::createBindGroup):
+        (WebGPU::BindGroup::BindGroup):
+        (WebGPU::BindGroup::setLabel):
+        * WebGPU/BindGroupLayout.h:
+        (WebGPU::BindGroupLayout::vertexArgumentEncoder const):
+        (WebGPU::BindGroupLayout::fragmentArgumentEncoder const):
+        (WebGPU::BindGroupLayout::computeArgumentEncoder const):
+        * WebGPU/BindGroupLayout.mm:
+        (WebGPU::isPresent):
+        (WebGPU::createArgumentDescriptor):
+        (WebGPU::Device::createBindGroupLayout):
+        (WebGPU::BindGroupLayout::BindGroupLayout):
+        (WebGPU::BindGroupLayout::setLabel):
+        (WebGPU::BindGroupLayout::encodedLength const):
+        * WebGPU/Buffer.h:
+        (WebGPU::Buffer::buffer const):
+        * WebGPU/Buffer.mm:
+        (WebGPU::Buffer::Buffer):
+        * WebGPU/PipelineLayout.h:
+        (WebGPU::PipelineLayout::create):
+        (WebGPU::PipelineLayout::numberOfBindGroupLayouts const):
+        (WebGPU::PipelineLayout::bindGroupLayout const):
+        * WebGPU/PipelineLayout.mm:
+        (WebGPU::Device::createPipelineLayout):
+        (WebGPU::PipelineLayout::PipelineLayout):
+        (WebGPU::PipelineLayout::setLabel):
+        * WebGPU/Sampler.h:
+        (WebGPU::Sampler::samplerState const):
+        * WebGPU/Sampler.mm:
+        (WebGPU::Sampler::Sampler):
+        * WebGPU/TextureView.h:
+        (WebGPU::TextureView::texture const):
+        * WebGPU/TextureView.mm:
+        (WebGPU::TextureView::TextureView):
+
+2022-02-21  Myles C. Maxfield  <[email protected]>
+
         [WebGPU] Tracer bullet part 8: Basic implementation of device creation routines
         https://bugs.webkit.org/show_bug.cgi?id=236902
 

Modified: trunk/Source/WebGPU/WebGPU/BindGroup.h (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/BindGroup.h	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/BindGroup.h	2022-02-21 21:27:46 UTC (rev 290264)
@@ -43,6 +43,10 @@
 
     void setLabel(const char*);
 
+    id <MTLBuffer> vertexArgumentBuffer() const { return m_vertexArgumentBuffer; }
+    id <MTLBuffer> fragmentArgumentBuffer() const { return m_fragmentArgumentBuffer; }
+    id <MTLBuffer> computeArgumentBuffer() const { return m_computeArgumentBuffer; }
+
 private:
     BindGroup(id <MTLBuffer> vertexArgumentBuffer, id <MTLBuffer> fragmentArgumentBuffer, id <MTLBuffer> computeArgumentBuffer);
 

Modified: trunk/Source/WebGPU/WebGPU/BindGroup.mm (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/BindGroup.mm	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/BindGroup.mm	2022-02-21 21:27:46 UTC (rev 290264)
@@ -26,14 +26,90 @@
 #import "config.h"
 #import "BindGroup.h"
 
+#import "BindGroupLayout.h"
+#import "Buffer.h"
 #import "Device.h"
+#import "Sampler.h"
+#import "TextureView.h"
 
 namespace WebGPU {
 
+static bool bufferIsPresent(const WGPUBindGroupEntry& entry)
+{
+    return entry.buffer;
+}
+
+static bool samplerIsPresent(const WGPUBindGroupEntry& entry)
+{
+    return entry.sampler;
+}
+
+static bool textureViewIsPresent(const WGPUBindGroupEntry& entry)
+{
+    return entry.textureView;
+}
+
 RefPtr<BindGroup> Device::createBindGroup(const WGPUBindGroupDescriptor* descriptor)
 {
-    UNUSED_PARAM(descriptor);
-    return BindGroup::create(nil, nil, nil);
+    if (descriptor->nextInChain)
+        return nullptr;
+
+    const BindGroupLayout& bindGroupLayout = descriptor->layout->bindGroupLayout;
+
+    // FIXME: Don't allocate 3 new buffers for every bind group.
+    // In fact, don't even allocate a single new buffer for every bind group.
+    id <MTLBuffer> vertexArgumentBuffer = [m_device newBufferWithLength:bindGroupLayout.encodedLength() options:MTLResourceStorageModeShared];
+    id <MTLBuffer> fragmentArgumentBuffer = [m_device newBufferWithLength:bindGroupLayout.encodedLength() options:MTLResourceStorageModeShared];
+    id <MTLBuffer> computeArgumentBuffer = [m_device newBufferWithLength:bindGroupLayout.encodedLength() options:MTLResourceStorageModeShared];
+    if (!vertexArgumentBuffer || !fragmentArgumentBuffer || !computeArgumentBuffer)
+        return nullptr;
+
+    auto label = [NSString stringWithCString:descriptor->label encoding:NSUTF8StringEncoding];
+    vertexArgumentBuffer.label = label;
+    fragmentArgumentBuffer.label = label;
+    computeArgumentBuffer.label = label;
+
+    id <MTLArgumentEncoder> vertexArgumentEncoder = bindGroupLayout.vertexArgumentEncoder();
+    id <MTLArgumentEncoder> fragmentArgumentEncoder = bindGroupLayout.fragmentArgumentEncoder();
+    id <MTLArgumentEncoder> computeArgumentEncoder = bindGroupLayout.computeArgumentEncoder();
+    [vertexArgumentEncoder setArgumentBuffer:vertexArgumentBuffer offset:0];
+    [fragmentArgumentEncoder setArgumentBuffer:fragmentArgumentBuffer offset:0];
+    [computeArgumentEncoder setArgumentBuffer:computeArgumentBuffer offset:0];
+
+    for (uint32_t i = 0; i < descriptor->entryCount; ++i) {
+        const WGPUBindGroupEntry& entry = descriptor->entries[i];
+
+        if (entry.nextInChain)
+            return nullptr;
+
+        bool bufferIsPresent = WebGPU::bufferIsPresent(entry);
+        bool samplerIsPresent = WebGPU::samplerIsPresent(entry);
+        bool textureViewIsPresent = WebGPU::textureViewIsPresent(entry);
+        if (static_cast<int>(bufferIsPresent) + static_cast<int>(samplerIsPresent) + static_cast<int>(textureViewIsPresent) != 1)
+            return nullptr;
+
+        if (bufferIsPresent) {
+            id <MTLBuffer> buffer = entry.buffer->buffer->buffer();
+            [vertexArgumentEncoder setBuffer:buffer offset:entry.offset atIndex:entry.binding];
+            [fragmentArgumentEncoder setBuffer:buffer offset:entry.offset atIndex:entry.binding];
+            [computeArgumentEncoder setBuffer:buffer offset:entry.offset atIndex:entry.binding];
+        } else if (samplerIsPresent) {
+            id <MTLSamplerState> sampler = entry.sampler->sampler->samplerState();
+            [vertexArgumentEncoder setSamplerState:sampler atIndex:entry.binding];
+            [fragmentArgumentEncoder setSamplerState:sampler atIndex:entry.binding];
+            [computeArgumentEncoder setSamplerState:sampler atIndex:entry.binding];
+        } else if (textureViewIsPresent) {
+            id <MTLTexture> texture = entry.textureView->textureView->texture();
+            [vertexArgumentEncoder setTexture:texture atIndex:entry.binding];
+            [fragmentArgumentEncoder setTexture:texture atIndex:entry.binding];
+            [computeArgumentEncoder setTexture:texture atIndex:entry.binding];
+        } else {
+            ASSERT_NOT_REACHED();
+            return nullptr;
+        }
+    }
+
+    return BindGroup::create(vertexArgumentBuffer, fragmentArgumentBuffer, computeArgumentBuffer);
 }
 
 BindGroup::BindGroup(id <MTLBuffer> vertexArgumentBuffer, id <MTLBuffer> fragmentArgumentBuffer, id <MTLBuffer> computeArgumentBuffer)
@@ -41,9 +117,6 @@
     , m_fragmentArgumentBuffer(fragmentArgumentBuffer)
     , m_computeArgumentBuffer(computeArgumentBuffer)
 {
-    UNUSED_VARIABLE(m_vertexArgumentBuffer);
-    UNUSED_VARIABLE(m_fragmentArgumentBuffer);
-    UNUSED_VARIABLE(m_computeArgumentBuffer);
 }
 
 BindGroup::~BindGroup() = default;
@@ -50,7 +123,10 @@
 
 void BindGroup::setLabel(const char* label)
 {
-    UNUSED_PARAM(label);
+    auto labelString = [NSString stringWithCString:label encoding:NSUTF8StringEncoding];
+    m_vertexArgumentBuffer.label = labelString;
+    m_fragmentArgumentBuffer.label = labelString;
+    m_computeArgumentBuffer.label = labelString;
 }
 
 }

Modified: trunk/Source/WebGPU/WebGPU/BindGroupLayout.h (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/BindGroupLayout.h	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/BindGroupLayout.h	2022-02-21 21:27:46 UTC (rev 290264)
@@ -43,6 +43,12 @@
 
     void setLabel(const char*);
 
+    NSUInteger encodedLength() const;
+
+    id <MTLArgumentEncoder> vertexArgumentEncoder() const { return m_vertexArgumentEncoder; }
+    id <MTLArgumentEncoder> fragmentArgumentEncoder() const { return m_fragmentArgumentEncoder; }
+    id <MTLArgumentEncoder> computeArgumentEncoder() const { return m_computeArgumentEncoder; }
+
 private:
     BindGroupLayout(id <MTLArgumentEncoder> vertexArgumentEncoder, id <MTLArgumentEncoder> fragmentArgumentEncoder, id <MTLArgumentEncoder> computeArgumentEncoder);
 

Modified: trunk/Source/WebGPU/WebGPU/BindGroupLayout.mm (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/BindGroupLayout.mm	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/BindGroupLayout.mm	2022-02-21 21:27:46 UTC (rev 290264)
@@ -30,10 +30,187 @@
 
 namespace WebGPU {
 
+static bool isPresent(const WGPUBufferBindingLayout& buffer)
+{
+    return buffer.type != WGPUBufferBindingType_Undefined;
+}
+
+static MTLArgumentDescriptor *createArgumentDescriptor(const WGPUBufferBindingLayout& buffer)
+{
+    if (buffer.nextInChain)
+        return nil;
+
+    auto descriptor = [MTLArgumentDescriptor new];
+    descriptor.dataType = MTLDataTypePointer;
+    // FIXME: Handle hasDynamicOffset.
+    // FIXME: Handle minBindingSize.
+    switch (buffer.type) {
+    case WGPUBufferBindingType_Uniform:
+    case WGPUBufferBindingType_ReadOnlyStorage:
+        descriptor.access = MTLArgumentAccessReadOnly;
+        break;
+    case WGPUBufferBindingType_Storage:
+        descriptor.access = MTLArgumentAccessReadWrite;
+        break;
+    default:
+        return nil;
+    }
+    return descriptor;
+}
+
+static bool isPresent(const WGPUSamplerBindingLayout& sampler)
+{
+    return sampler.type != WGPUSamplerBindingType_Undefined;
+}
+
+static MTLArgumentDescriptor *createArgumentDescriptor(const WGPUSamplerBindingLayout& sampler)
+{
+    if (sampler.nextInChain)
+        return nil;
+
+    UNUSED_PARAM(sampler);
+    auto descriptor = [MTLArgumentDescriptor new];
+    descriptor.dataType = MTLDataTypeSampler;
+    // FIXME: Implement this.
+    return descriptor;
+}
+
+static bool isPresent(const WGPUTextureBindingLayout& texture)
+{
+    return texture.sampleType != WGPUTextureSampleType_Undefined
+        && texture.viewDimension != WGPUTextureViewDimension_Undefined;
+}
+
+static MTLArgumentDescriptor *createArgumentDescriptor(const WGPUTextureBindingLayout& texture)
+{
+    if (texture.nextInChain)
+        return nil;
+
+    UNUSED_PARAM(texture);
+    auto descriptor = [MTLArgumentDescriptor new];
+    descriptor.dataType = MTLDataTypeTexture;
+    // FIXME: Implement this.
+    return descriptor;
+}
+
+static bool isPresent(const WGPUStorageTextureBindingLayout& storageTexture)
+{
+    return storageTexture.access != WGPUStorageTextureAccess_Undefined
+        && storageTexture.format != WGPUTextureFormat_Undefined
+        && storageTexture.viewDimension != WGPUTextureViewDimension_Undefined;
+}
+
+static MTLArgumentDescriptor *createArgumentDescriptor(const WGPUStorageTextureBindingLayout& storageTexture)
+{
+    if (storageTexture.nextInChain)
+        return nil;
+
+    UNUSED_PARAM(storageTexture);
+    auto descriptor = [MTLArgumentDescriptor new];
+    descriptor.dataType = MTLDataTypeTexture;
+    // FIXME: Implement this.
+    return descriptor;
+}
+
 RefPtr<BindGroupLayout> Device::createBindGroupLayout(const WGPUBindGroupLayoutDescriptor* descriptor)
 {
-    UNUSED_PARAM(descriptor);
-    return BindGroupLayout::create(nil, nil, nil);
+    if (descriptor->nextInChain)
+        return nullptr;
+
+    NSMutableArray<MTLArgumentDescriptor *> *vertexArguments = [NSMutableArray arrayWithCapacity:descriptor->entryCount];
+    NSMutableArray<MTLArgumentDescriptor *> *fragmentArguments = [NSMutableArray arrayWithCapacity:descriptor->entryCount];
+    NSMutableArray<MTLArgumentDescriptor *> *computeArguments = [NSMutableArray arrayWithCapacity:descriptor->entryCount];
+    if (!vertexArguments || !fragmentArguments || !computeArguments)
+        return nullptr;
+
+    for (uint32_t i = 0; i < descriptor->entryCount; ++i) {
+        const WGPUBindGroupLayoutEntry& entry = descriptor->entries[i];
+        if (entry.nextInChain)
+            return nullptr;
+
+        // https://gpuweb.github.io/gpuweb/#dictdef-gpubindgrouplayoutentry
+        // "Only one [of buffer, sampler, texture, storageTexture, or externalTexture] may be defined for any given GPUBindGroupLayoutEntry."
+
+        ASSERT(i == vertexArguments.count);
+        ASSERT(vertexArguments.count == fragmentArguments.count);
+        ASSERT(fragmentArguments.count == computeArguments.count);
+
+        const WGPUBufferBindingLayout& buffer = entry.buffer;
+        const WGPUSamplerBindingLayout& sampler = entry.sampler;
+        const WGPUTextureBindingLayout& texture = entry.texture;
+        const WGPUStorageTextureBindingLayout& storageTexture = entry.storageTexture;
+
+        MTLArgumentDescriptor *descriptor = nil;
+
+        if (isPresent(buffer)) {
+            if (i != vertexArguments.count)
+                return nullptr;
+
+            descriptor = createArgumentDescriptor(buffer);
+            if (!descriptor)
+                return nullptr;
+        }
+
+        if (isPresent(sampler)) {
+            if (i != vertexArguments.count)
+                return nullptr;
+
+            descriptor = createArgumentDescriptor(sampler);
+            if (!descriptor)
+                return nullptr;
+        }
+
+        if (isPresent(texture)) {
+            if (i != vertexArguments.count)
+                return nullptr;
+
+            descriptor = createArgumentDescriptor(texture);
+            if (!descriptor)
+                return nullptr;
+        }
+
+        if (isPresent(storageTexture)) {
+            if (i != vertexArguments.count)
+                return nullptr;
+
+            descriptor = createArgumentDescriptor(storageTexture);
+            if (!descriptor)
+                return nullptr;
+        }
+
+        // FIXME: This needs coordination with the shader compiler.
+        descriptor.index = i;
+
+        MTLArgumentDescriptor *vertexDescriptor = descriptor;
+        MTLArgumentDescriptor *fragmentDescriptor = [descriptor copy];
+        MTLArgumentDescriptor *computeDescriptor = [descriptor copy];
+        if (!fragmentDescriptor || !computeDescriptor)
+            return nullptr;
+
+        if (!(entry.visibility & WGPUShaderStage_Vertex))
+            vertexDescriptor.access = MTLArgumentAccessReadOnly;
+        if (!(entry.visibility & WGPUShaderStage_Fragment))
+            fragmentDescriptor.access = MTLArgumentAccessReadOnly;
+        if (!(entry.visibility & WGPUShaderStage_Compute))
+            computeDescriptor.access = MTLArgumentAccessReadOnly;
+
+        [vertexArguments addObject:vertexDescriptor];
+        [fragmentArguments addObject:fragmentDescriptor];
+        [computeArguments addObject:computeDescriptor];
+    }
+
+    id <MTLArgumentEncoder> vertexArgumentEncoder = [m_device newArgumentEncoderWithArguments:vertexArguments];
+    id <MTLArgumentEncoder> fragmentArgumentEncoder = [m_device newArgumentEncoderWithArguments:fragmentArguments];
+    id <MTLArgumentEncoder> computeArgumentEncoder = [m_device newArgumentEncoderWithArguments:computeArguments];
+    if (!vertexArgumentEncoder || !fragmentArgumentEncoder || !computeArgumentEncoder)
+        return nullptr;
+
+    auto label = [NSString stringWithCString:descriptor->label encoding:NSUTF8StringEncoding];
+    vertexArgumentEncoder.label = label;
+    fragmentArgumentEncoder.label = label;
+    computeArgumentEncoder.label = label;
+
+    return BindGroupLayout::create(vertexArgumentEncoder, fragmentArgumentEncoder, computeArgumentEncoder);
 }
 
 BindGroupLayout::BindGroupLayout(id <MTLArgumentEncoder> vertexArgumentEncoder, id <MTLArgumentEncoder> fragmentArgumentEncoder, id <MTLArgumentEncoder> computeArgumentEncoder)
@@ -41,9 +218,6 @@
     , m_fragmentArgumentEncoder(fragmentArgumentEncoder)
     , m_computeArgumentEncoder(computeArgumentEncoder)
 {
-    UNUSED_VARIABLE(m_vertexArgumentEncoder);
-    UNUSED_VARIABLE(m_fragmentArgumentEncoder);
-    UNUSED_VARIABLE(m_computeArgumentEncoder);
 }
 
 BindGroupLayout::~BindGroupLayout() = default;
@@ -50,11 +224,22 @@
 
 void BindGroupLayout::setLabel(const char* label)
 {
-    UNUSED_PARAM(label);
+    auto labelString = [NSString stringWithCString:label encoding:NSUTF8StringEncoding];
+    m_vertexArgumentEncoder.label = labelString;
+    m_fragmentArgumentEncoder.label = labelString;
+    m_computeArgumentEncoder.label = labelString;
 }
 
+NSUInteger BindGroupLayout::encodedLength() const
+{
+    auto result = m_vertexArgumentEncoder.encodedLength;
+    ASSERT(result == m_fragmentArgumentEncoder.encodedLength);
+    ASSERT(result == m_computeArgumentEncoder.encodedLength);
+    return result;
 }
 
+}
+
 void wgpuBindGroupLayoutRelease(WGPUBindGroupLayout bindGroupLayout)
 {
     delete bindGroupLayout;

Modified: trunk/Source/WebGPU/WebGPU/Buffer.h (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/Buffer.h	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/Buffer.h	2022-02-21 21:27:46 UTC (rev 290264)
@@ -49,6 +49,8 @@
     void unmap();
     void setLabel(const char*);
 
+    id <MTLBuffer> buffer() const { return m_buffer; }
+
 private:
     Buffer(id <MTLBuffer>);
 

Modified: trunk/Source/WebGPU/WebGPU/Buffer.mm (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/Buffer.mm	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/Buffer.mm	2022-02-21 21:27:46 UTC (rev 290264)
@@ -39,7 +39,6 @@
 Buffer::Buffer(id <MTLBuffer> buffer)
     : m_buffer(buffer)
 {
-    UNUSED_VARIABLE(m_buffer);
 }
 
 Buffer::~Buffer() = default;

Modified: trunk/Source/WebGPU/WebGPU/PipelineLayout.h (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/PipelineLayout.h	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/PipelineLayout.h	2022-02-21 21:27:46 UTC (rev 290264)
@@ -28,15 +28,18 @@
 #import <wtf/FastMalloc.h>
 #import <wtf/Ref.h>
 #import <wtf/RefCounted.h>
+#import <wtf/Vector.h>
 
 namespace WebGPU {
 
+class BindGroupLayout;
+
 class PipelineLayout : public RefCounted<PipelineLayout> {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    static Ref<PipelineLayout> create()
+    static Ref<PipelineLayout> create(Vector<Ref<BindGroupLayout>>&& bindGroupLayouts)
     {
-        return adoptRef(*new PipelineLayout());
+        return adoptRef(*new PipelineLayout(WTFMove(bindGroupLayouts)));
     }
 
     ~PipelineLayout();
@@ -43,8 +46,13 @@
 
     void setLabel(const char*);
 
+    size_t numberOfBindGroupLayouts() const { return m_bindGroupLayouts.size(); }
+    const BindGroupLayout& bindGroupLayout(size_t i) const { return m_bindGroupLayouts[i]; }
+
 private:
-    PipelineLayout();
+    PipelineLayout(Vector<Ref<BindGroupLayout>>&&);
+
+    const Vector<Ref<BindGroupLayout>> m_bindGroupLayouts;
 };
 
 } // namespace WebGPU

Modified: trunk/Source/WebGPU/WebGPU/PipelineLayout.mm (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/PipelineLayout.mm	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/PipelineLayout.mm	2022-02-21 21:27:46 UTC (rev 290264)
@@ -26,6 +26,7 @@
 #import "config.h"
 #import "PipelineLayout.h"
 
+#import "BindGroupLayout.h"
 #import "Device.h"
 
 namespace WebGPU {
@@ -32,17 +33,28 @@
 
 RefPtr<PipelineLayout> Device::createPipelineLayout(const WGPUPipelineLayoutDescriptor* descriptor)
 {
-    UNUSED_PARAM(descriptor);
-    return PipelineLayout::create();
+    if (descriptor->nextInChain)
+        return nullptr;
+
+    Vector<Ref<BindGroupLayout>> bindGroupLayouts;
+    bindGroupLayouts.reserveInitialCapacity(descriptor->bindGroupLayoutCount);
+    for (uint32_t i = 0; i < descriptor->bindGroupLayoutCount; ++i) {
+        const auto* bindGroupLayout = descriptor->bindGroupLayouts[i];
+        bindGroupLayouts.uncheckedAppend(bindGroupLayout->bindGroupLayout);
+    }
+    return PipelineLayout::create(WTFMove(bindGroupLayouts));
 }
 
-PipelineLayout::PipelineLayout() = default;
+PipelineLayout::PipelineLayout(Vector<Ref<BindGroupLayout>>&& bindGroupLayouts)
+    : m_bindGroupLayouts(WTFMove(bindGroupLayouts))
+{
+}
 
 PipelineLayout::~PipelineLayout() = default;
 
-void PipelineLayout::setLabel(const char* label)
+void PipelineLayout::setLabel(const char*)
 {
-    UNUSED_PARAM(label);
+    // There is no Metal object that represents a pipeline layout.
 }
 
 }

Modified: trunk/Source/WebGPU/WebGPU/Sampler.h (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/Sampler.h	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/Sampler.h	2022-02-21 21:27:46 UTC (rev 290264)
@@ -43,6 +43,8 @@
 
     void setLabel(const char*);
 
+    id <MTLSamplerState> samplerState() const { return m_samplerState; }
+
 private:
     Sampler(id <MTLSamplerState>);
 

Modified: trunk/Source/WebGPU/WebGPU/Sampler.mm (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/Sampler.mm	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/Sampler.mm	2022-02-21 21:27:46 UTC (rev 290264)
@@ -39,7 +39,6 @@
 Sampler::Sampler(id <MTLSamplerState> samplerState)
     : m_samplerState(samplerState)
 {
-    UNUSED_VARIABLE(m_samplerState);
 }
 
 Sampler::~Sampler() = default;

Modified: trunk/Source/WebGPU/WebGPU/TextureView.h (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/TextureView.h	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/TextureView.h	2022-02-21 21:27:46 UTC (rev 290264)
@@ -43,6 +43,8 @@
 
     void setLabel(const char*);
 
+    id <MTLTexture> texture() const { return m_texture; }
+
 private:
     TextureView(id <MTLTexture>);
 

Modified: trunk/Source/WebGPU/WebGPU/TextureView.mm (290263 => 290264)


--- trunk/Source/WebGPU/WebGPU/TextureView.mm	2022-02-21 21:20:12 UTC (rev 290263)
+++ trunk/Source/WebGPU/WebGPU/TextureView.mm	2022-02-21 21:27:46 UTC (rev 290264)
@@ -32,7 +32,6 @@
 TextureView::TextureView(id <MTLTexture> texture)
     : m_texture(texture)
 {
-    UNUSED_VARIABLE(m_texture);
 }
 
 TextureView::~TextureView() = default;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to