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