| Differences between
and this patch
- a/Source/WebGPU/ChangeLog +54 lines
Lines 1-3 a/Source/WebGPU/ChangeLog_sec1
1
2022-02-19  Myles C. Maxfield  <mmaxfield@apple.com>
2
3
        [WebGPU] Tracer bullet part 9: Basic implementation of bindings
4
        https://bugs.webkit.org/show_bug.cgi?id=236903
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        This is a basic implementation of the BindGroup, BindGroupLayout, and PipelineLayout methods.
9
        Eventually we'll want to suballocate multiple BindGroups so they coexist within the same Buffer,
10
        but this is an initial simple implementation that doesn't do that.
11
12
        * WebGPU/BindGroup.h:
13
        (WebGPU::BindGroup::vertexArgumentBuffer const):
14
        (WebGPU::BindGroup::fragmentArgumentBuffer const):
15
        (WebGPU::BindGroup::computeArgumentBuffer const):
16
        * WebGPU/BindGroup.mm:
17
        (WebGPU::bufferIsPresent):
18
        (WebGPU::samplerIsPresent):
19
        (WebGPU::textureViewIsPresent):
20
        (WebGPU::Device::createBindGroup):
21
        (WebGPU::BindGroup::BindGroup):
22
        (WebGPU::BindGroup::setLabel):
23
        * WebGPU/BindGroupLayout.h:
24
        (WebGPU::BindGroupLayout::vertexArgumentEncoder const):
25
        (WebGPU::BindGroupLayout::fragmentArgumentEncoder const):
26
        (WebGPU::BindGroupLayout::computeArgumentEncoder const):
27
        * WebGPU/BindGroupLayout.mm:
28
        (WebGPU::isPresent):
29
        (WebGPU::createArgumentDescriptor):
30
        (WebGPU::Device::createBindGroupLayout):
31
        (WebGPU::BindGroupLayout::BindGroupLayout):
32
        (WebGPU::BindGroupLayout::setLabel):
33
        (WebGPU::BindGroupLayout::encodedLength const):
34
        * WebGPU/Buffer.h:
35
        (WebGPU::Buffer::buffer const):
36
        * WebGPU/Buffer.mm:
37
        (WebGPU::Buffer::Buffer):
38
        * WebGPU/PipelineLayout.h:
39
        (WebGPU::PipelineLayout::create):
40
        (WebGPU::PipelineLayout::numberOfBindGroupLayouts const):
41
        (WebGPU::PipelineLayout::bindGroupLayout const):
42
        * WebGPU/PipelineLayout.mm:
43
        (WebGPU::Device::createPipelineLayout):
44
        (WebGPU::PipelineLayout::PipelineLayout):
45
        (WebGPU::PipelineLayout::setLabel):
46
        * WebGPU/Sampler.h:
47
        (WebGPU::Sampler::samplerState const):
48
        * WebGPU/Sampler.mm:
49
        (WebGPU::Sampler::Sampler):
50
        * WebGPU/TextureView.h:
51
        (WebGPU::TextureView::texture const):
52
        * WebGPU/TextureView.mm:
53
        (WebGPU::TextureView::TextureView):
54
1
2022-02-19  Myles C. Maxfield  <mmaxfield@apple.com>
55
2022-02-19  Myles C. Maxfield  <mmaxfield@apple.com>
2
56
3
        [WebGPU] Tracer bullet part 8: Basic implementation of device creation routines
57
        [WebGPU] Tracer bullet part 8: Basic implementation of device creation routines
- a/Source/WebGPU/WebGPU/BindGroup.h +4 lines
Lines 43-48 public: a/Source/WebGPU/WebGPU/BindGroup.h_sec1
43
43
44
    void setLabel(const char*);
44
    void setLabel(const char*);
45
45
46
    id <MTLBuffer> vertexArgumentBuffer() const { return m_vertexArgumentBuffer; }
47
    id <MTLBuffer> fragmentArgumentBuffer() const { return m_fragmentArgumentBuffer; }
