blob: 8a37eceffb92fd3427409ea686235ffd7532adf1 [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)
Jamie Madill231c7f52017-04-26 13:45:37 -040028 : mBufferSize(bufferSize), mIndexType(indexType)
Jamie Madill87717702015-04-13 13:50:24 -040029 {
30 }
31
32 MOCK_METHOD3(initialize, gl::Error(unsigned int, GLenum, bool));
Jamie Madill231c7f52017-04-26 13:45:37 -040033 MOCK_METHOD3(mapBuffer, gl::Error(unsigned int, unsigned int, void **));
Jamie Madill87717702015-04-13 13:50:24 -040034 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)
Jamie Madill231c7f52017-04-26 13:45:37 -040051 : mBufferSize(bufferSize), mIndexType(indexType)
Jamie Madill87717702015-04-13 13:50:24 -040052 {
53 }
54
Jamie Madill231c7f52017-04-26 13:45:37 -040055 MOCK_METHOD0(createVertexBuffer, rx::VertexBuffer *());
Jamie Madilld3dfda22015-07-06 08:28:49 -040056 MOCK_CONST_METHOD1(getVertexConversionType, rx::VertexConversionType(gl::VertexFormatType));
57 MOCK_CONST_METHOD1(getVertexComponentType, GLenum(gl::VertexFormatType));
Jiawei-Shao2597fb62016-12-09 16:38:02 +080058 MOCK_CONST_METHOD4(getVertexSpaceRequired,
Jamie Madilld8fa9212016-03-02 11:51:43 -050059 gl::ErrorOrResult<unsigned int>(const gl::VertexAttribute &,
Jiawei-Shao2597fb62016-12-09 16:38:02 +080060 const gl::VertexBinding &,
Jamie Madilld8fa9212016-03-02 11:51:43 -050061 GLsizei,
62 GLsizei));
Jamie Madill87717702015-04-13 13:50:24 -040063
64 // Dependency injection
Jamie Madill231c7f52017-04-26 13:45:37 -040065 rx::IndexBuffer *createIndexBuffer() override
Jamie Madill87717702015-04-13 13:50:24 -040066 {
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:
Jamie Madill8f775602016-11-03 16:45:34 -040078 MockBufferD3D(rx::BufferFactoryD3D *factory) : BufferD3D(mockState, factory), mData() {}
Jamie Madill87717702015-04-13 13:50:24 -040079
80 // BufferImpl
Jamie Madillb8353b02017-01-25 12:57:21 -080081 gl::Error setData(rx::ContextImpl *context,
82 GLenum target,
83 const void *data,
84 size_t size,
85 GLenum) override
Geoff Lang71632d02015-05-12 17:14:56 -040086 {
87 mData.resize(size);
88 if (data && size > 0)
89 {
90 memcpy(&mData[0], data, size);
91 }
He Yunchaoacd18982017-01-04 10:46:42 +080092 return gl::NoError();
Geoff Lang71632d02015-05-12 17:14:56 -040093 }
94
Jamie Madillb8353b02017-01-25 12:57:21 -080095 MOCK_METHOD5(setSubData, gl::Error(rx::ContextImpl *, GLenum, const void *, size_t, size_t));
Jamie Madill5f56ddb2017-01-13 17:29:55 -050096 MOCK_METHOD5(copySubData,
97 gl::Error(rx::ContextImpl *context, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
Jamie Madill876429b2017-04-20 15:46:24 -040098 MOCK_METHOD3(map, gl::Error(rx::ContextImpl *context, GLenum, void **));
Jamie Madill5f56ddb2017-01-13 17:29:55 -050099 MOCK_METHOD5(mapRange,
Jamie Madill876429b2017-04-20 15:46:24 -0400100 gl::Error(rx::ContextImpl *context, size_t, size_t, GLbitfield, void **));
Jamie Madill5f56ddb2017-01-13 17:29:55 -0500101 MOCK_METHOD2(unmap, gl::Error(rx::ContextImpl *context, GLboolean *));
Jamie Madill87717702015-04-13 13:50:24 -0400102
103 // BufferD3D
Jamie Madill7d712e72016-03-29 21:54:33 -0400104 MOCK_METHOD0(markTransformFeedbackUsage, gl::Error());
Jamie Madill87717702015-04-13 13:50:24 -0400105
106 // inlined for speed
107 bool supportsDirectBinding() const override { return false; }
Geoff Lang71632d02015-05-12 17:14:56 -0400108 size_t getSize() const override { return mData.size(); }
109
110 gl::Error getData(const uint8_t **outData) override
111 {
112 *outData = &mData[0];
He Yunchaoacd18982017-01-04 10:46:42 +0800113 return gl::NoError();
Geoff Lang71632d02015-05-12 17:14:56 -0400114 }
Jamie Madill87717702015-04-13 13:50:24 -0400115
116 private:
Jamie Madill8f775602016-11-03 16:45:34 -0400117 gl::BufferState mockState;
Geoff Lang71632d02015-05-12 17:14:56 -0400118 std::vector<uint8_t> mData;
Jamie Madill87717702015-04-13 13:50:24 -0400119};
120
Jamie Madill8f775602016-11-03 16:45:34 -0400121class MockGLFactoryD3D : public rx::MockGLFactory
122{
123 public:
124 MockGLFactoryD3D(MockBufferFactoryD3D *bufferFactory) : mBufferFactory(bufferFactory) {}
125
126 rx::BufferImpl *createBuffer(const gl::BufferState &state) override
127 {
128 MockBufferD3D *mockBufferD3D = new MockBufferD3D(mBufferFactory);
129
130 EXPECT_CALL(*mBufferFactory, createVertexBuffer())
131 .WillOnce(Return(nullptr))
132 .RetiresOnSaturation();
133 mockBufferD3D->initializeStaticData();
134
135 return mockBufferD3D;
136 }
137
138 MockBufferFactoryD3D *mBufferFactory;
139};
140
Jamie Madill87717702015-04-13 13:50:24 -0400141class IndexDataManagerPerfTest : public ANGLEPerfTest
142{
143 public:
144 IndexDataManagerPerfTest();
145
Olli Etuaho8047f062015-12-15 17:54:42 +0200146 void step() override;
Jamie Madill87717702015-04-13 13:50:24 -0400147
148 rx::IndexDataManager mIndexDataManager;
149 GLsizei mIndexCount;
150 unsigned int mBufferSize;
Jamie Madill8f775602016-11-03 16:45:34 -0400151 MockBufferFactoryD3D mMockBufferFactory;
152 MockGLFactoryD3D mMockGLFactory;
Jamie Madill87717702015-04-13 13:50:24 -0400153 gl::Buffer mIndexBuffer;
Jamie Madill87717702015-04-13 13:50:24 -0400154};
155
Jamie Madill87717702015-04-13 13:50:24 -0400156IndexDataManagerPerfTest::IndexDataManagerPerfTest()
157 : ANGLEPerfTest("IndexDataManger", "_run"),
Jamie Madill8f775602016-11-03 16:45:34 -0400158 mIndexDataManager(&mMockBufferFactory, rx::RENDERER_D3D11),
Jamie Madill87717702015-04-13 13:50:24 -0400159 mIndexCount(4000),
Geoff Lang71632d02015-05-12 17:14:56 -0400160 mBufferSize(mIndexCount * sizeof(GLushort)),
Jamie Madill8f775602016-11-03 16:45:34 -0400161 mMockBufferFactory(mBufferSize, GL_UNSIGNED_SHORT),
162 mMockGLFactory(&mMockBufferFactory),
163 mIndexBuffer(&mMockGLFactory, 1)
Jamie Madill87717702015-04-13 13:50:24 -0400164{
Geoff Lang71632d02015-05-12 17:14:56 -0400165 std::vector<GLushort> indexData(mIndexCount);
Jamie Madill87717702015-04-13 13:50:24 -0400166 for (GLsizei index = 0; index < mIndexCount; ++index)
167 {
Geoff Lang71632d02015-05-12 17:14:56 -0400168 indexData[index] = static_cast<GLushort>(index);
Jamie Madill87717702015-04-13 13:50:24 -0400169 }
Jamie Madillb8353b02017-01-25 12:57:21 -0800170 mIndexBuffer.bufferData(nullptr, GL_ARRAY_BUFFER, &indexData[0],
171 indexData.size() * sizeof(GLushort), GL_STATIC_DRAW);
Jamie Madill87717702015-04-13 13:50:24 -0400172}
173
Olli Etuaho8047f062015-12-15 17:54:42 +0200174void IndexDataManagerPerfTest::step()
Jamie Madill87717702015-04-13 13:50:24 -0400175{
176 rx::TranslatedIndexData translatedIndexData;
Jamie Madill87717702015-04-13 13:50:24 -0400177 for (unsigned int iteration = 0; iteration < 100; ++iteration)
178 {
Geoff Lang3edfe032015-09-04 16:38:24 -0400179 mIndexBuffer.getIndexRange(GL_UNSIGNED_SHORT, 0, mIndexCount, false,
180 &translatedIndexData.indexRange);
Jamie Madill4dd1e552015-11-06 14:23:24 -0500181 mIndexDataManager.prepareIndexData(GL_UNSIGNED_SHORT, mIndexCount, &mIndexBuffer, nullptr,
Cooper Partin534bf872016-02-09 11:33:29 -0800182 &translatedIndexData, false);
Jamie Madill87717702015-04-13 13:50:24 -0400183 }
Jamie Madill87717702015-04-13 13:50:24 -0400184}
185
186TEST_F(IndexDataManagerPerfTest, Run)
187{
188 run();
189}
190
Jamie Madill8f775602016-11-03 16:45:34 -0400191} // anonymous namespace