Path: blob/main_old/src/tests/perf_tests/IndexDataManagerTest.cpp
1693 views
//1// Copyright 2015 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// IndexDataManagerPerfTest:6// Performance test for index buffer management.7//89#include "ANGLEPerfTest.h"1011#include <gmock/gmock.h>1213#include "angle_unittests_utils.h"14#include "libANGLE/renderer/d3d/BufferD3D.h"15#include "libANGLE/renderer/d3d/IndexBuffer.h"16#include "libANGLE/renderer/d3d/IndexDataManager.h"1718using namespace testing;1920namespace21{22constexpr unsigned int kIterationsPerStep = 100;2324class MockIndexBuffer : public rx::IndexBuffer25{26public:27MockIndexBuffer(unsigned int bufferSize, gl::DrawElementsType indexType)28: mBufferSize(bufferSize), mIndexType(indexType)29{}3031MOCK_METHOD4(initialize,32angle::Result(const gl::Context *, unsigned int, gl::DrawElementsType, bool));33MOCK_METHOD4(mapBuffer,34angle::Result(const gl::Context *, unsigned int, unsigned int, void **));35MOCK_METHOD1(unmapBuffer, angle::Result(const gl::Context *));36MOCK_METHOD1(discard, angle::Result(const gl::Context *));37MOCK_METHOD3(setSize, angle::Result(const gl::Context *, unsigned int, gl::DrawElementsType));3839// inlined for speed40gl::DrawElementsType getIndexType() const override { return mIndexType; }41unsigned int getBufferSize() const override { return mBufferSize; }4243private:44unsigned int mBufferSize;45gl::DrawElementsType mIndexType;46};4748class MockBufferFactoryD3D : public rx::BufferFactoryD3D49{50public:51MockBufferFactoryD3D(unsigned int bufferSize, gl::DrawElementsType indexType)52: mBufferSize(bufferSize), mIndexType(indexType)53{}5455MOCK_METHOD0(createVertexBuffer, rx::VertexBuffer *());56MOCK_CONST_METHOD1(getVertexConversionType, rx::VertexConversionType(angle::FormatID));57MOCK_CONST_METHOD1(getVertexComponentType, GLenum(angle::FormatID));58MOCK_CONST_METHOD7(getVertexSpaceRequired,59angle::Result(const gl::Context *,60const gl::VertexAttribute &,61const gl::VertexBinding &,62size_t,63GLsizei,64GLuint,65unsigned int *));6667// Dependency injection68rx::IndexBuffer *createIndexBuffer() override69{70return new MockIndexBuffer(mBufferSize, mIndexType);71}7273private:74unsigned int mBufferSize;75gl::DrawElementsType mIndexType;76};7778class MockBufferD3D : public rx::BufferD3D79{80public:81MockBufferD3D(rx::BufferFactoryD3D *factory) : BufferD3D(mockState, factory), mData() {}8283// BufferImpl84angle::Result setData(const gl::Context *context,85gl::BufferBinding target,86const void *data,87size_t size,88gl::BufferUsage) override89{90mData.resize(size);91if (data && size > 0)92{93memcpy(&mData[0], data, size);94}95return angle::Result::Continue;96}9798MOCK_METHOD5(99setSubData,100angle::Result(const gl::Context *, gl::BufferBinding, const void *, size_t, size_t));101MOCK_METHOD5(copySubData,102angle::Result(const gl::Context *, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));103MOCK_METHOD3(map, angle::Result(const gl::Context *context, GLenum, void **));104MOCK_METHOD5(mapRange, angle::Result(const gl::Context *, size_t, size_t, GLbitfield, void **));105MOCK_METHOD2(unmap, angle::Result(const gl::Context *context, GLboolean *));106107// BufferD3D108MOCK_METHOD1(markTransformFeedbackUsage, angle::Result(const gl::Context *));109110// inlined for speed111bool supportsDirectBinding() const override { return false; }112size_t getSize() const override { return mData.size(); }113114angle::Result getData(const gl::Context *context, const uint8_t **outData) override115{116*outData = &mData[0];117return angle::Result::Continue;118}119120private:121gl::BufferState mockState;122std::vector<uint8_t> mData;123};124125class MockGLFactoryD3D : public rx::MockGLFactory126{127public:128MockGLFactoryD3D(MockBufferFactoryD3D *bufferFactory) : mBufferFactory(bufferFactory) {}129130rx::BufferImpl *createBuffer(const gl::BufferState &state) override131{132MockBufferD3D *mockBufferD3D = new MockBufferD3D(mBufferFactory);133134EXPECT_CALL(*mBufferFactory, createVertexBuffer())135.WillOnce(Return(nullptr))136.RetiresOnSaturation();137mockBufferD3D->initializeStaticData(nullptr);138139return mockBufferD3D;140}141142MockBufferFactoryD3D *mBufferFactory;143};144145class IndexDataManagerPerfTest : public ANGLEPerfTest146{147public:148IndexDataManagerPerfTest();149150void step() override;151152rx::IndexDataManager mIndexDataManager;153GLsizei mIndexCount;154unsigned int mBufferSize;155MockBufferFactoryD3D mMockBufferFactory;156MockGLFactoryD3D mMockGLFactory;157gl::Buffer mIndexBuffer;158};159160IndexDataManagerPerfTest::IndexDataManagerPerfTest()161: ANGLEPerfTest("IndexDataManager", "", "_run", kIterationsPerStep),162mIndexDataManager(&mMockBufferFactory),163mIndexCount(4000),164mBufferSize(mIndexCount * sizeof(GLushort)),165mMockBufferFactory(mBufferSize, gl::DrawElementsType::UnsignedShort),166mMockGLFactory(&mMockBufferFactory),167mIndexBuffer(&mMockGLFactory, {1})168{169std::vector<GLushort> indexData(mIndexCount);170for (GLsizei index = 0; index < mIndexCount; ++index)171{172indexData[index] = static_cast<GLushort>(index);173}174EXPECT_EQ(175angle::Result::Continue,176mIndexBuffer.bufferData(nullptr, gl::BufferBinding::Array, &indexData[0],177indexData.size() * sizeof(GLushort), gl::BufferUsage::StaticDraw));178}179180void IndexDataManagerPerfTest::step()181{182rx::TranslatedIndexData translatedIndexData;183gl::IndexRange indexRange;184for (unsigned int iteration = 0; iteration < kIterationsPerStep; ++iteration)185{186(void)mIndexBuffer.getIndexRange(nullptr, gl::DrawElementsType::UnsignedShort, 0,187mIndexCount, false, &indexRange);188(void)mIndexDataManager.prepareIndexData(nullptr, gl::DrawElementsType::UnsignedShort,189gl::DrawElementsType::UnsignedShort, mIndexCount,190&mIndexBuffer, nullptr, &translatedIndexData);191}192}193194TEST_F(IndexDataManagerPerfTest, Run)195{196run();197}198199} // anonymous namespace200201202