Update VertexInput (InputState) to match the spec - Part 2

This patch changed the front end code and tests and examples.

BUG=dawn:80, dawn:107

Change-Id: Ia6c60232c04a1bfb862263766eb28e9afc3bc8db
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/7620
Commit-Queue: Yunchao He <yunchao.he@intel.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
Yunchao He
2019-06-06 01:56:57 +00:00
committed by Commit Bot service account
parent 9cd21f1bf9
commit 97c0885a4a
21 changed files with 272 additions and 218 deletions

View File

@@ -74,13 +74,13 @@ class VertexBufferValidationTest : public ValidationTest {
descriptor.cFragmentStage.module = fsModule;
for (unsigned int i = 0; i < numBuffers; ++i) {
descriptor.cVertexInput.cBuffers[i].numAttributes = 1;
descriptor.cVertexInput.cBuffers[i].attributes =
&descriptor.cVertexInput.cAttributes[i];
descriptor.cVertexInput.cAttributes[i].shaderLocation = i;
descriptor.cVertexInput.cAttributes[i].inputSlot = i;
descriptor.cVertexInput.cAttributes[i].format = dawn::VertexFormat::Float3;
descriptor.cVertexInput.cBuffers[i].inputSlot = i;
}
descriptor.cVertexInput.numBuffers = numBuffers;
descriptor.cVertexInput.numAttributes = numBuffers;
return device.CreateRenderPipeline(&descriptor);
}

View File

