blob: 5a6ebcc617ea94c60ad072895221f78abc64ba79 [file] [log] [blame]
//
// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// LinkProgramPerfTest:
// Performance tests compiling a lot of shaders.
//
#include "ANGLEPerfTest.h"
#include <array>
#include "common/vector_utils.h"
#include "shader_utils.h"
using namespace angle;
namespace
{
struct LinkProgramParams final : public RenderTestParams
{
LinkProgramParams()
{
majorVersion = 2;
minorVersion = 0;
windowWidth = 256;
windowHeight = 256;
}
std::string suffix() const override
{
std::stringstream strstr;
strstr << RenderTestParams::suffix();
if (eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
{
strstr << "_null";
}
return strstr.str();
}
};
std::ostream &operator<<(std::ostream &os, const LinkProgramParams &params)
{
os << params.suffix().substr(1);
return os;
}
class LinkProgramBenchmark : public ANGLERenderTest,
public ::testing::WithParamInterface<LinkProgramParams>
{
public:
LinkProgramBenchmark();
void initializeBenchmark() override;
void destroyBenchmark() override;
void drawBenchmark() override;
protected:
GLuint mVertexBuffer = 0;
};
LinkProgramBenchmark::LinkProgramBenchmark() : ANGLERenderTest("LinkProgram", GetParam())
{
}
void LinkProgramBenchmark::initializeBenchmark()
{
std::array<Vector3, 6> vertices = {{Vector3(-1.0f, 1.0f, 0.5f), Vector3(-1.0f, -1.0f, 0.5f),
Vector3(1.0f, -1.0f, 0.5f), Vector3(-1.0f, 1.0f, 0.5f),
Vector3(1.0f, -1.0f, 0.5f), Vector3(1.0f, 1.0f, 0.5f)}};
glGenBuffers(1, &mVertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vector3), vertices.data(),
GL_STATIC_DRAW);
};
void LinkProgramBenchmark::destroyBenchmark()
{
glDeleteBuffers(1, &mVertexBuffer);
}
void LinkProgramBenchmark::drawBenchmark()
{
static const char *vertexShader =
"attribute vec2 position;\n"
"void main() {\n"
" gl_Position = vec4(position, 0, 1);\n"
"}";
static const char *fragmentShader =
"precision mediump float;\n"
"void main() {\n"
" gl_FragColor = vec4(1, 0, 0, 1);\n"
"}";
GLuint program = CompileProgram(vertexShader, fragmentShader);
ASSERT_NE(0u, program);
glUseProgram(program);
GLint positionLoc = glGetAttribLocation(program, "position");
glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 8, nullptr);
glEnableVertexAttribArray(positionLoc);
// Draw with the program to ensure the shader gets compiled and used.
glDrawArrays(GL_TRIANGLES, 0, 6);
glDeleteProgram(program);
}
using namespace egl_platform;
LinkProgramParams LinkProgramD3D11Params()
{
LinkProgramParams params;
params.eglParameters = D3D11();
return params;
}
LinkProgramParams LinkProgramD3D9Params()
{
LinkProgramParams params;
params.eglParameters = D3D9();
return params;
}
LinkProgramParams LinkProgramOpenGLParams()
{
LinkProgramParams params;
params.eglParameters = OPENGL();
return params;
}
TEST_P(LinkProgramBenchmark, Run)
{
run();
}
ANGLE_INSTANTIATE_TEST(LinkProgramBenchmark,
LinkProgramD3D11Params(),
LinkProgramD3D9Params(),
LinkProgramOpenGLParams());
} // anonymous namespace