blob: c89f1df94db92a556f68fe05901d4cc34bcf8160 [file] [log] [blame]
Jamie Madill87717702015-04-13 13:50:24 -04001//
2// Copyright 2015 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// IndexDataManagerPerfTest:
7// Performance test for index buffer management.
8//
9
10#include "ANGLEPerfTest.h"
11
12#include <gmock/gmock.h>
13
14#include "libANGLE/renderer/d3d/BufferD3D.h"
15#include "libANGLE/renderer/d3d/IndexBuffer.h"
16#include "libANGLE/renderer/d3d/IndexDataManager.h"
17
18using namespace testing;
19
20namespace
21{
22
23class MockIndexBuffer : public rx::IndexBuffer
24{
25 public:
26 MockIndexBuffer(unsigned int bufferSize, GLenum indexType)
27 : mBufferSize(bufferSize),
28 mIndexType(indexType)
29 {
30 }
31
32 MOCK_METHOD3(initialize, gl::Error(unsigned int, GLenum, bool));
33 MOCK_METHOD3(mapBuffer, gl::Error(unsigned int, unsigned int, void**));
34 MOCK_METHOD0(unmapBuffer, gl::Error());
35 MOCK_METHOD0(discard, gl::Error());
36 MOCK_METHOD2(setSize, gl::Error(unsigned int, GLenum));
37
38 // inlined for speed
39 GLenum getIndexType() const override { return mIndexType; }
40 unsigned int getBufferSize() const override { return mBufferSize; }
41
42 private:
43 unsigned int mBufferSize;
44 GLenum mIndexType;
45};
46
47class MockBufferFactoryD3D : public rx::BufferFactoryD3D
48{
49 public:
50 MockBufferFactoryD3D(unsigned int bufferSize, GLenum indexType)
51 : mBufferSize(bufferSize),
52 mIndexType(indexType)
53 {
54 }
55
56 MOCK_METHOD0(createVertexBuffer, rx::VertexBuffer*());
Jamie Madilld3dfda22015-07-06 08:28:49 -040057 MOCK_CONST_METHOD1(getVertexConversionType, rx::VertexConversionType(gl::VertexFormatType));
58 MOCK_CONST_METHOD1(getVertexComponentType, GLenum(gl::VertexFormatType));
Jamie Madilld8fa9212016-03-02 11:51:43 -050059 MOCK_CONST_METHOD3(getVertexSpaceRequired,
60 gl::ErrorOrResult<unsigned int>(const gl::VertexAttribute &,
61 GLsizei,
62 GLsizei));
Jamie Madill87717702015-04-13 13:50:24 -040063
64 // Dependency injection
65 rx::IndexBuffer* createIndexBuffer() override
66 {
67 return new MockIndexBuffer(mBufferSize, mIndexType);
68 }
69
70 private:
71 unsigned int mBufferSize;
72 GLenum mIndexType;
73};
74
75class MockBufferD3D : public rx::BufferD3D
76{
77 public:
Geoff Lang71632d02015-05-12 17:14:56 -040078 MockBufferD3D(rx::BufferFactoryD3D *factory)
Jamie Madill87717702015-04-13 13:50:24 -040079 : BufferD3D(factory),
Geoff Lang71632d02015-05-12 17:14:56 -040080 mData()
Jamie Madill87717702015-04-13 13:50:24 -040081 {
82 }
83
84 // BufferImpl
Geoff Lang71632d02015-05-12 17:14:56 -040085 gl::Error setData(const void *data, size_t size, GLenum) override
86 {
87 mData.resize(size);
88 if (data && size > 0)
89 {
90 memcpy(&mData[0], data, size);
91 }
92 return gl::Error(GL_NO_ERROR);
93 }
94
Jamie Madill87717702015-04-13 13:50:24 -040095 MOCK_METHOD3(setSubData, gl::Error(const void*, size_t, size_t));
96 MOCK_METHOD4(copySubData, gl::Error(BufferImpl*, GLintptr, GLintptr, GLsizeiptr));
97 MOCK_METHOD2(map, gl::Error(GLenum, GLvoid **));
98 MOCK_METHOD4(mapRange, gl::Error(size_t, size_t, GLbitfield, GLvoid **));
99 MOCK_METHOD1(unmap, gl::Error(GLboolean *));
100
101 // BufferD3D
Jamie Madill7d712e72016-03-29 21:54:33 -0400102 MOCK_METHOD0(markTransformFeedbackUsage, gl::Error());
Jamie Madill87717702015-04-13 13:50:24 -0400103
104 // inlined for speed
105 bool supportsDirectBinding() const override { return false; }
Geoff Lang71632d02015-05-12 17:14:56 -0400106 size_t getSize() const override { return mData.size(); }
107
108 gl::Error getData(const uint8_t **outData) override
109 {
110 *outData = &mData[0];
111 return gl::Error(GL_NO_ERROR);
112 }
Jamie Madill87717702015-04-13 13:50:24 -0400113
114 private:
Geoff Lang71632d02015-05-12 17:14:56 -0400115 std::vector<uint8_t> mData;
Jamie Madill87717702015-04-13 13:50:24 -0400116};
117
118class IndexDataManagerPerfTest : public ANGLEPerfTest
119{
120 public:
121 IndexDataManagerPerfTest();
122
Olli Etuaho8047f062015-12-15 17:54:42 +0200123 void step() override;
Jamie Madill87717702015-04-13 13:50:24 -0400124
125 rx::IndexDataManager mIndexDataManager;
126 GLsizei mIndexCount;
127 unsigned int mBufferSize;
128 MockBufferFactoryD3D mMockFactory;
129 gl::Buffer mIndexBuffer;
Jamie Madill87717702015-04-13 13:50:24 -0400130};
131
Geoff Lang71632d02015-05-12 17:14:56 -0400132MockBufferD3D *InitMockBufferD3D(MockBufferFactoryD3D *mockFactory)
Jamie Madill87717702015-04-13 13:50:24 -0400133{
Geoff Lang71632d02015-05-12 17:14:56 -0400134 MockBufferD3D *mockBufferD3D = new MockBufferD3D(mockFactory);
Jamie Madill87717702015-04-13 13:50:24 -0400135
136 EXPECT_CALL(*mockFactory, createVertexBuffer()).WillOnce(Return(nullptr)).RetiresOnSaturation();
137 mockBufferD3D->initializeStaticData();
138
139 return mockBufferD3D;
140}
141
142IndexDataManagerPerfTest::IndexDataManagerPerfTest()
143 : ANGLEPerfTest("IndexDataManger", "_run"),
144 mIndexDataManager(&mMockFactory, rx::RENDERER_D3D11),
145 mIndexCount(4000),
Geoff Lang71632d02015-05-12 17:14:56 -0400146 mBufferSize(mIndexCount * sizeof(GLushort)),
Jamie Madill87717702015-04-13 13:50:24 -0400147 mMockFactory(mBufferSize, GL_UNSIGNED_SHORT),
Geoff Lang71632d02015-05-12 17:14:56 -0400148 mIndexBuffer(InitMockBufferD3D(&mMockFactory), 1)
Jamie Madill87717702015-04-13 13:50:24 -0400149{
Geoff Lang71632d02015-05-12 17:14:56 -0400150 std::vector<GLushort> indexData(mIndexCount);
Jamie Madill87717702015-04-13 13:50:24 -0400151 for (GLsizei index = 0; index < mIndexCount; ++index)
152 {
Geoff Lang71632d02015-05-12 17:14:56 -0400153 indexData[index] = static_cast<GLushort>(index);
Jamie Madill87717702015-04-13 13:50:24 -0400154 }
Geoff Lang71632d02015-05-12 17:14:56 -0400155 mIndexBuffer.bufferData(&indexData[0], indexData.size() * sizeof(GLushort), GL_STATIC_DRAW);
Jamie Madill87717702015-04-13 13:50:24 -0400156}
157
Olli Etuaho8047f062015-12-15 17:54:42 +0200158void IndexDataManagerPerfTest::step()
Jamie Madill87717702015-04-13 13:50:24 -0400159{
160 rx::TranslatedIndexData translatedIndexData;
Jamie Madill87717702015-04-13 13:50:24 -0400161 for (unsigned int iteration = 0; iteration < 100; ++iteration)
162 {
Geoff Lang3edfe032015-09-04 16:38:24 -0400163 mIndexBuffer.getIndexRange(GL_UNSIGNED_SHORT, 0, mIndexCount, false,
164 &translatedIndexData.indexRange);
Jamie Madill4dd1e552015-11-06 14:23:24 -0500165 mIndexDataManager.prepareIndexData(GL_UNSIGNED_SHORT, mIndexCount, &mIndexBuffer, nullptr,
Cooper Partin534bf872016-02-09 11:33:29 -0800166 &translatedIndexData, false);
Jamie Madill87717702015-04-13 13:50:24 -0400167 }
Jamie Madill87717702015-04-13 13:50:24 -0400168}
169
170TEST_F(IndexDataManagerPerfTest, Run)
171{
172 run();
173}
174
175}