C++程序  |  104行  |  4.07 KB

// 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 <EGL/egl.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#elif defined(USE_OPENGL)
#include <GL/gl.h>
#include <GL/glx.h>

#define LIST_PROC_FUNCTIONS(F)                                     \
  F(glAttachShader, PFNGLATTACHSHADERPROC)                         \
  F(glBindBuffer, PFNGLBINDBUFFERPROC)                             \
  F(glBindBufferARB, PFNGLBINDBUFFERARBPROC)                       \
  F(glBindFramebuffer, PFNGLBINDFRAMEBUFFERPROC)                   \
  F(glBindRenderbuffer, PFNGLBINDRENDERBUFFERPROC)                 \
  F(glBufferData, PFNGLBUFFERDATAPROC)                             \
  F(glBufferDataARB, PFNGLBUFFERDATAARBPROC)                       \
  F(glBufferSubData, PFNGLBUFFERSUBDATAPROC)                       \
  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)

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_