Edit

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

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2018-12-02 12:03:33
    Hash : 35cd7332
    Message : Refactor test shader style. This change enforces a lot more consistency. We pass const char * to the Compile functions instead of std::string. Also fixes the indentation of C++11 block comments to be more consistent. Bug: angleproject:2995 Change-Id: Id6e5ea94055d8cbd420df4ea2e81b2d96cb5ce78 Reviewed-on: https://chromium-review.googlesource.com/c/1357103 Reviewed-by: Jamie Madill <jmadill@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
    {
    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);
    }