blob: f9cdec2d7eeb948273952228610caf2db93ee37d [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
Jamie Madill8f775602016-11-03 16:45:34 -040014#include "angle_unittests_utils.h"
Jamie Madill87717702015-04-13 13:50:24 -040015#include "libANGLE/renderer/d3d/BufferD3D.h"
16#include "libANGLE/renderer/d3d/IndexBuffer.h"
17#include "libANGLE/renderer/d3d/IndexDataManager.h"
18
19using namespace testing;
20
21namespace
22{
23
24class MockIndexBuffer : public rx::IndexBuffer
25{
26 public:
27 MockIndexBuffer(unsigned int bufferSize, GLenum indexType)
28 : mBufferSize(bufferSize),
29 mIndexType(indexType)
30 {
31 }
32
33 MOCK_METHOD3(initialize, gl::Error(unsigned int, GLenum, bool));
34 MOCK_METHOD3(mapBuffer, gl::Error(unsigned int, unsigned int, void**));
35 MOCK_METHOD0(unmapBuffer, gl::Error());
36 MOCK_METHOD0(discard, gl::Error());
37 MOCK_METHOD2(setSize, gl::Error(unsigned int, GLenum));
38
39 // inlined for speed
40 GLenum getIndexType() const override { return mIndexType; }
41 unsigned int getBufferSize() const override { return mBufferSize; }
42
43 private:
44 unsigned int mBufferSize;
45 GLenum mIndexType;
46};
47
48class MockBufferFactoryD3D : public rx::BufferFactoryD3D
49{
50 public:
51 MockBufferFactoryD3D(unsigned int bufferSize, GLenum indexType)
52 : mBufferSize(bufferSize),
53 mIndexType(indexType)
54 {
55 }
56
57 MOCK_METHOD0(createVertexBuffer, rx::VertexBuffer*());
Jamie Madilld3dfda22015-07-06 08:28:49 -040058 MOCK_CONST_METHOD1(getVertexConversionType, rx::VertexConversionType(gl::VertexFormatType));
59 MOCK_CONST_METHOD1(getVertexComponentType, GLenum(gl::VertexFormatType));
Jamie Madilld8fa9212016-03-02 11:51:43 -050060 MOCK_CONST_METHOD3(getVertexSpaceRequired,
61 gl::ErrorOrResult<unsigned int>(const gl::VertexAttribute &,
62 GLsizei,
63 GLsizei));
Jamie Madill87717702015-04-13 13:50:24 -040064
65 // Dependency injection
66 rx::IndexBuffer* createIndexBuffer() override
67 {
68 return new MockIndexBuffer(mBufferSize, mIndexType);
69 }
70
71 private:
72 unsigned int mBufferSize;
73 GLenum mIndexType;
74};
75
76class MockBufferD3D : public rx::BufferD3D
77{
78 public:
Jamie Madill8f775602016-11-03 16:45:34 -040079 MockBufferD3D(rx::BufferFactoryD3D *factory) : BufferD3D(mockState, factory), mData() {}
Jamie Madill87717702015-04-13 13:50:24 -040080
81 // BufferImpl
Jamie Madill29639852016-09-02 15:00:09 -040082 gl::Error setData(GLenum target, const void *data, size_t size, GLenum) override
Geoff Lang71632d02015-05-12 17:14:56 -040083 {
84 mData.resize(size);
85 if (data && size > 0)
86 {
87 memcpy(&mData[0], data, size);
88 }
He Yunchaoacd18982017-01-04 10:46:42 +080089 return gl::NoError();
Geoff Lang71632d02015-05-12 17:14:56 -040090 }
91
Jamie Madill29639852016-09-02 15:00:09 -040092 MOCK_METHOD4(setSubData, gl::Error(GLenum, const void *, size_t, size_t));
Jamie Madill87717702015-04-13 13:50:24 -040093 MOCK_METHOD4(copySubData, gl::Error(BufferImpl*, GLintptr, GLintptr, GLsizeiptr));
94 MOCK_METHOD2(map, gl::Error(GLenum, GLvoid **));
95 MOCK_METHOD4(mapRange, gl::Error(size_t, size_t, GLbitfield, GLvoid **));
96 MOCK_METHOD1(unmap, gl::Error(GLboolean *));
97
98 // BufferD3D
Jamie Madill7d712e72016-03-29 21:54:33 -040099 MOCK_METHOD0(markTransformFeedbackUsage, gl::Error());
Jamie Madill87717702015-04-13 13:50:24 -0400100
101 // inlined for speed
102 bool supportsDirectBinding() const override { return false; }
Geoff Lang71632d02015-05-12 17:14:56 -0400103 size_t getSize() const override { return mData.size(); }
104
105 gl::Error getData(const uint8_t **outData) override
106 {
107 *outData = &mData[0];
He Yunchaoacd18982017-01-04 10:46:42 +0800108 return gl::NoError();
Geoff Lang71632d02015-05-12 17:14:56 -0400109 }
Jamie Madill87717702015-04-13 13:50:24 -0400110
111 private:
Jamie Madill8f775602016-11-03 16:45:34 -0400112 gl::BufferState mockState;
Geoff Lang71632d02015-05-12 17:14:56 -0400113 std::vector<uint8_t> mData;
Jamie Madill87717702015-04-13 13:50:24 -0400114};
115
Jamie Madill8f775602016-11-03 16:45:34 -0400116class MockGLFactoryD3D : public rx::MockGLFactory
117{
118 public:
119 MockGLFactoryD3D(MockBufferFactoryD3D *bufferFactory) : mBufferFactory(bufferFactory) {}
120
121 rx::BufferImpl *createBuffer(const gl::BufferState &state) override
122 {
123 MockBufferD3D *mockBufferD3D = new MockBufferD3D(mBufferFactory);
124
125 EXPECT_CALL(*mBufferFactory, createVertexBuffer())
126 .WillOnce(Return(nullptr))
127 .RetiresOnSaturation();
128 mockBufferD3D->initializeStaticData();
129
130 return mockBufferD3D;
131 }
132
133 MockBufferFactoryD3D *mBufferFactory;
134};
135
Jamie Madill87717702015-04-13 13:50:24 -0400136class IndexDataManagerPerfTest : public ANGLEPerfTest
137{
138 public:
139 IndexDataManagerPerfTest();
140
Olli Etuaho8047f062015-12-15 17:54:42 +0200141 void step() override;
Jamie Madill87717702015-04-13 13:50:24 -0400142
143 rx::IndexDataManager mIndexDataManager;
144 GLsizei mIndexCount;
145 unsigned int mBufferSize;
Jamie Madill8f775602016-11-03 16:45:34 -0400146 MockBufferFactoryD3D mMockBufferFactory;
147 MockGLFactoryD3D mMockGLFactory;
Jamie Madill87717702015-04-13 13:50:24 -0400148 gl::Buffer mIndexBuffer;
Jamie Madill87717702015-04-13 13:50:24 -0400149};
150
Jamie Madill87717702015-04-13 13:50:24 -0400151IndexDataManagerPerfTest::IndexDataManagerPerfTest()
152 : ANGLEPerfTest("IndexDataManger", "_run"),
Jamie Madill8f775602016-11-03 16:45:34 -0400153 mIndexDataManager(&mMockBufferFactory, rx::RENDERER_D3D11),
Jamie Madill87717702015-04-13 13:50:24 -0400154 mIndexCount(4000),
Geoff Lang71632d02015-05-12 17:14:56 -0400155 mBufferSize(mIndexCount * sizeof(GLushort)),
Jamie Madill8f775602016-11-03 16:45:34 -0400156 mMockBufferFactory(mBufferSize, GL_UNSIGNED_SHORT),
157 mMockGLFactory(&mMockBufferFactory),
158 mIndexBuffer(&mMockGLFactory, 1)
Jamie Madill87717702015-04-13 13:50:24 -0400159{
Geoff Lang71632d02015-05-12 17:14:56 -0400160 std::vector<GLushort> indexData(mIndexCount);
Jamie Madill87717702015-04-13 13:50:24 -0400161 for (GLsizei index = 0; index < mIndexCount; ++index)
162 {
Geoff Lang71632d02015-05-12 17:14:56 -0400163 indexData[index] = static_cast<GLushort>(index);
Jamie Madill87717702015-04-13 13:50:24 -0400164 }
Jamie Madill29639852016-09-02 15:00:09 -0400165 mIndexBuffer.bufferData(GL_ARRAY_BUFFER, &indexData[0], indexData.size() * sizeof(GLushort),
166 GL_STATIC_DRAW);
Jamie Madill87717702015-04-13 13:50:24 -0400167}
168
Olli Etuaho8047f062015-12-15 17:54:42 +0200169void IndexDataManagerPerfTest::step()
Jamie Madill87717702015-04-13 13:50:24 -0400170{
171 rx::TranslatedIndexData translatedIndexData;
Jamie Madill87717702015-04-13 13:50:24 -0400172 for (unsigned int iteration = 0; iteration < 100; ++iteration)
173 {
Geoff Lang3edfe032015-09-04 16:38:24 -0400174 mIndexBuffer.getIndexRange(GL_UNSIGNED_SHORT, 0, mIndexCount, false,
175 &translatedIndexData.indexRange);
Jamie Madill4dd1e552015-11-06 14:23:24 -0500176 mIndexDataManager.prepareIndexData(GL_UNSIGNED_SHORT, mIndexCount, &mIndexBuffer, nullptr,
Cooper Partin534bf872016-02-09 11:33:29 -0800177 &translatedIndexData, false);
Jamie Madill87717702015-04-13 13:50:24 -0400178 }
Jamie Madill87717702015-04-13 13:50:24 -0400179}
180
181TEST_F(IndexDataManagerPerfTest, Run)
182{
183 run();
184}
185
Jamie Madill8f775602016-11-03 16:45:34 -0400186} // anonymous namespace