Skip to content

Commit 34c4b48

Browse files
committed
Unreviewed, reverting 293885@main (479d743)
https://bugs.webkit.org/show_bug.cgi?id=289480 rdar://146676364 [WebGPU] GPURenderPassEncoder.drawIndexed takes significant time in GPU process Re-land of https://bugs.webkit.org/show_bug.cgi?id=289480 which regression fixed, specifically setVertex/FragmentBytes: would bypass the buffer cache. Reverted change: Revert "[WebGPU] GPURenderPassEncoder.drawIndexed takes significant time in GPU process" https://bugs.webkit.org/show_bug.cgi?id=289480 rdar://146676364 293885@main (479d743) Canonical link: https://commits.webkit.org/293947@main
1 parent 94049f5 commit 34c4b48

30 files changed

+663
-351
lines changed

Source/WebCore/Modules/WebGPU/Implementation/WebGPUComputePassEncoderImpl.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,12 @@ void ComputePassEncoderImpl::end()
7171
void ComputePassEncoderImpl::setBindGroup(Index32 index, const BindGroup& bindGroup,
7272
std::optional<Vector<BufferDynamicOffset>>&& offsets)
7373
{
74-
auto backingOffsets = valueOrDefault(offsets);
75-
wgpuComputePassEncoderSetBindGroup(m_backing.get(), index, protectedConvertToBackingContext()->convertToBacking(bindGroup), static_cast<uint32_t>(backingOffsets.size()), backingOffsets.data());
74+
wgpuComputePassEncoderSetBindGroup(m_backing.get(), index, protectedConvertToBackingContext()->convertToBacking(bindGroup), WTFMove(offsets));
7675
}
7776

78-
void ComputePassEncoderImpl::setBindGroup(Index32 index, const BindGroup& bindGroup,
79-
std::span<const uint32_t> dynamicOffsetsArrayBuffer,
80-
Size64 dynamicOffsetsDataStart,
81-
Size32 dynamicOffsetsDataLength)
77+
void ComputePassEncoderImpl::setBindGroup(Index32, const BindGroup&, std::span<const uint32_t>, Size64, Size32)
8278
{
83-
wgpuComputePassEncoderSetBindGroup(m_backing.get(), index, protectedConvertToBackingContext()->convertToBacking(bindGroup), dynamicOffsetsDataLength, dynamicOffsetsArrayBuffer.subspan(dynamicOffsetsDataStart).data());
79+
RELEASE_ASSERT_NOT_REACHED();
8480
}
8581

8682
void ComputePassEncoderImpl::pushDebugGroup(String&& groupLabel)

