Path: blob/main_old/samples/tri_fan_microbench/TriFanMicroBench.cpp
2585 views
//1// Copyright 2014 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//56// Based on Hello_Triangle.c from7// Book: OpenGL(R) ES 2.0 Programming Guide8// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner9// ISBN-10: 032150279510// ISBN-13: 978032150279711// Publisher: Addison-Wesley Professional12// URLs: http://safari.informit.com/978032156383513// http://www.opengles-book.com1415#include "SampleApplication.h"1617#include "util/shader_utils.h"1819#include <cstring>20#include <iostream>2122// This small sample compares the per-frame render time for a series of23// squares drawn with TRIANGLE_FANS versus squares drawn with TRIANGLES.24// To exacerbate differences between the two, we use a large collection25// of short buffers with pre-translated vertex data.2627class TriangleFanBenchSample : public SampleApplication28{29public:30TriangleFanBenchSample(int argc, char **argv)31: SampleApplication("Microbench", argc, argv, 2, 0, 1280, 1280), mFrameCount(0)32{}3334void createVertexBuffers()35{36const unsigned int slices = 8;37const unsigned int numFanVertices = slices + 2;38const unsigned int fanFloats = numFanVertices * 3;3940mNumFanVerts = numFanVertices;4142const GLfloat halfDim = 0.0625;43GLfloat fanVertices[] = {440.0f, 0.0f, 0.0f, // center45-halfDim, -halfDim, 0.0f, // LL46-halfDim, 0.0f, 0.0f, // CL47-halfDim, halfDim, 0.0f, // UL480.0f, halfDim, 0.0f, // UC49halfDim, halfDim, 0.0f, // UR50halfDim, 0.0f, 0.0f, // CR51halfDim, -halfDim, 0.0f, // LR520.0f, -halfDim, 0.0f, // LC53-halfDim, -halfDim, 0.0f // LL (closes the fan)54};5556const GLfloat xMin = -1.0f; // We leave viewport/worldview untransformed in this sample57const GLfloat xMax = 1.0f;58const GLfloat yMin = -1.0f;59// const GLfloat yMax = 1.0f;6061glGenBuffers(mNumSquares, mFanBufId);6263GLfloat xOffset = xMin;64GLfloat yOffset = yMin;65for (unsigned int i = 0; i < mNumSquares; ++i)66{67GLfloat tempVerts[fanFloats] = {0};68for (unsigned int j = 0; j < numFanVertices; ++j)69{70tempVerts[j * 3] = fanVertices[j * 3] + xOffset;71tempVerts[j * 3 + 1] = fanVertices[j * 3 + 1] + yOffset;72tempVerts[j * 3 + 2] = 0.0f;73}7475glBindBuffer(GL_ARRAY_BUFFER, mFanBufId[i]);76glBufferData(GL_ARRAY_BUFFER, fanFloats * sizeof(GLfloat), tempVerts, GL_STATIC_DRAW);7778xOffset += 2 * halfDim;79if (xOffset > xMax)80{81xOffset = xMin;82yOffset += 2 * halfDim;83}84}8586const unsigned int numTriVertices = slices * 3;87const unsigned int triFloats = numTriVertices * 3;88GLfloat triVertices[triFloats];89GLfloat *triPointer = triVertices;9091mNumTriVerts = numTriVertices;9293for (unsigned int i = 0; i < slices; ++i)94{95memcpy(triPointer, fanVertices,963 * sizeof(GLfloat)); // copy center point as first vertex for this slice97triPointer += 3;98for (unsigned int j = 1; j < 3; ++j)99{100GLfloat *vertex =101&(fanVertices[(i + j) * 3]); // copy two outer vertices for this point102memcpy(triPointer, vertex, 3 * sizeof(GLfloat));103triPointer += 3;104}105}106107// GLfloat triVertices2[triFloats];108glGenBuffers(mNumSquares, mTriBufId);109xOffset = xMin;110yOffset = yMin;111112for (unsigned int i = 0; i < mNumSquares; ++i)113{114triPointer = triVertices;115GLfloat tempVerts[triFloats];116for (unsigned int j = 0; j < numTriVertices; ++j)117{118tempVerts[j * 3] = triPointer[0] + xOffset;119tempVerts[j * 3 + 1] = triPointer[1] + yOffset;120tempVerts[j * 3 + 2] = 0.0f;121triPointer += 3;122}123124glBindBuffer(GL_ARRAY_BUFFER, mTriBufId[i]);125glBufferData(GL_ARRAY_BUFFER, triFloats * sizeof(GLfloat), tempVerts, GL_STATIC_DRAW);126xOffset += 2 * halfDim;127if (xOffset > xMax)128{129yOffset += 2 * halfDim;130xOffset = xMin;131}132}133}134135bool initialize() override136{137constexpr char kVS[] = R"(attribute vec4 vPosition;138void main()139{140gl_Position = vPosition;141})";142143constexpr char kFS[] = R"(precision mediump float;144void main()145{146gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);147})";148149mProgram = CompileProgram(kVS, kFS);150if (!mProgram)151{152return false;153}154155glClearColor(0.0f, 0.0f, 0.0f, 0.0f);156157createVertexBuffers();158159mFanTotalTime = 0;160mTriTotalTime = 0;161162return true;163}164165void destroy() override166{167std::cout << "Total draw time using TRIANGLE_FAN: " << mFanTotalTime << "ms ("168<< (float)mFanTotalTime / (float)mFrameCount << " average per frame)"169<< std::endl;170std::cout << "Total draw time using TRIANGLES: " << mTriTotalTime << "ms ("171<< (float)mTriTotalTime / (float)mFrameCount << " average per frame)"172<< std::endl;173glDeleteProgram(mProgram);174}175176void draw() override177{178// Set the viewport179glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());180181// Clear the color buffer182glClear(GL_COLOR_BUFFER_BIT);183184// Use the program object185glUseProgram(mProgram);186187// Bind the vertex data188glEnableVertexAttribArray(0);189190// Draw using triangle fans, stored in VBO191mFanTimer.start();192for (unsigned i = 0; i < mNumSquares; ++i)193{194glBindBuffer(GL_ARRAY_BUFFER, mFanBufId[i]);195glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);196glDrawArrays(GL_TRIANGLE_FAN, 0, mNumFanVerts);197}198mFanTimer.stop();199200mFanTotalTime += static_cast<unsigned int>(201mFanTimer.getElapsedTime() * 1000); // convert from usec to msec when accumulating202203// Clear to eliminate driver-side gains from occlusion204glClear(GL_COLOR_BUFFER_BIT);205206// Draw using triangles, stored in VBO207mTriTimer.start();208for (unsigned i = 1; i < mNumSquares; ++i)209{210glBindBuffer(GL_ARRAY_BUFFER, mTriBufId[i]);211glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);212glDrawArrays(GL_TRIANGLES, 0, mNumTriVerts);213}214mTriTimer.stop();215216mTriTotalTime += static_cast<unsigned int>(217mTriTimer.getElapsedTime() * 1000); // convert from usec to msec when accumulating218219mFrameCount++;220}221222private:223static const unsigned int mNumSquares = 289;224unsigned int mNumFanVerts;225unsigned int mNumTriVerts;226GLuint mProgram;227GLuint mFanBufId[mNumSquares];228GLuint mTriBufId[mNumSquares];229230Timer mFanTimer;231Timer mTriTimer;232unsigned int mFrameCount;233unsigned int mTriTotalTime;234unsigned int mFanTotalTime;235};236237int main(int argc, char **argv)238{239TriangleFanBenchSample app(argc, argv);240return app.run();241}242243244