diff options
author | Jamie Madill <jmadill@chromium.org> | 2014-08-29 15:15:02 -0400 |
---|---|---|
committer | Jamie Madill <jmadill@chromium.org> | 2014-09-02 14:47:06 +0000 |
commit | 2d8c879fb1e0429d57966195ba75b413d3f43474 (patch) | |
tree | 6eaaf481ca8f622f42f87f67ff1821944d640d4e | |
parent | 33ea2f977647e5e3a71cd0d6af6c9eef82afe9e3 (diff) | |
download | angle-2d8c879fb1e0429d57966195ba75b413d3f43474.tar.gz |
Expand the SubData benchmark.
BUG=angle:705
Change-Id: I9bd29bb35ad6c240bf141b9449bb613d2e00f828
Reviewed-on: https://chromium-review.googlesource.com/213811
Reviewed-by: Brandon Jones <bajones@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
-rw-r--r-- | tests/perf_tests/BufferSubData.cpp | 181 |
1 files changed, 142 insertions, 39 deletions
diff --git a/tests/perf_tests/BufferSubData.cpp b/tests/perf_tests/BufferSubData.cpp index db614cf9..8ecf07df 100644 --- a/tests/perf_tests/BufferSubData.cpp +++ b/tests/perf_tests/BufferSubData.cpp @@ -9,6 +9,121 @@ #include <cassert> #include <sstream> +namespace +{ + +GLfloat *GetFloatData(GLint componentCount) +{ + static GLfloat vertices2[] = + { + 1, 2, + 0, 0, + 2, 0, + }; + + static GLfloat vertices3[] = + { + 1, 2, 1, + 0, 0, 1, + 2, 0, 1, + }; + + static GLfloat vertices4[] = + { + 1, 2, 1, 3, + 0, 0, 1, 3, + 2, 0, 1, 3, + }; + + switch (componentCount) + { + case 2: return vertices2; + case 3: return vertices3; + case 4: return vertices4; + default: return NULL; + } +} + +template <class T> +GLsizeiptr GetNormalizedData(GLsizeiptr numElements, GLfloat *floatData, std::vector<uint8_t> *data) +{ + GLsizeiptr triDataSize = sizeof(T) * numElements; + data->resize(triDataSize); + + T *destPtr = reinterpret_cast<T*>(data->data()); + + for (GLsizeiptr dataIndex = 0; dataIndex < numElements; dataIndex++) + { + GLfloat scaled = floatData[dataIndex] * 0.25f; + destPtr[dataIndex] = static_cast<T>(scaled * static_cast<GLfloat>(std::numeric_limits<T>::max())); + } + + return triDataSize; +} + +template <class T> +GLsizeiptr GetIntData(GLsizeiptr numElements, GLfloat *floatData, std::vector<uint8_t> *data) +{ + GLsizeiptr triDataSize = sizeof(T) * numElements; + data->resize(triDataSize); + + T *destPtr = reinterpret_cast<T*>(data->data()); + + for (GLsizeiptr dataIndex = 0; dataIndex < numElements; dataIndex++) + { + destPtr[dataIndex] = static_cast<T>(floatData[dataIndex]); + } + + return triDataSize; +} + +GLsizeiptr GetVertexData(GLenum type, GLint componentCount, GLboolean normalized, std::vector<uint8_t> *data) +{ + GLsizeiptr triDataSize = 0; + GLfloat *floatData = GetFloatData(componentCount); + + if (type == GL_FLOAT) + { + triDataSize = sizeof(GLfloat) * componentCount * 3; + data->resize(triDataSize); + memcpy(data->data(), floatData, triDataSize); + } + else if (normalized == GL_TRUE) + { + GLsizeiptr numElements = componentCount * 3; + + switch (type) + { + case GL_BYTE: triDataSize = GetNormalizedData<GLbyte>(numElements, floatData, data); break; + case GL_SHORT: triDataSize = GetNormalizedData<GLshort>(numElements, floatData, data); break; + case GL_INT: triDataSize = GetNormalizedData<GLint>(numElements, floatData, data); break; + case GL_UNSIGNED_BYTE: triDataSize = GetNormalizedData<GLubyte>(numElements, floatData, data); break; + case GL_UNSIGNED_SHORT: triDataSize = GetNormalizedData<GLushort>(numElements, floatData, data); break; + case GL_UNSIGNED_INT: triDataSize = GetNormalizedData<GLuint>(numElements, floatData, data); break; + default: assert(0); + } + } + else + { + GLsizeiptr numElements = componentCount * 3; + + switch (type) + { + case GL_BYTE: triDataSize = GetIntData<GLbyte>(numElements, floatData, data); break; + case GL_SHORT: triDataSize = GetIntData<GLshort>(numElements, floatData, data); break; + case GL_INT: triDataSize = GetIntData<GLint>(numElements, floatData, data); break; + case GL_UNSIGNED_BYTE: triDataSize = GetIntData<GLubyte>(numElements, floatData, data); break; + case GL_UNSIGNED_SHORT: triDataSize = GetIntData<GLushort>(numElements, floatData, data); break; + case GL_UNSIGNED_INT: triDataSize = GetIntData<GLuint>(numElements, floatData, data); break; + default: assert(0); + } + } + + return triDataSize; +} + +} + std::string BufferSubDataParams::name() const { std::stringstream strstr; @@ -24,6 +139,11 @@ std::string BufferSubDataParams::name() const strstr << " - "; + if (vertexNormalized) + { + strstr << "Norm"; + } + switch (vertexType) { case GL_FLOAT: strstr << "Float"; break; @@ -59,10 +179,12 @@ bool BufferSubDataBenchmark::initializeBenchmark() { const std::string vs = SHADER_SOURCE ( - attribute vec4 vPosition; + attribute vec2 vPosition; + uniform float uScale; + uniform float uOffset; void main() { - gl_Position = vPosition; + gl_Position = vec4(vPosition * vec2(uScale) - vec2(uOffset), 0, 1); } ); @@ -96,52 +218,33 @@ bool BufferSubDataBenchmark::initializeBenchmark() mUpdateData = new uint8_t[mParams.updateSize]; - GLfloat vertices2[] = - { - 0.0f, 0.5f, - -0.5f, -0.5f, - 0.5f, -0.5f, - }; - - GLfloat vertices3[] = - { - 0.0f, 0.5f, 0.0f, - -0.5f, -0.5f, 0.0f, - 0.5f, -0.5f, 0.0f, - }; - - GLfloat vertices4[] = - { - 0.0f, 0.5f, 0.0f, 1.0f, - -0.5f, -0.5f, 0.0f, 1.0f, - 0.5f, -0.5f, 0.0f, 1.0f, - }; - - float *vertexData = NULL; + std::vector<uint8_t> data; + GLsizei triDataSize = GetVertexData(mParams.vertexType, + mParams.vertexComponentCount, + mParams.vertexNormalized, &data); - switch (mParams.vertexComponentCount) - { - case 2: vertexData = vertices2; break; - case 3: vertexData = vertices3; break; - case 4: vertexData = vertices4; break; - default: break; - } - - assert(vertexData != NULL); - - GLsizeiptr vertexDataSize = sizeof(GLfloat) * mParams.vertexComponentCount; - GLsizeiptr triDataSize = vertexDataSize * 3; mNumTris = mParams.updateSize / triDataSize; - int offset = 0; - for (int i = 0; i < mNumTris; ++i) + for (int i = 0, offset = 0; i < mNumTris; ++i) { - memcpy(mUpdateData + offset, vertexData, triDataSize); + memcpy(mUpdateData + offset, data.data(), triDataSize); offset += triDataSize; } // Set the viewport glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); + GLfloat scale = 0.5f; + GLfloat offset = 0.5f; + + if (mParams.vertexNormalized == GL_TRUE) + { + scale = 2.0f; + offset = 0.5f; + } + + glUniform1f(glGetUniformLocation(mProgram, "uScale"), scale); + glUniform1f(glGetUniformLocation(mProgram, "uOffset"), offset); + GLenum glErr = glGetError(); if (glErr != GL_NO_ERROR) { |