Path: blob/main_old/src/tests/perf_tests/ClearPerf.cpp
1693 views
//1// Copyright 2019 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// ClearPerf:6// Performance test for clearing framebuffers.7//89#include "ANGLEPerfTest.h"1011#include <iostream>12#include <random>13#include <sstream>1415#include "test_utils/gl_raii.h"16#include "util/shader_utils.h"1718using namespace angle;1920namespace21{22constexpr unsigned int kIterationsPerStep = 256;2324struct ClearParams final : public RenderTestParams25{26ClearParams()27{28iterationsPerStep = kIterationsPerStep;29trackGpuTime = true;3031fboSize = 2048;32textureSize = 16;3334internalFormat = GL_RGBA8;35}3637std::string story() const override;3839GLsizei fboSize;40GLsizei textureSize;4142GLenum internalFormat;43};4445std::ostream &operator<<(std::ostream &os, const ClearParams ¶ms)46{47os << params.backendAndStory().substr(1);48return os;49}5051std::string ClearParams::story() const52{53std::stringstream strstr;5455strstr << RenderTestParams::story();5657if (internalFormat == GL_RGB8)58{59strstr << "_rgb";60}6162return strstr.str();63}6465class ClearBenchmark : public ANGLERenderTest, public ::testing::WithParamInterface<ClearParams>66{67public:68ClearBenchmark();6970void initializeBenchmark() override;71void destroyBenchmark() override;72void drawBenchmark() override;7374private:75void initShaders();7677std::vector<GLuint> mTextures;7879GLuint mProgram;80};8182ClearBenchmark::ClearBenchmark() : ANGLERenderTest("Clear", GetParam()), mProgram(0u)83{84// Crashes on nvidia+d3d11. http://crbug.com/94541585if (GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)86{87mSkipTest = true;88}89}9091void ClearBenchmark::initializeBenchmark()92{93initShaders();94glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());9596ASSERT_GL_NO_ERROR();97}9899void ClearBenchmark::initShaders()100{101constexpr char kVS[] = R"(void main()102{103gl_Position = vec4(0, 0, 0, 1);104})";105106constexpr char kFS[] = R"(precision mediump float;107void main()108{109gl_FragColor = vec4(0);110})";111112mProgram = CompileProgram(kVS, kFS);113ASSERT_NE(0u, mProgram);114115glUseProgram(mProgram);116117glDisable(GL_DEPTH_TEST);118119ASSERT_GL_NO_ERROR();120}121122void ClearBenchmark::destroyBenchmark()123{124glDeleteProgram(mProgram);125}126127void ClearBenchmark::drawBenchmark()128{129const auto ¶ms = GetParam();130131std::vector<float> textureData(params.textureSize * params.textureSize * 4, 0.5);132133GLRenderbuffer colorRbo;134glBindRenderbuffer(GL_RENDERBUFFER, colorRbo);135glRenderbufferStorage(GL_RENDERBUFFER, params.internalFormat, params.fboSize, params.fboSize);136137GLRenderbuffer depthRbo;138glBindRenderbuffer(GL_RENDERBUFFER, depthRbo);139glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, params.fboSize, params.fboSize);140141GLFramebuffer fbo;142glBindFramebuffer(GL_FRAMEBUFFER, fbo);143glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRbo);144glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRbo);145146startGpuTimer();147for (size_t it = 0; it < params.iterationsPerStep; ++it)148{149float clearValue = (it % 2) * 0.5f + 0.2f;150glClearColor(clearValue, clearValue, clearValue, clearValue);151glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);152glDrawArrays(GL_TRIANGLES, 0, 3);153}154stopGpuTimer();155156ASSERT_GL_NO_ERROR();157}158159ClearParams D3D11Params()160{161ClearParams params;162params.eglParameters = egl_platform::D3D11();163return params;164}165166ClearParams OpenGLOrGLESParams()167{168ClearParams params;169params.eglParameters = egl_platform::OPENGL_OR_GLES();170return params;171}172173ClearParams VulkanParams(bool emulatedFormat)174{175ClearParams params;176params.eglParameters = egl_platform::VULKAN();177if (emulatedFormat)178{179params.internalFormat = GL_RGB8;180}181return params;182}183184} // anonymous namespace185186TEST_P(ClearBenchmark, Run)187{188run();189}190191ANGLE_INSTANTIATE_TEST(ClearBenchmark,192D3D11Params(),193OpenGLOrGLESParams(),194VulkanParams(false),195VulkanParams(true));196197198