From fd84329f1500b765adca69987ce3ad162976d95c Mon Sep 17 00:00:00 2001 From: cholleme <> Date: Thu, 1 Jan 2004 22:42:24 +0000 Subject: [PATCH] Statistics bumpmapping driver --- gl_bumpstat.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 gl_bumpstat.c diff --git a/gl_bumpstat.c b/gl_bumpstat.c new file mode 100644 index 0000000..214156d --- /dev/null +++ b/gl_bumpstat.c @@ -0,0 +1,150 @@ +/* +Copyright (C) 2001-2002 Charles Hollemeersch + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +A passtrough bumpmap driver that collects statistics. +This uses the original bumpmap driver for the actual drawing +*/ + +#include "quakedef.h" + +static bumpdriver_t original; +static qboolean gl_bumpstatistics; + +static int ambientSurfaces; +static int bumpSurfaces; +static int ambientSurfaceTris; +static int bumpSurfaceTris; + +static int ambientTriangles; +static int bumpTriangles; + +static double averageTris; +static int numFrames = 0; + +void STAT_drawSurfaceListBase(vertexdef_t *verts, msurface_t **surfs, int numSurfaces, shader_t *shader) { + int i; + original.drawSurfaceListBase(verts, surfs, numSurfaces, shader); + ambientSurfaces += numSurfaces; + for (i=0; ipolys->numindecies/3); + } +} + +void STAT_drawSurfaceListBump (vertexdef_t *verts, msurface_t **surfs, int numSurfaces, const transform_t *tr, const lightobject_t *lo) { + int i; + original.drawSurfaceListBump(verts, surfs, numSurfaces, tr, lo); + bumpSurfaces += numSurfaces; + for (i=0; ipolys->numindecies/3); + } +} + +void STAT_drawTriangleListBase (vertexdef_t *verts, int *indecies, int numIndecies, shader_t *shader, int lightmapIndex) { + original.drawTriangleListBase(verts, indecies, numIndecies, shader, lightmapIndex); + ambientTriangles += (numIndecies/3); +} + +void STAT_drawTriangleListBump (const vertexdef_t *verts, int *indecies, int numIndecies, shader_t *shader, const transform_t *tr, const lightobject_t *lo) { + original.drawTriangleListBump(verts, indecies, numIndecies, shader, tr, lo); + bumpTriangles += (numIndecies/3); +} + +void *STAT_getDriverMem (size_t size, drivermem_t hint) { + return original.getDriverMem(size, hint); +} + +void STAT_freeAllDriverMem (void) { + original.freeAllDriverMem(); +} + +void STAT_freeDriver (void) { + original.freeDriver(); +} + +/** + This installs the statistics driver +*/ +void BUMP_StartStat(void) { + original = gl_bumpdriver; + gl_bumpstatistics = true; + + gl_bumpdriver.drawSurfaceListBase = STAT_drawSurfaceListBase; + gl_bumpdriver.drawSurfaceListBump = STAT_drawSurfaceListBump; + gl_bumpdriver.drawTriangleListBase = STAT_drawTriangleListBase; + gl_bumpdriver.drawTriangleListBump = STAT_drawTriangleListBump; + gl_bumpdriver.getDriverMem = STAT_getDriverMem; + gl_bumpdriver.freeAllDriverMem = STAT_freeAllDriverMem; + gl_bumpdriver.freeDriver = STAT_freeDriver; +} + +/** + This uninstals the statistics driver and reinstalls the old driver +*/ +void BUMP_StopStat(void) { + gl_bumpstatistics = false; + gl_bumpdriver = original; +} + +/** + This prints the current statistics +*/ +void BUMP_PrintStats(void) { + if (!gl_bumpstatistics) return; +/* + ambientSurfaces = 0; + bumpSurfaces = 0; + ambientSurfaceTris = 0; + bumpSurfaceTris = 0; + ambientTriangles = 0; + bumpTriangles = 0; +*/ + Con_Printf("--- Stats ---\n"); + Con_Printf("Surfaces\n"); + Con_Printf(" Ambient: %i Bump %i Total %i\n",ambientSurfaces, bumpSurfaces, ambientSurfaces+bumpSurfaces); + Con_Printf("SurfaceTriangles\n"); + Con_Printf(" Ambient: %i Bump %i Total %i\n",ambientSurfaceTris, bumpSurfaceTris, ambientSurfaceTris+bumpSurfaceTris); + Con_Printf("Triangles\n"); + Con_Printf(" Ambient: %i Bump %i Total %i\n",ambientTriangles, bumpTriangles, ambientTriangles+bumpTriangles); + + averageTris = (averageTris*numFrames + (ambientTriangles+bumpTriangles+ambientSurfaceTris+bumpSurfaceTris)) / (numFrames+1); + Con_Printf("Average\n"); + Con_Printf(" Triangles: %i\n", (int)(averageTris)); + numFrames++; +} + +/** + This resets the internal counters, should be called every frame +*/ +void BUMP_ResetStats(void) { + if (!gl_bumpstatistics) return; + + ambientSurfaces = 0; + bumpSurfaces = 0; + ambientSurfaceTris = 0; + bumpSurfaceTris = 0; + ambientTriangles = 0; + bumpTriangles = 0; +} + +void ToggleStatistics_f(void) { + if (gl_bumpstatistics) { + BUMP_StopStat(); + } else { + BUMP_StartStat(); + } +} \ No newline at end of file