Use more ityp helpers for VertexBufferSlot.
Bug: dawn:2222
Change-Id: I255f7780d20592559c2b6d20ee92878aee7e804e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/164320
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/native/CommandBufferStateTracker.cpp b/src/dawn/native/CommandBufferStateTracker.cpp
index 4946180..309da4d 100644
--- a/src/dawn/native/CommandBufferStateTracker.cpp
+++ b/src/dawn/native/CommandBufferStateTracker.cpp
@@ -397,10 +397,10 @@
RenderPipelineBase* lastRenderPipeline = GetRenderPipeline();
- const ityp::bitset<VertexBufferSlot, kMaxVertexBuffers>& vertexBufferSlotsUsedAsVertexBuffer =
- lastRenderPipeline->GetVertexBufferSlotsUsedAsVertexBuffer();
+ const auto& vertexBuffersUsedAsVertexBuffer =
+ lastRenderPipeline->GetVertexBuffersUsedAsVertexBuffer();
- for (auto usedSlotVertex : IterateBitSet(vertexBufferSlotsUsedAsVertexBuffer)) {
+ for (auto usedSlotVertex : IterateBitSet(vertexBuffersUsedAsVertexBuffer)) {
const VertexBufferInfo& vertexBuffer = lastRenderPipeline->GetVertexBuffer(usedSlotVertex);
uint64_t arrayStride = vertexBuffer.arrayStride;
uint64_t bufferSize = mVertexBufferSizes[usedSlotVertex];
@@ -443,10 +443,10 @@
RenderPipelineBase* lastRenderPipeline = GetRenderPipeline();
- const ityp::bitset<VertexBufferSlot, kMaxVertexBuffers>& vertexBufferSlotsUsedAsInstanceBuffer =
- lastRenderPipeline->GetVertexBufferSlotsUsedAsInstanceBuffer();
+ const auto& vertexBuffersUsedAsInstanceBuffer =
+ lastRenderPipeline->GetVertexBuffersUsedAsInstanceBuffer();
- for (auto usedSlotInstance : IterateBitSet(vertexBufferSlotsUsedAsInstanceBuffer)) {
+ for (auto usedSlotInstance : IterateBitSet(vertexBuffersUsedAsInstanceBuffer)) {
const VertexBufferInfo& vertexBuffer =
lastRenderPipeline->GetVertexBuffer(usedSlotInstance);
uint64_t arrayStride = vertexBuffer.arrayStride;
@@ -548,9 +548,8 @@
if (aspects[VALIDATION_ASPECT_VERTEX_BUFFERS]) {
RenderPipelineBase* lastRenderPipeline = GetRenderPipeline();
- const ityp::bitset<VertexBufferSlot, kMaxVertexBuffers>& requiredVertexBuffers =
- lastRenderPipeline->GetVertexBufferSlotsUsed();
- if (IsSubset(requiredVertexBuffers, mVertexBufferSlotsUsed)) {
+ const auto& requiredVertexBuffers = lastRenderPipeline->GetVertexBuffersUsed();
+ if (IsSubset(requiredVertexBuffers, mVertexBuffersUsed)) {
mAspects.set(VALIDATION_ASPECT_VERTEX_BUFFERS);
}
}
@@ -601,8 +600,8 @@
if (aspects[VALIDATION_ASPECT_VERTEX_BUFFERS]) {
// Try to be helpful by finding one missing vertex buffer to surface in the error message.
- const ityp::bitset<VertexBufferSlot, kMaxVertexBuffers> missingVertexBuffers =
- GetRenderPipeline()->GetVertexBufferSlotsUsed() & ~mVertexBufferSlotsUsed;
+ const auto missingVertexBuffers =
+ GetRenderPipeline()->GetVertexBuffersUsed() & ~mVertexBuffersUsed;
DAWN_ASSERT(missingVertexBuffers.any());
VertexBufferSlot firstMissing = ityp::Sub(GetHighestBitIndexPlusOne(missingVertexBuffers),
@@ -758,13 +757,13 @@
}
void CommandBufferStateTracker::UnsetVertexBuffer(VertexBufferSlot slot) {
- mVertexBufferSlotsUsed.set(slot, false);
+ mVertexBuffersUsed.set(slot, false);
mVertexBufferSizes[slot] = 0;
mAspects.reset(VALIDATION_ASPECT_VERTEX_BUFFERS);
}
void CommandBufferStateTracker::SetVertexBuffer(VertexBufferSlot slot, uint64_t size) {
- mVertexBufferSlotsUsed.set(slot);
+ mVertexBuffersUsed.set(slot);
mVertexBufferSizes[slot] = size;
}
diff --git a/src/dawn/native/CommandBufferStateTracker.h b/src/dawn/native/CommandBufferStateTracker.h
index 64ea127..a7c8dc4 100644
--- a/src/dawn/native/CommandBufferStateTracker.h
+++ b/src/dawn/native/CommandBufferStateTracker.h
@@ -94,13 +94,14 @@
ityp::array<BindGroupIndex, BindGroupBase*, kMaxBindGroups> mBindgroups = {};
ityp::array<BindGroupIndex, std::vector<uint32_t>, kMaxBindGroups> mDynamicOffsets = {};
- ityp::bitset<VertexBufferSlot, kMaxVertexBuffers> mVertexBufferSlotsUsed;
+
+ VertexBufferMask mVertexBuffersUsed;
+ PerVertexBuffer<uint64_t> mVertexBufferSizes = {};
+
bool mIndexBufferSet = false;
wgpu::IndexFormat mIndexFormat;
uint64_t mIndexBufferSize = 0;
- ityp::array<VertexBufferSlot, uint64_t, kMaxVertexBuffers> mVertexBufferSizes = {};
-
PipelineLayoutBase* mLastPipelineLayout = nullptr;
PipelineBase* mLastPipeline = nullptr;
diff --git a/src/dawn/native/IntegerTypes.h b/src/dawn/native/IntegerTypes.h
index 913aba7..890cf12 100644
--- a/src/dawn/native/IntegerTypes.h
+++ b/src/dawn/native/IntegerTypes.h
@@ -33,6 +33,22 @@
#include "dawn/common/Constants.h"
#include "dawn/common/TypedInteger.h"
+namespace dawn::ityp {
+template <typename Index, typename Value, size_t Size>
+class array;
+
+template <typename Index, size_t N>
+class bitset;
+} // namespace dawn::ityp
+
+// This files creates a number of integer types using ityp to represent the zoo of indices used all
+// over the codebase, so that the semantic of numbers is clear from the types, but also so it is
+// harder to use the wrong type to index into array, bitsets and other containers.
+//
+// In addition various container type aliases are declared so that they have a consistent name
+// everywhere and don't need explicit sizing with the kMaxStuff constants. Respective ityp::
+// headers still need to be #included in the files using them though.
+
namespace dawn::native {
// Binding numbers in the shader and BindGroup/BindGroupLayoutDescriptors
@@ -49,10 +65,16 @@
constexpr ColorAttachmentIndex kMaxColorAttachmentsTyped =
ColorAttachmentIndex(kMaxColorAttachments);
+// Vertex buffer slots represent the `slot` passed in calls to SetVertexBuffer or the index in the
+// wgpu::VertexState::vertexBuffers
using VertexBufferSlot = TypedInteger<struct VertexBufferSlotT, uint8_t>;
-using VertexAttributeLocation = TypedInteger<struct VertexAttributeLocationT, uint8_t>;
-
constexpr VertexBufferSlot kMaxVertexBuffersTyped = VertexBufferSlot(kMaxVertexBuffers);
+
+using VertexBufferMask = ityp::bitset<VertexBufferSlot, kMaxVertexBuffers>;
+template <typename Value>
+using PerVertexBuffer = ityp::array<VertexBufferSlot, Value, kMaxVertexBuffers>;
+
+using VertexAttributeLocation = TypedInteger<struct VertexAttributeLocationT, uint8_t>;
constexpr VertexAttributeLocation kMaxVertexAttributesTyped =
VertexAttributeLocation(kMaxVertexAttributes);
diff --git a/src/dawn/native/RenderPipeline.cpp b/src/dawn/native/RenderPipeline.cpp
index 4e5f572..a97e479 100644
--- a/src/dawn/native/RenderPipeline.cpp
+++ b/src/dawn/native/RenderPipeline.cpp
@@ -835,53 +835,53 @@
GetRenderStagesAndSetPlaceholderShader(device, descriptor)),
mAttachmentState(device->GetOrCreateAttachmentState(descriptor, GetLayout())) {
mVertexBufferCount = descriptor->vertex.bufferCount;
- const VertexBufferLayout* buffers = descriptor->vertex.buffers;
- for (uint8_t slot = 0; slot < mVertexBufferCount; ++slot) {
+
+ auto buffers =
+ ityp::SpanFromUntyped<VertexBufferSlot>(descriptor->vertex.buffers, mVertexBufferCount);
+ for (auto [slot, buffer] : Enumerate(buffers)) {
// Skip unused slots
- if (buffers[slot].stepMode == wgpu::VertexStepMode::VertexBufferNotUsed) {
+ if (buffer.stepMode == wgpu::VertexStepMode::VertexBufferNotUsed) {
continue;
}
- VertexBufferSlot typedSlot(slot);
-
- mVertexBufferSlotsUsed.set(typedSlot);
- mVertexBufferInfos[typedSlot].arrayStride = buffers[slot].arrayStride;
- mVertexBufferInfos[typedSlot].stepMode = buffers[slot].stepMode;
- mVertexBufferInfos[typedSlot].usedBytesInStride = 0;
- mVertexBufferInfos[typedSlot].lastStride = 0;
- switch (buffers[slot].stepMode) {
+ mVertexBuffersUsed.set(slot);
+ mVertexBufferInfos[slot].arrayStride = buffer.arrayStride;
+ mVertexBufferInfos[slot].stepMode = buffer.stepMode;
+ mVertexBufferInfos[slot].usedBytesInStride = 0;
+ mVertexBufferInfos[slot].lastStride = 0;
+ switch (buffer.stepMode) {
case wgpu::VertexStepMode::Vertex:
- mVertexBufferSlotsUsedAsVertexBuffer.set(typedSlot);
+ mVertexBuffersUsedAsVertexBuffer.set(slot);
break;
case wgpu::VertexStepMode::Instance:
- mVertexBufferSlotsUsedAsInstanceBuffer.set(typedSlot);
+ mVertexBuffersUsedAsInstanceBuffer.set(slot);
break;
default:
DAWN_UNREACHABLE();
}
- for (uint32_t i = 0; i < buffers[slot].attributeCount; ++i) {
- VertexAttributeLocation location = VertexAttributeLocation(
- static_cast<uint8_t>(buffers[slot].attributes[i].shaderLocation));
+ auto attributes = ityp::SpanFromUntyped<size_t>(buffer.attributes, buffer.attributeCount);
+ for (auto [i, attribute] : Enumerate(attributes)) {
+ VertexAttributeLocation location =
+ VertexAttributeLocation(static_cast<uint8_t>(attribute.shaderLocation));
+
mAttributeLocationsUsed.set(location);
mAttributeInfos[location].shaderLocation = location;
- mAttributeInfos[location].vertexBufferSlot = typedSlot;
- mAttributeInfos[location].offset = buffers[slot].attributes[i].offset;
- mAttributeInfos[location].format = buffers[slot].attributes[i].format;
+ mAttributeInfos[location].vertexBufferSlot = slot;
+ mAttributeInfos[location].offset = attribute.offset;
+ mAttributeInfos[location].format = attribute.format;
// Compute the access boundary of this attribute by adding attribute format size to
// attribute offset. Although offset is in uint64_t, such sum must be no larger than
// maxVertexBufferArrayStride (2048), which is promised by the GPUVertexBufferLayout
// validation of creating render pipeline. Therefore, calculating in uint16_t will
// cause no overflow.
- uint32_t formatByteSize =
- GetVertexFormatInfo(buffers[slot].attributes[i].format).byteSize;
- DAWN_ASSERT(buffers[slot].attributes[i].offset <= 2048);
- uint16_t accessBoundary =
- uint16_t(buffers[slot].attributes[i].offset) + uint16_t(formatByteSize);
- mVertexBufferInfos[typedSlot].usedBytesInStride =
- std::max(mVertexBufferInfos[typedSlot].usedBytesInStride, accessBoundary);
- mVertexBufferInfos[typedSlot].lastStride =
- std::max(mVertexBufferInfos[typedSlot].lastStride,
+ uint32_t formatByteSize = GetVertexFormatInfo(attribute.format).byteSize;
+ DAWN_ASSERT(attribute.offset <= 2048);
+ uint16_t accessBoundary = uint16_t(attribute.offset) + uint16_t(formatByteSize);
+ mVertexBufferInfos[slot].usedBytesInStride =
+ std::max(mVertexBufferInfos[slot].usedBytesInStride, accessBoundary);
+ mVertexBufferInfos[slot].lastStride =
+ std::max(mVertexBufferInfos[slot].lastStride,
mAttributeInfos[location].offset + formatByteSize);
}
}
@@ -1017,27 +1017,24 @@
return mAttributeInfos[location];
}
-const ityp::bitset<VertexBufferSlot, kMaxVertexBuffers>&
-RenderPipelineBase::GetVertexBufferSlotsUsed() const {
+const VertexBufferMask& RenderPipelineBase::GetVertexBuffersUsed() const {
DAWN_ASSERT(!IsError());
- return mVertexBufferSlotsUsed;
+ return mVertexBuffersUsed;
}
-const ityp::bitset<VertexBufferSlot, kMaxVertexBuffers>&
-RenderPipelineBase::GetVertexBufferSlotsUsedAsVertexBuffer() const {
+const VertexBufferMask& RenderPipelineBase::GetVertexBuffersUsedAsVertexBuffer() const {
DAWN_ASSERT(!IsError());
- return mVertexBufferSlotsUsedAsVertexBuffer;
+ return mVertexBuffersUsedAsVertexBuffer;
}
-const ityp::bitset<VertexBufferSlot, kMaxVertexBuffers>&
-RenderPipelineBase::GetVertexBufferSlotsUsedAsInstanceBuffer() const {
+const VertexBufferMask& RenderPipelineBase::GetVertexBuffersUsedAsInstanceBuffer() const {
DAWN_ASSERT(!IsError());
- return mVertexBufferSlotsUsedAsInstanceBuffer;
+ return mVertexBuffersUsedAsInstanceBuffer;
}
const VertexBufferInfo& RenderPipelineBase::GetVertexBuffer(VertexBufferSlot slot) const {
DAWN_ASSERT(!IsError());
- DAWN_ASSERT(mVertexBufferSlotsUsed[slot]);
+ DAWN_ASSERT(mVertexBuffersUsed[slot]);
return mVertexBufferInfos[slot];
}
@@ -1201,8 +1198,8 @@
recorder.Record(desc.shaderLocation, desc.vertexBufferSlot, desc.offset, desc.format);
}
- recorder.Record(mVertexBufferSlotsUsed);
- for (VertexBufferSlot slot : IterateBitSet(mVertexBufferSlotsUsed)) {
+ recorder.Record(mVertexBuffersUsed);
+ for (VertexBufferSlot slot : IterateBitSet(mVertexBuffersUsed)) {
const VertexBufferInfo& desc = GetVertexBuffer(slot);
recorder.Record(desc.arrayStride, desc.stepMode);
}
@@ -1306,11 +1303,11 @@
}
}
- if (a->mVertexBufferSlotsUsed != b->mVertexBufferSlotsUsed) {
+ if (a->mVertexBuffersUsed != b->mVertexBuffersUsed) {
return false;
}
- for (VertexBufferSlot slot : IterateBitSet(a->mVertexBufferSlotsUsed)) {
+ for (VertexBufferSlot slot : IterateBitSet(a->mVertexBuffersUsed)) {
const VertexBufferInfo& descA = a->GetVertexBuffer(slot);
const VertexBufferInfo& descB = b->GetVertexBuffer(slot);
if (descA.arrayStride != descB.arrayStride || descA.stepMode != descB.stepMode) {
diff --git a/src/dawn/native/RenderPipeline.h b/src/dawn/native/RenderPipeline.h
index 9ba6f0c..359249a 100644
--- a/src/dawn/native/RenderPipeline.h
+++ b/src/dawn/native/RenderPipeline.h
@@ -33,7 +33,6 @@
#include <vector>
#include "dawn/common/ContentLessObjectCacheable.h"
-#include "dawn/common/TypedInteger.h"
#include "dawn/native/AttachmentState.h"
#include "dawn/native/Forward.h"
#include "dawn/native/IntegerTypes.h"
@@ -102,11 +101,9 @@
const ityp::bitset<VertexAttributeLocation, kMaxVertexAttributes>& GetAttributeLocationsUsed()
const;
const VertexAttributeInfo& GetAttribute(VertexAttributeLocation location) const;
- const ityp::bitset<VertexBufferSlot, kMaxVertexBuffers>& GetVertexBufferSlotsUsed() const;
- const ityp::bitset<VertexBufferSlot, kMaxVertexBuffers>&
- GetVertexBufferSlotsUsedAsVertexBuffer() const;
- const ityp::bitset<VertexBufferSlot, kMaxVertexBuffers>&
- GetVertexBufferSlotsUsedAsInstanceBuffer() const;
+ const VertexBufferMask& GetVertexBuffersUsed() const;
+ const VertexBufferMask& GetVertexBuffersUsedAsVertexBuffer() const;
+ const VertexBufferMask& GetVertexBuffersUsedAsInstanceBuffer() const;
const VertexBufferInfo& GetVertexBuffer(VertexBufferSlot slot) const;
uint32_t GetVertexBufferCount() const;
@@ -154,10 +151,10 @@
uint32_t mVertexBufferCount;
ityp::bitset<VertexAttributeLocation, kMaxVertexAttributes> mAttributeLocationsUsed;
ityp::array<VertexAttributeLocation, VertexAttributeInfo, kMaxVertexAttributes> mAttributeInfos;
- ityp::bitset<VertexBufferSlot, kMaxVertexBuffers> mVertexBufferSlotsUsed;
- ityp::bitset<VertexBufferSlot, kMaxVertexBuffers> mVertexBufferSlotsUsedAsVertexBuffer;
- ityp::bitset<VertexBufferSlot, kMaxVertexBuffers> mVertexBufferSlotsUsedAsInstanceBuffer;
- ityp::array<VertexBufferSlot, VertexBufferInfo, kMaxVertexBuffers> mVertexBufferInfos;
+ VertexBufferMask mVertexBuffersUsed;
+ VertexBufferMask mVertexBuffersUsedAsVertexBuffer;
+ VertexBufferMask mVertexBuffersUsedAsInstanceBuffer;
+ PerVertexBuffer<VertexBufferInfo> mVertexBufferInfos;
// Attachments
Ref<AttachmentState> mAttachmentState;
diff --git a/src/dawn/native/TintUtils.cpp b/src/dawn/native/TintUtils.cpp
index 0736045..534e82f 100644
--- a/src/dawn/native/TintUtils.cpp
+++ b/src/dawn/native/TintUtils.cpp
@@ -178,7 +178,7 @@
cfg.pulling_group = static_cast<uint32_t>(pullingBufferBindingSet);
cfg.vertex_state.resize(renderPipeline.GetVertexBufferCount());
- for (VertexBufferSlot slot : IterateBitSet(renderPipeline.GetVertexBufferSlotsUsed())) {
+ for (VertexBufferSlot slot : IterateBitSet(renderPipeline.GetVertexBuffersUsed())) {
const VertexBufferInfo& dawnInfo = renderPipeline.GetVertexBuffer(slot);
tint::ast::transform::VertexBufferLayoutDescriptor* tintInfo =
&cfg.vertex_state[static_cast<uint8_t>(slot)];
diff --git a/src/dawn/native/d3d11/CommandBufferD3D11.cpp b/src/dawn/native/d3d11/CommandBufferD3D11.cpp
index fe550bf..49cd6e1 100644
--- a/src/dawn/native/d3d11/CommandBufferD3D11.cpp
+++ b/src/dawn/native/d3d11/CommandBufferD3D11.cpp
@@ -91,8 +91,7 @@
// If the vertex state has changed, we need to update the strides.
if (mLastAppliedRenderPipeline != renderPipeline) {
mLastAppliedRenderPipeline = renderPipeline;
- for (VertexBufferSlot slot :
- IterateBitSet(renderPipeline->GetVertexBufferSlotsUsed())) {
+ for (VertexBufferSlot slot : IterateBitSet(renderPipeline->GetVertexBuffersUsed())) {
mStrides[slot] = renderPipeline->GetVertexBuffer(slot).arrayStride;
}
}
@@ -104,9 +103,9 @@
private:
const ScopedSwapStateCommandRecordingContext* mCommandContext;
const RenderPipeline* mLastAppliedRenderPipeline = nullptr;
- ityp::array<VertexBufferSlot, ID3D11Buffer*, kMaxVertexBuffers> mD3D11Buffers = {};
- ityp::array<VertexBufferSlot, UINT, kMaxVertexBuffers> mStrides = {};
- ityp::array<VertexBufferSlot, UINT, kMaxVertexBuffers> mOffsets = {};
+ PerVertexBuffer<ID3D11Buffer*> mD3D11Buffers = {};
+ PerVertexBuffer<UINT> mStrides = {};
+ PerVertexBuffer<UINT> mOffsets = {};
};
MaybeError SynchronizeTextureBeforeUse(
diff --git a/src/dawn/native/d3d12/CommandBufferD3D12.cpp b/src/dawn/native/d3d12/CommandBufferD3D12.cpp
index 6a86747..ba6727b 100644
--- a/src/dawn/native/d3d12/CommandBufferD3D12.cpp
+++ b/src/dawn/native/d3d12/CommandBufferD3D12.cpp
@@ -664,7 +664,7 @@
public:
void OnSetVertexBuffer(VertexBufferSlot slot, Buffer* buffer, uint64_t offset, uint64_t size) {
mStartSlot = std::min(mStartSlot, slot);
- mEndSlot = std::max(mEndSlot, ityp::Add(slot, VertexBufferSlot(uint8_t(1))));
+ mEndSlot = std::max(mEndSlot, ityp::PlusOne(slot));
auto* d3d12BufferView = &mD3D12BufferViews[slot];
d3d12BufferView->BufferLocation = buffer->GetVA() + offset;
@@ -684,10 +684,9 @@
if (mLastAppliedRenderPipeline != renderPipeline) {
mLastAppliedRenderPipeline = renderPipeline;
- for (VertexBufferSlot slot :
- IterateBitSet(renderPipeline->GetVertexBufferSlotsUsed())) {
+ for (VertexBufferSlot slot : IterateBitSet(renderPipeline->GetVertexBuffersUsed())) {
startSlot = std::min(startSlot, slot);
- endSlot = std::max(endSlot, ityp::Add(slot, VertexBufferSlot(uint8_t(1))));
+ endSlot = std::max(endSlot, ityp::PlusOne(slot));
mD3D12BufferViews[slot].StrideInBytes =
renderPipeline->GetVertexBuffer(slot).arrayStride;
}
@@ -705,8 +704,8 @@
static_cast<uint8_t>(ityp::Sub(endSlot, startSlot)),
&mD3D12BufferViews[startSlot]);
- mStartSlot = VertexBufferSlot(kMaxVertexBuffers);
- mEndSlot = VertexBufferSlot(uint8_t(0));
+ mStartSlot = kMaxVertexBuffersTyped;
+ mEndSlot = {};
}
private:
@@ -716,9 +715,8 @@
// data in the middle of the range).
const RenderPipeline* mLastAppliedRenderPipeline = nullptr;
VertexBufferSlot mStartSlot{kMaxVertexBuffers};
- VertexBufferSlot mEndSlot{uint8_t(0)};
- ityp::array<VertexBufferSlot, D3D12_VERTEX_BUFFER_VIEW, kMaxVertexBuffers> mD3D12BufferViews =
- {};
+ VertexBufferSlot mEndSlot{};
+ PerVertexBuffer<D3D12_VERTEX_BUFFER_VIEW> mD3D12BufferViews = {};
};
void ResolveMultisampledRenderPass(CommandRecordingContext* commandContext,
diff --git a/src/dawn/native/metal/CommandBufferMTL.mm b/src/dawn/native/metal/CommandBufferMTL.mm
index 22f0ce5..c3d37f1 100644
--- a/src/dawn/native/metal/CommandBufferMTL.mm
+++ b/src/dawn/native/metal/CommandBufferMTL.mm
@@ -683,14 +683,13 @@
// When a new pipeline is bound we must set all the vertex buffers again because
// they might have been offset by the pipeline layout, and they might be packed
// differently from the previous pipeline.
- mDirtyVertexBuffers |= pipeline->GetVertexBufferSlotsUsed();
+ mDirtyVertexBuffers |= pipeline->GetVertexBuffersUsed();
}
void Apply(id<MTLRenderCommandEncoder> encoder,
RenderPipeline* pipeline,
bool enableVertexPulling) {
- const auto& vertexBuffersToApply =
- mDirtyVertexBuffers & pipeline->GetVertexBufferSlotsUsed();
+ const auto& vertexBuffersToApply = mDirtyVertexBuffers & pipeline->GetVertexBuffersUsed();
for (VertexBufferSlot slot : IterateBitSet(vertexBuffersToApply)) {
uint32_t metalIndex = pipeline->GetMtlVertexBufferIndex(slot);
@@ -712,10 +711,10 @@
private:
// All the indices in these arrays are Dawn vertex buffer indices
- ityp::bitset<VertexBufferSlot, kMaxVertexBuffers> mDirtyVertexBuffers;
- ityp::array<VertexBufferSlot, id<MTLBuffer>, kMaxVertexBuffers> mVertexBuffers;
- ityp::array<VertexBufferSlot, NSUInteger, kMaxVertexBuffers> mVertexBufferOffsets;
- ityp::array<VertexBufferSlot, uint32_t, kMaxVertexBuffers> mVertexBufferBindingSizes;
+ VertexBufferMask mDirtyVertexBuffers;
+ PerVertexBuffer<id<MTLBuffer>> mVertexBuffers;
+ PerVertexBuffer<NSUInteger> mVertexBufferOffsets;
+ PerVertexBuffer<uint32_t> mVertexBufferBindingSizes;
StorageBufferLengthTracker* mLengthTracker;
};
diff --git a/src/dawn/native/metal/RenderPipelineMTL.h b/src/dawn/native/metal/RenderPipelineMTL.h
index 0033dd6..51d2a3c 100644
--- a/src/dawn/native/metal/RenderPipelineMTL.h
+++ b/src/dawn/native/metal/RenderPipelineMTL.h
@@ -75,7 +75,7 @@
MTLCullMode mMtlCullMode;
NSPRef<id<MTLRenderPipelineState>> mMtlRenderPipelineState;
NSPRef<id<MTLDepthStencilState>> mMtlDepthStencilState;
- ityp::array<VertexBufferSlot, uint32_t, kMaxVertexBuffers> mMtlVertexBufferIndices;
+ PerVertexBuffer<uint32_t> mMtlVertexBufferIndices;
wgpu::ShaderStage mStagesRequiringStorageBufferLength = wgpu::ShaderStage::None;
};
diff --git a/src/dawn/native/metal/RenderPipelineMTL.mm b/src/dawn/native/metal/RenderPipelineMTL.mm
index 7c65a35..3ea2a23 100644
--- a/src/dawn/native/metal/RenderPipelineMTL.mm
+++ b/src/dawn/native/metal/RenderPipelineMTL.mm
@@ -353,7 +353,7 @@
uint32_t mtlVertexBufferIndex =
ToBackend(GetLayout())->GetBufferBindingCount(SingleShaderStage::Vertex);
- for (VertexBufferSlot slot : IterateBitSet(GetVertexBufferSlotsUsed())) {
+ for (VertexBufferSlot slot : IterateBitSet(GetVertexBuffersUsed())) {
mMtlVertexBufferIndices[slot] = mtlVertexBufferIndex;
mtlVertexBufferIndex++;
}
@@ -511,7 +511,7 @@
NSRef<MTLVertexDescriptor> RenderPipeline::MakeVertexDesc() const {
MTLVertexDescriptor* mtlVertexDescriptor = [MTLVertexDescriptor new];
- for (VertexBufferSlot slot : IterateBitSet(GetVertexBufferSlotsUsed())) {
+ for (VertexBufferSlot slot : IterateBitSet(GetVertexBuffersUsed())) {
const VertexBufferInfo& info = GetVertexBuffer(slot);
MTLVertexBufferLayoutDescriptor* layoutDesc = [MTLVertexBufferLayoutDescriptor new];
diff --git a/src/dawn/native/metal/ShaderModuleMTL.mm b/src/dawn/native/metal/ShaderModuleMTL.mm
index ab996f0..f983c20 100644
--- a/src/dawn/native/metal/ShaderModuleMTL.mm
+++ b/src/dawn/native/metal/ShaderModuleMTL.mm
@@ -213,7 +213,7 @@
vertexPullingTransformConfig =
BuildVertexPullingTransformConfig(*renderPipeline, kPullingBufferBindingSet);
- for (VertexBufferSlot slot : IterateBitSet(renderPipeline->GetVertexBufferSlotsUsed())) {
+ for (VertexBufferSlot slot : IterateBitSet(renderPipeline->GetVertexBuffersUsed())) {
uint32_t metalIndex = renderPipeline->GetMtlVertexBufferIndex(slot);
// Tell Tint to map (kPullingBufferBindingSet, slot) to this MSL buffer index.
diff --git a/src/dawn/native/opengl/CommandBufferGL.cpp b/src/dawn/native/opengl/CommandBufferGL.cpp
index ad8824d..75b10e5 100644
--- a/src/dawn/native/opengl/CommandBufferGL.cpp
+++ b/src/dawn/native/opengl/CommandBufferGL.cpp
@@ -180,7 +180,7 @@
}
mIndexBufferDirty = true;
- mDirtyVertexBuffers |= pipeline->GetVertexBufferSlotsUsed();
+ mDirtyVertexBuffers |= pipeline->GetVertexBuffersUsed();
mLastPipeline = pipeline;
}
@@ -192,7 +192,7 @@
}
for (VertexBufferSlot slot :
- IterateBitSet(mDirtyVertexBuffers & mLastPipeline->GetVertexBufferSlotsUsed())) {
+ IterateBitSet(mDirtyVertexBuffers & mLastPipeline->GetVertexBuffersUsed())) {
for (VertexAttributeLocation location :
IterateBitSet(ToBackend(mLastPipeline)->GetAttributesUsingVertexBuffer(slot))) {
const VertexAttributeInfo& attribute = mLastPipeline->GetAttribute(location);
@@ -226,9 +226,9 @@
bool mIndexBufferDirty = false;
Buffer* mIndexBuffer = nullptr;
- ityp::bitset<VertexBufferSlot, kMaxVertexBuffers> mDirtyVertexBuffers;
- ityp::array<VertexBufferSlot, Buffer*, kMaxVertexBuffers> mVertexBuffers;
- ityp::array<VertexBufferSlot, uint64_t, kMaxVertexBuffers> mVertexBufferOffsets;
+ VertexBufferMask mDirtyVertexBuffers;
+ PerVertexBuffer<Buffer*> mVertexBuffers;
+ PerVertexBuffer<uint64_t> mVertexBufferOffsets;
RenderPipelineBase* mLastPipeline = nullptr;
};
diff --git a/src/dawn/native/opengl/RenderPipelineGL.h b/src/dawn/native/opengl/RenderPipelineGL.h
index 08995e3..5028873 100644
--- a/src/dawn/native/opengl/RenderPipelineGL.h
+++ b/src/dawn/native/opengl/RenderPipelineGL.h
@@ -64,9 +64,7 @@
GLuint mVertexArrayObject;
GLenum mGlPrimitiveTopology;
- ityp::array<VertexBufferSlot,
- ityp::bitset<VertexAttributeLocation, kMaxVertexAttributes>,
- kMaxVertexBuffers>
+ PerVertexBuffer<ityp::bitset<VertexAttributeLocation, kMaxVertexAttributes>>
mAttributesUsingVertexBuffer;
};
diff --git a/src/dawn/native/vulkan/RenderPipelineVk.cpp b/src/dawn/native/vulkan/RenderPipelineVk.cpp
index 86dd907c..6b4af38 100644
--- a/src/dawn/native/vulkan/RenderPipelineVk.cpp
+++ b/src/dawn/native/vulkan/RenderPipelineVk.cpp
@@ -611,7 +611,7 @@
PipelineVertexInputStateCreateInfoTemporaryAllocations* tempAllocations) {
// Fill in the "binding info" that will be chained in the create info
uint32_t bindingCount = 0;
- for (VertexBufferSlot slot : IterateBitSet(GetVertexBufferSlotsUsed())) {
+ for (VertexBufferSlot slot : IterateBitSet(GetVertexBuffersUsed())) {
const VertexBufferInfo& bindingInfo = GetVertexBuffer(slot);
VkVertexInputBindingDescription* bindingDesc = &tempAllocations->bindings[bindingCount];