@@ -63,7 +63,8 @@ TEST_F(VertexInputTest, PipelineCompatibility) {
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.cBuffers[0].stride = 2 * sizeof(float);
state.numAttributes = 2;
state.cBuffers[0].numAttributes = 2;
state.cAttributes[0].shaderLocation = 0;
state.cAttributes[1].shaderLocation = 1;
state.cAttributes[1].offset = sizeof(float);
@@ -101,6 +102,8 @@ TEST_F(VertexInputTest, StrideZero) {
// Works ok without attributes
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.cBuffers[0].stride = 0;
state.cBuffers[0].numAttributes = 1;
CreatePipeline(true, state, R"(
#version 450
void main() {
@@ -109,7 +112,6 @@ TEST_F(VertexInputTest, StrideZero) {
)");
// Works ok with attributes at a large-ish offset
state.numAttributes = 1;
state.cAttributes[0].offset = 128;
CreatePipeline(true, state, R"(
#version 450
@@ -119,11 +121,17 @@ TEST_F(VertexInputTest, StrideZero) {
)");
}
// Test that we cannot set an already set input
TEST_F(VertexInputTest, AlreadySetInput) {
// Control case
// Check validation that vertex attribute offset should be within vertex buffer stride,
// if vertex buffer stride is not zero.
TEST_F(VertexInputTest, SetOffsetOutOfBounds) {
// Control case, setting correct stride and offset
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.cBuffers[0].stride = 2 * sizeof(float);
state.cBuffers[0].numAttributes = 2;
state.cAttributes[0].shaderLocation = 0;
state.cAttributes[1].shaderLocation = 1;
state.cAttributes[1].offset = sizeof(float);
CreatePipeline(true, state, R"(
#version 450
void main() {
@@ -131,8 +139,44 @@ TEST_F(VertexInputTest, AlreadySetInput) {
}
)");
// Oh no, input 0 is set twice
state.numBuffers = 2;
// Test vertex attribute offset exceed vertex buffer stride range
state.cBuffers[0].stride = sizeof(float);
CreatePipeline(false, state, R"(
#version 450
void main() {
gl_Position = vec4(0.0);
}
)");
// It's OK if stride is zero
state.cBuffers[0].stride = 0;
CreatePipeline(true, state, R"(
#version 450
void main() {
gl_Position = vec4(0.0);
}
)");
}
// Check out of bounds condition on total number of vertex buffers
TEST_F(VertexInputTest, SetVertexBuffersNumLimit) {
// Control case, setting max vertex buffer number
utils::ComboVertexInputDescriptor state;
state.numBuffers = kMaxVertexBuffers;
for (uint32_t i = 0; i < kMaxVertexBuffers; ++i) {
state.cBuffers[i].numAttributes = 1;
state.cBuffers[i].attributes = &state.cAttributes[i];
state.cAttributes[i].shaderLocation = i;
}
CreatePipeline(true, state, R"(
#version 450
void main() {
gl_Position = vec4(0.0);
}
)");
// Test vertex buffer number exceed the limit
state.numBuffers = kMaxVertexBuffers + 1;
CreatePipeline(false, state, R"(
#version 450
void main() {
@@ -141,12 +185,15 @@ TEST_F(VertexInputTest, AlreadySetInput) {
)");
}
// Check out of bounds condition on input slot
TEST_F(VertexInputTest, SetInputSlotOutOfBounds) {
// Control case, setting last input slot
// Check out of bounds condition on total number of vertex attributes
TEST_F(VertexInputTest, SetVertexAttributesNumLimit) {
// Control case, setting max vertex attribute number
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.cBuffers[0].inputSlot = kMaxVertexBuffers - 1;
state.numBuffers = 2;
state.cBuffers[0].numAttributes = kMaxVertexAttributes;
for (uint32_t i = 0; i < kMaxVertexAttributes; ++i) {
state.cAttributes[i].shaderLocation = i;
}
CreatePipeline(true, state, R"(
#version 450
void main() {
@@ -154,8 +201,9 @@ TEST_F(VertexInputTest, SetInputSlotOutOfBounds) {
}
)");
// Test input slot OOB
state.cBuffers[0].inputSlot = kMaxVertexBuffers;
// Test vertex attribute number exceed the limit
state.cBuffers[1].numAttributes = 1;
state.cBuffers[1].attributes = &state.cAttributes[kMaxVertexAttributes - 1];
CreatePipeline(false, state, R"(
#version 450
void main() {
@@ -170,6 +218,7 @@ TEST_F(VertexInputTest, SetInputStrideOutOfBounds) {
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.cBuffers[0].stride = kMaxVertexBufferStride;
state.cBuffers[0].numAttributes = 1;
CreatePipeline(true, state, R"(
#version 450
void main() {
@@ -189,10 +238,11 @@ TEST_F(VertexInputTest, SetInputStrideOutOfBounds) {
// Test that we cannot set an already set attribute
TEST_F(VertexInputTest, AlreadySetAttribute) {
// Control case, setting last attribute
// Control case, setting attribute 0
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.numAttributes = 1;
state.cBuffers[0].numAttributes = 1;
state.cAttributes[0].shaderLocation = 0;
CreatePipeline(true, state, R"(
#version 450
void main() {
@@ -201,7 +251,49 @@ TEST_F(VertexInputTest, AlreadySetAttribute) {
)");
// Oh no, attribute 0 is set twice
state.numAttributes = 2;
state.cBuffers[0].numAttributes = 2;
state.cAttributes[0].shaderLocation = 0;
state.cAttributes[1].shaderLocation = 0;
CreatePipeline(false, state, R"(
#version 450
void main() {
gl_Position = vec4(0.0);
}
)");
}
// Test that a stride of 0 is valid
TEST_F(VertexInputTest, SetSameShaderLocation) {
// Control case, setting different shader locations in two attributes
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.cBuffers[0].numAttributes = 2;
state.cAttributes[0].shaderLocation = 0;
state.cAttributes[1].shaderLocation = 1;
state.cAttributes[1].offset = sizeof(float);
CreatePipeline(true, state, R"(
#version 450
void main() {
gl_Position = vec4(0.0);
}
)");
// Test same shader location in two attributes in the same buffer
state.cAttributes[1].shaderLocation = 0;
CreatePipeline(false, state, R"(
#version 450
void main() {
gl_Position = vec4(0.0);
}
)");
// Test same shader location in two attributes in different buffers
state.numBuffers = 2;
state.cBuffers[0].numAttributes = 1;
state.cAttributes[0].shaderLocation = 0;
state.cBuffers[1].numAttributes = 1;
state.cBuffers[1].attributes = &state.cAttributes[1];
state.cAttributes[1].shaderLocation = 0;
CreatePipeline(false, state, R"(
#version 450
void main() {
@@ -215,7 +307,7 @@ TEST_F(VertexInputTest, SetAttributeLocationOutOfBounds) {
// Control case, setting last attribute shader location
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.numAttributes = 1;
state.cBuffers[0].numAttributes = 1;
state.cAttributes[0].shaderLocation = kMaxVertexAttributes - 1;
CreatePipeline(true, state, R"(
#version 450
@@ -239,7 +331,7 @@ TEST_F(VertexInputTest, SetAttributeOffsetOutOfBounds) {
// Control case, setting max attribute offset for FloatR32 vertex format
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.numAttributes = 1;
state.cBuffers[0].numAttributes = 1;
state.cAttributes[0].offset = kMaxVertexAttributeEnd - sizeof(dawn::VertexFormat::Float);
CreatePipeline(true, state, R"(
#version 450
@@ -262,7 +354,7 @@ TEST_F(VertexInputTest, SetAttributeOffsetOutOfBounds) {
TEST_F(VertexInputTest, SetAttributeOffsetOverflow) {
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.numAttributes = 1;
state.cBuffers[0].numAttributes = 1;
state.cAttributes[0].offset = std::numeric_limits<uint32_t>::max();
CreatePipeline(false, state, R"(
#version 450
@@ -271,49 +363,3 @@ TEST_F(VertexInputTest, SetAttributeOffsetOverflow) {
}
)");
}
// Check that all attributes must be backed by an input
TEST_F(VertexInputTest, RequireInputForAttribute) {
// Control case
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.numAttributes = 1;
CreatePipeline(true, state, R"(
#version 450
void main() {
gl_Position = vec4(0.0);
}
)");
// Attribute 0 uses input 1 which doesn't exist
state.cAttributes[0].inputSlot = 1;
CreatePipeline(false, state, R"(
#version 450
void main() {
gl_Position = vec4(0.0);
}
)");
}
// Check OOB checks for an attribute's input
TEST_F(VertexInputTest, SetAttributeOOBCheckForInputs) {
// Control case
utils::ComboVertexInputDescriptor state;
state.numBuffers = 1;
state.numAttributes = 1;
CreatePipeline(true, state, R"(
#version 450
void main() {
gl_Position = vec4(0.0);
}
)");
// Could crash if we didn't check for OOB
state.cAttributes[0].inputSlot = 1000000;
CreatePipeline(false, state, R"(
#version 450
void main() {
gl_Position = vec4(0.0);
}
)");
}