Commit 640fa5dc by Frank Henigman Committed by Commit Bot

Enable more of AttributeLayoutTest.

Enable more parts of AttributeLayoutTest because: - partial Vulkan support for vertex data in client memory has landed - we can work around bugs which prevented some parts from working - we have more fine-grained control over which parts to run Avoid glBufferSubData to work around ANGLE bug 2374. Let subclasses decide about skipping test cases. For example on Vulkan indexed draw with vertex data in client memory is not supported yet. BUG=angleproject:1683 Change-Id: Id073334299bd1a642b2518ccb3c47ebd8ff010d9 Reviewed-on: https://chromium-review.googlesource.com/933943Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Frank Henigman <fjhenigman@chromium.org>
parent 360098d5
...@@ -50,61 +50,52 @@ class Container ...@@ -50,61 +50,52 @@ class Container
public: public:
static constexpr size_t kSize = 1024; static constexpr size_t kSize = 1024;
virtual void init(void) = 0; void open(void) { memset(mMemory, 0xff, kSize); }
virtual void putData(unsigned offset, const void *data, size_t size) = 0;
virtual const char *getAddress() = 0; void fill(size_t numItem, size_t itemSize, const char *src, unsigned offset, unsigned stride)
virtual GLuint getBuffer() = 0; {
while (numItem--)
{
ASSERT(offset + itemSize <= kSize);
memcpy(mMemory + offset, src, itemSize);
src += itemSize;
offset += stride;
}
}
virtual void close(void) {}
virtual ~Container() {} virtual ~Container() {}
virtual const char *getAddress() = 0;
virtual GLuint getBuffer() = 0;
protected:
char mMemory[kSize];
}; };
// Vertex attribute data in client memory. // Vertex attribute data in client memory.
class Memory : public Container class Memory : public Container
{ {
public: public:
void init(void) override { memset(mMemory, 0, kSize); }
void putData(unsigned offset, const void *data, size_t size) override
{
ASSERT(offset + size <= kSize);
memcpy(mMemory + offset, data, size);
}
const char *getAddress() override { return mMemory; } const char *getAddress() override { return mMemory; }
GLuint getBuffer() override { return 0; } GLuint getBuffer() override { return 0; }
protected:
char mMemory[kSize];
}; };
// Vertex attribute data in buffer object. // Vertex attribute data in buffer object.
class Buffer : public Container class Buffer : public Container
{ {
public: public:
Buffer() { mZeroes.fill(0); } void close(void) override
void init(void) override
{ {
glBindBuffer(GL_ARRAY_BUFFER, mBuffer); glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(mZeroes), mZeroes.data(), GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(mMemory), mMemory, GL_STATIC_DRAW);
}
void putData(unsigned offset, const void *data, size_t size) override
{
ASSERT(offset + size <= kSize);
glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
glBufferSubData(GL_ARRAY_BUFFER, offset, size, data);
} }
const char *getAddress() override { return nullptr; } const char *getAddress() override { return nullptr; }
GLuint getBuffer() override { return mBuffer; } GLuint getBuffer() override { return mBuffer; }
protected: protected:
GLBuffer mBuffer; GLBuffer mBuffer;
static std::array<char, kSize> mZeroes;
}; };
std::array<char, Buffer::kSize> Buffer::mZeroes;
// clang-format off // clang-format off
template<class Type> struct GLType {}; template<class Type> struct GLType {};
...@@ -137,17 +128,12 @@ class Attrib ...@@ -137,17 +128,12 @@ class Attrib
(void)GLType<GLfloat>::kGLType; (void)GLType<GLfloat>::kGLType;
} }
void initContainer(void) const { mContainer->init(); } void openContainer(void) const { mContainer->open(); }
void fillContainer(void) const void fillContainer(void) const
{ {
unsigned offset = mOffset; mContainer->fill(kNumVertices, mAttribSize, mData, mOffset, mStride);
for (unsigned i = 0; i < kNumVertices; ++i)
{
mContainer->putData(offset, mData + i * mAttribSize, mAttribSize);
offset += mStride;
}
} }
void closeContainer(void) const { mContainer->close(); }
void enable(unsigned index) const void enable(unsigned index) const
{ {
...@@ -157,6 +143,8 @@ class Attrib ...@@ -157,6 +143,8 @@ class Attrib
glEnableVertexAttribArray(index); glEnableVertexAttribArray(index);
} }
bool inClientMemory(void) const { return mContainer->getAddress() != nullptr; }
protected: protected:
std::shared_ptr<Container> mContainer; std::shared_ptr<Container> mContainer;
unsigned mOffset; unsigned mOffset;
...@@ -169,16 +157,30 @@ class Attrib ...@@ -169,16 +157,30 @@ class Attrib
typedef std::vector<Attrib> TestCase; typedef std::vector<Attrib> TestCase;
bool UsesClientMemory(const TestCase &tc)
{
for (const Attrib &a : tc)
{
if (a.inClientMemory())
return true;
}
return false;
}
void PrepareTestCase(const TestCase &tc) void PrepareTestCase(const TestCase &tc)
{ {
for (const Attrib &a : tc) for (const Attrib &a : tc)
{ {
a.initContainer(); a.openContainer();
} }
for (const Attrib &a : tc) for (const Attrib &a : tc)
{ {
a.fillContainer(); a.fillContainer();
} }
for (const Attrib &a : tc)
{
a.closeContainer();
}
unsigned i = 0; unsigned i = 0;
for (const Attrib &a : tc) for (const Attrib &a : tc)
{ {
...@@ -249,6 +251,7 @@ class AttributeLayoutTest : public ANGLETest ...@@ -249,6 +251,7 @@ class AttributeLayoutTest : public ANGLETest
ANGLETest::TearDown(); ANGLETest::TearDown();
} }
virtual bool Skip(const TestCase &) { return false; }
virtual void Draw(int firstVertex, unsigned vertexCount, const GLushort *indices) = 0; virtual void Draw(int firstVertex, unsigned vertexCount, const GLushort *indices) = 0;
void Run(bool drawFirstTriangle) void Run(bool drawFirstTriangle)
...@@ -258,6 +261,9 @@ class AttributeLayoutTest : public ANGLETest ...@@ -258,6 +261,9 @@ class AttributeLayoutTest : public ANGLETest
for (unsigned i = 0; i < mTestCases.size(); ++i) for (unsigned i = 0; i < mTestCases.size(); ++i)
{ {
if (Skip(mTestCases[i]))
continue;
PrepareTestCase(mTestCases[i]); PrepareTestCase(mTestCases[i]);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
...@@ -338,42 +344,41 @@ void AttributeLayoutTest::GetTestCases(void) ...@@ -338,42 +344,41 @@ void AttributeLayoutTest::GetTestCases(void)
std::shared_ptr<Container> B0 = std::make_shared<Buffer>(); std::shared_ptr<Container> B0 = std::make_shared<Buffer>();
std::shared_ptr<Container> B1 = std::make_shared<Buffer>(); std::shared_ptr<Container> B1 = std::make_shared<Buffer>();
// two buffers // 0. two buffers
mTestCases.push_back({Attrib(B0, 0, 8, mCoord), Attrib(B1, 0, 12, mColor)}); mTestCases.push_back({Attrib(B0, 0, 8, mCoord), Attrib(B1, 0, 12, mColor)});
// 1. two memory
mTestCases.push_back({Attrib(M0, 0, 8, mCoord), Attrib(M1, 0, 12, mColor)});
// 2. one memory, sequential
mTestCases.push_back({Attrib(M0, 0, 8, mCoord), Attrib(M0, 96, 12, mColor)});
// 3. buffer and memory
mTestCases.push_back({Attrib(B0, 0, 8, mCoord), Attrib(M0, 0, 12, mColor)});
if (IsVulkan()) if (IsVulkan())
{ {
std::cout << "cases skipped on Vulkan: data in memory, integer data, non-zero offsets" std::cout << "cases skipped on Vulkan: integer data, non-zero buffer offsets" << std::endl;
<< std::endl;
return; return;
} }
// stride != size - ANGLE bug 2310 // 4. stride != size - ANGLE bug 2310
mTestCases.push_back({Attrib(B0, 0, 16, mCoord), Attrib(B1, 0, 12, mColor)}); mTestCases.push_back({Attrib(B0, 0, 16, mCoord), Attrib(B1, 0, 12, mColor)});
// one buffer, sequential // 5. one memory, interleaved
mTestCases.push_back({Attrib(M0, 0, 20, mCoord), Attrib(M0, 8, 20, mColor)});
// 6. one buffer, sequential
mTestCases.push_back({Attrib(B0, 0, 8, mCoord), Attrib(B0, 96, 12, mColor)}); mTestCases.push_back({Attrib(B0, 0, 8, mCoord), Attrib(B0, 96, 12, mColor)});
// one buffer, interleaved // 7. one buffer, interleaved
mTestCases.push_back({Attrib(B0, 0, 20, mCoord), Attrib(B0, 8, 20, mColor)}); mTestCases.push_back({Attrib(B0, 0, 20, mCoord), Attrib(B0, 8, 20, mColor)});
// two memory // 8. memory and buffer, float and integer
mTestCases.push_back({Attrib(M0, 0, 8, mCoord), Attrib(M1, 0, 12, mColor)});
// one memory, sequential
mTestCases.push_back({Attrib(M0, 0, 8, mCoord), Attrib(M0, 96, 12, mColor)});
// one memory, interleaved
mTestCases.push_back({Attrib(M0, 0, 20, mCoord), Attrib(M0, 8, 20, mColor)});
// buffer and memory
mTestCases.push_back({Attrib(B0, 0, 8, mCoord), Attrib(M0, 0, 12, mColor)});
// memory and buffer, float and integer
mTestCases.push_back({Attrib(M0, 0, 8, mCoord), Attrib(B0, 0, 12, mBColor)}); mTestCases.push_back({Attrib(M0, 0, 8, mCoord), Attrib(B0, 0, 12, mBColor)});
// unusual offset and stride // 9. buffer and memory, unusual offset and stride
mTestCases.push_back({Attrib(B0, 11, 13, mCoord), Attrib(B1, 23, 17, mColor)}); mTestCases.push_back({Attrib(B0, 11, 13, mCoord), Attrib(M0, 23, 17, mColor)});
} }
class AttributeLayoutNonIndexed : public AttributeLayoutTest class AttributeLayoutNonIndexed : public AttributeLayoutTest
...@@ -395,6 +400,18 @@ class AttributeLayoutMemoryIndexed : public AttributeLayoutTest ...@@ -395,6 +400,18 @@ class AttributeLayoutMemoryIndexed : public AttributeLayoutTest
class AttributeLayoutBufferIndexed : public AttributeLayoutTest class AttributeLayoutBufferIndexed : public AttributeLayoutTest
{ {
bool Skip(const TestCase &tc) override
{
if (IsVulkan() && UsesClientMemory(tc))
{
std::cout
<< "test case skipped on Vulkan: indexed draw with vertex data in client memory"
<< std::endl;
return true;
}
return false;
}
void Draw(int firstVertex, unsigned vertexCount, const GLushort *indices) override void Draw(int firstVertex, unsigned vertexCount, const GLushort *indices) override
{ {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);
...@@ -415,14 +432,6 @@ TEST_P(AttributeLayoutNonIndexed, Test) ...@@ -415,14 +432,6 @@ TEST_P(AttributeLayoutNonIndexed, Test)
return; return;
} }
// TODO(fjhenigman): This should work but doesn't. Figure out why.
if (IsVulkan())
{
std::cout << "test skipped on Vulkan: non-indexed non-zero vertex start"
<< std::endl;
return;
}
Run(false); Run(false);
} }
...@@ -448,15 +457,8 @@ TEST_P(AttributeLayoutMemoryIndexed, Test) ...@@ -448,15 +457,8 @@ TEST_P(AttributeLayoutMemoryIndexed, Test)
TEST_P(AttributeLayoutBufferIndexed, Test) TEST_P(AttributeLayoutBufferIndexed, Test)
{ {
Run(true);
// TODO(fjhenigman): This should work but doesn't. Figure out why. Run(true);
if (IsVulkan())
{
std::cout << "test skipped on Vulkan: buffer indexed non-zero vertex start"
<< std::endl;
return;
}
if (IsWindows() && IsAMD() && (IsOpenGL() || GetParam() == ES2_D3D11_FL9_3())) if (IsWindows() && IsAMD() && (IsOpenGL() || GetParam() == ES2_D3D11_FL9_3()))
{ {
......
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