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 ¶ms) 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