blob: a1919f9dac45e575af89bab738a9218937120ad4 [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{
Jamie Madill3402d522018-10-30 15:14:52 -040023constexpr unsigned int kIterationsPerStep = 100;
Jamie Madill87717702015-04-13 13:50:24 -040024
25class MockIndexBuffer : public rx::IndexBuffer
26{
27 public:
28 MockIndexBuffer(unsigned int bufferSize, GLenum indexType)
Jamie Madill231c7f52017-04-26 13:45:37 -040029 : mBufferSize(bufferSize), mIndexType(indexType)
Jamie Madill87717702015-04-13 13:50:24 -040030 {
31 }
32
Jamie Madillec1fe5b2018-08-10 10:05:52 -040033 MOCK_METHOD4(initialize, angle::Result(const gl::Context *, unsigned int, GLenum, bool));
34 MOCK_METHOD4(mapBuffer,
35 angle::Result(const gl::Context *, unsigned int, unsigned int, void **));
36 MOCK_METHOD1(unmapBuffer, angle::Result(const gl::Context *));
37 MOCK_METHOD1(discard, angle::Result(const gl::Context *));
38 MOCK_METHOD3(setSize, angle::Result(const gl::Context *, unsigned int, GLenum));
Jamie Madill87717702015-04-13 13:50:24 -040039
40 // inlined for speed
41 GLenum getIndexType() const override { return mIndexType; }
42 unsigned int getBufferSize() const override { return mBufferSize; }
43
44 private:
45 unsigned int mBufferSize;
46 GLenum mIndexType;
47};
48
49class MockBufferFactoryD3D : public rx::BufferFactoryD3D
50{
51 public:
52 MockBufferFactoryD3D(unsigned int bufferSize, GLenum indexType)
Jamie Madill231c7f52017-04-26 13:45:37 -040053 : mBufferSize(bufferSize), mIndexType(indexType)
Jamie Madill87717702015-04-13 13:50:24 -040054 {
55 }
56
Jamie Madill231c7f52017-04-26 13:45:37 -040057 MOCK_METHOD0(createVertexBuffer, rx::VertexBuffer *());
Frank Henigmand633b152018-10-04 23:34:31 -040058 MOCK_CONST_METHOD1(getVertexConversionType, rx::VertexConversionType(angle::FormatID));
59 MOCK_CONST_METHOD1(getVertexComponentType, GLenum(angle::FormatID));
Jamie Madill854429d2018-07-27 08:12:48 -040060 MOCK_CONST_METHOD6(getVertexSpaceRequired,
Jamie Madillec1fe5b2018-08-10 10:05:52 -040061 angle::Result(const gl::Context *,
62 const gl::VertexAttribute &,
63 const gl::VertexBinding &,
64 size_t,
65 GLsizei,
66 unsigned int *));
Jamie Madill87717702015-04-13 13:50:24 -040067
68 // Dependency injection
Jamie Madill231c7f52017-04-26 13:45:37 -040069 rx::IndexBuffer *createIndexBuffer() override
Jamie Madill87717702015-04-13 13:50:24 -040070 {
71 return new MockIndexBuffer(mBufferSize, mIndexType);
72 }
73
74 private:
75 unsigned int mBufferSize;
76 GLenum mIndexType;
77};
78
79class MockBufferD3D : public rx::BufferD3D
80{
81 public:
Jamie Madill8f775602016-11-03 16:45:34 -040082 MockBufferD3D(rx::BufferFactoryD3D *factory) : BufferD3D(mockState, factory), mData() {}
Jamie Madill87717702015-04-13 13:50:24 -040083
84 // BufferImpl
Jamie Madillae108bd2018-10-18 15:00:38 -040085 angle::Result setData(const gl::Context *context,
86 gl::BufferBinding target,
87 const void *data,
88 size_t size,
89 gl::BufferUsage) override
Geoff Lang71632d02015-05-12 17:14:56 -040090 {
91 mData.resize(size);
92 if (data && size > 0)
93 {
94 memcpy(&mData[0], data, size);
95 }
Jamie Madillae108bd2018-10-18 15:00:38 -040096 return angle::Result::Continue();
Geoff Lang71632d02015-05-12 17:14:56 -040097 }
98
Jamie Madillae108bd2018-10-18 15:00:38 -040099 MOCK_METHOD5(
100 setSubData,
101 angle::Result(const gl::Context *, gl::BufferBinding, const void *, size_t, size_t));
Jamie Madill5f56ddb2017-01-13 17:29:55 -0500102 MOCK_METHOD5(copySubData,
Jamie Madillae108bd2018-10-18 15:00:38 -0400103 angle::Result(const gl::Context *, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
104 MOCK_METHOD3(map, angle::Result(const gl::Context *context, GLenum, void **));
105 MOCK_METHOD5(mapRange, angle::Result(const gl::Context *, size_t, size_t, GLbitfield, void **));
106 MOCK_METHOD2(unmap, angle::Result(const gl::Context *context, GLboolean *));
Jamie Madill87717702015-04-13 13:50:24 -0400107
108 // BufferD3D
Jamie Madillec1fe5b2018-08-10 10:05:52 -0400109 MOCK_METHOD1(markTransformFeedbackUsage, angle::Result(const gl::Context *));
Jamie Madill87717702015-04-13 13:50:24 -0400110
111 // inlined for speed
112 bool supportsDirectBinding() const override { return false; }
Geoff Lang71632d02015-05-12 17:14:56 -0400113 size_t getSize() const override { return mData.size(); }
114
Jamie Madillec1fe5b2018-08-10 10:05:52 -0400115 angle::Result getData(const gl::Context *context, const uint8_t **outData) override
Geoff Lang71632d02015-05-12 17:14:56 -0400116 {
117 *outData = &mData[0];
Jamie Madillec1fe5b2018-08-10 10:05:52 -0400118 return angle::Result::Continue();
Geoff Lang71632d02015-05-12 17:14:56 -0400119 }
Jamie Madill87717702015-04-13 13:50:24 -0400120
121 private:
Jamie Madill8f775602016-11-03 16:45:34 -0400122 gl::BufferState mockState;
Geoff Lang71632d02015-05-12 17:14:56 -0400123 std::vector<uint8_t> mData;
Jamie Madill87717702015-04-13 13:50:24 -0400124};
125
Jamie Madill8f775602016-11-03 16:45:34 -0400126class MockGLFactoryD3D : public rx::MockGLFactory
127{
128 public:
129 MockGLFactoryD3D(MockBufferFactoryD3D *bufferFactory) : mBufferFactory(bufferFactory) {}
130
131 rx::BufferImpl *createBuffer(const gl::BufferState &state) override
132 {
133 MockBufferD3D *mockBufferD3D = new MockBufferD3D(mBufferFactory);
134
135 EXPECT_CALL(*mBufferFactory, createVertexBuffer())
136 .WillOnce(Return(nullptr))
137 .RetiresOnSaturation();
Jamie Madill33510102017-09-20 10:39:18 -0400138 mockBufferD3D->initializeStaticData(nullptr);
Jamie Madill8f775602016-11-03 16:45:34 -0400139
140 return mockBufferD3D;
141 }
142
143 MockBufferFactoryD3D *mBufferFactory;
144};
145
Jamie Madill87717702015-04-13 13:50:24 -0400146class IndexDataManagerPerfTest : public ANGLEPerfTest
147{
148 public:
149 IndexDataManagerPerfTest();
150
Olli Etuaho8047f062015-12-15 17:54:42 +0200151 void step() override;
Jamie Madill87717702015-04-13 13:50:24 -0400152
153 rx::IndexDataManager mIndexDataManager;
154 GLsizei mIndexCount;
155 unsigned int mBufferSize;
Jamie Madill8f775602016-11-03 16:45:34 -0400156 MockBufferFactoryD3D mMockBufferFactory;
157 MockGLFactoryD3D mMockGLFactory;
Jamie Madill87717702015-04-13 13:50:24 -0400158 gl::Buffer mIndexBuffer;
Jamie Madill87717702015-04-13 13:50:24 -0400159};
160
Jamie Madill87717702015-04-13 13:50:24 -0400161IndexDataManagerPerfTest::IndexDataManagerPerfTest()
Jamie Madill3402d522018-10-30 15:14:52 -0400162 : ANGLEPerfTest("IndexDataManger", "_run", kIterationsPerStep),
Jamie Madill578b51f2017-11-20 16:13:34 -0500163 mIndexDataManager(&mMockBufferFactory),
Jamie Madill87717702015-04-13 13:50:24 -0400164 mIndexCount(4000),
Geoff Lang71632d02015-05-12 17:14:56 -0400165 mBufferSize(mIndexCount * sizeof(GLushort)),
Jamie Madill8f775602016-11-03 16:45:34 -0400166 mMockBufferFactory(mBufferSize, GL_UNSIGNED_SHORT),
167 mMockGLFactory(&mMockBufferFactory),
168 mIndexBuffer(&mMockGLFactory, 1)
Jamie Madill87717702015-04-13 13:50:24 -0400169{
Geoff Lang71632d02015-05-12 17:14:56 -0400170 std::vector<GLushort> indexData(mIndexCount);
Jamie Madill87717702015-04-13 13:50:24 -0400171 for (GLsizei index = 0; index < mIndexCount; ++index)
172 {
Geoff Lang71632d02015-05-12 17:14:56 -0400173 indexData[index] = static_cast<GLushort>(index);
Jamie Madill87717702015-04-13 13:50:24 -0400174 }
Jamie Madill71c88b32017-09-14 22:20:29 -0400175 EXPECT_FALSE(mIndexBuffer
Corentin Wallez336129f2017-10-17 15:55:40 -0400176 .bufferData(nullptr, gl::BufferBinding::Array, &indexData[0],
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400177 indexData.size() * sizeof(GLushort), gl::BufferUsage::StaticDraw)
Jamie Madill71c88b32017-09-14 22:20:29 -0400178 .isError());
Jamie Madill87717702015-04-13 13:50:24 -0400179}
180
Olli Etuaho8047f062015-12-15 17:54:42 +0200181void IndexDataManagerPerfTest::step()
Jamie Madill87717702015-04-13 13:50:24 -0400182{
183 rx::TranslatedIndexData translatedIndexData;
Jamie Madill578b51f2017-11-20 16:13:34 -0500184 gl::IndexRange indexRange;
Jamie Madill3402d522018-10-30 15:14:52 -0400185 for (unsigned int iteration = 0; iteration < kIterationsPerStep; ++iteration)
Jamie Madill87717702015-04-13 13:50:24 -0400186 {
Jamie Madill33510102017-09-20 10:39:18 -0400187 (void)mIndexBuffer.getIndexRange(nullptr, GL_UNSIGNED_SHORT, 0, mIndexCount, false,
Jamie Madill578b51f2017-11-20 16:13:34 -0500188 &indexRange);
189 (void)mIndexDataManager.prepareIndexData(nullptr, GL_UNSIGNED_SHORT, GL_UNSIGNED_SHORT,
190 mIndexCount, &mIndexBuffer, nullptr,
191 &translatedIndexData);
Jamie Madill87717702015-04-13 13:50:24 -0400192 }
Jamie Madill87717702015-04-13 13:50:24 -0400193}
194
195TEST_F(IndexDataManagerPerfTest, Run)
196{
197 run();
198}
199
Jamie Madill8f775602016-11-03 16:45:34 -0400200} // anonymous namespace