Source/WebCore/Modules/WebGPU/Implementation/WebGPURenderPassEncoderImpl.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,12 @@ void RenderPassEncoderImpl::drawIndexedIndirect(const Buffer& indirectBuffer, Si
9191
void RenderPassEncoderImpl::setBindGroup(Index32 index, const BindGroup& bindGroup,
9292
std::optional<Vector<BufferDynamicOffset>>&& dynamicOffsets)
9393
{
94-
auto backingOffsets = valueOrDefault(dynamicOffsets);
95-
wgpuRenderPassEncoderSetBindGroup(m_backing.get(), index, protectedConvertToBackingContext()->convertToBacking(bindGroup), backingOffsets.size(), backingOffsets.data());
94+
wgpuRenderPassEncoderSetBindGroup(m_backing.get(), index, protectedConvertToBackingContext()->convertToBacking(bindGroup), WTFMove(dynamicOffsets));
9695
}
9796

98-
void RenderPassEncoderImpl::setBindGroup(Index32 index, const BindGroup& bindGroup,
99-
std::span<const uint32_t> dynamicOffsetsArrayBuffer,
100-
Size64 dynamicOffsetsDataStart,
101-
Size32 dynamicOffsetsDataLength)
97+
void RenderPassEncoderImpl::setBindGroup(Index32, const BindGroup&, std::span<const uint32_t>, Size64, Size32)
10298
{
103-
// FIXME: Use checked algebra.
104-
wgpuRenderPassEncoderSetBindGroup(m_backing.get(), index, protectedConvertToBackingContext()->convertToBacking(bindGroup), dynamicOffsetsDataLength, dynamicOffsetsArrayBuffer.subspan(dynamicOffsetsDataStart).data());
99+
RELEASE_ASSERT_NOT_REACHED();
105100
}
106101

107102
void RenderPassEncoderImpl::pushDebugGroup(String&& groupLabel)

Source/WebGPU/WebGPU/BindGroup.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ class BindGroup : public RefCountedAndCanMakeWeakPtr<BindGroup>, public WGPUBind
6868

6969
static constexpr MTLRenderStages MTLRenderStageCompute = static_cast<MTLRenderStages>(0);
7070
static constexpr MTLRenderStages MTLRenderStageUndefined = static_cast<MTLRenderStages>(MTLRenderStageFragment + 1);
71-
static Ref<BindGroup> create(id<MTLBuffer> vertexArgumentBuffer, id<MTLBuffer> fragmentArgumentBuffer, id<MTLBuffer> computeArgumentBuffer, Vector<BindableResources>&& resources, const BindGroupLayout& bindGroupLayout, DynamicBuffersContainer&& dynamicBuffers, SamplersContainer&& samplers, ShaderStageArray<ExternalTextureIndices>&& externalTextureIndices, Device& device)
71+
static Ref<BindGroup> create(id<MTLBuffer> vertexArgumentBuffer, id<MTLBuffer> fragmentArgumentBuffer, id<MTLBuffer> computeArgumentBuffer, Vector<BindableResources>&& resources, const BindGroupLayout& bindGroupLayout, DynamicBuffersContainer&& dynamicBuffers, SamplersContainer&& samplers, ShaderStageArray<ExternalTextureIndices>&& externalTextureIndices, uint32_t uniqueIdentifier, Device& device)
7272
{
73-
return adoptRef(*new BindGroup(vertexArgumentBuffer, fragmentArgumentBuffer, computeArgumentBuffer, WTFMove(resources), bindGroupLayout, WTFMove(dynamicBuffers), WTFMove(samplers), WTFMove(externalTextureIndices), device));
73+
return adoptRef(*new BindGroup(vertexArgumentBuffer, fragmentArgumentBuffer, computeArgumentBuffer, WTFMove(resources), bindGroupLayout, WTFMove(dynamicBuffers), WTFMove(samplers), WTFMove(externalTextureIndices), uniqueIdentifier, device));
7474
}
7575
static Ref<BindGroup> createInvalid(Device& device)
7676
{
@@ -104,9 +104,13 @@ class BindGroup : public RefCountedAndCanMakeWeakPtr<BindGroup>, public WGPUBind
104104
bool updateExternalTextures(ExternalTexture&);
105105
bool makeSubmitInvalid(ShaderStage, const BindGroupLayout*) const;
106106
const SamplersContainer& samplers() const { return m_samplers; }
107+
uint32_t uniqueId() const { return m_uniqueIdentifier; }
108+
void validatedSuccessfully(uint32_t groupIndex, uint64_t pipelineIndex, uint32_t maxOffset) const;
109+
bool previouslyValidatedBindGroup(uint32_t groupIndex, uint64_t pipelineIndex, uint32_t maxOffset) const;
110+
bool hasSamplers() const { return m_samplers.size(); }
107111

108112
private:
109-
BindGroup(id<MTLBuffer> vertexArgumentBuffer, id<MTLBuffer> fragmentArgumentBuffer, id<MTLBuffer> computeArgumentBuffer, Vector<BindableResources>&&, const BindGroupLayout&, DynamicBuffersContainer&&, SamplersContainer&&, ShaderStageArray<ExternalTextureIndices>&&, Device&);
113+
BindGroup(id<MTLBuffer> vertexArgumentBuffer, id<MTLBuffer> fragmentArgumentBuffer, id<MTLBuffer> computeArgumentBuffer, Vector<BindableResources>&&, const BindGroupLayout&, DynamicBuffersContainer&&, SamplersContainer&&, ShaderStageArray<ExternalTextureIndices>&&, uint32_t uniqueIdentifier, Device&);
110114
BindGroup(Device&);
111115

112116
const id<MTLBuffer> m_vertexArgumentBuffer { nil };
@@ -118,8 +122,10 @@ class BindGroup : public RefCountedAndCanMakeWeakPtr<BindGroup>, public WGPUBind
118122
RefPtr<const BindGroupLayout> m_bindGroupLayout;
119123
DynamicBuffersContainer m_dynamicBuffers;
120124
HashMap<uint32_t, uint32_t, DefaultHash<uint32_t>, WTF::UnsignedWithZeroKeyHashTraits<uint32_t>> m_dynamicOffsetsIndices;
125+
mutable HashMap<uint64_t, uint32_t, DefaultHash<uint64_t>, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>> m_validatedBindGroup;
121126
SamplersContainer m_samplers;
122127
ShaderStageArray<ExternalTextureIndices> m_externalTextureIndices;
128+
uint32_t m_uniqueIdentifier { 0 };
123129
};
124130

125131
} // namespace WebGPU

