| Index: client/deps/glbench/src/utils.cc
|
| diff --git a/client/deps/glbench/src/utils.cc b/client/deps/glbench/src/utils.cc
|
| index ea0d6e0f444307e89ce86493d0f37a59f496ac0d..4d2aca4a908da3db65cb680a453c19692cbf7d33 100644
|
| --- a/client/deps/glbench/src/utils.cc
|
| +++ b/client/deps/glbench/src/utils.cc
|
| @@ -47,6 +47,103 @@ void *MmapFile(const char* name, size_t* length) {
|
| }
|
|
|
|
|
| +namespace glbench {
|
| +
|
| +GLuint SetupTexture(GLsizei size_log2) {
|
| + GLsizei size = 1 << size_log2;
|
| + GLuint name = ~0;
|
| + glGenTextures(1, &name);
|
| + glBindTexture(GL_TEXTURE_2D, name);
|
| + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
| + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
| +
|
| + unsigned char *pixels = new unsigned char[size * size * 4];
|
| + if (!pixels)
|
| + return 0;
|
| +
|
| + for (GLint level = 0; size > 0; level++, size /= 2) {
|
| + unsigned char *p = pixels;
|
| + for (int i = 0; i < size; i++) {
|
| + for (int j = 0; j < size; j++) {
|
| + *p++ = level %3 != 0 ? (i ^ j) << level : 0;
|
| + *p++ = level %3 != 1 ? (i ^ j) << level : 0;
|
| + *p++ = level %3 != 2 ? (i ^ j) << level : 0;
|
| + *p++ = 255;
|
| + }
|
| + }
|
| + if (size == 1) {
|
| + unsigned char *p = pixels;
|
| + *p++ = 255;
|
| + *p++ = 255;
|
| + *p++ = 255;
|
| + *p++ = 255;
|
| + }
|
| + glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0,
|
| + GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
| + }
|
| + delete[] pixels;
|
| + return name;
|
| +}
|
| +
|
| +GLuint SetupVBO(GLenum target, GLsizeiptr size, const GLvoid *data) {
|
| + GLuint buf = ~0;
|
| + glGenBuffers(1, &buf);
|
| + glBindBuffer(target, buf);
|
| + glBufferData(target, size, data, GL_STATIC_DRAW);
|
| + CHECK(!glGetError());
|
| + return buf;
|
| +}
|
| +
|
| +// Generates a tautological lattice.
|
| +void CreateLattice(GLfloat **vertices, GLsizeiptr *size,
|
| + GLfloat size_x, GLfloat size_y, int width, int height)
|
| +{
|
| + GLfloat *vptr = *vertices = new GLfloat[2 * (width + 1) * (height + 1)];
|
| + for (int j = 0; j <= height; j++) {
|
| + for (int i = 0; i <= width; i++) {
|
| + *vptr++ = i * size_x;
|
| + *vptr++ = j * size_y;
|
| + }
|
| + }
|
| + *size = (vptr - *vertices) * sizeof(GLfloat);
|
| +}
|
| +
|
| +// Generates a mesh of 2*width*height triangles. The ratio of front facing to
|
| +// back facing triangles is culled_ratio/RAND_MAX. Returns the number of
|
| +// vertices in the mesh.
|
| +int CreateMesh(GLuint **indices, GLsizeiptr *size,
|
| + int width, int height, int culled_ratio) {
|
| + srand(0);
|
| +
|
| + GLuint *iptr = *indices = new GLuint[2 * 3 * (width * height)];
|
| + const int swath_height = 4;
|
| +
|
| + CHECK(width % swath_height == 0 && height % swath_height == 0);
|
| +
|
| + for (int j = 0; j < height; j += swath_height) {
|
| + for (int i = 0; i < width; i++) {
|
| + for (int j2 = 0; j2 < swath_height; j2++) {
|
| + GLuint first = (j + j2) * (width + 1) + i;
|
| + GLuint second = first + 1;
|
| + GLuint third = first + (width + 1);
|
| + GLuint fourth = third + 1;
|
| +
|
| + bool flag = rand() < culled_ratio;
|
| + *iptr++ = first;
|
| + *iptr++ = flag ? second : third;
|
| + *iptr++ = flag ? third : second;
|
| +
|
| + *iptr++ = fourth;
|
| + *iptr++ = flag ? third : second;
|
| + *iptr++ = flag ? second : third;
|
| + }
|
| + }
|
| + }
|
| + *size = (iptr - *indices) * sizeof(GLuint);
|
| +
|
| + return iptr - *indices;
|
| +}
|
| +
|
| static void print_info_log(int obj)
|
| {
|
| char info_log[4096];
|
| @@ -67,7 +164,6 @@ static void print_info_log(int obj)
|
| }
|
| }
|
|
|
| -
|
| GLuint InitShaderProgram(const char *vertex_src, const char *fragment_src) {
|
| GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
| GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
| @@ -92,3 +188,5 @@ GLuint InitShaderProgram(const char *vertex_src, const char *fragment_src) {
|
|
|
| return program;
|
| }
|
| +
|
| +} // namespace glbench
|
|
|