Path: blob/main_old/src/tests/perf_tests/IndexConversionPerf.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// IndexConversionPerf:6// Performance tests for ANGLE index conversion in D3D11.7//89#include "ANGLEPerfTest.h"10#include "tests/test_utils/draw_call_perf_utils.h"1112#include <sstream>1314using namespace angle;1516namespace17{18struct IndexConversionPerfParams final : public RenderTestParams19{20std::string story() const override21{22std::stringstream strstr;2324if (indexRangeOffset > 0)25{26strstr << "_index_range";27}2829strstr << RenderTestParams::story();3031return strstr.str();32}3334unsigned int numIndexTris;3536// A second test, which covers using index ranges with an offset.37unsigned int indexRangeOffset;38};3940// Provide a custom gtest parameter name function for IndexConversionPerfParams.41std::ostream &operator<<(std::ostream &stream, const IndexConversionPerfParams ¶m)42{43stream << param.backendAndStory().substr(1);44return stream;45}4647class IndexConversionPerfTest : public ANGLERenderTest,48public ::testing::WithParamInterface<IndexConversionPerfParams>49{50public:51IndexConversionPerfTest();5253void initializeBenchmark() override;54void destroyBenchmark() override;55void drawBenchmark() override;5657private:58void updateBufferData();59void drawConversion();60void drawIndexRange();6162GLuint mProgram;63GLuint mVertexBuffer;64GLuint mIndexBuffer;65std::vector<GLushort> mIndexData;66};6768IndexConversionPerfTest::IndexConversionPerfTest()69: ANGLERenderTest("IndexConversionPerfTest", GetParam()),70mProgram(0),71mVertexBuffer(0),72mIndexBuffer(0)73{}7475void IndexConversionPerfTest::initializeBenchmark()76{77const auto ¶ms = GetParam();7879ASSERT_LT(0u, params.iterationsPerStep);80ASSERT_LT(0u, params.numIndexTris);8182mProgram = SetupSimpleScaleAndOffsetProgram();83ASSERT_NE(0u, mProgram);8485glClearColor(0.0f, 0.0f, 0.0f, 0.0f);8687// Initialize the vertex data88size_t numTris = std::numeric_limits<GLushort>::max() / 3 + 1;89mVertexBuffer = Create2DTriangleBuffer(numTris, GL_STATIC_DRAW);9091glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);92glEnableVertexAttribArray(0);9394// Initialize the index buffer95for (unsigned int triIndex = 0; triIndex < params.numIndexTris; ++triIndex)96{97// Handle two different types of tests, one with index conversion triggered by a -1 index.98if (params.indexRangeOffset == 0)99{100mIndexData.push_back(std::numeric_limits<GLushort>::max());101}102else103{104mIndexData.push_back(0);105}106107mIndexData.push_back(1);108mIndexData.push_back(2);109}110111glGenBuffers(1, &mIndexBuffer);112glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);113updateBufferData();114115// Set the viewport116glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());117118ASSERT_GL_NO_ERROR();119}120121void IndexConversionPerfTest::updateBufferData()122{123glBufferData(GL_ELEMENT_ARRAY_BUFFER, mIndexData.size() * sizeof(mIndexData[0]), &mIndexData[0],124GL_STATIC_DRAW);125}126127void IndexConversionPerfTest::destroyBenchmark()128{129glDeleteProgram(mProgram);130glDeleteBuffers(1, &mVertexBuffer);131glDeleteBuffers(1, &mIndexBuffer);132}133134void IndexConversionPerfTest::drawBenchmark()135{136const auto ¶ms = GetParam();137138if (params.indexRangeOffset == 0)139{140drawConversion();141}142else143{144drawIndexRange();145}146}147148void IndexConversionPerfTest::drawConversion()149{150const auto ¶ms = GetParam();151152// Trigger an update to ensure we convert once a frame153updateBufferData();154155for (unsigned int it = 0; it < params.iterationsPerStep; it++)156{157glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(params.numIndexTris * 3 - 1),158GL_UNSIGNED_SHORT, reinterpret_cast<void *>(0));159}160161ASSERT_GL_NO_ERROR();162}163164void IndexConversionPerfTest::drawIndexRange()165{166const auto ¶ms = GetParam();167168unsigned int indexCount = 3;169size_t offset = static_cast<size_t>(indexCount * getNumStepsPerformed());170171offset %= (params.numIndexTris * 3);172173// This test increments an offset each step. Drawing repeatedly may cause the system memory174// to release. Then, using a fresh offset will require index range validation, which pages175// it back in. The performance should be good even if the data is was used quite a bit.176for (unsigned int it = 0; it < params.iterationsPerStep; it++)177{178glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(indexCount), GL_UNSIGNED_SHORT,179reinterpret_cast<void *>(offset));180}181182ASSERT_GL_NO_ERROR();183}184185IndexConversionPerfParams IndexConversionPerfD3D11Params()186{187IndexConversionPerfParams params;188params.eglParameters = egl_platform::D3D11_NULL();189params.majorVersion = 2;190params.minorVersion = 0;191params.windowWidth = 256;192params.windowHeight = 256;193params.iterationsPerStep = 225;194params.numIndexTris = 3000;195params.indexRangeOffset = 0;196return params;197}198199IndexConversionPerfParams IndexRangeOffsetPerfD3D11Params()200{201IndexConversionPerfParams params;202params.eglParameters = egl_platform::D3D11_NULL();203params.majorVersion = 2;204params.minorVersion = 0;205params.windowWidth = 256;206params.windowHeight = 256;207params.iterationsPerStep = 16;208params.numIndexTris = 50000;209params.indexRangeOffset = 64;210return params;211}212213TEST_P(IndexConversionPerfTest, Run)214{215run();216}217218ANGLE_INSTANTIATE_TEST(IndexConversionPerfTest,219IndexConversionPerfD3D11Params(),220IndexRangeOffsetPerfD3D11Params());221222// This test suite is not instantiated on some OSes.223GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(IndexConversionPerfTest);224} // namespace225226227