From bb6b19c4100067d369a7bd984a78ec08fdb35db2 Mon Sep 17 00:00:00 2001 From: Doug Binks Date: Tue, 18 Feb 2014 12:26:41 +0100 Subject: [PATCH] Added GPU timer and fixed up formatting. --- example/demo.c | 42 ++++++++++++++++++++---------------------- example/example_gl3.c | 41 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 25 deletions(-) diff --git a/example/demo.c b/example/demo.c index 41f5882..9c8b40e 100644 --- a/example/demo.c +++ b/example/demo.c @@ -911,28 +911,26 @@ void renderFPS(struct NVGcontext* vg, float x, float y, struct FPScounter* fps, nvgFill(vg); nvgFontFace(vg, "sans"); - if( RENDER_FPS == style ) - { - nvgFontSize(vg, 18.0f); - nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_MIDDLE); - nvgFillColor(vg, nvgRGBA(240,240,240,255)); - sprintf(str, "%.2f FPS", 1.0f / avg); - nvgText(vg, x+w-5,y+h/2, str, NULL); - - nvgFontSize(vg, 15.0f); - nvgTextAlign(vg,NVG_ALIGN_LEFT|NVG_ALIGN_MIDDLE); - nvgFillColor(vg, nvgRGBA(240,240,240,160)); - sprintf(str, "%.2f ms", avg * 1000.0f); - nvgText(vg, x+5,y+h/2, str, NULL); - } - else - { - nvgFontSize(vg, 18.0f); - nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_MIDDLE); - nvgFillColor(vg, nvgRGBA(240,240,240,255)); - sprintf(str, "%.2f ms", avg * 1000.0f); - nvgText(vg, x+w-5,y+h/2, str, NULL); - } + if( RENDER_FPS == style ) { + nvgFontSize(vg, 18.0f); + nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_MIDDLE); + nvgFillColor(vg, nvgRGBA(240,240,240,255)); + sprintf(str, "%.2f FPS", 1.0f / avg); + nvgText(vg, x+w-5,y+h/2, str, NULL); + + nvgFontSize(vg, 15.0f); + nvgTextAlign(vg,NVG_ALIGN_LEFT|NVG_ALIGN_MIDDLE); + nvgFillColor(vg, nvgRGBA(240,240,240,160)); + sprintf(str, "%.2f ms", avg * 1000.0f); + nvgText(vg, x+5,y+h/2, str, NULL); + } + else { + nvgFontSize(vg, 18.0f); + nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_MIDDLE); + nvgFillColor(vg, nvgRGBA(240,240,240,255)); + sprintf(str, "%.2f ms", avg * 1000.0f); + nvgText(vg, x+w-5,y+h/2, str, NULL); + } } diff --git a/example/example_gl3.c b/example/example_gl3.c index 6b9d192..f1f69e4 100644 --- a/example/example_gl3.c +++ b/example/example_gl3.c @@ -31,7 +31,6 @@ #include "nanovg_gl3buf.h" #include "demo.h" - void errorcb(int error, const char* desc) { printf("GLFW error %d: %s\n", error, desc); @@ -49,14 +48,19 @@ static void key(GLFWwindow* window, int key, int scancode, int action, int mods) blowup = !blowup; } +enum numqueries { + NUM_QUERIES = 5 +}; + int main() { GLFWwindow* window; struct DemoData data; struct NVGcontext* vg = NULL; - struct FPScounter fps; - struct FPScounter cpuTimes; + struct FPScounter fps, cpuTimes, gpuTimes; double prevt = 0, cpuTime = 0; + int timerquery = GL_FALSE, currquery = 0, retquery = 0; + GLuint timerqueryid[NUM_QUERIES]; if (!glfwInit()) { printf("Failed to init GLFW."); @@ -65,6 +69,7 @@ int main() initFPS(&fps); initFPS(&cpuTimes); + initFPS(&gpuTimes); glfwSetErrorCallback(errorcb); #ifndef _WIN32 // don't require this on win32, and works with more cards @@ -110,6 +115,11 @@ int main() glfwSwapInterval(0); + timerquery = glfwExtensionSupported("GL_ARB_timer_query"); + if( timerquery ) { + glGenQueries(NUM_QUERIES, timerqueryid); + } + glfwSetTime(0); prevt = glfwGetTime(); @@ -125,6 +135,10 @@ int main() prevt = t; updateFPS(&fps, dt); updateFPS(&cpuTimes, cpuTime); + if( timerquery ) { + glBeginQuery(GL_TIME_ELAPSED, timerqueryid[currquery % NUM_QUERIES] ); + currquery = ++currquery; + } glfwGetCursorPos(window, &mx, &my); glfwGetWindowSize(window, &winWidth, &winHeight); @@ -147,11 +161,32 @@ int main() renderDemo(vg, mx,my, winWidth,winHeight, t, blowup, &data); renderFPS(vg, 5,5, &fps, RENDER_FPS); renderFPS(vg, 310,5, &cpuTimes, RENDER_MS); + renderFPS(vg, 615,5, &gpuTimes, RENDER_MS); nvgEndFrame(vg); glEnable(GL_DEPTH_TEST); + + // Measure the CPU time taken excluding swap buffers (as the swap may wait for GPU) cpuTime = glfwGetTime() - t; + + if( timerquery ) { + GLint available = 1; + glEndQuery(GL_TIME_ELAPSED); + while( available && retquery <= currquery ) { + // check for results if there are any + glGetQueryObjectiv(timerqueryid[retquery], GL_QUERY_RESULT_AVAILABLE, &available); + if( available ) { + GLuint64 timeElapsed = 0; + double gpuTime; + glGetQueryObjectui64v(timerqueryid[retquery % NUM_QUERIES], GL_QUERY_RESULT, &timeElapsed); + retquery = ++retquery ; + gpuTime = (double)timeElapsed * 1e-9; + updateFPS(&gpuTimes, (float)gpuTime); + } + } + + } glfwSwapBuffers(window); glfwPollEvents(); }