133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill//
233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill// Use of this source code is governed by a BSD-style license that can be
433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill// found in the LICENSE file.
533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill//
633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill#include "BufferSubData.h"
833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill#include <cassert>
1033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill#include <sstream>
1133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
12bbffd5562e33a6cf6f6f1bb5be6cfa30df8f36ecJamie Madill#include "shader_utils.h"
13bbffd5562e33a6cf6f6f1bb5be6cfa30df8f36ecJamie Madill
142d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madillnamespace
152d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill{
162d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
172d8c879fb1e0429d57966195ba75b413d3f43474Jamie MadillGLfloat *GetFloatData(GLint componentCount)
182d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill{
192d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    static GLfloat vertices2[] =
202d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
212d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        1, 2,
222d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        0, 0,
232d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        2, 0,
242d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    };
252d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
262d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    static GLfloat vertices3[] =
272d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
282d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        1, 2, 1,
292d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        0, 0, 1,
302d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        2, 0, 1,
312d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    };
322d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
332d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    static GLfloat vertices4[] =
342d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
352d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        1, 2, 1, 3,
362d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        0, 0, 1, 3,
372d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        2, 0, 1, 3,
382d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    };
392d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
402d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    switch (componentCount)
412d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
422d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill      case 2: return vertices2;
432d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill      case 3: return vertices3;
442d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill      case 4: return vertices4;
452d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill      default: return NULL;
462d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    }
472d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill}
482d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
492d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madilltemplate <class T>
502d8c879fb1e0429d57966195ba75b413d3f43474Jamie MadillGLsizeiptr GetNormalizedData(GLsizeiptr numElements, GLfloat *floatData, std::vector<uint8_t> *data)
512d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill{
522d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    GLsizeiptr triDataSize = sizeof(T) * numElements;
532d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    data->resize(triDataSize);
542d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
552d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    T *destPtr = reinterpret_cast<T*>(data->data());
562d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
572d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    for (GLsizeiptr dataIndex = 0; dataIndex < numElements; dataIndex++)
582d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
592d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        GLfloat scaled = floatData[dataIndex] * 0.25f;
602d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        destPtr[dataIndex] = static_cast<T>(scaled * static_cast<GLfloat>(std::numeric_limits<T>::max()));
612d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    }
622d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
632d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    return triDataSize;
642d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill}
652d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
662d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madilltemplate <class T>
672d8c879fb1e0429d57966195ba75b413d3f43474Jamie MadillGLsizeiptr GetIntData(GLsizeiptr numElements, GLfloat *floatData, std::vector<uint8_t> *data)
682d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill{
692d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    GLsizeiptr triDataSize = sizeof(T) * numElements;
702d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    data->resize(triDataSize);
712d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
722d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    T *destPtr = reinterpret_cast<T*>(data->data());
732d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
742d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    for (GLsizeiptr dataIndex = 0; dataIndex < numElements; dataIndex++)
752d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
762d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        destPtr[dataIndex] = static_cast<T>(floatData[dataIndex]);
772d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    }
782d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
792d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    return triDataSize;
802d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill}
812d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
822d8c879fb1e0429d57966195ba75b413d3f43474Jamie MadillGLsizeiptr GetVertexData(GLenum type, GLint componentCount, GLboolean normalized, std::vector<uint8_t> *data)
832d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill{
842d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    GLsizeiptr triDataSize = 0;
852d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    GLfloat *floatData = GetFloatData(componentCount);
862d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
872d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    if (type == GL_FLOAT)
882d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
892d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        triDataSize = sizeof(GLfloat) * componentCount * 3;
902d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        data->resize(triDataSize);
912d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        memcpy(data->data(), floatData, triDataSize);
922d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    }
932d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    else if (normalized == GL_TRUE)
942d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
952d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        GLsizeiptr numElements = componentCount * 3;
962d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
972d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        switch (type)
982d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        {
992d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_BYTE:           triDataSize = GetNormalizedData<GLbyte>(numElements, floatData, data); break;
1002d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_SHORT:          triDataSize = GetNormalizedData<GLshort>(numElements, floatData, data); break;
1012d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_INT:            triDataSize = GetNormalizedData<GLint>(numElements, floatData, data); break;
1022d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_UNSIGNED_BYTE:  triDataSize = GetNormalizedData<GLubyte>(numElements, floatData, data); break;
1032d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_UNSIGNED_SHORT: triDataSize = GetNormalizedData<GLushort>(numElements, floatData, data); break;
1042d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_UNSIGNED_INT:   triDataSize = GetNormalizedData<GLuint>(numElements, floatData, data); break;
1052d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          default: assert(0);
1062d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        }
1072d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    }
1082d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    else
1092d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
1102d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        GLsizeiptr numElements = componentCount * 3;
1112d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
1122d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        switch (type)
1132d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        {
1142d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_BYTE:           triDataSize = GetIntData<GLbyte>(numElements, floatData, data); break;
1152d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_SHORT:          triDataSize = GetIntData<GLshort>(numElements, floatData, data); break;
1162d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_INT:            triDataSize = GetIntData<GLint>(numElements, floatData, data); break;
1172d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_UNSIGNED_BYTE:  triDataSize = GetIntData<GLubyte>(numElements, floatData, data); break;
1182d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_UNSIGNED_SHORT: triDataSize = GetIntData<GLushort>(numElements, floatData, data); break;
1192d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          case GL_UNSIGNED_INT:   triDataSize = GetIntData<GLuint>(numElements, floatData, data); break;
1202d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill          default: assert(0);
1212d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        }
1222d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    }
1232d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
1242d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    return triDataSize;
1252d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill}
1262d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
1272d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill}
1282d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
12933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madillstd::string BufferSubDataParams::name() const
13033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill{
13133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    std::stringstream strstr;
13233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
133bbffd5562e33a6cf6f6f1bb5be6cfa30df8f36ecJamie Madill    strstr << "BufferSubData - " << BenchmarkParams::name() << " - ";
13433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
1352d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    if (vertexNormalized)
1362d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
1372d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        strstr << "Norm";
1382d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    }
1392d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
14033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    switch (vertexType)
14133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    {
14233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill      case GL_FLOAT: strstr << "Float"; break;
14333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill      case GL_INT: strstr << "Int"; break;
14433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill      case GL_BYTE: strstr << "Byte"; break;
14533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill      case GL_SHORT: strstr << "Short"; break;
14633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill      case GL_UNSIGNED_INT: strstr << "UInt"; break;
14733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill      case GL_UNSIGNED_BYTE: strstr << "UByte"; break;
14833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill      case GL_UNSIGNED_SHORT: strstr << "UShort"; break;
14933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill      default: strstr << "UNKNOWN FORMAT (" << vertexType << ")"; break;
15033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    }
15133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
15233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    strstr << vertexComponentCount;
15333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
15482cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill    strstr << " - " << updateSize << "b updates (per " << updatesEveryNFrames << ") - ";
15533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    strstr << (bufferSize >> 10) << "k buffer - ";
15633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    strstr << iterations << " updates";
15733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
15833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    return strstr.str();
15933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill}
16033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
16133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie MadillBufferSubDataBenchmark::BufferSubDataBenchmark(const BufferSubDataParams &params)
16233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    : SimpleBenchmark(params.name(), 1280, 720, 2, params.requestedRenderer),
16382cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill      mProgram(0),
16482cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill      mBuffer(0),
16582cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill      mUpdateData(NULL),
16682cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill      mNumTris(0),
16733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill      mParams(params)
16833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill{
16933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    mDrawIterations = mParams.iterations;
17033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
17133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    assert(mParams.vertexComponentCount > 1);
17233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    assert(mParams.iterations > 0);
17333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill}
17433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
17533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madillbool BufferSubDataBenchmark::initializeBenchmark()
17633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill{
17733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    const std::string vs = SHADER_SOURCE
17833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    (
1792d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        attribute vec2 vPosition;
1802d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        uniform float uScale;
1812d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        uniform float uOffset;
18233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        void main()
18333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        {
1842d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill            gl_Position = vec4(vPosition * vec2(uScale) - vec2(uOffset), 0, 1);
18533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        }
18633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    );
18733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
18833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    const std::string fs = SHADER_SOURCE
18933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    (
19033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        precision mediump float;
19133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        void main()
19233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        {
19333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill            gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
19433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        }
19533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    );
19633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
19733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    mProgram = CompileProgram(vs, fs);
19833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    if (!mProgram)
19933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    {
20033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        return false;
20133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    }
20233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
20333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    // Use the program object
20433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    glUseProgram(mProgram);
20533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
20633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
20733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
20882cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill
20982cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill    std::vector<uint8_t> zeroData(mParams.bufferSize);
21082cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill    memset(zeroData.data(), 0, zeroData.size());
21182cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill
21233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    glGenBuffers(1, &mBuffer);
21333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
21482cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill    glBufferData(GL_ARRAY_BUFFER, mParams.bufferSize, zeroData.data(), GL_DYNAMIC_DRAW);
21533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
21633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    glVertexAttribPointer(0, mParams.vertexComponentCount, mParams.vertexType,
21733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill                          mParams.vertexNormalized, 0, 0);
21833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    glEnableVertexAttribArray(0);
21933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
22082cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill    if (mParams.updateSize > 0)
22182cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill    {
22282cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill        mUpdateData = new uint8_t[mParams.updateSize];
22382cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill    }
22433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
2252d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    std::vector<uint8_t> data;
2262d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    GLsizei triDataSize = GetVertexData(mParams.vertexType,
2272d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill                                        mParams.vertexComponentCount,
2282d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill                                        mParams.vertexNormalized, &data);
22933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
23033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    mNumTris = mParams.updateSize / triDataSize;
2312d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    for (int i = 0, offset = 0; i < mNumTris; ++i)
23233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    {
2332d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        memcpy(mUpdateData + offset, data.data(), triDataSize);
23433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        offset += triDataSize;
23533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    }
23633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
23782cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill    if (mParams.updateSize == 0)
23882cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill    {
23982cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill        mNumTris = 1;
24082cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill        glBufferSubData(GL_ARRAY_BUFFER, 0, data.size(), data.data());
24182cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill    }
24282cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill
24333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    // Set the viewport
24433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
24533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
2462d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    GLfloat scale = 0.5f;
2472d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    GLfloat offset = 0.5f;
2482d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
2492d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    if (mParams.vertexNormalized == GL_TRUE)
2502d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    {
2512d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        scale = 2.0f;
2522d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill        offset = 0.5f;
2532d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    }
2542d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
2552d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    glUniform1f(glGetUniformLocation(mProgram, "uScale"), scale);
2562d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill    glUniform1f(glGetUniformLocation(mProgram, "uOffset"), offset);
2572d8c879fb1e0429d57966195ba75b413d3f43474Jamie Madill
25833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    GLenum glErr = glGetError();
25933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    if (glErr != GL_NO_ERROR)
26033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    {
26133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        return false;
26233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    }
26333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
26433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    return true;
26533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill}
26633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
26733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madillvoid BufferSubDataBenchmark::destroyBenchmark()
26833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill{
26933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    glDeleteProgram(mProgram);
27033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    glDeleteBuffers(1, &mBuffer);
27133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    delete[] mUpdateData;
27233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill}
27333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
27433ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madillvoid BufferSubDataBenchmark::beginDrawBenchmark()
27533ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill{
27633ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    // Clear the color buffer
27733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    glClear(GL_COLOR_BUFFER_BIT);
27833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill}
27933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill
28033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madillvoid BufferSubDataBenchmark::drawBenchmark()
28133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill{
28233ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    for (unsigned int it = 0; it < mParams.iterations; it++)
28333ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    {
28482cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill        if (mParams.updateSize > 0 && ((mNumFrames % mParams.updatesEveryNFrames) == 0))
28582cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill        {
28682cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill            glBufferSubData(GL_ARRAY_BUFFER, 0, mParams.updateSize, mUpdateData);
28782cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill        }
28882cceb2de7958c7706768f21052a2e3409511fb8Jamie Madill
28933ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill        glDrawArrays(GL_TRIANGLES, 0, 3 * mNumTris);
29033ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill    }
29133ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madill}
292