blob: a85d212cc12c5ed66cf9291e8476656c9716e456 [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
Jamie Madillb1565902018-07-27 08:12:48 -040032 MOCK_METHOD4(initialize, gl::Error(const gl::Context *, unsigned int, GLenum, bool));
33 MOCK_METHOD4(mapBuffer, gl::Error(const gl::Context *, unsigned int, unsigned int, void **));
34 MOCK_METHOD1(unmapBuffer, gl::Error(const gl::Context *));
35 MOCK_METHOD1(discard, gl::Error(const gl::Context *));
36 MOCK_METHOD3(setSize, gl::Error(const gl::Context *, unsigned int, GLenum));
Jamie Madill87717702015-04-13 13:50:24 -040037
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));
Jamie Madillb1565902018-07-27 08:12:48 -040058 MOCK_CONST_METHOD5(getVertexSpaceRequired,
59 gl::ErrorOrResult<unsigned int>(const gl::Context *,
60 const gl::VertexAttribute &,
Jiawei-Shao2597fb62016-12-09 16:38:02 +080061 const gl::VertexBinding &,
Jamie Madill18e323a2018-05-11 16:54:17 -040062 size_t,
Jamie Madilld8fa9212016-03-02 11:51:43 -050063 GLsizei));
Jamie Madill87717702015-04-13 13:50:24 -040064
65 // Dependency injection
Jamie Madill231c7f52017-04-26 13:45:37 -040066 rx::IndexBuffer *createIndexBuffer() override
Jamie Madill87717702015-04-13 13:50:24 -040067 {
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 Madillc564c072017-06-01 12:45:42 -040082 gl::Error setData(const gl::Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -040083 gl::BufferBinding target,
Jamie Madillb8353b02017-01-25 12:57:21 -080084 const void *data,
85 size_t size,
Corentin Wallez2e568cf2017-09-18 17:05:22 -040086 gl::BufferUsage) override
Geoff Lang71632d02015-05-12 17:14:56 -040087 {
88 mData.resize(size);
89 if (data && size > 0)
90 {
91 memcpy(&mData[0], data, size);
92 }
He Yunchaoacd18982017-01-04 10:46:42 +080093 return gl::NoError();
Geoff Lang71632d02015-05-12 17:14:56 -040094 }
95
Corentin Wallez336129f2017-10-17 15:55:40 -040096 MOCK_METHOD5(setSubData,
97 gl::Error(const gl::Context *, gl::BufferBinding, const void *, size_t, size_t));
Jamie Madill5f56ddb2017-01-13 17:29:55 -050098 MOCK_METHOD5(copySubData,
Jamie Madillc564c072017-06-01 12:45:42 -040099 gl::Error(const gl::Context *, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
100 MOCK_METHOD3(map, gl::Error(const gl::Context *context, GLenum, void **));
101 MOCK_METHOD5(mapRange, gl::Error(const gl::Context *, size_t, size_t, GLbitfield, void **));
102 MOCK_METHOD2(unmap, gl::Error(const gl::Context *context, GLboolean *));
Jamie Madill87717702015-04-13 13:50:24 -0400103
104 // BufferD3D
Jamie Madill33510102017-09-20 10:39:18 -0400105 MOCK_METHOD1(markTransformFeedbackUsage, gl::Error(const gl::Context *));
Jamie Madill87717702015-04-13 13:50:24 -0400106
107 // inlined for speed
108 bool supportsDirectBinding() const override { return false; }
Geoff Lang71632d02015-05-12 17:14:56 -0400109 size_t getSize() const override { return mData.size(); }
110
Jamie Madill33510102017-09-20 10:39:18 -0400111 gl::Error getData(const gl::Context *context, const uint8_t **outData) override
Geoff Lang71632d02015-05-12 17:14:56 -0400112 {
113 *outData = &mData[0];
He Yunchaoacd18982017-01-04 10:46:42 +0800114 return gl::NoError();
Geoff Lang71632d02015-05-12 17:14:56 -0400115 }
Jamie Madill87717702015-04-13 13:50:24 -0400116
117 private:
Jamie Madill8f775602016-11-03 16:45:34 -0400118 gl::BufferState mockState;
Geoff Lang71632d02015-05-12 17:14:56 -0400119 std::vector<uint8_t> mData;
Jamie Madill87717702015-04-13 13:50:24 -0400120};
121
Jamie Madill8f775602016-11-03 16:45:34 -0400122class MockGLFactoryD3D : public rx::MockGLFactory
123{
124 public:
125 MockGLFactoryD3D(MockBufferFactoryD3D *bufferFactory) : mBufferFactory(bufferFactory) {}
126
127 rx::BufferImpl *createBuffer(const gl::BufferState &state) override
128 {
129 MockBufferD3D *mockBufferD3D = new MockBufferD3D(mBufferFactory);
130
131 EXPECT_CALL(*mBufferFactory, createVertexBuffer())
132 .WillOnce(Return(nullptr))
133 .RetiresOnSaturation();
Jamie Madill33510102017-09-20 10:39:18 -0400134 mockBufferD3D->initializeStaticData(nullptr);
Jamie Madill8f775602016-11-03 16:45:34 -0400135
136 return mockBufferD3D;
137 }
138
139 MockBufferFactoryD3D *mBufferFactory;
140};
141
Jamie Madill87717702015-04-13 13:50:24 -0400142class IndexDataManagerPerfTest : public ANGLEPerfTest
143{
144 public:
145 IndexDataManagerPerfTest();
146
Olli Etuaho8047f062015-12-15 17:54:42 +0200147 void step() override;
Jamie Madill87717702015-04-13 13:50:24 -0400148
149 rx::IndexDataManager mIndexDataManager;
150 GLsizei mIndexCount;
151 unsigned int mBufferSize;
Jamie Madill8f775602016-11-03 16:45:34 -0400152 MockBufferFactoryD3D mMockBufferFactory;
153 MockGLFactoryD3D mMockGLFactory;
Jamie Madill87717702015-04-13 13:50:24 -0400154 gl::Buffer mIndexBuffer;
Jamie Madill87717702015-04-13 13:50:24 -0400155};
156
Jamie Madill87717702015-04-13 13:50:24 -0400157IndexDataManagerPerfTest::IndexDataManagerPerfTest()
158 : ANGLEPerfTest("IndexDataManger", "_run"),
Jamie Madill578b51f2017-11-20 16:13:34 -0500159 mIndexDataManager(&mMockBufferFactory),
Jamie Madill87717702015-04-13 13:50:24 -0400160 mIndexCount(4000),
Geoff Lang71632d02015-05-12 17:14:56 -0400161 mBufferSize(mIndexCount * sizeof(GLushort)),
Jamie Madill8f775602016-11-03 16:45:34 -0400162 mMockBufferFactory(mBufferSize, GL_UNSIGNED_SHORT),
163 mMockGLFactory(&mMockBufferFactory),
164 mIndexBuffer(&mMockGLFactory, 1)
Jamie Madill87717702015-04-13 13:50:24 -0400165{
Geoff Lang71632d02015-05-12 17:14:56 -0400166 std::vector<GLushort> indexData(mIndexCount);
Jamie Madill87717702015-04-13 13:50:24 -0400167 for (GLsizei index = 0; index < mIndexCount; ++index)
168 {
Geoff Lang71632d02015-05-12 17:14:56 -0400169 indexData[index] = static_cast<GLushort>(index);
Jamie Madill87717702015-04-13 13:50:24 -0400170 }
Jamie Madill71c88b32017-09-14 22:20:29 -0400171 EXPECT_FALSE(mIndexBuffer
Corentin Wallez336129f2017-10-17 15:55:40 -0400172 .bufferData(nullptr, gl::BufferBinding::Array, &indexData[0],
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400173 indexData.size() * sizeof(GLushort), gl::BufferUsage::StaticDraw)
Jamie Madill71c88b32017-09-14 22:20:29 -0400174 .isError());
Jamie Madill87717702015-04-13 13:50:24 -0400175}
176
Olli Etuaho8047f062015-12-15 17:54:42 +0200177void IndexDataManagerPerfTest::step()
Jamie Madill87717702015-04-13 13:50:24 -0400178{
179 rx::TranslatedIndexData translatedIndexData;
Jamie Madill578b51f2017-11-20 16:13:34 -0500180 gl::IndexRange indexRange;
Jamie Madill87717702015-04-13 13:50:24 -0400181 for (unsigned int iteration = 0; iteration < 100; ++iteration)
182 {
Jamie Madill33510102017-09-20 10:39:18 -0400183 (void)mIndexBuffer.getIndexRange(nullptr, GL_UNSIGNED_SHORT, 0, mIndexCount, false,
Jamie Madill578b51f2017-11-20 16:13:34 -0500184 &indexRange);
185 (void)mIndexDataManager.prepareIndexData(nullptr, GL_UNSIGNED_SHORT, GL_UNSIGNED_SHORT,
186 mIndexCount, &mIndexBuffer, nullptr,
187 &translatedIndexData);
Jamie Madill87717702015-04-13 13:50:24 -0400188 }
Jamie Madill87717702015-04-13 13:50:24 -0400189}
190
191TEST_F(IndexDataManagerPerfTest, Run)
192{
193 run();
194}
195
Jamie Madill8f775602016-11-03 16:45:34 -0400196} // anonymous namespace