Commit 71632d0c by Geoff Lang

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/270498Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 3ba57d1b
...@@ -71,14 +71,23 @@ class MockBufferFactoryD3D : public rx::BufferFactoryD3D ...@@ -71,14 +71,23 @@ class MockBufferFactoryD3D : public rx::BufferFactoryD3D
class MockBufferD3D : public rx::BufferD3D class MockBufferD3D : public rx::BufferD3D
{ {
public: public:
MockBufferD3D(rx::BufferFactoryD3D *factory, size_t bufferSize) MockBufferD3D(rx::BufferFactoryD3D *factory)
: BufferD3D(factory), : BufferD3D(factory),
mBufferSize(bufferSize) mData()
{ {
} }
// BufferImpl // 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_METHOD3(setSubData, gl::Error(const void*, size_t, size_t));
MOCK_METHOD4(copySubData, gl::Error(BufferImpl*, GLintptr, GLintptr, GLsizeiptr)); MOCK_METHOD4(copySubData, gl::Error(BufferImpl*, GLintptr, GLintptr, GLsizeiptr));
MOCK_METHOD2(map, gl::Error(GLenum, GLvoid **)); MOCK_METHOD2(map, gl::Error(GLenum, GLvoid **));
...@@ -90,11 +99,16 @@ class MockBufferD3D : public rx::BufferD3D ...@@ -90,11 +99,16 @@ class MockBufferD3D : public rx::BufferD3D
// inlined for speed // inlined for speed
bool supportsDirectBinding() const override { return false; } bool supportsDirectBinding() const override { return false; }
size_t getSize() const override { return mBufferSize; } size_t getSize() const override { return mData.size(); }
gl::Error getData(const uint8_t **) override { return gl::Error(GL_NO_ERROR); }
gl::Error getData(const uint8_t **outData) override
{
*outData = &mData[0];
return gl::Error(GL_NO_ERROR);
}
private: private:
size_t mBufferSize; std::vector<uint8_t> mData;
}; };
class IndexDataManagerPerfTest : public ANGLEPerfTest class IndexDataManagerPerfTest : public ANGLEPerfTest
...@@ -109,12 +123,11 @@ class IndexDataManagerPerfTest : public ANGLEPerfTest ...@@ -109,12 +123,11 @@ class IndexDataManagerPerfTest : public ANGLEPerfTest
unsigned int mBufferSize; unsigned int mBufferSize;
MockBufferFactoryD3D mMockFactory; MockBufferFactoryD3D mMockFactory;
gl::Buffer mIndexBuffer; 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(); EXPECT_CALL(*mockFactory, createVertexBuffer()).WillOnce(Return(nullptr)).RetiresOnSaturation();
mockBufferD3D->initializeStaticData(); mockBufferD3D->initializeStaticData();
...@@ -126,21 +139,21 @@ IndexDataManagerPerfTest::IndexDataManagerPerfTest() ...@@ -126,21 +139,21 @@ IndexDataManagerPerfTest::IndexDataManagerPerfTest()
: ANGLEPerfTest("IndexDataManger", "_run"), : ANGLEPerfTest("IndexDataManger", "_run"),
mIndexDataManager(&mMockFactory, rx::RENDERER_D3D11), mIndexDataManager(&mMockFactory, rx::RENDERER_D3D11),
mIndexCount(4000), mIndexCount(4000),
mBufferSize(mIndexCount * 2), mBufferSize(mIndexCount * sizeof(GLushort)),
mMockFactory(mBufferSize, GL_UNSIGNED_SHORT), mMockFactory(mBufferSize, GL_UNSIGNED_SHORT),
mIndexBuffer(InitMockBufferD3D(&mMockFactory, mBufferSize), 1), mIndexBuffer(InitMockBufferD3D(&mMockFactory), 1)
mIndexData(mIndexCount)
{ {
std::vector<GLushort> indexData(mIndexCount);
for (GLsizei index = 0; index < mIndexCount; ++index) 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) void IndexDataManagerPerfTest::step(float dt, double totalTime)
{ {
rx::TranslatedIndexData translatedIndexData; rx::TranslatedIndexData translatedIndexData;
for (unsigned int iteration = 0; iteration < 100; ++iteration) for (unsigned int iteration = 0; iteration < 100; ++iteration)
{ {
mIndexBuffer.getIndexRange(GL_UNSIGNED_SHORT, 0, mIndexCount, &translatedIndexData.indexRange); mIndexBuffer.getIndexRange(GL_UNSIGNED_SHORT, 0, mIndexCount, &translatedIndexData.indexRange);
......
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