From eb2f8e6ffab3409d98b038dfc7849cb33bfe0f42 Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Wed, 28 Jun 2017 15:03:50 +0100 Subject: [PATCH] Performance Improvements: Remove unnecessary SwapBuffer calls Change-Id: I8ce9f1d5e2fcdab8f81c355774a2f9775e1a365b --- dali/integration-api/core.h | 48 ++++++++++++++++++++------ dali/internal/render/common/render-manager.cpp | 3 ++ 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/dali/integration-api/core.h b/dali/integration-api/core.h index ba492a1..fed5246 100644 --- a/dali/integration-api/core.h +++ b/dali/integration-api/core.h @@ -1,8 +1,8 @@ -#ifndef __DALI_INTEGRATION_CORE_H__ -#define __DALI_INTEGRATION_CORE_H__ +#ifndef DALI_INTEGRATION_CORE_H +#define DALI_INTEGRATION_CORE_H /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -118,26 +118,52 @@ public: * Constructor */ RenderStatus() - : needsUpdate(false) + : needsUpdate( false ), + needsPostRender( false ) { } /** * Set whether update needs to run following a render. - * This might be because render has sent messages to update, or it has - * some textures to upload over several frames. + * @param[in] updateRequired Set to true if an update is required to be run */ - void SetNeedsUpdate(bool updateRequired) { needsUpdate = updateRequired; } + void SetNeedsUpdate( bool updateRequired ) + { + needsUpdate = updateRequired; + } /** * Query the update status following rendering of a frame. - * @return true if update should run. + * @return True if update is required to be run + */ + bool NeedsUpdate() const + { + return needsUpdate; + } + + /** + * Sets if a post-render should be run. + * If nothing is rendered this frame, we can skip post-render. + * @param[in] postRenderRequired Set to True if post-render is required to be run */ - bool NeedsUpdate() { return needsUpdate; } + void SetNeedsPostRender( bool postRenderRequired ) + { + needsPostRender = postRenderRequired; + } + + /** + * Queries if a post-render should be run. + * @return True if post-render is required to be run + */ + bool NeedsPostRender() const + { + return needsPostRender; + } private: - bool needsUpdate; + bool needsUpdate :1; ///< True if update is required to be run + bool needsPostRender :1; ///< True if post-render is required to be run. }; /** @@ -413,4 +439,4 @@ private: } // namespace Dali -#endif // __DALI_INTEGRATION_CORE_H__ +#endif // DALI_INTEGRATION_CORE_H diff --git a/dali/internal/render/common/render-manager.cpp b/dali/internal/render/common/render-manager.cpp index bc511af..c980d74 100644 --- a/dali/internal/render/common/render-manager.cpp +++ b/dali/internal/render/common/render-manager.cpp @@ -436,6 +436,9 @@ void RenderManager::Render( Integration::RenderStatus& status ) // Only render if we have instructions to render, or the last frame was rendered (and therefore a clear is required). if( haveInstructions || mImpl->lastFrameWasRendered ) { + // Mark that we will require a post-render step to be performed (includes swap-buffers). + status.SetNeedsPostRender( true ); + // switch rendering to adaptor provided (default) buffer mImpl->context.BindFramebuffer( GL_FRAMEBUFFER, 0 ); -- 2.7.4