1 /************************************************************************** 2 * 3 * Copyright 2013 Marek Olk <maraeo (at) gmail.com> 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 /* This file contains code for calculating framerate for displaying on the HUD. 29 */ 30 31 #include "hud/hud_private.h" 32 #include "util/os_time.h" 33 #include "util/u_memory.h" 34 35 struct fps_info { 36 int frames; 37 uint64_t last_time; 38 }; 39 40 static void 41 query_fps(struct hud_graph *gr, struct pipe_context *pipe) 42 { 43 struct fps_info *info = gr->query_data; 44 uint64_t now = os_time_get(); 45 46 info->frames++; 47 48 if (info->last_time) { 49 if (info->last_time + gr->pane->period <= now) { 50 double fps = ((uint64_t)info->frames) * 1000000 / 51 (double)(now - info->last_time); 52 info->frames = 0; 53 info->last_time = now; 54 55 hud_graph_add_value(gr, fps); 56 } 57 } 58 else { 59 info->last_time = now; 60 } 61 } 62 63 static void 64 free_query_data(void *p, struct pipe_context *pipe) 65 { 66 FREE(p); 67 } 68 69 void 70 hud_fps_graph_install(struct hud_pane *pane) 71 { 72 struct hud_graph *gr = CALLOC_STRUCT(hud_graph); 73 74 if (!gr) 75 return; 76 77 strcpy(gr->name, "fps"); 78 gr->query_data = CALLOC_STRUCT(fps_info); 79 if (!gr->query_data) { 80 FREE(gr); 81 return; 82 } 83 84 gr->query_new_value = query_fps; 85 86 /* Don't use free() as our callback as that messes up Gallium's 87 * memory debugger. Use simple free_query_data() wrapper. 88 */ 89 gr->free_query_data = free_query_data; 90 91 hud_pane_add_graph(pane, gr); 92 } 93