From 90fc2a81649f55e14e1ce94c851a4d75cbea80e2 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Tue, 20 Nov 2018 05:26:51 +1100 Subject: [PATCH] [client] move FPS calculations out of renderers --- client/lg-renderer.h | 5 +- client/main.c | 22 +++++++ client/renderers/egl.c | 7 +- client/renderers/opengl.c | 130 +++++++++++++++++--------------------- 4 files changed, 89 insertions(+), 75 deletions(-) diff --git a/client/lg-renderer.h b/client/lg-renderer.h index fe57a5bb..e25808f0 100644 --- a/client/lg-renderer.h +++ b/client/lg-renderer.h @@ -36,7 +36,8 @@ Place, Suite 330, Boston, MA 02111-1307 USA (x)->on_mouse_event && \ (x)->on_alert && \ (x)->render_startup && \ - (x)->render) + (x)->render && \ + (x)->update_fps) #define LGR_OPTION_COUNT(x) (sizeof(x) / sizeof(LG_RendererOpt)) @@ -116,6 +117,7 @@ typedef bool (* LG_RendererOnMouseEvent)(void * opaque, const bool visib typedef bool (* LG_RendererOnFrameEvent)(void * opaque, const LG_RendererFormat format, const uint8_t * data); typedef void (* LG_RendererOnAlert )(void * opaque, const LG_RendererAlert alert, const char * message, bool ** closeFlag); typedef bool (* LG_RendererRender )(void * opaque, SDL_Window *window); +typedef void (* LG_RendererUpdateFPS )(void * opaque, const float avgFPS, const float renderFPS); typedef struct LG_Renderer { @@ -132,6 +134,7 @@ typedef struct LG_Renderer LG_RendererOnAlert on_alert; LG_RendererRender render_startup; LG_RendererRender render; + LG_RendererUpdateFPS update_fps; } LG_Renderer; diff --git a/client/main.c b/client/main.c index f01d7964..1ba82d8b 100644 --- a/client/main.c +++ b/client/main.c @@ -68,6 +68,11 @@ struct AppState struct KVMFRHeader * shm; unsigned int shmSize; int64_t fpsSleep; + + uint64_t lastFrameTime; + uint64_t renderTime; + uint64_t frameCount; + uint64_t renderCount; }; typedef struct RenderOpts @@ -198,6 +203,22 @@ int renderThread(void * unused) if (!state.lgr->render(state.lgrData, state.window)) break; + const uint64_t t = nanotime(); + state.renderTime += t - state.lastFrameTime; + state.lastFrameTime = t; + ++state.renderCount; + + if (state.renderTime > 1e9) + { + const float avgFPS = 1000.0f / (((float)state.renderTime / state.frameCount ) / 1e6f); + const float renderFPS = 1000.0f / (((float)state.renderTime / state.renderCount) / 1e6f); + state.renderTime = 0; + state.frameCount = 0; + state.renderCount = 0; + + state.lgr->update_fps(state.lgrData, avgFPS, renderFPS); + } + const uint64_t total = microtime() - start; if (total < state.fpsSleep) { @@ -409,6 +430,7 @@ int frameThread(void * unused) break; } + ++state.frameCount; if (!state.started) { state.started = true; diff --git a/client/renderers/egl.c b/client/renderers/egl.c index 2505ecf3..a5e6ac7e 100644 --- a/client/renderers/egl.c +++ b/client/renderers/egl.c @@ -491,6 +491,10 @@ bool egl_render(void * opaque, SDL_Window * window) return true; } +void egl_update_fps(void * opaque, const float avgFps, const float renderFps) +{ +} + void update_mouse_shape(struct Inst * this) { LG_LOCK(this->mouseLock); @@ -591,5 +595,6 @@ struct LG_Renderer LGR_EGL = .on_frame_event = egl_on_frame_event, .on_alert = egl_on_alert, .render_startup = egl_render_startup, - .render = egl_render + .render = egl_render, + .update_fps = egl_update_fps }; \ No newline at end of file diff --git a/client/renderers/opengl.c b/client/renderers/opengl.c index 431db3c0..aacaab91 100644 --- a/client/renderers/opengl.c +++ b/client/renderers/opengl.c @@ -125,10 +125,6 @@ struct Inst bool waitDone; bool fpsTexture; - uint64_t lastFrameTime; - uint64_t renderTime; - uint64_t frameCount; - uint64_t renderCount; SDL_Rect fpsRect; LG_Lock mouseLock; @@ -141,7 +137,6 @@ struct Inst bool mouseUpdate; bool newShape; - uint64_t lastMouseDraw; LG_RendererCursor mouseType; bool mouseVisible; SDL_Rect mousePos; @@ -379,7 +374,6 @@ bool opengl_on_frame_event(void * opaque, const LG_RendererFormat format, const this->waitFadeTime = microtime() + FADE_TIME; } - ++this->frameCount; return true; } @@ -530,65 +524,6 @@ bool opengl_render(void * opaque, SDL_Window * window) if (!draw_frame(this)) return false; - if (this->params.showFPS && this->renderTime > 1e9) - { - char str[128]; - const float avgFPS = 1000.0f / (((float)this->renderTime / this->frameCount ) / 1e6f); - const float renderFPS = 1000.0f / (((float)this->renderTime / this->renderCount) / 1e6f); - snprintf(str, sizeof(str), "UPS: %8.4f, FPS: %8.4f", avgFPS, renderFPS); - - LG_FontBitmap *textSurface = NULL; - if (!(textSurface = this->font->render(this->fontObj, LG_FONT_BITMAP, 0xffffff00, str))) - { - DEBUG_ERROR("Failed to render text"); - LG_UNLOCK(this->formatLock); - return false; - } - - bitmap_to_texture(textSurface, this->textures[FPS_TEXTURE]); - - this->fpsRect.x = 5; - this->fpsRect.y = 5; - this->fpsRect.w = textSurface->width; - this->fpsRect.h = textSurface->height; - - this->font->release(this->fontObj, textSurface); - - this->renderTime = 0; - this->frameCount = 0; - this->renderCount = 0; - this->fpsTexture = true; - - glNewList(this->fpsList, GL_COMPILE); - glPushMatrix(); - glLoadIdentity(); - - glEnable(GL_BLEND); - glDisable(GL_TEXTURE_2D); - glColor4f(0.0f, 0.0f, 1.0f, 0.5f); - glBegin(GL_TRIANGLE_STRIP); - glVertex2i(this->fpsRect.x , this->fpsRect.y ); - glVertex2i(this->fpsRect.x + this->fpsRect.w, this->fpsRect.y ); - glVertex2i(this->fpsRect.x , this->fpsRect.y + this->fpsRect.h); - glVertex2i(this->fpsRect.x + this->fpsRect.w, this->fpsRect.y + this->fpsRect.h); - glEnd(); - glEnable(GL_TEXTURE_2D); - - glBindTexture(GL_TEXTURE_2D, this->textures[FPS_TEXTURE]); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(0.0f , 0.0f); glVertex2i(this->fpsRect.x , this->fpsRect.y ); - glTexCoord2f(1.0f , 0.0f); glVertex2i(this->fpsRect.x + this->fpsRect.w, this->fpsRect.y ); - glTexCoord2f(0.0f , 1.0f); glVertex2i(this->fpsRect.x , this->fpsRect.y + this->fpsRect.h); - glTexCoord2f(1.0f, 1.0f); glVertex2i(this->fpsRect.x + this->fpsRect.w, this->fpsRect.y + this->fpsRect.h); - glEnd(); - glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_BLEND); - - glPopMatrix(); - glEndList(); - } - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); @@ -683,16 +618,64 @@ bool opengl_render(void * opaque, SDL_Window * window) else SDL_GL_SwapWindow(window); - const uint64_t t = nanotime(); - this->renderTime += t - this->lastFrameTime; - this->lastFrameTime = t; - ++this->renderCount; - - this->mouseUpdate = false; - this->lastMouseDraw = t; + this->mouseUpdate = false; return true; } +void opengl_update_fps(void * opaque, const float avgFPS, const float renderFPS) +{ + struct Inst * this = (struct Inst *)opaque; + if (!this->params.showFPS) + return; + + char str[128]; + snprintf(str, sizeof(str), "UPS: %8.4f, FPS: %8.4f", avgFPS, renderFPS); + + LG_FontBitmap *textSurface = NULL; + if (!(textSurface = this->font->render(this->fontObj, LG_FONT_BITMAP, 0xffffff00, str))) + DEBUG_ERROR("Failed to render text"); + + bitmap_to_texture(textSurface, this->textures[FPS_TEXTURE]); + + this->fpsRect.x = 5; + this->fpsRect.y = 5; + this->fpsRect.w = textSurface->width; + this->fpsRect.h = textSurface->height; + + this->font->release(this->fontObj, textSurface); + + this->fpsTexture = true; + + glNewList(this->fpsList, GL_COMPILE); + glPushMatrix(); + glLoadIdentity(); + + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glColor4f(0.0f, 0.0f, 1.0f, 0.5f); + glBegin(GL_TRIANGLE_STRIP); + glVertex2i(this->fpsRect.x , this->fpsRect.y ); + glVertex2i(this->fpsRect.x + this->fpsRect.w, this->fpsRect.y ); + glVertex2i(this->fpsRect.x , this->fpsRect.y + this->fpsRect.h); + glVertex2i(this->fpsRect.x + this->fpsRect.w, this->fpsRect.y + this->fpsRect.h); + glEnd(); + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, this->textures[FPS_TEXTURE]); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f , 0.0f); glVertex2i(this->fpsRect.x , this->fpsRect.y ); + glTexCoord2f(1.0f , 0.0f); glVertex2i(this->fpsRect.x + this->fpsRect.w, this->fpsRect.y ); + glTexCoord2f(0.0f , 1.0f); glVertex2i(this->fpsRect.x , this->fpsRect.y + this->fpsRect.h); + glTexCoord2f(1.0f, 1.0f); glVertex2i(this->fpsRect.x + this->fpsRect.w, this->fpsRect.y + this->fpsRect.h); + glEnd(); + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_BLEND); + + glPopMatrix(); + glEndList(); +} + void draw_torus(float x, float y, float inner, float outer, unsigned int pts) { glBegin(GL_QUAD_STRIP); @@ -866,7 +849,8 @@ const LG_Renderer LGR_OpenGL = .on_frame_event = opengl_on_frame_event, .on_alert = opengl_on_alert, .render_startup = opengl_render_startup, - .render = opengl_render + .render = opengl_render, + .update_fps = opengl_update_fps }; static bool _check_gl_error(unsigned int line, const char * name)