Edit

kc3-lang/angle/src/tests/test_utils/draw_call_perf_utils.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2017-02-15 10:41:31
    Hash : 3764b257
    Message : Vulkan: Run simple triangle perf test. The most basic perf test possible. BUG=angleproject:xxxx Change-Id: I71b28098c0a1f2174a0177b08bddf74d337438e9 Reviewed-on: https://chromium-review.googlesource.com/427270 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • src/tests/test_utils/draw_call_perf_utils.cpp
  • //
    // Copyright (c) 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 "shader_utils.h"
    
    namespace
    {
    
    const char *SimpleScaleAndOffsetVertexShaderSource()
    {
        // clang-format off
        return SHADER_SOURCE
        (
            attribute vec2 vPosition;
            uniform float uScale;
            uniform float uOffset;
            void main()
            {
                gl_Position = vec4(vPosition * vec2(uScale) + vec2(uOffset), 0, 1);
            }
        );
        // clang-format on
    }
    
    const char *SimpleDrawVertexShaderSource()
    {
        // clang-format off
        return SHADER_SOURCE
        (
            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);
            }
        );
        // clang-format on
    }
    
    const char *SimpleFragmentShaderSource()
    {
        // clang-format off
        return SHADER_SOURCE
        (
            precision mediump float;
            void main()
            {
                gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
            }
        );
        // clang-format on
    }
    
    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()
    {
        const std::string vs = SimpleScaleAndOffsetVertexShaderSource();
        const std::string fs = SimpleFragmentShaderSource();
        GLuint program       = CompileProgram(vs, fs);
        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()
    {
        const std::string vs = SimpleDrawVertexShaderSource();
        const std::string fs = SimpleFragmentShaderSource();
        GLuint program       = CompileProgram(vs, fs);
        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);
    }