| // |
| // Copyright 2017 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. |
| // |
| // draw_call_perf_utils.cpp: |
| // Common utilities for performance tests that need to do a large amount of draw calls. |
| // |
| |
| #include "draw_call_perf_utils.h" |
| |
| #include <vector> |
| |
| #include "util/shader_utils.h" |
| |
| namespace |
| { |
| constexpr char kSimpleScaleAndOffsetVS[] = R"(attribute vec2 vPosition; |
| uniform float uScale; |
| uniform float uOffset; |
| void main() |
| { |
| gl_Position = vec4(vPosition * vec2(uScale) + vec2(uOffset), 0, 1); |
| })"; |
| |
| constexpr char kSimpleDrawVS[] = R"(attribute vec2 vPosition; |
| const float scale = 0.5; |
| const float offset = -0.5; |
| |
| void main() |
| { |
| gl_Position = vec4(vPosition * vec2(scale) + vec2(offset), 0, 1); |
| })"; |
| |
| constexpr char kSimpleTexCoordVS[] = R"(attribute vec2 vPosition; |
| varying vec2 texCoord; |
| void main() |
| { |
| gl_Position = vec4(vPosition, 0, 1); |
| texCoord = vPosition * 0.5 + vec2(0.5); |
| })"; |
| |
| constexpr char kSimpleFS[] = R"(precision mediump float; |
| void main() |
| { |
| gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); |
| })"; |
| |
| constexpr char kSimpleTextureFS[] = R"(precision mediump float; |
| varying vec2 texCoord; |
| uniform sampler2D tex; |
| void main() |
| { |
| gl_FragColor = texture2D(tex, texCoord); |
| })"; |
| |
| void Generate2DTriangleData(size_t numTris, std::vector<float> *floatData) |
| { |
| for (size_t triIndex = 0; triIndex < numTris; ++triIndex) |
| { |
| floatData->push_back(1.0f); |
| floatData->push_back(2.0f); |
| |
| floatData->push_back(0.0f); |
| floatData->push_back(0.0f); |
| |
| floatData->push_back(2.0f); |
| floatData->push_back(0.0f); |
| } |
| } |
| |
| } // anonymous namespace |
| |
| GLuint SetupSimpleScaleAndOffsetProgram() |
| { |
| GLuint program = CompileProgram(kSimpleScaleAndOffsetVS, kSimpleFS); |
| if (program == 0u) |
| { |
| return program; |
| } |
| |
| // Use the program object |
| glUseProgram(program); |
| |
| GLfloat scale = 0.5f; |
| GLfloat offset = -0.5f; |
| |
| glUniform1f(glGetUniformLocation(program, "uScale"), scale); |
| glUniform1f(glGetUniformLocation(program, "uOffset"), offset); |
| return program; |
| } |
| |
| GLuint SetupSimpleDrawProgram() |
| { |
| GLuint program = CompileProgram(kSimpleDrawVS, kSimpleFS); |
| if (program == 0u) |
| { |
| return program; |
| } |
| |
| // Use the program object |
| glUseProgram(program); |
| |
| return program; |
| } |
| |
| GLuint SetupSimpleTextureProgram() |
| { |
| GLuint program = CompileProgram(kSimpleTexCoordVS, kSimpleTextureFS); |
| if (program == 0u) |
| { |
| return program; |
| } |
| |
| // Use the program object |
| glUseProgram(program); |
| |
| return program; |
| } |
| |
| GLuint Create2DTriangleBuffer(size_t numTris, GLenum usage) |
| { |
| GLuint buffer = 0u; |
| glGenBuffers(1, &buffer); |
| glBindBuffer(GL_ARRAY_BUFFER, buffer); |
| |
| std::vector<GLfloat> floatData; |
| Generate2DTriangleData(numTris, &floatData); |
| |
| // To avoid generating GL errors when testing validation-only with zero triangles. |
| if (floatData.empty()) |
| { |
| floatData.push_back(0.0f); |
| } |
| |
| glBufferData(GL_ARRAY_BUFFER, floatData.size() * sizeof(GLfloat), &floatData[0], usage); |
| |
| return buffer; |
| } |
| |
| void CreateColorFBO(GLsizei width, GLsizei height, GLuint *fbo, GLuint *texture) |
| { |
| glGenFramebuffers(1, fbo); |
| glBindFramebuffer(GL_FRAMEBUFFER, *fbo); |
| glGenTextures(1, texture); |
| glBindTexture(GL_TEXTURE_2D, *texture); |
| glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); |
| glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *texture, 0); |
| } |