mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-17 17:05:31 +00:00
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:
committed by
Commit Bot service account
parent
9cd21f1bf9
commit
97c0885a4a
@@ -48,7 +48,7 @@ class DestroyTest : public DawnTest {
|
||||
descriptor.primitiveTopology = dawn::PrimitiveTopology::TriangleStrip;
|
||||
descriptor.cVertexInput.numBuffers = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].stride = 4 * sizeof(float);
|
||||
descriptor.cVertexInput.numAttributes = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].numAttributes = 1;
|
||||
descriptor.cVertexInput.cAttributes[0].format = dawn::VertexFormat::Float4;
|
||||
descriptor.cColorStates[0]->format = renderPass.colorFormat;
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ class DrawIndexedTest : public DawnTest {
|
||||
descriptor.primitiveTopology = dawn::PrimitiveTopology::TriangleStrip;
|
||||
descriptor.cVertexInput.numBuffers = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].stride = 4 * sizeof(float);
|
||||
descriptor.cVertexInput.numAttributes = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].numAttributes = 1;
|
||||
descriptor.cVertexInput.cAttributes[0].format = dawn::VertexFormat::Float4;
|
||||
descriptor.cColorStates[0]->format = renderPass.colorFormat;
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ class DrawTest : public DawnTest {
|
||||
descriptor.primitiveTopology = dawn::PrimitiveTopology::TriangleStrip;
|
||||
descriptor.cVertexInput.numBuffers = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].stride = 4 * sizeof(float);
|
||||
descriptor.cVertexInput.numAttributes = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].numAttributes = 1;
|
||||
descriptor.cVertexInput.cAttributes[0].format = dawn::VertexFormat::Float4;
|
||||
descriptor.cColorStates[0]->format = renderPass.colorFormat;
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ class IndexFormatTest : public DawnTest {
|
||||
descriptor.cVertexInput.indexFormat = format;
|
||||
descriptor.cVertexInput.numBuffers = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].stride = 4 * sizeof(float);
|
||||
descriptor.cVertexInput.numAttributes = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].numAttributes = 1;
|
||||
descriptor.cVertexInput.cAttributes[0].format = dawn::VertexFormat::Float4;
|
||||
descriptor.cColorStates[0]->format = renderPass.colorFormat;
|
||||
|
||||
|
||||
@@ -187,7 +187,7 @@ class PrimitiveTopologyTest : public DawnTest {
|
||||
descriptor.primitiveTopology = primitiveTopology;
|
||||
descriptor.cVertexInput.numBuffers = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].stride = 4 * sizeof(float);
|
||||
descriptor.cVertexInput.numAttributes = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].numAttributes = 1;
|
||||
descriptor.cVertexInput.cAttributes[0].format = dawn::VertexFormat::Float4;
|
||||
descriptor.cColorStates[0]->format = renderPass.colorFormat;
|
||||
|
||||
|
||||
@@ -364,7 +364,7 @@ class VertexFormatTest : public DawnTest {
|
||||
descriptor.cFragmentStage.module = fsModule;
|
||||
descriptor.cVertexInput.numBuffers = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].stride = strideBytes;
|
||||
descriptor.cVertexInput.numAttributes = 1;
|
||||
descriptor.cVertexInput.cBuffers[0].numAttributes = 1;
|
||||
descriptor.cVertexInput.cAttributes[0].format = format;
|
||||
descriptor.cColorStates[0]->format = renderPass.colorFormat;
|
||||
|
||||
|
||||
@@ -136,40 +136,42 @@ class VertexInputTest : public DawnTest {
|
||||
return device.CreateRenderPipeline(&descriptor);
|
||||
}
|
||||
|
||||
struct VertexBufferSpec {
|
||||
uint32_t slot;
|
||||
uint64_t stride;
|
||||
InputStepMode step;
|
||||
};
|
||||
struct AttributeSpec {
|
||||
struct VertexAttributeSpec {
|
||||
uint32_t location;
|
||||
uint32_t slot;
|
||||
uint64_t offset;
|
||||
VertexFormat format;
|
||||
};
|
||||
struct VertexBufferSpec {
|
||||
uint64_t stride;
|
||||
InputStepMode step;
|
||||
std::vector<VertexAttributeSpec> attributes;
|
||||
};
|
||||
|
||||
utils::ComboVertexInputDescriptor MakeVertexInput(
|
||||
const std::vector<VertexBufferSpec>& buffers,
|
||||
const std::vector<AttributeSpec>& attributes) {
|
||||
const std::vector<VertexBufferSpec>& buffers) {
|
||||
utils::ComboVertexInputDescriptor vertexInput;
|
||||
uint32_t numBuffers = 0;
|
||||
for (const auto& buffer : buffers) {
|
||||
vertexInput.cBuffers[numBuffers].inputSlot = buffer.slot;
|
||||
uint32_t totalNumAttributes = 0;
|
||||
for (const VertexBufferSpec& buffer : buffers) {
|
||||
vertexInput.cBuffers[numBuffers].stride = buffer.stride;
|
||||
vertexInput.cBuffers[numBuffers].stepMode = buffer.step;
|
||||
|
||||
vertexInput.cBuffers[numBuffers].attributes =
|
||||
&vertexInput.cAttributes[totalNumAttributes];
|
||||
|
||||
for (const VertexAttributeSpec& attribute : buffer.attributes) {
|
||||
vertexInput.cAttributes[totalNumAttributes].shaderLocation = attribute.location;
|
||||
vertexInput.cAttributes[totalNumAttributes].offset = attribute.offset;
|
||||
vertexInput.cAttributes[totalNumAttributes].format = attribute.format;
|
||||
totalNumAttributes++;
|
||||
}
|
||||
vertexInput.cBuffers[numBuffers].numAttributes =
|
||||
static_cast<uint32_t>(buffer.attributes.size());
|
||||
|
||||
numBuffers++;
|
||||
}
|
||||
|
||||
uint32_t numAttributes = 0;
|
||||
for (const auto& attribute : attributes) {
|
||||
vertexInput.cAttributes[numAttributes].shaderLocation = attribute.location;
|
||||
vertexInput.cAttributes[numAttributes].inputSlot = attribute.slot;
|
||||
vertexInput.cAttributes[numAttributes].offset = attribute.offset;
|
||||
vertexInput.cAttributes[numAttributes].format = attribute.format;
|
||||
numAttributes++;
|
||||
}
|
||||
vertexInput.numBuffers = numBuffers;
|
||||
vertexInput.numAttributes = numAttributes;
|
||||
return vertexInput;
|
||||
}
|
||||
|
||||
@@ -232,7 +234,7 @@ class VertexInputTest : public DawnTest {
|
||||
// Test compilation and usage of the fixture :)
|
||||
TEST_P(VertexInputTest, Basic) {
|
||||
utils::ComboVertexInputDescriptor vertexInput = MakeVertexInput(
|
||||
{{0, 4 * sizeof(float), InputStepMode::Vertex}}, {{0, 0, 0, VertexFormat::Float4}});
|
||||
{{4 * sizeof(float), InputStepMode::Vertex, {{0, 0, VertexFormat::Float4}}}});
|
||||
dawn::RenderPipeline pipeline =
|
||||
MakeTestPipeline(vertexInput, 1, {{0, VertexFormat::Float4, InputStepMode::Vertex}});
|
||||
|
||||
@@ -250,7 +252,7 @@ TEST_P(VertexInputTest, ZeroStride) {
|
||||
DAWN_SKIP_TEST_IF(IsLinux() && IsOpenGL());
|
||||
|
||||
utils::ComboVertexInputDescriptor vertexInput =
|
||||
MakeVertexInput({{0, 0, InputStepMode::Vertex}}, {{0, 0, 0, VertexFormat::Float4}});
|
||||
MakeVertexInput({{0, InputStepMode::Vertex, {{0, 0, VertexFormat::Float4}}}});
|
||||
dawn::RenderPipeline pipeline =
|
||||
MakeTestPipeline(vertexInput, 0, {{0, VertexFormat::Float4, InputStepMode::Vertex}});
|
||||
|
||||
@@ -268,7 +270,7 @@ TEST_P(VertexInputTest, AttributeExpanding) {
|
||||
// R32F case
|
||||
{
|
||||
utils::ComboVertexInputDescriptor vertexInput =
|
||||
MakeVertexInput({{0, 0, InputStepMode::Vertex}}, {{0, 0, 0, VertexFormat::Float}});
|
||||
MakeVertexInput({{0, InputStepMode::Vertex, {{0, 0, VertexFormat::Float}}}});
|
||||
dawn::RenderPipeline pipeline =
|
||||
MakeTestPipeline(vertexInput, 0, {{0, VertexFormat::Float, InputStepMode::Vertex}});
|
||||
|
||||
@@ -280,7 +282,7 @@ TEST_P(VertexInputTest, AttributeExpanding) {
|
||||
// RG32F case
|
||||
{
|
||||
utils::ComboVertexInputDescriptor vertexInput =
|
||||
MakeVertexInput({{0, 0, InputStepMode::Vertex}}, {{0, 0, 0, VertexFormat::Float2}});
|
||||
MakeVertexInput({{0, InputStepMode::Vertex, {{0, 0, VertexFormat::Float2}}}});
|
||||
dawn::RenderPipeline pipeline =
|
||||
MakeTestPipeline(vertexInput, 0, {{0, VertexFormat::Float2, InputStepMode::Vertex}});
|
||||
|
||||
@@ -292,7 +294,7 @@ TEST_P(VertexInputTest, AttributeExpanding) {
|
||||
// RGB32F case
|
||||
{
|
||||
utils::ComboVertexInputDescriptor vertexInput =
|
||||
MakeVertexInput({{0, 0, InputStepMode::Vertex}}, {{0, 0, 0, VertexFormat::Float3}});
|
||||
MakeVertexInput({{0, InputStepMode::Vertex, {{0, 0, VertexFormat::Float3}}}});
|
||||
dawn::RenderPipeline pipeline =
|
||||
MakeTestPipeline(vertexInput, 0, {{0, VertexFormat::Float3, InputStepMode::Vertex}});
|
||||
|
||||
@@ -309,7 +311,7 @@ TEST_P(VertexInputTest, StrideLargerThanAttributes) {
|
||||
DAWN_SKIP_TEST_IF(IsLinux() && IsOpenGL());
|
||||
|
||||
utils::ComboVertexInputDescriptor vertexInput = MakeVertexInput(
|
||||
{{0, 8 * sizeof(float), InputStepMode::Vertex}}, {{0, 0, 0, VertexFormat::Float4}});
|
||||
{{8 * sizeof(float), InputStepMode::Vertex, {{0, 0, VertexFormat::Float4}}}});
|
||||
dawn::RenderPipeline pipeline =
|
||||
MakeTestPipeline(vertexInput, 1, {{0, VertexFormat::Float4, InputStepMode::Vertex}});
|
||||
|
||||
@@ -324,8 +326,9 @@ TEST_P(VertexInputTest, StrideLargerThanAttributes) {
|
||||
// Test two attributes at an offset, vertex version
|
||||
TEST_P(VertexInputTest, TwoAttributesAtAnOffsetVertex) {
|
||||
utils::ComboVertexInputDescriptor vertexInput = MakeVertexInput(
|
||||
{{0, 8 * sizeof(float), InputStepMode::Vertex}},
|
||||
{{0, 0, 0, VertexFormat::Float4}, {1, 0, 4 * sizeof(float), VertexFormat::Float4}});
|
||||
{{8 * sizeof(float),
|
||||
InputStepMode::Vertex,
|
||||
{{0, 0, VertexFormat::Float4}, {1, 4 * sizeof(float), VertexFormat::Float4}}}});
|
||||
dawn::RenderPipeline pipeline =
|
||||
MakeTestPipeline(vertexInput, 1, {{0, VertexFormat::Float4, InputStepMode::Vertex}});
|
||||
|
||||
@@ -340,8 +343,9 @@ TEST_P(VertexInputTest, TwoAttributesAtAnOffsetVertex) {
|
||||
// Test two attributes at an offset, instance version
|
||||
TEST_P(VertexInputTest, TwoAttributesAtAnOffsetInstance) {
|
||||
utils::ComboVertexInputDescriptor vertexInput = MakeVertexInput(
|
||||
{{0, 8 * sizeof(float), InputStepMode::Instance}},
|
||||
{{0, 0, 0, VertexFormat::Float4}, {1, 0, 4 * sizeof(float), VertexFormat::Float4}});
|
||||
{{8 * sizeof(float),
|
||||
InputStepMode::Instance,
|
||||
{{0, 0, VertexFormat::Float4}, {1, 4 * sizeof(float), VertexFormat::Float4}}}});
|
||||
dawn::RenderPipeline pipeline =
|
||||
MakeTestPipeline(vertexInput, 1, {{0, VertexFormat::Float4, InputStepMode::Instance}});
|
||||
|
||||
@@ -356,7 +360,7 @@ TEST_P(VertexInputTest, TwoAttributesAtAnOffsetInstance) {
|
||||
// Test a pure-instance input state
|
||||
TEST_P(VertexInputTest, PureInstance) {
|
||||
utils::ComboVertexInputDescriptor vertexInput = MakeVertexInput(
|
||||
{{0, 4 * sizeof(float), InputStepMode::Instance}}, {{0, 0, 0, VertexFormat::Float4}});
|
||||
{{4 * sizeof(float), InputStepMode::Instance, {{0, 0, VertexFormat::Float4}}}});
|
||||
dawn::RenderPipeline pipeline =
|
||||
MakeTestPipeline(vertexInput, 1, {{0, VertexFormat::Float4, InputStepMode::Instance}});
|
||||
|
||||
@@ -373,14 +377,12 @@ TEST_P(VertexInputTest, PureInstance) {
|
||||
// different attribute types
|
||||
TEST_P(VertexInputTest, MixedEverything) {
|
||||
utils::ComboVertexInputDescriptor vertexInput = MakeVertexInput(
|
||||
{
|
||||
{0, 12 * sizeof(float), InputStepMode::Vertex},
|
||||
{1, 10 * sizeof(float), InputStepMode::Instance},
|
||||
},
|
||||
{{0, 0, 0, VertexFormat::Float},
|
||||
{1, 0, 6 * sizeof(float), VertexFormat::Float2},
|
||||
{2, 1, 0, VertexFormat::Float3},
|
||||
{3, 1, 5 * sizeof(float), VertexFormat::Float4}});
|
||||
{{12 * sizeof(float),
|
||||
InputStepMode::Vertex,
|
||||
{{0, 0, VertexFormat::Float}, {1, 6 * sizeof(float), VertexFormat::Float2}}},
|
||||
{10 * sizeof(float),
|
||||
InputStepMode::Instance,
|
||||
{{2, 0, VertexFormat::Float3}, {3, 5 * sizeof(float), VertexFormat::Float4}}}});
|
||||
dawn::RenderPipeline pipeline =
|
||||
MakeTestPipeline(vertexInput, 1,
|
||||
{{0, VertexFormat::Float, InputStepMode::Vertex},
|
||||
@@ -406,8 +408,10 @@ TEST_P(VertexInputTest, MixedEverything) {
|
||||
// Test input state is unaffected by unused vertex slot
|
||||
TEST_P(VertexInputTest, UnusedVertexSlot) {
|
||||
// Instance input state, using slot 1
|
||||
// TODO(yunchao.he@intel.com): This is not actually testing slot 1 right now,
|
||||
// need to allow null for buffer[0].
|
||||
utils::ComboVertexInputDescriptor instanceVertexInput = MakeVertexInput(
|
||||
{{1, 4 * sizeof(float), InputStepMode::Instance}}, {{0, 1, 0, VertexFormat::Float4}});
|
||||
{{4 * sizeof(float), InputStepMode::Instance, {{0, 0, VertexFormat::Float4}}}});
|
||||
dawn::RenderPipeline instancePipeline = MakeTestPipeline(
|
||||
instanceVertexInput, 1, {{0, VertexFormat::Float4, InputStepMode::Instance}});
|
||||
|
||||
@@ -444,13 +448,15 @@ TEST_P(VertexInputTest, UnusedVertexSlot) {
|
||||
TEST_P(VertexInputTest, MultiplePipelinesMixedVertexInput) {
|
||||
// Basic input state, using slot 0
|
||||
utils::ComboVertexInputDescriptor vertexVertexInput = MakeVertexInput(
|
||||
{{0, 4 * sizeof(float), InputStepMode::Vertex}}, {{0, 0, 0, VertexFormat::Float4}});
|
||||
{{4 * sizeof(float), InputStepMode::Vertex, {{0, 0, VertexFormat::Float4}}}});
|
||||
dawn::RenderPipeline vertexPipeline =
|
||||
MakeTestPipeline(vertexVertexInput, 1, {{0, VertexFormat::Float4, InputStepMode::Vertex}});
|
||||
|
||||
// Instance input state, using slot 1
|
||||
// TODO(yunchao.he@intel.com): This is not actually testing slot 1 right now,
|
||||
// need to allow null for buffer[0].
|
||||
utils::ComboVertexInputDescriptor instanceVertexInput = MakeVertexInput(
|
||||
{{1, 4 * sizeof(float), InputStepMode::Instance}}, {{0, 1, 0, VertexFormat::Float4}});
|
||||
{{4 * sizeof(float), InputStepMode::Instance, {{0, 0, VertexFormat::Float4}}}});
|
||||
dawn::RenderPipeline instancePipeline = MakeTestPipeline(
|
||||
instanceVertexInput, 1, {{0, VertexFormat::Float4, InputStepMode::Instance}});
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
)");
|
||||
}
|
||||
|
||||
@@ -122,8 +122,6 @@ TEST_F(WireArgumentTests, CStringArgument) {
|
||||
vertexInput.indexFormat = DAWN_INDEX_FORMAT_UINT32;
|
||||
vertexInput.numBuffers = 0;
|
||||
vertexInput.buffers = nullptr;
|
||||
vertexInput.numAttributes = 0;
|
||||
vertexInput.attributes = nullptr;
|
||||
|
||||
// Create the rasterization state
|
||||
DawnRasterizationStateDescriptor rasterizationState;
|
||||
|
||||
@@ -92,8 +92,6 @@ TEST_F(WireOptionalTests, OptionalStructPointer) {
|
||||
vertexInput.indexFormat = DAWN_INDEX_FORMAT_UINT32;
|
||||
vertexInput.numBuffers = 0;
|
||||
vertexInput.buffers = nullptr;
|
||||
vertexInput.numAttributes = 0;
|
||||
vertexInput.attributes = nullptr;
|
||||
|
||||
// Create the rasterization state
|
||||
DawnRasterizationStateDescriptor rasterizationState;
|
||||
|
||||
Reference in New Issue
Block a user