blob: b6465c01a75bb0c7fbaca65fea8df107bae444a4 [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 Madill87717702015-04-13 13:50:24 -040059
60 // Dependency injection
61 rx::IndexBuffer* createIndexBuffer() override
62 {
63 return new MockIndexBuffer(mBufferSize, mIndexType);
64 }
65
66 private:
67 unsigned int mBufferSize;
68 GLenum mIndexType;
69};
70
71class MockBufferD3D : public rx::BufferD3D
72{
73 public:
Geoff Lang71632d02015-05-12 17:14:56 -040074 MockBufferD3D(rx::BufferFactoryD3D *factory)
Jamie Madill87717702015-04-13 13:50:24 -040075 : BufferD3D(factory),
Geoff Lang71632d02015-05-12 17:14:56 -040076 mData()
Jamie Madill87717702015-04-13 13:50:24 -040077 {
78 }
79
80 // BufferImpl
Geoff Lang71632d02015-05-12 17:14:56 -040081 gl::Error setData(const void *data, size_t size, GLenum) override
82 {
83 mData.resize(size);
84 if (data && size > 0)
85 {
86 memcpy(&mData[0], data, size);
87 }
88 return gl::Error(GL_NO_ERROR);
89 }
90
Jamie Madill87717702015-04-13 13:50:24 -040091 MOCK_METHOD3(setSubData, gl::Error(const void*, size_t, size_t));
92 MOCK_METHOD4(copySubData, gl::Error(BufferImpl*, GLintptr, GLintptr, GLsizeiptr));
93 MOCK_METHOD2(map, gl::Error(GLenum, GLvoid **));
94 MOCK_METHOD4(mapRange, gl::Error(size_t, size_t, GLbitfield, GLvoid **));
95 MOCK_METHOD1(unmap, gl::Error(GLboolean *));
96
97 // BufferD3D
98 MOCK_METHOD0(markTransformFeedbackUsage, void());
99
100 // inlined for speed
101 bool supportsDirectBinding() const override { return false; }
Geoff Lang71632d02015-05-12 17:14:56 -0400102 size_t getSize() const override { return mData.size(); }
103
104 gl::Error getData(const uint8_t **outData) override
105 {
106 *outData = &mData[0];
107 return gl::Error(GL_NO_ERROR);
108 }
Jamie Madill87717702015-04-13 13:50:24 -0400109
110 private:
Geoff Lang71632d02015-05-12 17:14:56 -0400111 std::vector<uint8_t> mData;
Jamie Madill87717702015-04-13 13:50:24 -0400112};
113
114class IndexDataManagerPerfTest : public ANGLEPerfTest
115{
116 public:
117 IndexDataManagerPerfTest();
118
Olli Etuaho8047f062015-12-15 17:54:42 +0200119 void step() override;
Jamie Madill87717702015-04-13 13:50:24 -0400120
121 rx::IndexDataManager mIndexDataManager;
122 GLsizei mIndexCount;
123 unsigned int mBufferSize;
124 MockBufferFactoryD3D mMockFactory;
125 gl::Buffer mIndexBuffer;
Jamie Madill87717702015-04-13 13:50:24 -0400126};
127
Geoff Lang71632d02015-05-12 17:14:56 -0400128MockBufferD3D *InitMockBufferD3D(MockBufferFactoryD3D *mockFactory)
Jamie Madill87717702015-04-13 13:50:24 -0400129{
Geoff Lang71632d02015-05-12 17:14:56 -0400130 MockBufferD3D *mockBufferD3D = new MockBufferD3D(mockFactory);
Jamie Madill87717702015-04-13 13:50:24 -0400131
132 EXPECT_CALL(*mockFactory, createVertexBuffer()).WillOnce(Return(nullptr)).RetiresOnSaturation();
133 mockBufferD3D->initializeStaticData();
134
135 return mockBufferD3D;
136}
137
138IndexDataManagerPerfTest::IndexDataManagerPerfTest()
139 : ANGLEPerfTest("IndexDataManger", "_run"),
140 mIndexDataManager(&mMockFactory, rx::RENDERER_D3D11),
141 mIndexCount(4000),
Geoff Lang71632d02015-05-12 17:14:56 -0400142 mBufferSize(mIndexCount * sizeof(GLushort)),
Jamie Madill87717702015-04-13 13:50:24 -0400143 mMockFactory(mBufferSize, GL_UNSIGNED_SHORT),
Geoff Lang71632d02015-05-12 17:14:56 -0400144 mIndexBuffer(InitMockBufferD3D(&mMockFactory), 1)
Jamie Madill87717702015-04-13 13:50:24 -0400145{
Geoff Lang71632d02015-05-12 17:14:56 -0400146 std::vector<GLushort> indexData(mIndexCount);
Jamie Madill87717702015-04-13 13:50:24 -0400147 for (GLsizei index = 0; index < mIndexCount; ++index)
148 {
Geoff Lang71632d02015-05-12 17:14:56 -0400149 indexData[index] = static_cast<GLushort>(index);
Jamie Madill87717702015-04-13 13:50:24 -0400150 }
Geoff Lang71632d02015-05-12 17:14:56 -0400151 mIndexBuffer.bufferData(&indexData[0], indexData.size() * sizeof(GLushort), GL_STATIC_DRAW);
Jamie Madill87717702015-04-13 13:50:24 -0400152}
153
Olli Etuaho8047f062015-12-15 17:54:42 +0200154void IndexDataManagerPerfTest::step()
Jamie Madill87717702015-04-13 13:50:24 -0400155{
156 rx::TranslatedIndexData translatedIndexData;
Cooper Partin558f2b52015-06-02 09:34:11 -0700157 rx::SourceIndexData sourceIndexData;
Jamie Madill87717702015-04-13 13:50:24 -0400158 for (unsigned int iteration = 0; iteration < 100; ++iteration)
159 {
Geoff Lang3edfe032015-09-04 16:38:24 -0400160 mIndexBuffer.getIndexRange(GL_UNSIGNED_SHORT, 0, mIndexCount, false,
161 &translatedIndexData.indexRange);
Jamie Madill4dd1e552015-11-06 14:23:24 -0500162 mIndexDataManager.prepareIndexData(GL_UNSIGNED_SHORT, mIndexCount, &mIndexBuffer, nullptr,
163 &translatedIndexData, &sourceIndexData, false);
Jamie Madill87717702015-04-13 13:50:24 -0400164 }
Jamie Madill87717702015-04-13 13:50:24 -0400165}
166
167TEST_F(IndexDataManagerPerfTest, Run)
168{
169 run();
170}
171
172}