Source/WebGPU/WebGPU/BindGroup.mm

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -938,7 +938,8 @@ static BindGroupEntryUsageData makeBindGroupEntryUsageData(BindGroupEntryUsage u
938938
BindGroup::ShaderStageArray<BindGroupLayout::ArgumentIndices> argumentIndices;
939939
for (ShaderStage stage : stages) {
940940
auto encodedLength = bindGroupLayout->encodedLength(stage);
941-
argumentBuffer[stage] = encodedLength ? safeCreateBuffer(encodedLength, MTLStorageModeShared) : nil;
941+
if (encodedLength)
942+
argumentBuffer[stage] = safeCreateBuffer(encodedLength, MTLStorageModeShared);
942943
[argumentEncoder[stage] setArgumentBuffer:argumentBuffer[stage] offset:0];
943944
argumentIndices[stage] = bindGroupLayout->argumentIndices(stage);
944945
}
@@ -998,7 +999,7 @@ static BindGroupEntryUsageData makeBindGroupEntryUsageData(BindGroupEntryUsage u
998999
bool isDestroyed = apiBuffer->isDestroyed();
9991000
if (isDestroyed && stage != ShaderStage::Undefined) {
10001001
argumentEncoder[stage] = nil;
1001-
argumentBuffer[stage] = nil;
1002+
argumentBuffer[stage] = { };
10021003
}
10031004

10041005
auto entryOffset = isDestroyed ? 0 : entry.offset;
@@ -1142,7 +1143,7 @@ static BindGroupEntryUsageData makeBindGroupEntryUsageData(BindGroupEntryUsage u
11421143
}
11431144
} else if (stage != ShaderStage::Undefined) {
11441145
argumentEncoder[stage] = nil;
1145-
argumentBuffer[stage] = nil;
1146+
argumentBuffer[stage] = { };
11461147
}
11471148

11481149
if (stage != ShaderStage::Undefined) {
@@ -1235,7 +1236,13 @@ static BindGroupEntryUsageData makeBindGroupEntryUsageData(BindGroupEntryUsage u
12351236
std::sort(dynamicBuffers.begin(), dynamicBuffers.end(), [](const BindGroup::BufferAndType& a, const BindGroup::BufferAndType& b) {
12361237
return a.bindingIndex < b.bindingIndex;
12371238
});
1238-
return BindGroup::create(argumentBuffer[ShaderStage::Vertex], argumentBuffer[ShaderStage::Fragment], argumentBuffer[ShaderStage::Compute], WTFMove(resources), bindGroupLayout, WTFMove(dynamicBuffers), WTFMove(samplersSet), WTFMove(externalTextureIndices), *this);
1239+
1240+
if (m_bindGroupId == std::numeric_limits<decltype(m_bindGroupId)>::max()) {
1241+
loseTheDevice(WGPUDeviceLostReason_Undefined);
1242+
return BindGroup::createInvalid(*this);
1243+
}
1244+
1245+
return BindGroup::create(argumentBuffer[ShaderStage::Vertex], argumentBuffer[ShaderStage::Fragment], argumentBuffer[ShaderStage::Compute], WTFMove(resources), bindGroupLayout, WTFMove(dynamicBuffers), WTFMove(samplersSet), WTFMove(externalTextureIndices), ++m_bindGroupId, *this);
12391246
#undef VALIDATION_ERROR
12401247
#undef INTERNAL_ERROR_STRING
12411248
}
@@ -1245,7 +1252,7 @@ static BindGroupEntryUsageData makeBindGroupEntryUsageData(BindGroupEntryUsage u
12451252
return !!bindGroupLayout();
12461253
}
12471254

1248-
BindGroup::BindGroup(id<MTLBuffer> vertexArgumentBuffer, id<MTLBuffer> fragmentArgumentBuffer, id<MTLBuffer> computeArgumentBuffer, Vector<BindableResources>&& resources, const BindGroupLayout& bindGroupLayout, DynamicBuffersContainer&& dynamicBuffers, SamplersContainer&& samplers, ShaderStageArray<ExternalTextureIndices>&& externalTextureIndices, Device& device)
1255+
BindGroup::BindGroup(id<MTLBuffer> vertexArgumentBuffer, id<MTLBuffer> fragmentArgumentBuffer, id<MTLBuffer> computeArgumentBuffer, Vector<BindableResources>&& resources, const BindGroupLayout& bindGroupLayout, DynamicBuffersContainer&& dynamicBuffers, SamplersContainer&& samplers, ShaderStageArray<ExternalTextureIndices>&& externalTextureIndices, uint32_t uniqueIdentifier, Device& device)
12491256
: m_vertexArgumentBuffer(vertexArgumentBuffer)
12501257
, m_fragmentArgumentBuffer(fragmentArgumentBuffer)
12511258
, m_computeArgumentBuffer(computeArgumentBuffer)
@@ -1255,6 +1262,7 @@ static BindGroupEntryUsageData makeBindGroupEntryUsageData(BindGroupEntryUsage u
12551262
, m_dynamicBuffers(WTFMove(dynamicBuffers))
12561263
, m_samplers(WTFMove(samplers))
12571264
, m_externalTextureIndices(WTFMove(externalTextureIndices))
1265+
, m_uniqueIdentifier(uniqueIdentifier)
12581266
{
12591267
for (size_t index = 0, maxIndex = m_dynamicBuffers.size(); index < maxIndex; ++index)
12601268
m_dynamicOffsetsIndices.add(m_dynamicBuffers[index].bindingIndex, index);
@@ -1443,6 +1451,23 @@ static bool WARN_UNUSED_RETURN setArgumentBuffer(id<MTLArgumentEncoder> encoder,
14431451
return true;
14441452
}
14451453

1454+
static uint64_t makePipelineBindGroupKey(uint32_t groupIndex, uint64_t pipelineIndex)
1455+
{
1456+
return static_cast<uint64_t>(groupIndex) | (pipelineIndex << Device::maxBindGroups);
1457+
}
1458+
1459+
void BindGroup::validatedSuccessfully(uint32_t groupIndex, uint64_t pipelineIndex, uint32_t maxOffset) const
1460+
{
1461+
auto it = m_validatedBindGroup.add(makePipelineBindGroupKey(groupIndex, pipelineIndex), maxOffset).iterator;
1462+
it->value = std::max(it->value, maxOffset);
1463+
}
1464+
1465+
bool BindGroup::previouslyValidatedBindGroup(uint32_t groupIndex, uint64_t pipelineIndex, uint32_t maxOffset) const
1466+
{
1467+
auto it = m_validatedBindGroup.find(makePipelineBindGroupKey(groupIndex, pipelineIndex));
1468+
return it != m_validatedBindGroup.end() && it->value >= maxOffset;
1469+
}
1470+
14461471
} // namespace WebGPU
14471472

14481473
#pragma mark WGPU Stubs

Source/WebGPU/WebGPU/BindGroupLayout.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ class BindGroupLayout : public RefCountedAndCanMakeWeakPtr<BindGroupLayout>, pub
8181
using StageMapTable = HashMap<uint64_t, StageMapValue, DefaultHash<uint64_t>, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>>;
8282
using ArgumentIndices = HashSet<uint32_t, IntHash<uint32_t>, WTF::UnsignedWithZeroKeyHashTraits<uint32_t>>;
8383

84-
static Ref<BindGroupLayout> create(StageMapTable&& stageMapTable, id<MTLArgumentEncoder> vertexArgumentEncoder, id<MTLArgumentEncoder> fragmentArgumentEncoder, id<MTLArgumentEncoder> computeArgumentEncoder, EntriesContainer&& entries, size_t sizeOfVertexDynamicOffsets, size_t sizeOfFragmentDynamicOffsets, size_t sizeOfComputeDynamicOffsets, bool isAutoGenerated, ShaderStageArray<uint32_t>&& uniformBuffersPerStage, ShaderStageArray<uint32_t>&& storageBuffersPerStage, ShaderStageArray<uint32_t>&& samplersPerStage, ShaderStageArray<uint32_t>&& texturesPerStage, ShaderStageArray<uint32_t>&& storageTexturesPerStage, uint32_t dynamicUniformBuffers, uint32_t dynamicStorageBuffers, ShaderStageArray<ArgumentIndices>&& argumentIndices, const Device& device)
84+
static Ref<BindGroupLayout> create(StageMapTable&& stageMapTable, id<MTLArgumentEncoder> vertexArgumentEncoder, id<MTLArgumentEncoder> fragmentArgumentEncoder, id<MTLArgumentEncoder> computeArgumentEncoder, EntriesContainer&& entries, size_t sizeOfVertexDynamicOffsets, size_t sizeOfFragmentDynamicOffsets, size_t sizeOfComputeDynamicOffsets, bool isAutoGenerated, ShaderStageArray<uint32_t>&& uniformBuffersPerStage, ShaderStageArray<uint32_t>&& storageBuffersPerStage, ShaderStageArray<uint32_t>&& samplersPerStage, ShaderStageArray<uint32_t>&& texturesPerStage, ShaderStageArray<uint32_t>&& storageTexturesPerStage, uint32_t dynamicUniformBuffers, uint32_t dynamicStorageBuffers, ShaderStageArray<ArgumentIndices>&& argumentIndices, uint32_t identifier, const Device& device)
8585
{
86-
return adoptRef(*new BindGroupLayout(WTFMove(stageMapTable), vertexArgumentEncoder, fragmentArgumentEncoder, computeArgumentEncoder, WTFMove(entries), sizeOfVertexDynamicOffsets, sizeOfFragmentDynamicOffsets, sizeOfComputeDynamicOffsets, isAutoGenerated, WTFMove(uniformBuffersPerStage), WTFMove(storageBuffersPerStage), WTFMove(samplersPerStage), WTFMove(texturesPerStage), WTFMove(storageTexturesPerStage), dynamicUniformBuffers, dynamicStorageBuffers, WTFMove(argumentIndices), device));
86+
return adoptRef(*new BindGroupLayout(WTFMove(stageMapTable), vertexArgumentEncoder, fragmentArgumentEncoder, computeArgumentEncoder, WTFMove(entries), sizeOfVertexDynamicOffsets, sizeOfFragmentDynamicOffsets, sizeOfComputeDynamicOffsets, isAutoGenerated, WTFMove(uniformBuffersPerStage), WTFMove(storageBuffersPerStage), WTFMove(samplersPerStage), WTFMove(texturesPerStage), WTFMove(storageTexturesPerStage), dynamicUniformBuffers, dynamicStorageBuffers, WTFMove(argumentIndices), identifier, device));
8787
}
8888
static Ref<BindGroupLayout> createInvalid(const Device& device)
8989
{
@@ -129,12 +129,13 @@ class BindGroupLayout : public RefCountedAndCanMakeWeakPtr<BindGroupLayout>, pub
129129
uint32_t dynamicUniformBuffers() const;
130130
uint32_t dynamicStorageBuffers() const;
131131
uint32_t dynamicBufferCount() const;
132-
NSString* errorValidatingDynamicOffsets(std::span<const uint32_t>, const BindGroup&) const;
132+
NSString* errorValidatingDynamicOffsets(std::span<const uint32_t>, const BindGroup&, uint32_t& maxOffset) const;
133133
NSString* errorValidatingBindGroupCompatibility(const BindGroupLayout&) const;
134134
static bool equalBindingEntries(const BindGroupLayout::Entry::BindingLayout&, const BindGroupLayout::Entry::BindingLayout&);
135135
const ArgumentIndices& argumentIndices(ShaderStage) const;
136+
uint32_t uniqueId() const { return m_uniqueIdentifier; }
136137
private:
137-
BindGroupLayout(StageMapTable&&, id<MTLArgumentEncoder>, id<MTLArgumentEncoder>, id<MTLArgumentEncoder>, EntriesContainer&&, size_t sizeOfVertexDynamicOffsets, size_t sizeOfFragmentDynamicOffsets, size_t sizeOfComputeDynamicOffsets, bool isAutoGenerated, ShaderStageArray<uint32_t>&& uniformBuffersPerStage, ShaderStageArray<uint32_t>&& storageBuffersPerStage, ShaderStageArray<uint32_t>&& samplersPerStage, ShaderStageArray<uint32_t>&& texturesPerStage, ShaderStageArray<uint32_t>&& storageTexturesPerStage, uint32_t dynamicUniformBuffers, uint32_t dynamicStorageBuffers, ShaderStageArray<ArgumentIndices>&&, const Device&);
138+
BindGroupLayout(StageMapTable&&, id<MTLArgumentEncoder>, id<MTLArgumentEncoder>, id<MTLArgumentEncoder>, EntriesContainer&&, size_t sizeOfVertexDynamicOffsets, size_t sizeOfFragmentDynamicOffsets, size_t sizeOfComputeDynamicOffsets, bool isAutoGenerated, ShaderStageArray<uint32_t>&& uniformBuffersPerStage, ShaderStageArray<uint32_t>&& storageBuffersPerStage, ShaderStageArray<uint32_t>&& samplersPerStage, ShaderStageArray<uint32_t>&& texturesPerStage, ShaderStageArray<uint32_t>&& storageTexturesPerStage, uint32_t dynamicUniformBuffers, uint32_t dynamicStorageBuffers, ShaderStageArray<ArgumentIndices>&&, uint32_t identifier, const Device&);
138139
explicit BindGroupLayout(const Device&);
139140

140141
const StageMapTable m_indicesForBinding;
@@ -160,6 +161,7 @@ class BindGroupLayout : public RefCountedAndCanMakeWeakPtr<BindGroupLayout>, pub
160161
ShaderStageArray<ArgumentIndices> m_argumentIndices;
161162
uint32_t m_dynamicUniformBuffers { 0 };
162163
uint32_t m_dynamicStorageBuffers { 0 };
164+
uint32_t m_uniqueIdentifier { 0 };
163165
};
164166

165167
} // namespace WebGPU

0 commit comments

Comments
 (0)