Validate zero-attribute for VertexBufferNotUsed buffers

Add a validation to ensure zero-attribute for unused vertex
buffer slots (stepMode = VertexBufferNotUsed).

Fuzz tests found that non-zero-attribute with unused vertex
buffer can cause an error in swiftshader.

We may be able to think input data having non-zero-attribute
with unused vertex buffe is malformed. Refusing such input
data can avoid the error.

Bug: chromium:1333293
Change-Id: Ib58d526bdaefa683e459b5c813e348b72e81e13e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/93560
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Takahiro <hogehoge@gachapin.jp>
Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
Takahiro 2022-06-15 16:06:47 +00:00 committed by Dawn LUCI CQ
parent f0a97a0a23
commit 1f93b11939
2 changed files with 20 additions and 0 deletions

View File

@ -99,6 +99,11 @@ MaybeError ValidateVertexBufferLayout(
DAWN_INVALID_IF(buffer->arrayStride % 4 != 0, DAWN_INVALID_IF(buffer->arrayStride % 4 != 0,
"Vertex buffer arrayStride (%u) is not a multiple of 4.", buffer->arrayStride); "Vertex buffer arrayStride (%u) is not a multiple of 4.", buffer->arrayStride);
DAWN_INVALID_IF(
buffer->stepMode == wgpu::VertexStepMode::VertexBufferNotUsed && buffer->attributeCount > 0,
"attributeCount (%u) is not zero although vertex buffer stepMode is %s.",
buffer->attributeCount, wgpu::VertexStepMode::VertexBufferNotUsed);
for (uint32_t i = 0; i < buffer->attributeCount; ++i) { for (uint32_t i = 0; i < buffer->attributeCount; ++i) {
DAWN_TRY_CONTEXT(ValidateVertexAttribute(device, &buffer->attributes[i], metadata, DAWN_TRY_CONTEXT(ValidateVertexAttribute(device, &buffer->attributes[i], metadata,
buffer->arrayStride, attributesSetMask), buffer->arrayStride, attributesSetMask),

View File

@ -427,3 +427,18 @@ TEST_F(VertexStateTest, BaseTypeMatchingForInexistentInput) {
DoTest(wgpu::VertexFormat::Uint8x4); DoTest(wgpu::VertexFormat::Uint8x4);
DoTest(wgpu::VertexFormat::Sint32x2); DoTest(wgpu::VertexFormat::Sint32x2);
} }
// Test that non-zero attributeCount with VertexBufferNotUsed stepMode is invalid
TEST_F(VertexStateTest, UnusedBufferZeroAttribute) {
// Non-zero attributeCount with non-VertexBufferNotUsed is valid
utils::ComboVertexState state;
state.vertexBufferCount = 1;
state.cVertexBuffers[0].arrayStride = 0;
state.cVertexBuffers[0].attributeCount = 1;
state.cVertexBuffers[0].stepMode = wgpu::VertexStepMode::Vertex;
CreatePipeline(true, state, kPlaceholderVertexShader);
// Non-zero attributeCount with VertexBufferNotUsed is invalid
state.cVertexBuffers[0].stepMode = wgpu::VertexStepMode::VertexBufferNotUsed;
CreatePipeline(false, state, kPlaceholderVertexShader);
}