Commit 04b7277e by Jamie Madill Committed by Commit Bot

Fix unintialized data in VertexAttributeTest.

The test was initializing an extra element at the end of a vertex buffer and never initializing it. I fixed this for one test but the bug was actually replicated into several. This fixes the bug by inializing the last vertex to the zero vertex value. Bug: angleproject:3951 Bug: angleproject:4163 Bug: angleproject:4258 Bug: angleproject:4269 Bug: angleproject:5258 Change-Id: I226406475340d756bfb7624d163abeca7b807f20 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2505551Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 1844860f
...@@ -140,8 +140,7 @@ DestT Pack1010102(std::array<SrcT, 4> input) ...@@ -140,8 +140,7 @@ DestT Pack1010102(std::array<SrcT, 4> input)
class VertexAttributeTest : public ANGLETest class VertexAttributeTest : public ANGLETest
{ {
protected: protected:
VertexAttributeTest() VertexAttributeTest() : mProgram(0), mTestAttrib(-1), mExpectedAttrib(-1), mBuffer(0)
: mProgram(0), mTestAttrib(-1), mExpectedAttrib(-1), mBuffer(0), mQuadBuffer(0)
{ {
setWindowWidth(128); setWindowWidth(128);
setWindowHeight(128); setWindowHeight(128);
...@@ -310,7 +309,6 @@ class VertexAttributeTest : public ANGLETest ...@@ -310,7 +309,6 @@ class VertexAttributeTest : public ANGLETest
{ {
glDeleteProgram(mProgram); glDeleteProgram(mProgram);
glDeleteBuffers(1, &mBuffer); glDeleteBuffers(1, &mBuffer);
glDeleteBuffers(1, &mQuadBuffer);
} }
// Override a feature to force emulation of attribute formats. // Override a feature to force emulation of attribute formats.
...@@ -406,11 +404,33 @@ class VertexAttributeTest : public ANGLETest ...@@ -406,11 +404,33 @@ class VertexAttributeTest : public ANGLETest
} }
} }
static void InitQuadVertexBuffer(GLBuffer *buffer)
{
auto quadVertices = GetQuadVertices();
GLsizei quadVerticesSize =
static_cast<GLsizei>(quadVertices.size() * sizeof(quadVertices[0]));
glBindBuffer(GL_ARRAY_BUFFER, *buffer);
glBufferData(GL_ARRAY_BUFFER, quadVerticesSize, nullptr, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, quadVerticesSize, quadVertices.data());
}
static void InitQuadPlusOneVertexBuffer(GLBuffer *buffer)
{
auto quadVertices = GetQuadVertices();
GLsizei quadVerticesSize =
static_cast<GLsizei>(quadVertices.size() * sizeof(quadVertices[0]));
glBindBuffer(GL_ARRAY_BUFFER, *buffer);
glBufferData(GL_ARRAY_BUFFER, quadVerticesSize + sizeof(Vector3), nullptr, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, quadVerticesSize, quadVertices.data());
glBufferSubData(GL_ARRAY_BUFFER, quadVerticesSize, sizeof(Vector3), &quadVertices[0]);
}
GLuint mProgram; GLuint mProgram;
GLint mTestAttrib; GLint mTestAttrib;
GLint mExpectedAttrib; GLint mExpectedAttrib;
GLuint mBuffer; GLuint mBuffer;
GLuint mQuadBuffer;
}; };
TEST_P(VertexAttributeTest, UnsignedByteUnnormalized) TEST_P(VertexAttributeTest, UnsignedByteUnnormalized)
...@@ -1211,21 +1231,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithBufferOffset) ...@@ -1211,21 +1231,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithBufferOffset)
std::array<GLfloat, kVertexCount> expectedData; std::array<GLfloat, kVertexCount> expectedData;
InitTestData(inputData, expectedData); InitTestData(inputData, expectedData);
auto quadVertices = GetQuadVertices(); GLBuffer quadBuffer;
InitQuadPlusOneVertexBuffer(&quadBuffer);
std::vector<Vector3> quadVerticesPlusOne(quadVertices.size() + 1);
for (size_t index = 0; index < quadVerticesPlusOne.size(); ++index)
{
quadVerticesPlusOne[index] = quadVertices[index % quadVertices.size()];
}
GLsizei quadVerticesSize =
static_cast<GLsizei>(quadVerticesPlusOne.size() * sizeof(quadVertices[0]));
glGenBuffers(1, &mQuadBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mQuadBuffer);
glBufferData(GL_ARRAY_BUFFER, quadVerticesSize, nullptr, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, quadVerticesSize, quadVerticesPlusOne.data());
GLint positionLocation = glGetAttribLocation(mProgram, "position"); GLint positionLocation = glGetAttribLocation(mProgram, "position");
ASSERT_NE(-1, positionLocation); ASSERT_NE(-1, positionLocation);
...@@ -1257,24 +1264,6 @@ TEST_P(VertexAttributeTest, DrawArraysWithBufferOffset) ...@@ -1257,24 +1264,6 @@ TEST_P(VertexAttributeTest, DrawArraysWithBufferOffset)
// Verify that using an unaligned offset doesn't mess up the draw. // Verify that using an unaligned offset doesn't mess up the draw.
TEST_P(VertexAttributeTest, DrawArraysWithUnalignedBufferOffset) TEST_P(VertexAttributeTest, DrawArraysWithUnalignedBufferOffset)
{ {
// anglebug.com/4258
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsNVIDIA() && IsOSX());
// anglebug.com/4163
ANGLE_SKIP_TEST_IF(IsD3D11() && IsNVIDIA() && IsWindows7());
// TODO(jmadill): Diagnose this failure.
ANGLE_SKIP_TEST_IF(IsD3D11_FL93());
// TODO(geofflang): Figure out why this is broken on AMD OpenGL
ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
// TODO(cnorthrop): Test this again on more recent drivers. http://anglebug.com/3951
ANGLE_SKIP_TEST_IF(IsLinux() && IsNVIDIA() && IsVulkan());
// TODO(https://anglebug.com/4269): Test is flaky on OpenGL and Metal on Mac NVIDIA.
ANGLE_SKIP_TEST_IF(IsOSX() && IsNVIDIA());
initBasicProgram(); initBasicProgram();
glUseProgram(mProgram); glUseProgram(mProgram);
...@@ -1282,13 +1271,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithUnalignedBufferOffset) ...@@ -1282,13 +1271,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithUnalignedBufferOffset)
std::array<GLfloat, kVertexCount> expectedData; std::array<GLfloat, kVertexCount> expectedData;
InitTestData(inputData, expectedData); InitTestData(inputData, expectedData);
auto quadVertices = GetQuadVertices(); GLBuffer quadBuffer;
GLsizei quadVerticesSize = static_cast<GLsizei>(quadVertices.size() * sizeof(quadVertices[0])); InitQuadPlusOneVertexBuffer(&quadBuffer);
glGenBuffers(1, &mQuadBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mQuadBuffer);
glBufferData(GL_ARRAY_BUFFER, quadVerticesSize + sizeof(Vector3), nullptr, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, quadVerticesSize, quadVertices.data());
GLint positionLocation = glGetAttribLocation(mProgram, "position"); GLint positionLocation = glGetAttribLocation(mProgram, "position");
ASSERT_NE(-1, positionLocation); ASSERT_NE(-1, positionLocation);
...@@ -1322,24 +1306,6 @@ TEST_P(VertexAttributeTest, DrawArraysWithUnalignedBufferOffset) ...@@ -1322,24 +1306,6 @@ TEST_P(VertexAttributeTest, DrawArraysWithUnalignedBufferOffset)
// In Metal backend, GL_SHORTx3 is coverted to GL_SHORTx4 if offset is unaligned. // In Metal backend, GL_SHORTx3 is coverted to GL_SHORTx4 if offset is unaligned.
TEST_P(VertexAttributeTest, DrawArraysWithUnalignedShortBufferOffset) TEST_P(VertexAttributeTest, DrawArraysWithUnalignedShortBufferOffset)
{ {
// anglebug.com/4258
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsNVIDIA() && IsOSX());
// anglebug.com/4163
ANGLE_SKIP_TEST_IF(IsD3D11() && IsNVIDIA() && IsWindows7());
// TODO(jmadill): Diagnose this failure.
ANGLE_SKIP_TEST_IF(IsD3D11_FL93());
// TODO(geofflang): Figure out why this is broken on AMD OpenGL
ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
// TODO(cnorthrop): Test this again on more recent drivers. http://anglebug.com/3951
ANGLE_SKIP_TEST_IF(IsLinux() && IsNVIDIA() && IsVulkan());
// TODO(https://anglebug.com/4269): Test is flaky on OpenGL and Metal on Mac NVIDIA.
ANGLE_SKIP_TEST_IF(IsOSX() && IsNVIDIA());
initBasicProgram(); initBasicProgram();
glUseProgram(mProgram); glUseProgram(mProgram);
...@@ -1357,13 +1323,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithUnalignedShortBufferOffset) ...@@ -1357,13 +1323,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithUnalignedShortBufferOffset)
expectedData[3 * i + 2] = 3 * i + 2; expectedData[3 * i + 2] = 3 * i + 2;
} }
auto quadVertices = GetQuadVertices(); GLBuffer quadBuffer;
GLsizei quadVerticesSize = static_cast<GLsizei>(quadVertices.size() * sizeof(quadVertices[0])); InitQuadPlusOneVertexBuffer(&quadBuffer);
glGenBuffers(1, &mQuadBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mQuadBuffer);
glBufferData(GL_ARRAY_BUFFER, quadVerticesSize + sizeof(Vector3), nullptr, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, quadVerticesSize, quadVertices.data());
GLint positionLocation = glGetAttribLocation(mProgram, "position"); GLint positionLocation = glGetAttribLocation(mProgram, "position");
ASSERT_NE(-1, positionLocation); ASSERT_NE(-1, positionLocation);
...@@ -1398,24 +1359,6 @@ TEST_P(VertexAttributeTest, DrawArraysWithUnalignedShortBufferOffset) ...@@ -1398,24 +1359,6 @@ TEST_P(VertexAttributeTest, DrawArraysWithUnalignedShortBufferOffset)
// draw. // draw.
TEST_P(VertexAttributeTest, DrawArraysWithShortBufferOffsetNotMultipleOf4) TEST_P(VertexAttributeTest, DrawArraysWithShortBufferOffsetNotMultipleOf4)
{ {
// anglebug.com/4258
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsNVIDIA() && IsOSX());
// anglebug.com/4163
ANGLE_SKIP_TEST_IF(IsD3D11() && IsNVIDIA() && IsWindows7());
// TODO(jmadill): Diagnose this failure.
ANGLE_SKIP_TEST_IF(IsD3D11_FL93());
// TODO(geofflang): Figure out why this is broken on AMD OpenGL
ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
// TODO(cnorthrop): Test this again on more recent drivers. http://anglebug.com/3951
ANGLE_SKIP_TEST_IF(IsLinux() && IsNVIDIA() && IsVulkan());
// TODO(https://anglebug.com/4269): Test is flaky on OpenGL and Metal on Mac NVIDIA.
ANGLE_SKIP_TEST_IF(IsOSX() && IsNVIDIA());
initBasicProgram(); initBasicProgram();
glUseProgram(mProgram); glUseProgram(mProgram);
...@@ -1433,13 +1376,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithShortBufferOffsetNotMultipleOf4) ...@@ -1433,13 +1376,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithShortBufferOffsetNotMultipleOf4)
expectedData[3 * i + 2] = 3 * i + 2; expectedData[3 * i + 2] = 3 * i + 2;
} }
auto quadVertices = GetQuadVertices(); GLBuffer quadBuffer;
GLsizei quadVerticesSize = static_cast<GLsizei>(quadVertices.size() * sizeof(quadVertices[0])); InitQuadPlusOneVertexBuffer(&quadBuffer);
glGenBuffers(1, &mQuadBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mQuadBuffer);
glBufferData(GL_ARRAY_BUFFER, quadVerticesSize + sizeof(Vector3), nullptr, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, quadVerticesSize, quadVertices.data());
GLint positionLocation = glGetAttribLocation(mProgram, "position"); GLint positionLocation = glGetAttribLocation(mProgram, "position");
ASSERT_NE(-1, positionLocation); ASSERT_NE(-1, positionLocation);
...@@ -1473,24 +1411,6 @@ TEST_P(VertexAttributeTest, DrawArraysWithShortBufferOffsetNotMultipleOf4) ...@@ -1473,24 +1411,6 @@ TEST_P(VertexAttributeTest, DrawArraysWithShortBufferOffsetNotMultipleOf4)
// Verify that using both aligned and unaligned offsets doesn't mess up the draw. // Verify that using both aligned and unaligned offsets doesn't mess up the draw.
TEST_P(VertexAttributeTest, DrawArraysWithAlignedAndUnalignedBufferOffset) TEST_P(VertexAttributeTest, DrawArraysWithAlignedAndUnalignedBufferOffset)
{ {
// anglebug.com/4258
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsNVIDIA() && IsOSX());
// anglebug.com/5258
ANGLE_SKIP_TEST_IF(IsD3D11() && IsNVIDIA());
// TODO(jmadill): Diagnose this failure.
ANGLE_SKIP_TEST_IF(IsD3D11_FL93());
// TODO(geofflang): Figure out why this is broken on AMD OpenGL
ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
// TODO(cnorthrop): Test this again on more recent drivers. http://anglebug.com/3951
ANGLE_SKIP_TEST_IF(IsLinux() && IsNVIDIA() && IsVulkan());
// TODO(https://anglebug.com/4269): Test is flaky on OpenGL and Metal on Mac NVIDIA.
ANGLE_SKIP_TEST_IF(IsOSX() && IsNVIDIA());
initBasicProgram(); initBasicProgram();
glUseProgram(mProgram); glUseProgram(mProgram);
...@@ -1498,13 +1418,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithAlignedAndUnalignedBufferOffset) ...@@ -1498,13 +1418,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithAlignedAndUnalignedBufferOffset)
std::array<GLfloat, kVertexCount> expectedData; std::array<GLfloat, kVertexCount> expectedData;
InitTestData(inputData, expectedData); InitTestData(inputData, expectedData);
auto quadVertices = GetQuadVertices(); GLBuffer quadBuffer;
GLsizei quadVerticesSize = static_cast<GLsizei>(quadVertices.size() * sizeof(quadVertices[0])); InitQuadPlusOneVertexBuffer(&quadBuffer);
glGenBuffers(1, &mQuadBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mQuadBuffer);
glBufferData(GL_ARRAY_BUFFER, quadVerticesSize + sizeof(Vector3), nullptr, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, quadVerticesSize, quadVertices.data());
GLint positionLocation = glGetAttribLocation(mProgram, "position"); GLint positionLocation = glGetAttribLocation(mProgram, "position");
ASSERT_NE(-1, positionLocation); ASSERT_NE(-1, positionLocation);
...@@ -1567,12 +1482,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithDisabledAttribute) ...@@ -1567,12 +1482,8 @@ TEST_P(VertexAttributeTest, DrawArraysWithDisabledAttribute)
std::array<GLfloat, kVertexCount> expectedData; std::array<GLfloat, kVertexCount> expectedData;
InitTestData(inputData, expectedData); InitTestData(inputData, expectedData);
auto quadVertices = GetQuadVertices(); GLBuffer buffer;
GLsizei quadVerticesSize = static_cast<GLsizei>(quadVertices.size() * sizeof(quadVertices[0])); InitQuadVertexBuffer(&buffer);
glGenBuffers(1, &mQuadBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mQuadBuffer);
glBufferData(GL_ARRAY_BUFFER, quadVerticesSize, quadVertices.data(), GL_STATIC_DRAW);
GLint positionLocation = glGetAttribLocation(mProgram, "position"); GLint positionLocation = glGetAttribLocation(mProgram, "position");
ASSERT_NE(-1, positionLocation); ASSERT_NE(-1, positionLocation);
...@@ -1813,6 +1724,7 @@ class VertexAttributeTestES31 : public VertexAttributeTestES3 ...@@ -1813,6 +1724,7 @@ class VertexAttributeTestES31 : public VertexAttributeTestES3
{ {
VertexAttributeTestES3::testTearDown(); VertexAttributeTestES3::testTearDown();
glDeleteBuffers(1, &mQuadBuffer);
glDeleteBuffers(1, &mExpectedBuffer); glDeleteBuffers(1, &mExpectedBuffer);
glDeleteVertexArrays(1, &mVAO); glDeleteVertexArrays(1, &mVAO);
} }
...@@ -1889,8 +1801,9 @@ class VertexAttributeTestES31 : public VertexAttributeTestES3 ...@@ -1889,8 +1801,9 @@ class VertexAttributeTestES31 : public VertexAttributeTestES3
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
} }
GLuint mVAO; GLuint mVAO = 0;
GLuint mExpectedBuffer; GLuint mExpectedBuffer = 0;
GLuint mQuadBuffer = 0;
const GLsizei kFloatStride = TypeStride(GL_FLOAT); const GLsizei kFloatStride = TypeStride(GL_FLOAT);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment