// Copyright (c) 2010 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BENCH_GL_MAIN_H_ #define BENCH_GL_MAIN_H_ #include <gflags/gflags.h> #include <stdarg.h> #include <sys/time.h> #if defined(USE_OPENGLES) #include <GLES2/gl2.h> #include <EGL/egl.h> #include <GLES2/gl2ext.h> #elif defined(USE_OPENGL) #include <GL/gl.h> #include <GL/glx.h> #ifdef WORKAROUND_CROSBUG14304 #define LIST_PROC_FUNCTIONS(F) \ F(glActiveTexture, PFNGLACTIVETEXTUREPROC) \ F(glAttachShader, PFNGLATTACHSHADERPROC) \ F(glBindBuffer, PFNGLBINDBUFFERPROC) \ F(glBufferData, PFNGLBUFFERDATAPROC) \ F(glCompileShader, PFNGLCOMPILESHADERPROC) \ F(glCreateProgram, PFNGLCREATEPROGRAMPROC) \ F(glCreateShader, PFNGLCREATESHADERPROC) \ F(glDeleteBuffers, PFNGLDELETEBUFFERSPROC) \ F(glDeleteProgram, PFNGLDELETEPROGRAMPROC) \ F(glDeleteShader, PFNGLDELETESHADERPROC) \ F(glDisableVertexAttribArray, PFNGLDISABLEVERTEXATTRIBARRAYPROC) \ F(glEnableVertexAttribArray, PFNGLENABLEVERTEXATTRIBARRAYPROC) \ F(glGenBuffers, PFNGLGENBUFFERSPROC) \ F(glGetAttribLocation, PFNGLGETATTRIBLOCATIONPROC) \ F(glGetInfoLogARB, PFNGLGETPROGRAMINFOLOGPROC) \ F(glGetProgramInfoLog, PFNGLGETPROGRAMINFOLOGPROC) \ F(glGetShaderInfoLog, PFNGLGETSHADERINFOLOGPROC) \ F(glGetUniformLocation, PFNGLGETUNIFORMLOCATIONPROC) \ F(glLinkProgram, PFNGLLINKPROGRAMPROC) \ F(glShaderSource, PFNGLSHADERSOURCEPROC) \ F(glUniform1f, PFNGLUNIFORM1FPROC) \ F(glUniform1i, PFNGLUNIFORM1IPROC) \ F(glUniform4fv, PFNGLUNIFORM4FVPROC) \ F(glUniformMatrix4fv, PFNGLUNIFORMMATRIX4FVPROC) \ F(glUseProgram, PFNGLUSEPROGRAMPROC) \ F(glVertexAttribPointer, PFNGLVERTEXATTRIBPOINTERPROC) \ F(glXSwapIntervalSGI, PFNGLXSWAPINTERVALSGIPROC) \ F(glXBindTexImageEXT, PFNGLXBINDTEXIMAGEEXTPROC) \ F(glXReleaseTexImageEXT, PFNGLXRELEASETEXIMAGEEXTPROC) #else #define LIST_PROC_FUNCTIONS(F) \ F(glAttachShader, PFNGLATTACHSHADERPROC) \ F(glBindBuffer, PFNGLBINDBUFFERPROC) \ F(glBindFramebuffer, PFNGLBINDFRAMEBUFFERPROC) \ F(glBindRenderbuffer, PFNGLBINDRENDERBUFFERPROC) \ F(glBufferData, PFNGLBUFFERDATAPROC) \ F(glCheckFramebufferStatus, PFNGLCHECKFRAMEBUFFERSTATUSPROC) \ F(glCompileShader, PFNGLCOMPILESHADERPROC) \ F(glCreateProgram, PFNGLCREATEPROGRAMPROC) \ F(glCreateShader, PFNGLCREATESHADERPROC) \ F(glDeleteBuffers, PFNGLDELETEBUFFERSPROC) \ F(glDeleteFramebuffers, PFNGLDELETEFRAMEBUFFERSPROC) \ F(glDeleteProgram, PFNGLDELETEPROGRAMPROC) \ F(glDeleteRenderbuffers, PFNGLDELETERENDERBUFFERSPROC) \ F(glDeleteShader, PFNGLDELETESHADERPROC) \ F(glDisableVertexAttribArray, PFNGLDISABLEVERTEXATTRIBARRAYPROC) \ F(glEnableVertexAttribArray, PFNGLENABLEVERTEXATTRIBARRAYPROC) \ F(glFramebufferRenderbuffer, PFNGLFRAMEBUFFERRENDERBUFFERPROC) \ F(glFramebufferTexture2D, PFNGLFRAMEBUFFERTEXTURE2DPROC) \ F(glGenBuffers, PFNGLGENBUFFERSPROC) \ F(glGenFramebuffers, PFNGLGENFRAMEBUFFERSPROC) \ F(glGenRenderbuffers, PFNGLGENRENDERBUFFERSPROC) \ F(glGetAttribLocation, PFNGLGETATTRIBLOCATIONPROC) \ F(glGetInfoLogARB, PFNGLGETPROGRAMINFOLOGPROC) \ F(glGetProgramInfoLog, PFNGLGETPROGRAMINFOLOGPROC) \ F(glGetShaderInfoLog, PFNGLGETSHADERINFOLOGPROC) \ F(glGetUniformLocation, PFNGLGETUNIFORMLOCATIONPROC) \ F(glLinkProgram, PFNGLLINKPROGRAMPROC) \ F(glRenderbufferStorage, PFNGLRENDERBUFFERSTORAGEPROC) \ F(glShaderSource, PFNGLSHADERSOURCEPROC) \ F(glUniform1f, PFNGLUNIFORM1FPROC) \ F(glUniform1i, PFNGLUNIFORM1IPROC) \ F(glUniform4fv, PFNGLUNIFORM4FVPROC) \ F(glUniformMatrix4fv, PFNGLUNIFORMMATRIX4FVPROC) \ F(glUseProgram, PFNGLUSEPROGRAMPROC) \ F(glVertexAttribPointer, PFNGLVERTEXATTRIBPOINTERPROC) \ F(glXBindTexImageEXT, PFNGLXBINDTEXIMAGEEXTPROC) \ F(glXReleaseTexImageEXT, PFNGLXRELEASETEXIMAGEEXTPROC) \ F(glXSwapIntervalSGI, PFNGLXSWAPINTERVALSGIPROC) #endif namespace gl { #define F(fun, type) extern type fun; LIST_PROC_FUNCTIONS(F) #undef F }; using namespace gl; #else #error bad graphics backend #endif inline uint64_t GetUTime() { struct timeval tv; gettimeofday(&tv, NULL); return static_cast<uint64_t>(tv.tv_usec) + 1000000ULL*static_cast<uint64_t>(tv.tv_sec); } extern bool g_verbose; extern bool g_hasty; extern GLint g_width; extern GLint g_height; extern GLint g_max_texture_size; DECLARE_bool(override_redirect); // This size is for a window that is very large but will fit on all // the displays we care about. #define WINDOW_WIDTH 512 #define WINDOW_HEIGHT 512 inline void dbg_printf(const char* format, ...) { if (!g_verbose) return; va_list args; va_start(args, format); vprintf(format, args); va_end(args); } #endif // BENCH_GL_MAIN_H_