Fix crash in IndexDataManagerPerfTest.
Since the gl::Buffer doesn't know about its data, the index range needs to
be computed on the raw indices instead of through the buffer.
Change-Id: I3f53822033a1a25bf5fae9132ee2ceb312eaa283
Reviewed-on: https://chromium-review.googlesource.com/270498
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/tests/perf_tests/IndexDataManagerTest.cpp b/src/tests/perf_tests/IndexDataManagerTest.cpp
index 2c9937e..b511386 100644
--- a/src/tests/perf_tests/IndexDataManagerTest.cpp
+++ b/src/tests/perf_tests/IndexDataManagerTest.cpp
@@ -71,14 +71,23 @@
class MockBufferD3D : public rx::BufferD3D
{
public:
- MockBufferD3D(rx::BufferFactoryD3D *factory, size_t bufferSize)
+ MockBufferD3D(rx::BufferFactoryD3D *factory)
: BufferD3D(factory),
- mBufferSize(bufferSize)
+ mData()
{
}
// BufferImpl
- MOCK_METHOD3(setData, gl::Error(const void*, size_t, GLenum));
+ gl::Error setData(const void *data, size_t size, GLenum) override
+ {
+ mData.resize(size);
+ if (data && size > 0)
+ {
+ memcpy(&mData[0], data, size);
+ }
+ return gl::Error(GL_NO_ERROR);
+ }
+
MOCK_METHOD3(setSubData, gl::Error(const void*, size_t, size_t));
MOCK_METHOD4(copySubData, gl::Error(BufferImpl*, GLintptr, GLintptr, GLsizeiptr));
MOCK_METHOD2(map, gl::Error(GLenum, GLvoid **));
@@ -90,11 +99,16 @@
// inlined for speed
bool supportsDirectBinding() const override { return false; }
- size_t getSize() const override { return mBufferSize; }
- gl::Error getData(const uint8_t **) override { return gl::Error(GL_NO_ERROR); }
+ size_t getSize() const override { return mData.size(); }
+
+ gl::Error getData(const uint8_t **outData) override
+ {
+ *outData = &mData[0];
+ return gl::Error(GL_NO_ERROR);
+ }
private:
- size_t mBufferSize;
+ std::vector<uint8_t> mData;
};
class IndexDataManagerPerfTest : public ANGLEPerfTest
@@ -109,12 +123,11 @@
unsigned int mBufferSize;
MockBufferFactoryD3D mMockFactory;
gl::Buffer mIndexBuffer;
- std::vector<GLshort> mIndexData;
};
-MockBufferD3D *InitMockBufferD3D(MockBufferFactoryD3D *mockFactory, unsigned int bufferSize)
+MockBufferD3D *InitMockBufferD3D(MockBufferFactoryD3D *mockFactory)
{
- MockBufferD3D *mockBufferD3D = new MockBufferD3D(mockFactory, static_cast<size_t>(bufferSize));
+ MockBufferD3D *mockBufferD3D = new MockBufferD3D(mockFactory);
EXPECT_CALL(*mockFactory, createVertexBuffer()).WillOnce(Return(nullptr)).RetiresOnSaturation();
mockBufferD3D->initializeStaticData();
@@ -126,21 +139,21 @@
: ANGLEPerfTest("IndexDataManger", "_run"),
mIndexDataManager(&mMockFactory, rx::RENDERER_D3D11),
mIndexCount(4000),
- mBufferSize(mIndexCount * 2),
+ mBufferSize(mIndexCount * sizeof(GLushort)),
mMockFactory(mBufferSize, GL_UNSIGNED_SHORT),
- mIndexBuffer(InitMockBufferD3D(&mMockFactory, mBufferSize), 1),
- mIndexData(mIndexCount)
+ mIndexBuffer(InitMockBufferD3D(&mMockFactory), 1)
{
+ std::vector<GLushort> indexData(mIndexCount);
for (GLsizei index = 0; index < mIndexCount; ++index)
{
- mIndexData[index] = static_cast<GLshort>(index);
+ indexData[index] = static_cast<GLushort>(index);
}
+ mIndexBuffer.bufferData(&indexData[0], indexData.size() * sizeof(GLushort), GL_STATIC_DRAW);
}
void IndexDataManagerPerfTest::step(float dt, double totalTime)
{
rx::TranslatedIndexData translatedIndexData;
-
for (unsigned int iteration = 0; iteration < 100; ++iteration)
{
mIndexBuffer.getIndexRange(GL_UNSIGNED_SHORT, 0, mIndexCount, &translatedIndexData.indexRange);