48
    id <MTLBuffer> computeArgumentBuffer() const { return m_computeArgumentBuffer; }
49
46
private:
50
private:
47
    BindGroup(id <MTLBuffer> vertexArgumentBuffer, id <MTLBuffer> fragmentArgumentBuffer, id <MTLBuffer> computeArgumentBuffer);
51
    BindGroup(id <MTLBuffer> vertexArgumentBuffer, id <MTLBuffer> fragmentArgumentBuffer, id <MTLBuffer> computeArgumentBuffer);
48
52
- a/Source/WebGPU/WebGPU/BindGroup.mm -6 / +82 lines
Lines 26-39 a/Source/WebGPU/WebGPU/BindGroup.mm_sec1
26
#import "config.h"
26
#import "config.h"
27
#import "BindGroup.h"
27
#import "BindGroup.h"
28
28
29
#import "BindGroupLayout.h"
30
#import "Buffer.h"
29
#import "Device.h"
31
#import "Device.h"
32
#import "Sampler.h"
33
#import "TextureView.h"
30
34
31
namespace WebGPU {
35
namespace WebGPU {
32
36
37
static bool bufferIsPresent(const WGPUBindGroupEntry& entry)
38
{
39
    return entry.buffer;
40
}
41
42
static bool samplerIsPresent(const WGPUBindGroupEntry& entry)
43
{
44
    return entry.sampler;
45
}
46
47
static bool textureViewIsPresent(const WGPUBindGroupEntry& entry)
48
{
49
    return entry.textureView;
50
}
51
33
RefPtr<BindGroup> Device::createBindGroup(const WGPUBindGroupDescriptor* descriptor)
52
RefPtr<BindGroup> Device::createBindGroup(const WGPUBindGroupDescriptor* descriptor)
34
{
53
{
35
    UNUSED_PARAM(descriptor);
54
    if (descriptor->nextInChain)
36
    return BindGroup::create(nil, nil, nil);
55
        return nullptr;
56
57
    const BindGroupLayout& bindGroupLayout = descriptor->layout->bindGroupLayout;
58
59
    // FIXME: Don't allocate 3 new buffers for every bind group.
60
    // In fact, don't even allocate a single new buffer for every bind group.
61
    id <MTLBuffer> vertexArgumentBuffer = [m_device newBufferWithLength:bindGroupLayout.encodedLength() options:MTLResourceStorageModeShared];
62
    id <MTLBuffer> fragmentArgumentBuffer = [m_device newBufferWithLength:bindGroupLayout.encodedLength() options:MTLResourceStorageModeShared];
63
    id <MTLBuffer> computeArgumentBuffer = [m_device newBufferWithLength:bindGroupLayout.encodedLength() options:MTLResourceStorageModeShared];
64
    if (!vertexArgumentBuffer || !fragmentArgumentBuffer || !computeArgumentBuffer)
65
        return nullptr;
66
67
    auto label = [NSString stringWithCString:descriptor->label encoding:NSUTF8StringEncoding];
68
    vertexArgumentBuffer.label = label;
69
    fragmentArgumentBuffer.label = label;
70
    computeArgumentBuffer.label = label;
71
72
    id <MTLArgumentEncoder> vertexArgumentEncoder = bindGroupLayout.vertexArgumentEncoder();
73
    id <MTLArgumentEncoder> fragmentArgumentEncoder = bindGroupLayout.fragmentArgumentEncoder();
74
    id <MTLArgumentEncoder> computeArgumentEncoder = bindGroupLayout.computeArgumentEncoder();
75
    [vertexArgumentEncoder setArgumentBuffer:vertexArgumentBuffer offset:0];
76
    [fragmentArgumentEncoder setArgumentBuffer:fragmentArgumentBuffer offset:0];
77
    [computeArgumentEncoder setArgumentBuffer:computeArgumentBuffer offset:0];
78
79
    for (uint32_t i = 0; i < descriptor->entryCount; ++i) {
80
        const WGPUBindGroupEntry& entry = descriptor->entries[i];
81
82
        if (entry.nextInChain)
83
            return nullptr;
84
85
        bool bufferIsPresent = WebGPU::bufferIsPresent(entry);
86
        bool samplerIsPresent = WebGPU::samplerIsPresent(entry);
87
        bool textureViewIsPresent = WebGPU::textureViewIsPresent(entry);
88
        if (static_cast<int>(bufferIsPresent) + static_cast<int>(samplerIsPresent) + static_cast<int>(textureViewIsPresent) != 1)
89
            return nullptr;
90
91
        if (bufferIsPresent) {
92
            id <MTLBuffer> buffer = entry.buffer->buffer->buffer();
93
            [vertexArgumentEncoder setBuffer:buffer offset:entry.offset atIndex:entry.binding];
94
            [fragmentArgumentEncoder setBuffer:buffer offset:entry.offset atIndex:entry.binding];
95
            [computeArgumentEncoder setBuffer:buffer offset:entry.offset atIndex:entry.binding];
96
        } else if (samplerIsPresent) {
97
            id <MTLSamplerState> sampler = entry.sampler->sampler->samplerState();
98
            [vertexArgumentEncoder setSamplerState:sampler atIndex:entry.binding];
99
            [fragmentArgumentEncoder setSamplerState:sampler atIndex:entry.binding];
100
            [computeArgumentEncoder setSamplerState:sampler atIndex:entry.binding];
101
        } else if (textureViewIsPresent) {
102
            id <MTLTexture> texture = entry.textureView->textureView->texture();
103
            [vertexArgumentEncoder setTexture:texture atIndex:entry.binding];
104
            [fragmentArgumentEncoder setTexture:texture atIndex:entry.binding];
105
            [computeArgumentEncoder setTexture:texture atIndex:entry.binding];
106
        } else {
107
            ASSERT_NOT_REACHED();
108
            return nullptr;
109
        }
110
    }
111
112
    return BindGroup::create(vertexArgumentBuffer, fragmentArgumentBuffer, computeArgumentBuffer);
37
}
113
}
38
114
39
BindGroup::BindGroup(id <MTLBuffer> vertexArgumentBuffer, id <MTLBuffer> fragmentArgumentBuffer, id <MTLBuffer> computeArgumentBuffer)
115
BindGroup::BindGroup(id <MTLBuffer> vertexArgumentBuffer, id <MTLBuffer> fragmentArgumentBuffer, id <MTLBuffer> computeArgumentBuffer)
Lines 41-56 BindGroup::BindGroup(id <MTLBuffer> vertexArgumentBuffer, id <MTLBuffer> fragmen a/Source/WebGPU/WebGPU/BindGroup.mm_sec2
41
    , m_fragmentArgumentBuffer(fragmentArgumentBuffer)
117
    , m_fragmentArgumentBuffer(fragmentArgumentBuffer)
42
    , m_computeArgumentBuffer(computeArgumentBuffer)
118
    , m_computeArgumentBuffer(computeArgumentBuffer)
43
{
119
{
44
    UNUSED_VARIABLE(m_vertexArgumentBuffer);
45
    UNUSED_VARIABLE(m_fragmentArgumentBuffer);
46
    UNUSED_VARIABLE(m_computeArgumentBuffer);
47
}
120
}
48
121
49
BindGroup::~BindGroup() = default;
122
BindGroup::~BindGroup() = default;
50
123
51
void BindGroup::setLabel(const char* label)
124
void BindGroup::setLabel(const char* label)
52
{
125
{
53
    UNUSED_PARAM(label);
126
    auto labelString = [NSString stringWithCString:label encoding:NSUTF8StringEncoding];
127
    m_vertexArgumentBuffer.label = labelString;
128
    m_fragmentArgumentBuffer.label = labelString;
129
    m_computeArgumentBuffer.label = labelString;
54
}
130
}
55
131
56
}
132
}
- a/Source/WebGPU/WebGPU/BindGroupLayout.h +6 lines
Lines 43-48 public: a/Source/WebGPU/WebGPU/BindGroupLayout.h_sec1
43
43
44
    void setLabel(const char*);
44
    void setLabel(const char*);
45
45
46
    NSUInteger encodedLength() const;
47
48
    id <MTLArgumentEncoder> vertexArgumentEncoder() const { return m_vertexArgumentEncoder; }
49
    id <MTLArgumentEncoder> fragmentArgumentEncoder() const { return m_fragmentArgumentEncoder; }
50
    id <MTLArgumentEncoder> computeArgumentEncoder() const { return m_computeArgumentEncoder; }
51
46
private:
52
private:
47
    BindGroupLayout(id <MTLArgumentEncoder> vertexArgumentEncoder, id <MTLArgumentEncoder> fragmentArgumentEncoder, id <MTLArgumentEncoder> computeArgumentEncoder);
53
    BindGroupLayout(id <MTLArgumentEncoder> vertexArgumentEncoder, id <MTLArgumentEncoder> fragmentArgumentEncoder, id <MTLArgumentEncoder> computeArgumentEncoder);
48
54
- a/Source/WebGPU/WebGPU/BindGroupLayout.mm -6 / +191 lines
Lines 30-39 a/Source/WebGPU/WebGPU/BindGroupLayout.mm_sec1
30
30
31
namespace WebGPU {
31
namespace WebGPU {
32
32
33
static bool isPresent(const WGPUBufferBindingLayout& buffer)
34
{
35
    return buffer.type != WGPUBufferBindingType_Undefined;
36
}
37
38
static MTLArgumentDescriptor *createArgumentDescriptor(const WGPUBufferBindingLayout& buffer)
39
{
40
    if (buffer.nextInChain)
41
        return nil;
42
43
    auto descriptor = [MTLArgumentDescriptor new];
44
    descriptor.dataType = MTLDataTypePointer;
45
    // FIXME: Handle hasDynamicOffset.
46
    // FIXME: Handle minBindingSize.
47
    switch (buffer.type) {
48
    case WGPUBufferBindingType_Uniform:
49
    case WGPUBufferBindingType_ReadOnlyStorage:
50
        descriptor.access = MTLArgumentAccessReadOnly;
51
        break;
52
    case WGPUBufferBindingType_Storage:
53
        descriptor.access = MTLArgumentAccessReadWrite;
54
        break;
55
    default:
56
        return nil;
57
    }
58
    return descriptor;
59
}
60
61
static bool isPresent(const WGPUSamplerBindingLayout& sampler)
62
{
63
    return sampler.type != WGPUSamplerBindingType_Undefined;
64
}
65
66
static MTLArgumentDescriptor *createArgumentDescriptor(const WGPUSamplerBindingLayout& sampler)
67
{
68
    if (sampler.nextInChain)
69
        return nil;
70
71
    UNUSED_PARAM(sampler);
72
    auto descriptor = [MTLArgumentDescriptor new];
73
    descriptor.dataType = MTLDataTypeSampler;
74
    // FIXME: Implement this.
75
    return descriptor;
76
}
77
78
static bool isPresent(const WGPUTextureBindingLayout& texture)
79
{
80
    return texture.sampleType != WGPUTextureSampleType_Undefined
81
        && texture.viewDimension != WGPUTextureViewDimension_Undefined;
82
}
83
84
static MTLArgumentDescriptor *createArgumentDescriptor(const WGPUTextureBindingLayout& texture)
85
{
86
    if (texture.nextInChain)
87
        return nil;
88
89
    UNUSED_PARAM(texture);
90
    auto descriptor = [MTLArgumentDescriptor new];
91
    descriptor.dataType = MTLDataTypeTexture;
92
    // FIXME: Implement this.
93
    return descriptor;
94
}
95
96
static bool isPresent(const WGPUStorageTextureBindingLayout& storageTexture)
97
{
98
    return storageTexture.access != WGPUStorageTextureAccess_Undefined
99
        && storageTexture.format != WGPUTextureFormat_Undefined
100
        && storageTexture.viewDimension != WGPUTextureViewDimension_Undefined;
101
}
102
103
static MTLArgumentDescriptor *createArgumentDescriptor(const WGPUStorageTextureBindingLayout& storageTexture)
104
{
105
    if (storageTexture.nextInChain)
106
        return nil;
107
108
    UNUSED_PARAM(storageTexture);
109
    auto descriptor = [MTLArgumentDescriptor new];
110
    descriptor.dataType = MTLDataTypeTexture;
111
    // FIXME: Implement this.
112
    return descriptor;
113
}
114
33
RefPtr<BindGroupLayout> Device::createBindGroupLayout(const WGPUBindGroupLayoutDescriptor* descriptor)
115
RefPtr<BindGroupLayout> Device::createBindGroupLayout(const WGPUBindGroupLayoutDescriptor* descriptor)
34
{
116
{
35
    UNUSED_PARAM(descriptor);
117
if (descriptor->nextInChain)
36
    return BindGroupLayout::create(nil, nil, nil);
118
        return nullptr;
119
120
    NSMutableArray<MTLArgumentDescriptor *> *vertexArguments = [NSMutableArray arrayWithCapacity:descriptor->entryCount];
121
    NSMutableArray<MTLArgumentDescriptor *> *fragmentArguments = [NSMutableArray arrayWithCapacity:descriptor->entryCount];
122
    NSMutableArray<MTLArgumentDescriptor *> *computeArguments = [NSMutableArray arrayWithCapacity:descriptor->entryCount];
123
    if (!vertexArguments || !fragmentArguments || !computeArguments)
124
        return nullptr;
125
126
    for (uint32_t i = 0; i < descriptor->entryCount; ++i) {
127
        const WGPUBindGroupLayoutEntry& entry = descriptor->entries[i];
128
        if (entry.nextInChain)
129
            return nullptr;
130
131
        // https://gpuweb.github.io/gpuweb/#dictdef-gpubindgrouplayoutentry
132
        // "Only one [of buffer, sampler, texture, storageTexture, or externalTexture] may be defined for any given GPUBindGroupLayoutEntry."
133
134
        ASSERT(i == vertexArguments.count);
135
        ASSERT(vertexArguments.count == fragmentArguments.count);
136
        ASSERT(fragmentArguments.count == computeArguments.count);
137
138
        const WGPUBufferBindingLayout& buffer = entry.buffer;
139
        const WGPUSamplerBindingLayout& sampler = entry.sampler;
140
        const WGPUTextureBindingLayout& texture = entry.texture;
141
        const WGPUStorageTextureBindingLayout& storageTexture = entry.storageTexture;
142
143
        MTLArgumentDescriptor *descriptor = nil;
144
145
        if (isPresent(buffer)) {
146
            if (i != vertexArguments.count)
147
                return nullptr;
148
149
            descriptor = createArgumentDescriptor(buffer);
150
            if (!descriptor)
151
                return nullptr;
152
        }
153
154
        if (isPresent(sampler)) {
155
            if (i != vertexArguments.count)
156
                return nullptr;
157
158
            descriptor = createArgumentDescriptor(sampler);
159
            if (!descriptor)
160
                return nullptr;
161
        }
162
163
        if (isPresent(texture)) {
164
            if (i != vertexArguments.count)
165
                return nullptr;
166
167
            descriptor = createArgumentDescriptor(texture);
168
            if (!descriptor)
169
                return nullptr;
170
        }
171
172
        if (isPresent(storageTexture)) {
173
            if (i != vertexArguments.count)
174
                return nullptr;
175
176
            descriptor = createArgumentDescriptor(storageTexture);
177
            if (!descriptor)
178
                return nullptr;
179
        }
180
181
        // FIXME: This needs coordination with the shader compiler.
182
        descriptor.index = i;
183
184
        MTLArgumentDescriptor *vertexDescriptor = descriptor;
185
        MTLArgumentDescriptor *fragmentDescriptor = [descriptor copy];
186
        MTLArgumentDescriptor *computeDescriptor = [descriptor copy];
187
        if (!fragmentDescriptor || !computeDescriptor)
188
            return nullptr;
189
190
        if (!(entry.visibility & WGPUShaderStage_Vertex))
191
            vertexDescriptor.access = MTLArgumentAccessReadOnly;
192
        if (!(entry.visibility & WGPUShaderStage_Fragment))
193
            fragmentDescriptor.access = MTLArgumentAccessReadOnly;
194
        if (!(entry.visibility & WGPUShaderStage_Compute))
195
            computeDescriptor.access = MTLArgumentAccessReadOnly;
196
197
        [vertexArguments addObject:vertexDescriptor];
198
        [fragmentArguments addObject:fragmentDescriptor];
199
        [computeArguments addObject:computeDescriptor];
200
    }
201
202
    id <MTLArgumentEncoder> vertexArgumentEncoder = [m_device newArgumentEncoderWithArguments:vertexArguments];
203
    id <MTLArgumentEncoder> fragmentArgumentEncoder = [m_device newArgumentEncoderWithArguments:fragmentArguments];
204
    id <MTLArgumentEncoder> computeArgumentEncoder = [m_device newArgumentEncoderWithArguments:computeArguments];
205
    if (!vertexArgumentEncoder || !fragmentArgumentEncoder || !computeArgumentEncoder)
206
        return nullptr;
207
208
    auto label = [NSString stringWithCString:descriptor->label encoding:NSUTF8StringEncoding];
209
    vertexArgumentEncoder.label = label;
210
    fragmentArgumentEncoder.label = label;
211
    computeArgumentEncoder.label = label;
212
213
    return BindGroupLayout::create(vertexArgumentEncoder, fragmentArgumentEncoder, computeArgumentEncoder);
37
}
214
}
38
215
39
BindGroupLayout::BindGroupLayout(id <MTLArgumentEncoder> vertexArgumentEncoder, id <MTLArgumentEncoder> fragmentArgumentEncoder, id <MTLArgumentEncoder> computeArgumentEncoder)
216
BindGroupLayout::BindGroupLayout(id <MTLArgumentEncoder> vertexArgumentEncoder, id <MTLArgumentEncoder> fragmentArgumentEncoder, id <MTLArgumentEncoder> computeArgumentEncoder)
Lines 41-56 BindGroupLayout::BindGroupLayout(id <MTLArgumentEncoder> vertexArgumentEncoder, a/Source/WebGPU/WebGPU/BindGroupLayout.mm_sec2
41
    , m_fragmentArgumentEncoder(fragmentArgumentEncoder)
218
    , m_fragmentArgumentEncoder(fragmentArgumentEncoder)
42
    , m_computeArgumentEncoder(computeArgumentEncoder)
219
    , m_computeArgumentEncoder(computeArgumentEncoder)
43
{
220
{
44
    UNUSED_VARIABLE(m_vertexArgumentEncoder);
45
    UNUSED_VARIABLE(m_fragmentArgumentEncoder);
46
    UNUSED_VARIABLE(m_computeArgumentEncoder);
47
}
221
}
48
222
49
BindGroupLayout::~BindGroupLayout() = default;
223
BindGroupLayout::~BindGroupLayout() = default;
50
224
51
void BindGroupLayout::setLabel(const char* label)
225
void BindGroupLayout::setLabel(const char* label)
52
{
226
{
53
    UNUSED_PARAM(label);
227
    auto labelString = [NSString stringWithCString:label encoding:NSUTF8StringEncoding];
228
    m_vertexArgumentEncoder.label = labelString;
229
    m_fragmentArgumentEncoder.label = labelString;
230
    m_computeArgumentEncoder.label = labelString;
231
}
232
233
NSUInteger BindGroupLayout::encodedLength() const
234
{
235
    auto result = m_vertexArgumentEncoder.encodedLength;
236
    ASSERT(result == m_fragmentArgumentEncoder.encodedLength);
237
    ASSERT(result == m_computeArgumentEncoder.encodedLength);
238
    return result;
54
}
239
}
55
240
56
}
241
}
- a/Source/WebGPU/WebGPU/Buffer.h +2 lines
Lines 49-54 public: a/Source/WebGPU/WebGPU/Buffer.h_sec1
49
    void unmap();
49
    void unmap();
50
    void setLabel(const char*);
50
    void setLabel(const char*);
51
51
52
    id <MTLBuffer> buffer() const { return m_buffer; }
53
52
private:
54
private:
53
    Buffer(id <MTLBuffer>);
55
    Buffer(id <MTLBuffer>);
54
56
- a/Source/WebGPU/WebGPU/Buffer.mm -1 lines
Lines 39-45 RefPtr<Buffer> Device::createBuffer(const WGPUBufferDescriptor* descriptor) a/Source/WebGPU/WebGPU/Buffer.mm_sec1
39
Buffer::Buffer(id <MTLBuffer> buffer)
39
Buffer::Buffer(id <MTLBuffer> buffer)
40
    : m_buffer(buffer)
40
    : m_buffer(buffer)
41
{
41
{
42
    UNUSED_VARIABLE(m_buffer);
43
}
42
}
44
43
45
Buffer::~Buffer() = default;
44
Buffer::~Buffer() = default;
- a/Source/WebGPU/WebGPU/PipelineLayout.h -3 / +11 lines
Lines 28-50 a/Source/WebGPU/WebGPU/PipelineLayout.h_sec1
28
#import <wtf/FastMalloc.h>
28
#import <wtf/FastMalloc.h>
29
#import <wtf/Ref.h>
29
#import <wtf/Ref.h>
30
#import <wtf/RefCounted.h>
30
#import <wtf/RefCounted.h>
31
#import <wtf/Vector.h>
31
32
32
namespace WebGPU {
33
namespace WebGPU {
33
34
35
class BindGroupLayout;
36
34
class PipelineLayout : public RefCounted<PipelineLayout> {
37
class PipelineLayout : public RefCounted<PipelineLayout> {
35
    WTF_MAKE_FAST_ALLOCATED;
38
    WTF_MAKE_FAST_ALLOCATED;
36
public:
39
public:
37
    static Ref<PipelineLayout> create()
40
    static Ref<PipelineLayout> create(Vector<Ref<BindGroupLayout>>&& bindGroupLayouts)
38
    {
41
    {
39
        return adoptRef(*new PipelineLayout());
42
        return adoptRef(*new PipelineLayout(WTFMove(bindGroupLayouts)));
40
    }
43
    }
41
44
42
    ~PipelineLayout();
45
    ~PipelineLayout();
43
46
44
    void setLabel(const char*);
47
    void setLabel(const char*);
45
48
49
    size_t numberOfBindGroupLayouts() const { return m_bindGroupLayouts.size(); }
50
    const BindGroupLayout& bindGroupLayout(size_t i) const { return m_bindGroupLayouts[i]; }
51
46
private:
52
private:
47
    PipelineLayout();
53
    PipelineLayout(Vector<Ref<BindGroupLayout>>&&);
54
55
    const Vector<Ref<BindGroupLayout>> m_bindGroupLayouts;
48
};
56
};
49
57
50
} // namespace WebGPU
58
} // namespace WebGPU
- a/Source/WebGPU/WebGPU/PipelineLayout.mm -5 / +17 lines
Lines 26-48 a/Source/WebGPU/WebGPU/PipelineLayout.mm_sec1
26
#import "config.h"
26
#import "config.h"
27
#import "PipelineLayout.h"
27
#import "PipelineLayout.h"
28
28
29
#import "BindGroupLayout.h"
29
#import "Device.h"
30
#import "Device.h"
30
31
31
namespace WebGPU {
32
namespace WebGPU {
32
33
33
RefPtr<PipelineLayout> Device::createPipelineLayout(const WGPUPipelineLayoutDescriptor* descriptor)
34
RefPtr<PipelineLayout> Device::createPipelineLayout(const WGPUPipelineLayoutDescriptor* descriptor)
34
{
35
{
35
    UNUSED_PARAM(descriptor);
36
    if (descriptor->nextInChain)
36
    return PipelineLayout::create();
37
        return nullptr;
38
39
    Vector<Ref<BindGroupLayout>> bindGroupLayouts;
40
    bindGroupLayouts.reserveInitialCapacity(descriptor->bindGroupLayoutCount);
41
    for (uint32_t i = 0; i < descriptor->bindGroupLayoutCount; ++i) {
42
        const auto* bindGroupLayout = descriptor->bindGroupLayouts[i];
43
        bindGroupLayouts.uncheckedAppend(bindGroupLayout->bindGroupLayout);
44
    }
45
    return PipelineLayout::create(WTFMove(bindGroupLayouts));
37
}
46
}
38
47
39
PipelineLayout::PipelineLayout() = default;
48
PipelineLayout::PipelineLayout(Vector<Ref<BindGroupLayout>>&& bindGroupLayouts)
49
    : m_bindGroupLayouts(WTFMove(bindGroupLayouts))
50
{
51
}
40
52
41
PipelineLayout::~PipelineLayout() = default;
53
PipelineLayout::~PipelineLayout() = default;
42
54
43
void PipelineLayout::setLabel(const char* label)
55
void PipelineLayout::setLabel(const char*)
44
{
56
{
45
    UNUSED_PARAM(label);
57
    // There is no Metal object that represents a pipeline layout.
46
}
58
}
47
59
48
}
60
}
- a/Source/WebGPU/WebGPU/Sampler.h +2 lines
Lines 43-48 public: a/Source/WebGPU/WebGPU/Sampler.h_sec1
43
43
44
    void setLabel(const char*);
44
    void setLabel(const char*);
45
45
46
    id <MTLSamplerState> samplerState() const { return m_samplerState; }
47
46
private:
48
private:
47
    Sampler(id <MTLSamplerState>);
49
    Sampler(id <MTLSamplerState>);
48
50
- a/Source/WebGPU/WebGPU/Sampler.mm -1 lines
Lines 39-45 RefPtr<Sampler> Device::createSampler(const WGPUSamplerDescriptor* descriptor) a/Source/WebGPU/WebGPU/Sampler.mm_sec1
39
Sampler::Sampler(id <MTLSamplerState> samplerState)
39
Sampler::Sampler(id <MTLSamplerState> samplerState)
40
    : m_samplerState(samplerState)
40
    : m_samplerState(samplerState)
41
{
41
{
42
    UNUSED_VARIABLE(m_samplerState);
43
}
42
}
44
43
45
Sampler::~Sampler() = default;
44
Sampler::~Sampler() = default;
- a/Source/WebGPU/WebGPU/TextureView.h +2 lines
Lines 43-48 public: a/Source/WebGPU/WebGPU/TextureView.h_sec1
43
43
44
    void setLabel(const char*);
44
    void setLabel(const char*);
45
45
46
    id <MTLTexture> texture() const { return m_texture; }
47
46
private:
48
private:
47
    TextureView(id <MTLTexture>);
49
    TextureView(id <MTLTexture>);
48
50
- a/Source/WebGPU/WebGPU/TextureView.mm -1 lines
Lines 32-38 namespace WebGPU { a/Source/WebGPU/WebGPU/TextureView.mm_sec1
32
TextureView::TextureView(id <MTLTexture> texture)
32
TextureView::TextureView(id <MTLTexture> texture)
33
    : m_texture(texture)
33
    : m_texture(texture)
34
{
34
{
35
    UNUSED_VARIABLE(m_texture);
36
}
35
}
37
36
38
TextureView::~TextureView() = default;
37
TextureView::~TextureView() = default;

Return to Bug 236903