132001f49Smrg/* 232001f49Smrg * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 332001f49Smrg * 432001f49Smrg * Permission is hereby granted, free of charge, to any person obtaining a 532001f49Smrg * copy of this software and associated documentation files (the "Software"), 632001f49Smrg * to deal in the Software without restriction, including without limitation 732001f49Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 832001f49Smrg * and/or sell copies of the Software, and to permit persons to whom the 932001f49Smrg * Software is furnished to do so, subject to the following conditions: 1032001f49Smrg * 1132001f49Smrg * The above copyright notice and this permission notice shall be included 1232001f49Smrg * in all copies or substantial portions of the Software. 1332001f49Smrg * 1432001f49Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1532001f49Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1632001f49Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1732001f49Smrg * VMWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 1832001f49Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 1932001f49Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2032001f49Smrg */ 2132001f49Smrg 2232001f49Smrg/** 2332001f49Smrg * Measure simple vertex processing rate via: 2432001f49Smrg * - immediate mode 2532001f49Smrg * - vertex arrays 2632001f49Smrg * - VBO vertex arrays 2732001f49Smrg * - glDrawElements 2832001f49Smrg * - VBO glDrawElements 2932001f49Smrg * - glDrawRangeElements 3032001f49Smrg * - VBO glDrawRangeElements 3132001f49Smrg * 3232001f49Smrg * Brian Paul 3332001f49Smrg * 16 Sep 2009 3432001f49Smrg */ 3532001f49Smrg 3632001f49Smrg#include <assert.h> 3732001f49Smrg#include <string.h> 3832001f49Smrg#include "glmain.h" 3932001f49Smrg#include "common.h" 4032001f49Smrg 4132001f49Smrg 4232001f49Smrg#define MAX_VERTS (100 * 100) 4332001f49Smrg 4432001f49Smrg/** glVertex2/3/4 size */ 4532001f49Smrg#define VERT_SIZE 4 4632001f49Smrg 4732001f49Smrgint WinWidth = 500, WinHeight = 500; 4832001f49Smrg 4932001f49Smrgstatic GLuint VertexBO, ElementBO; 5032001f49Smrg 5132001f49Smrgstatic unsigned NumVerts = MAX_VERTS; 5232001f49Smrgstatic unsigned VertBytes = VERT_SIZE * sizeof(float); 5332001f49Smrgstatic float *VertexData = NULL; 5432001f49Smrg 5532001f49Smrgstatic unsigned NumElements = MAX_VERTS; 5632001f49Smrgstatic GLuint *Elements = NULL; 5732001f49Smrg 5832001f49Smrg 5932001f49Smrg/** 6032001f49Smrg * Load VertexData buffer with a 2-D grid of points in the range [-1,1]^2. 6132001f49Smrg */ 6232001f49Smrgstatic void 6332001f49SmrgInitializeVertexData(void) 6432001f49Smrg{ 6532001f49Smrg unsigned i; 6632001f49Smrg float x = -1.0, y = -1.0; 6732001f49Smrg float dx = 2.0 / 100; 6832001f49Smrg float dy = 2.0 / 100; 6932001f49Smrg 7032001f49Smrg VertexData = (float *) malloc(NumVerts * VertBytes); 7132001f49Smrg 7232001f49Smrg for (i = 0; i < NumVerts; i++) { 7332001f49Smrg VertexData[i * VERT_SIZE + 0] = x; 7432001f49Smrg VertexData[i * VERT_SIZE + 1] = y; 7532001f49Smrg VertexData[i * VERT_SIZE + 2] = 0.0; 7632001f49Smrg VertexData[i * VERT_SIZE + 3] = 1.0; 7732001f49Smrg x += dx; 7832001f49Smrg if (x > 1.0) { 7932001f49Smrg x = -1.0; 8032001f49Smrg y += dy; 8132001f49Smrg } 8232001f49Smrg } 8332001f49Smrg 8432001f49Smrg Elements = (GLuint *) malloc(NumVerts * sizeof(GLuint)); 8532001f49Smrg 8632001f49Smrg for (i = 0; i < NumVerts; i++) { 8732001f49Smrg Elements[i] = NumVerts - i - 1; 8832001f49Smrg } 8932001f49Smrg} 9032001f49Smrg 9132001f49Smrg 9232001f49Smrg/** Called from test harness/main */ 9332001f49Smrgvoid 9432001f49SmrgPerfInit(void) 9532001f49Smrg{ 9632001f49Smrg InitializeVertexData(); 9732001f49Smrg 9832001f49Smrg /* setup VertexBO */ 9932001f49Smrg glGenBuffersARB(1, &VertexBO); 10032001f49Smrg glBindBufferARB(GL_ARRAY_BUFFER_ARB, VertexBO); 10132001f49Smrg glBufferDataARB(GL_ARRAY_BUFFER_ARB, 10232001f49Smrg NumVerts * VertBytes, VertexData, GL_STATIC_DRAW_ARB); 10332001f49Smrg glEnableClientState(GL_VERTEX_ARRAY); 10432001f49Smrg 10532001f49Smrg /* setup ElementBO */ 10632001f49Smrg glGenBuffersARB(1, &ElementBO); 10732001f49Smrg glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ElementBO); 10832001f49Smrg glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 10932001f49Smrg NumElements * sizeof(GLuint), Elements, GL_STATIC_DRAW_ARB); 11032001f49Smrg} 11132001f49Smrg 11232001f49Smrg 11332001f49Smrgstatic void 11432001f49SmrgDrawImmediate(unsigned count) 11532001f49Smrg{ 11632001f49Smrg unsigned i; 11732001f49Smrg glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0); 11832001f49Smrg glBindBufferARB(GL_ARRAY_BUFFER, 0); 11932001f49Smrg for (i = 0; i < count; i++) { 12032001f49Smrg unsigned j; 12132001f49Smrg glBegin(GL_POINTS); 12232001f49Smrg for (j = 0; j < NumVerts; j++) { 12332001f49Smrg#if VERT_SIZE == 4 12432001f49Smrg glVertex4fv(VertexData + j * 4); 12532001f49Smrg#elif VERT_SIZE == 3 12632001f49Smrg glVertex3fv(VertexData + j * 3); 12732001f49Smrg#elif VERT_SIZE == 2 12832001f49Smrg glVertex2fv(VertexData + j * 2); 12932001f49Smrg#else 13032001f49Smrg abort(); 13132001f49Smrg#endif 13232001f49Smrg } 13332001f49Smrg glEnd(); 13432001f49Smrg } 13532001f49Smrg glFinish(); 13632001f49Smrg PerfSwapBuffers(); 13732001f49Smrg} 13832001f49Smrg 13932001f49Smrg 14032001f49Smrgstatic void 14132001f49SmrgDrawArraysMem(unsigned count) 14232001f49Smrg{ 14332001f49Smrg unsigned i; 14432001f49Smrg glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0); 14532001f49Smrg glBindBufferARB(GL_ARRAY_BUFFER, 0); 14632001f49Smrg glVertexPointer(VERT_SIZE, GL_FLOAT, VertBytes, VertexData); 14732001f49Smrg for (i = 0; i < count; i++) { 14832001f49Smrg glDrawArrays(GL_POINTS, 0, NumVerts); 14932001f49Smrg } 15032001f49Smrg glFinish(); 15132001f49Smrg PerfSwapBuffers(); 15232001f49Smrg} 15332001f49Smrg 15432001f49Smrg 15532001f49Smrgstatic void 15632001f49SmrgDrawArraysVBO(unsigned count) 15732001f49Smrg{ 15832001f49Smrg unsigned i; 15932001f49Smrg glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0); 16032001f49Smrg glBindBufferARB(GL_ARRAY_BUFFER, VertexBO); 16132001f49Smrg glVertexPointer(VERT_SIZE, GL_FLOAT, VertBytes, (void *) 0); 16232001f49Smrg for (i = 0; i < count; i++) { 16332001f49Smrg glDrawArrays(GL_POINTS, 0, NumVerts); 16432001f49Smrg } 16532001f49Smrg glFinish(); 16632001f49Smrg PerfSwapBuffers(); 16732001f49Smrg} 16832001f49Smrg 16932001f49Smrg 17032001f49Smrgstatic void 17132001f49SmrgDrawElementsMem(unsigned count) 17232001f49Smrg{ 17332001f49Smrg unsigned i; 17432001f49Smrg glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0); 17532001f49Smrg glBindBufferARB(GL_ARRAY_BUFFER, 0); 17632001f49Smrg glVertexPointer(VERT_SIZE, GL_FLOAT, VertBytes, VertexData); 17732001f49Smrg for (i = 0; i < count; i++) { 17832001f49Smrg glDrawElements(GL_POINTS, NumVerts, GL_UNSIGNED_INT, Elements); 17932001f49Smrg } 18032001f49Smrg glFinish(); 18132001f49Smrg PerfSwapBuffers(); 18232001f49Smrg} 18332001f49Smrg 18432001f49Smrg 18532001f49Smrgstatic void 18632001f49SmrgDrawElementsBO(unsigned count) 18732001f49Smrg{ 18832001f49Smrg unsigned i; 18932001f49Smrg glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, ElementBO); 19032001f49Smrg glBindBufferARB(GL_ARRAY_BUFFER, VertexBO); 19132001f49Smrg glVertexPointer(VERT_SIZE, GL_FLOAT, VertBytes, (void *) 0); 19232001f49Smrg for (i = 0; i < count; i++) { 19332001f49Smrg glDrawElements(GL_POINTS, NumVerts, GL_UNSIGNED_INT, (void *) 0); 19432001f49Smrg } 19532001f49Smrg glFinish(); 19632001f49Smrg PerfSwapBuffers(); 19732001f49Smrg} 19832001f49Smrg 19932001f49Smrg 20032001f49Smrgstatic void 20132001f49SmrgDrawRangeElementsMem(unsigned count) 20232001f49Smrg{ 20332001f49Smrg unsigned i; 20432001f49Smrg glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0); 20532001f49Smrg glBindBufferARB(GL_ARRAY_BUFFER, 0); 20632001f49Smrg glVertexPointer(VERT_SIZE, GL_FLOAT, VertBytes, VertexData); 20732001f49Smrg for (i = 0; i < count; i++) { 20832001f49Smrg glDrawRangeElements(GL_POINTS, 0, NumVerts - 1, 20932001f49Smrg NumVerts, GL_UNSIGNED_INT, Elements); 21032001f49Smrg } 21132001f49Smrg glFinish(); 21232001f49Smrg PerfSwapBuffers(); 21332001f49Smrg} 21432001f49Smrg 21532001f49Smrg 21632001f49Smrgstatic void 21732001f49SmrgDrawRangeElementsBO(unsigned count) 21832001f49Smrg{ 21932001f49Smrg unsigned i; 22032001f49Smrg glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, ElementBO); 22132001f49Smrg glBindBufferARB(GL_ARRAY_BUFFER, VertexBO); 22232001f49Smrg glVertexPointer(VERT_SIZE, GL_FLOAT, VertBytes, (void *) 0); 22332001f49Smrg for (i = 0; i < count; i++) { 22432001f49Smrg glDrawRangeElements(GL_POINTS, 0, NumVerts - 1, 22532001f49Smrg NumVerts, GL_UNSIGNED_INT, (void *) 0); 22632001f49Smrg } 22732001f49Smrg glFinish(); 22832001f49Smrg PerfSwapBuffers(); 22932001f49Smrg} 23032001f49Smrg 23132001f49Smrgvoid 23232001f49SmrgPerfNextRound(void) 23332001f49Smrg{ 23432001f49Smrg} 23532001f49Smrg 23632001f49Smrg 23732001f49Smrg/** Called from test harness/main */ 23832001f49Smrgvoid 23932001f49SmrgPerfDraw(void) 24032001f49Smrg{ 24132001f49Smrg double rate; 24232001f49Smrg 24332001f49Smrg glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 24432001f49Smrg 24532001f49Smrg perf_printf("Vertex rate (%d x Vertex%df)\n", NumVerts, VERT_SIZE); 24632001f49Smrg 24732001f49Smrg rate = PerfMeasureRate(DrawImmediate); 24832001f49Smrg rate *= NumVerts; 24932001f49Smrg perf_printf(" Immediate mode: %s verts/sec\n", PerfHumanFloat(rate)); 25032001f49Smrg 25132001f49Smrg rate = PerfMeasureRate(DrawArraysMem); 25232001f49Smrg rate *= NumVerts; 25332001f49Smrg perf_printf(" glDrawArrays: %s verts/sec\n", PerfHumanFloat(rate)); 25432001f49Smrg 25532001f49Smrg rate = PerfMeasureRate(DrawArraysVBO); 25632001f49Smrg rate *= NumVerts; 25732001f49Smrg perf_printf(" VBO glDrawArrays: %s verts/sec\n", PerfHumanFloat(rate)); 25832001f49Smrg 25932001f49Smrg rate = PerfMeasureRate(DrawElementsMem); 26032001f49Smrg rate *= NumVerts; 26132001f49Smrg perf_printf(" glDrawElements: %s verts/sec\n", PerfHumanFloat(rate)); 26232001f49Smrg 26332001f49Smrg rate = PerfMeasureRate(DrawElementsBO); 26432001f49Smrg rate *= NumVerts; 26532001f49Smrg perf_printf(" VBO glDrawElements: %s verts/sec\n", PerfHumanFloat(rate)); 26632001f49Smrg 26732001f49Smrg rate = PerfMeasureRate(DrawRangeElementsMem); 26832001f49Smrg rate *= NumVerts; 26932001f49Smrg perf_printf(" glDrawRangeElements: %s verts/sec\n", PerfHumanFloat(rate)); 27032001f49Smrg 27132001f49Smrg rate = PerfMeasureRate(DrawRangeElementsBO); 27232001f49Smrg rate *= NumVerts; 27332001f49Smrg perf_printf(" VBO glDrawRangeElements: %s verts/sec\n", PerfHumanFloat(rate)); 27432001f49Smrg 27532001f49Smrg exit(0); 27632001f49Smrg} 277