blob: 4f11e49e044e3c7939386aa694e95ca9f2b0c1ba [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 Madillb980c562018-11-27 11:34:27 -050030 {}
Jamie Madill87717702015-04-13 13:50:24 -040031
Jamie Madillec1fe5b2018-08-10 10:05:52 -040032 MOCK_METHOD4(initialize, angle::Result(const gl::Context *, unsigned int, GLenum, bool));
33 MOCK_METHOD4(mapBuffer,
34 angle::Result(const gl::Context *, unsigned int, unsigned int, void **));
35 MOCK_METHOD1(unmapBuffer, angle::Result(const gl::Context *));
36 MOCK_METHOD1(discard, angle::Result(const gl::Context *));
37 MOCK_METHOD3(setSize, angle::Result(const gl::Context *, unsigned int, GLenum));
Jamie Madill87717702015-04-13 13:50:24 -040038
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)
Jamie Madill231c7f52017-04-26 13:45:37 -040052 : mBufferSize(bufferSize), mIndexType(indexType)
Jamie Madillb980c562018-11-27 11:34:27 -050053 {}
Jamie Madill87717702015-04-13 13:50:24 -040054
Jamie Madill231c7f52017-04-26 13:45:37 -040055 MOCK_METHOD0(createVertexBuffer, rx::VertexBuffer *());
Frank Henigmand633b152018-10-04 23:34:31 -040056 MOCK_CONST_METHOD1(getVertexConversionType, rx::VertexConversionType(angle::FormatID));
57 MOCK_CONST_METHOD1(getVertexComponentType, GLenum(angle::FormatID));
Jamie Madill854429d2018-07-27 08:12:48 -040058 MOCK_CONST_METHOD6(getVertexSpaceRequired,
Jamie Madillec1fe5b2018-08-10 10:05:52 -040059 angle::Result(const gl::Context *,
60 const gl::VertexAttribute &,
61 const gl::VertexBinding &,
62 size_t,
63 GLsizei,
64 unsigned int *));
Jamie Madill87717702015-04-13 13:50:24 -040065
66 // Dependency injection
Jamie Madill231c7f52017-04-26 13:45:37 -040067 rx::IndexBuffer *createIndexBuffer() override
Jamie Madill87717702015-04-13 13:50:24 -040068 {
69 return new MockIndexBuffer(mBufferSize, mIndexType);
70 }
71
72 private:
73 unsigned int mBufferSize;
74 GLenum mIndexType;
75};
76
77class MockBufferD3D : public rx::BufferD3D
78{
79 public:
Jamie Madill8f775602016-11-03 16:45:34 -040080 MockBufferD3D(rx::BufferFactoryD3D *factory) : BufferD3D(mockState, factory), mData() {}
Jamie Madill87717702015-04-13 13:50:24 -040081
82 // BufferImpl
Jamie Madillae108bd2018-10-18 15:00:38 -040083 angle::Result setData(const gl::Context *context,
84 gl::BufferBinding target,
85 const void *data,
86 size_t size,
87 gl::BufferUsage) override
Geoff Lang71632d02015-05-12 17:14:56 -040088 {
89 mData.resize(size);
90 if (data && size > 0)
91 {
92 memcpy(&mData[0], data, size);
93 }
Jamie Madillae108bd2018-10-18 15:00:38 -040094 return angle::Result::Continue();
Geoff Lang71632d02015-05-12 17:14:56 -040095 }
96
Jamie Madillae108bd2018-10-18 15:00:38 -040097 MOCK_METHOD5(
98 setSubData,
99 angle::Result(const gl::Context *, gl::BufferBinding, const void *, size_t, size_t));
Jamie Madill5f56ddb2017-01-13 17:29:55 -0500100 MOCK_METHOD5(copySubData,
Jamie Madillae108bd2018-10-18 15:00:38 -0400101 angle::Result(const gl::Context *, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
102 MOCK_METHOD3(map, angle::Result(const gl::Context *context, GLenum, void **));
103 MOCK_METHOD5(mapRange, angle::Result(const gl::Context *, size_t, size_t, GLbitfield, void **));
104 MOCK_METHOD2(unmap, angle::Result(const gl::Context *context, GLboolean *));
Jamie Madill87717702015-04-13 13:50:24 -0400105
106 // BufferD3D
Jamie Madillec1fe5b2018-08-10 10:05:52 -0400107 MOCK_METHOD1(markTransformFeedbackUsage, angle::Result(const gl::Context *));
Jamie Madill87717702015-04-13 13:50:24 -0400108
109 // inlined for speed
110 bool supportsDirectBinding() const override { return false; }
Geoff Lang71632d02015-05-12 17:14:56 -0400111 size_t getSize() const override { return mData.size(); }
112
Jamie Madillec1fe5b2018-08-10 10:05:52 -0400113 angle::Result getData(const gl::Context *context, const uint8_t **outData) override
Geoff Lang71632d02015-05-12 17:14:56 -0400114 {
115 *outData = &mData[0];
Jamie Madillec1fe5b2018-08-10 10:05:52 -0400116 return angle::Result::Continue();
Geoff Lang71632d02015-05-12 17:14:56 -0400117 }
Jamie Madill87717702015-04-13 13:50:24 -0400118
119 private:
Jamie Madill8f775602016-11-03 16:45:34 -0400120 gl::BufferState mockState;
Geoff Lang71632d02015-05-12 17:14:56 -0400121 std::vector<uint8_t> mData;
Jamie Madill87717702015-04-13 13:50:24 -0400122};
123
Jamie Madill8f775602016-11-03 16:45:34 -0400124class MockGLFactoryD3D : public rx::MockGLFactory
125{
126 public:
127 MockGLFactoryD3D(MockBufferFactoryD3D *bufferFactory) : mBufferFactory(bufferFactory) {}
128
129 rx::BufferImpl *createBuffer(const gl::BufferState &state) override
130 {
131 MockBufferD3D *mockBufferD3D = new MockBufferD3D(mBufferFactory);
132
133 EXPECT_CALL(*mBufferFactory, createVertexBuffer())
134 .WillOnce(Return(nullptr))
135 .RetiresOnSaturation();
Jamie Madill33510102017-09-20 10:39:18 -0400136 mockBufferD3D->initializeStaticData(nullptr);
Jamie Madill8f775602016-11-03 16:45:34 -0400137
138 return mockBufferD3D;
139 }
140
141 MockBufferFactoryD3D *mBufferFactory;
142};
143
Jamie Madill87717702015-04-13 13:50:24 -0400144class IndexDataManagerPerfTest : public ANGLEPerfTest
145{
146 public:
147 IndexDataManagerPerfTest();
148
Olli Etuaho8047f062015-12-15 17:54:42 +0200149 void step() override;
Jamie Madill87717702015-04-13 13:50:24 -0400150
151 rx::IndexDataManager mIndexDataManager;
152 GLsizei mIndexCount;
153 unsigned int mBufferSize;
Jamie Madill8f775602016-11-03 16:45:34 -0400154 MockBufferFactoryD3D mMockBufferFactory;
155 MockGLFactoryD3D mMockGLFactory;
Jamie Madill87717702015-04-13 13:50:24 -0400156 gl::Buffer mIndexBuffer;
Jamie Madill87717702015-04-13 13:50:24 -0400157};
158
Jamie Madill87717702015-04-13 13:50:24 -0400159IndexDataManagerPerfTest::IndexDataManagerPerfTest()
Jamie Madill3402d522018-10-30 15:14:52 -0400160 : ANGLEPerfTest("IndexDataManger", "_run", kIterationsPerStep),
Jamie Madill578b51f2017-11-20 16:13:34 -0500161 mIndexDataManager(&mMockBufferFactory),
Jamie Madill87717702015-04-13 13:50:24 -0400162 mIndexCount(4000),
Geoff Lang71632d02015-05-12 17:14:56 -0400163 mBufferSize(mIndexCount * sizeof(GLushort)),
Jamie Madill8f775602016-11-03 16:45:34 -0400164 mMockBufferFactory(mBufferSize, GL_UNSIGNED_SHORT),
165 mMockGLFactory(&mMockBufferFactory),
166 mIndexBuffer(&mMockGLFactory, 1)
Jamie Madill87717702015-04-13 13:50:24 -0400167{
Geoff Lang71632d02015-05-12 17:14:56 -0400168 std::vector<GLushort> indexData(mIndexCount);
Jamie Madill87717702015-04-13 13:50:24 -0400169 for (GLsizei index = 0; index < mIndexCount; ++index)
170 {
Geoff Lang71632d02015-05-12 17:14:56 -0400171 indexData[index] = static_cast<GLushort>(index);
Jamie Madill87717702015-04-13 13:50:24 -0400172 }
Jamie Madill71c88b32017-09-14 22:20:29 -0400173 EXPECT_FALSE(mIndexBuffer
Corentin Wallez336129f2017-10-17 15:55:40 -0400174 .bufferData(nullptr, gl::BufferBinding::Array, &indexData[0],
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400175 indexData.size() * sizeof(GLushort), gl::BufferUsage::StaticDraw)
Jamie Madill71c88b32017-09-14 22:20:29 -0400176 .isError());
Jamie Madill87717702015-04-13 13:50:24 -0400177}
178
Olli Etuaho8047f062015-12-15 17:54:42 +0200179void IndexDataManagerPerfTest::step()
Jamie Madill87717702015-04-13 13:50:24 -0400180{
181 rx::TranslatedIndexData translatedIndexData;
Jamie Madill578b51f2017-11-20 16:13:34 -0500182 gl::IndexRange indexRange;
Jamie Madill3402d522018-10-30 15:14:52 -0400183 for (unsigned int iteration = 0; iteration < kIterationsPerStep; ++iteration)
Jamie Madill87717702015-04-13 13:50:24 -0400184 {
Jamie Madill33510102017-09-20 10:39:18 -0400185 (void)mIndexBuffer.getIndexRange(nullptr, GL_UNSIGNED_SHORT, 0, mIndexCount, false,
Jamie Madill578b51f2017-11-20 16:13:34 -0500186 &indexRange);
187 (void)mIndexDataManager.prepareIndexData(nullptr, GL_UNSIGNED_SHORT, GL_UNSIGNED_SHORT,
188 mIndexCount, &mIndexBuffer, nullptr,
189 &translatedIndexData);
Jamie Madill87717702015-04-13 13:50:24 -0400190 }
Jamie Madill87717702015-04-13 13:50:24 -0400191}
192
193TEST_F(IndexDataManagerPerfTest, Run)
194{
195 run();
196}
197
Jamie Madill8f775602016-11-03 16:45:34 -0400198} // anonymous namespace