From 962e9e6cabaf455a5321cfbcc6214f0c1b25f3be Mon Sep 17 00:00:00 2001 From: Rahul Singhal Date: Fri, 6 Apr 2012 17:44:41 +0530 Subject: [PATCH] WindowSystem: Don't composite for every redraw request Previously composition was done for every redraw request. But this is incorrect as a layer/surface not part of the current render order may have sent that request. Correcting this exposes two hidden bugs. When the render order is modified, there is no way to compare it against the old render order. Hence we need to force a complete composition. And updating uniforms of a shader also needs to force a composition. Change-Id: Ie255c85fda24f6f30504617f19b62a23d77bbea5 --- LayerManagerCommands/src/LayerRemoveCommand.cpp | 17 +++++++++++------ .../src/ScreenSetRenderOrderCommand.cpp | 2 ++ LayerManagerCommands/src/ShaderSetUniformsCommand.cpp | 7 +++++++ .../src/WindowSystems/WaylandBaseWindowSystem.cpp | 1 - .../Graphic/src/WindowSystems/X11WindowSystem.cpp | 5 ++--- .../Platform/GLXRenderer/include/X11GLXRenderer.h | 3 ++- .../Platform/GLXRenderer/src/X11GLXRenderer.cpp | 5 +++++ .../WaylandGLESRenderer/include/WaylandGLESRenderer.h | 1 + .../WaylandGLESRenderer/src/WaylandGLESRenderer.cpp | 5 +++++ .../Platform/X11GLESRenderer/include/X11GLESRenderer.h | 1 + .../Platform/X11GLESRenderer/src/X11GLESRenderer.cpp | 7 ++++++- LayerManagerService/include/IRenderer.h | 6 ++++++ 12 files changed, 48 insertions(+), 12 deletions(-) diff --git a/LayerManagerCommands/src/LayerRemoveCommand.cpp b/LayerManagerCommands/src/LayerRemoveCommand.cpp index e9092ba..855db0e 100644 --- a/LayerManagerCommands/src/LayerRemoveCommand.cpp +++ b/LayerManagerCommands/src/LayerRemoveCommand.cpp @@ -33,12 +33,17 @@ ExecutionResult LayerRemoveCommand::execute(ICommandExecutor* executor) ExecutionResult result = ExecutionFailed; - Layer* layer = scene.getLayer(m_idToRemove); - if (layer) - { - scene.removeLayer(layer); - result = ExecutionSuccessRedraw; - } + Layer* layer = scene.getLayer(m_idToRemove); + if (layer) + { + if (scene.isLayerInCurrentRenderOrder(m_idToRemove)) + { + IRenderer* renderer = *((executor->getRendererList())->begin()); + renderer->forceCompositionWindowSystem(); + } + scene.removeLayer(layer); + result = ExecutionSuccessRedraw; + } return result; } diff --git a/LayerManagerCommands/src/ScreenSetRenderOrderCommand.cpp b/LayerManagerCommands/src/ScreenSetRenderOrderCommand.cpp index a8e655b..f5d87d7 100644 --- a/LayerManagerCommands/src/ScreenSetRenderOrderCommand.cpp +++ b/LayerManagerCommands/src/ScreenSetRenderOrderCommand.cpp @@ -31,6 +31,7 @@ ExecutionResult ScreenSetRenderOrderCommand::execute(ICommandExecutor* executor) { Scene& scene = *(executor->getScene()); ExecutionResult result = ExecutionFailed; + IRenderer* renderer = *((executor->getRendererList())->begin()); // check for doubles for (unsigned int i = 0; i < m_length; i++) @@ -57,6 +58,7 @@ ExecutionResult ScreenSetRenderOrderCommand::execute(ICommandExecutor* executor) scene.getCurrentRenderOrder().clear(); result = ExecutionSuccessRedraw; + renderer->forceCompositionWindowSystem(); LOG_DEBUG("ScreenSetRenderOrderCommand", "Length to set: " << m_length); diff --git a/LayerManagerCommands/src/ShaderSetUniformsCommand.cpp b/LayerManagerCommands/src/ShaderSetUniformsCommand.cpp index 7c5148c..7da6377 100644 --- a/LayerManagerCommands/src/ShaderSetUniformsCommand.cpp +++ b/LayerManagerCommands/src/ShaderSetUniformsCommand.cpp @@ -78,6 +78,13 @@ ExecutionResult ShaderSetUniformsCommand::execute(ICommandExecutor* executor) LOG_ERROR("ShaderSetUniformsCommand", "shader ID "<getRendererList())->begin()); + renderer->forceCompositionWindowSystem(); + } + return result; } diff --git a/LayerManagerPlugins/Renderers/Graphic/src/WindowSystems/WaylandBaseWindowSystem.cpp b/LayerManagerPlugins/Renderers/Graphic/src/WindowSystems/WaylandBaseWindowSystem.cpp index c84d525..e1ec1b5 100644 --- a/LayerManagerPlugins/Renderers/Graphic/src/WindowSystems/WaylandBaseWindowSystem.cpp +++ b/LayerManagerPlugins/Renderers/Graphic/src/WindowSystems/WaylandBaseWindowSystem.cpp @@ -884,7 +884,6 @@ void WaylandBaseWindowSystem::signalRedrawEvent() LOG_DEBUG("WaylandBaseWindowSystem", "signalRedrawEvent"); // set flag that redraw is needed this->m_systemState = REDRAW_STATE; - m_damaged = true; this->wakeUpRendererThread(); } diff --git a/LayerManagerPlugins/Renderers/Graphic/src/WindowSystems/X11WindowSystem.cpp b/LayerManagerPlugins/Renderers/Graphic/src/WindowSystems/X11WindowSystem.cpp index 79664c0..da5a895 100644 --- a/LayerManagerPlugins/Renderers/Graphic/src/WindowSystems/X11WindowSystem.cpp +++ b/LayerManagerPlugins/Renderers/Graphic/src/WindowSystems/X11WindowSystem.cpp @@ -593,13 +593,13 @@ void X11WindowSystem::Redraw() CheckRedrawAllLayers(); if (m_damaged) - { + { graphicSystem->activateGraphicContext(); graphicSystem->clearBackground(); RedrawAllLayers(); graphicSystem->swapBuffers(); graphicSystem->releaseGraphicContext(); - m_pScene->unlockScene(); + m_pScene->unlockScene(); if (debugMode) { printDebug(); @@ -960,7 +960,6 @@ void X11WindowSystem::signalRedrawEvent() { // set flag that redraw is needed this->m_systemState = REDRAW_STATE; - m_damaged = true; this->wakeUpRendererThread(); } diff --git a/LayerManagerPlugins/Renderers/Platform/GLXRenderer/include/X11GLXRenderer.h b/LayerManagerPlugins/Renderers/Platform/GLXRenderer/include/X11GLXRenderer.h index f66a409..35801cd 100644 --- a/LayerManagerPlugins/Renderers/Platform/GLXRenderer/include/X11GLXRenderer.h +++ b/LayerManagerPlugins/Renderers/Platform/GLXRenderer/include/X11GLXRenderer.h @@ -39,7 +39,8 @@ public: bool start(int, int, const char*); void stop(); - void signalWindowSystemRedraw(); + void signalWindowSystemRedraw(); + void forceCompositionWindowSystem(); private: X11WindowSystem* m_pWindowSystem; GLXGraphicsystem* m_pGraphicSystem; diff --git a/LayerManagerPlugins/Renderers/Platform/GLXRenderer/src/X11GLXRenderer.cpp b/LayerManagerPlugins/Renderers/Platform/GLXRenderer/src/X11GLXRenderer.cpp index b779218..8ebfee0 100644 --- a/LayerManagerPlugins/Renderers/Platform/GLXRenderer/src/X11GLXRenderer.cpp +++ b/LayerManagerPlugins/Renderers/Platform/GLXRenderer/src/X11GLXRenderer.cpp @@ -139,6 +139,11 @@ void X11GLXRenderer::signalWindowSystemRedraw() m_pWindowSystem->signalRedrawEvent(); } +void X11GLXRenderer::forceCompositionWindowSystem() +{ + m_pWindowSystem->m_damaged = true; +} + extern "C" IRenderer* createX11GLXRenderer(Scene* pScene) { return new X11GLXRenderer(pScene); } diff --git a/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/include/WaylandGLESRenderer.h b/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/include/WaylandGLESRenderer.h index 0e9b3a8..87b3e5b 100644 --- a/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/include/WaylandGLESRenderer.h +++ b/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/include/WaylandGLESRenderer.h @@ -39,6 +39,7 @@ public: uint* getScreenResolution(uint screenID); uint* getScreenIDs(uint* length); void signalWindowSystemRedraw(); + void forceCompositionWindowSystem(); Shader* createShader(const string* vertexName, const string* fragmentName); private: diff --git a/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/src/WaylandGLESRenderer.cpp b/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/src/WaylandGLESRenderer.cpp index c80d6b7..8c9f7dc 100644 --- a/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/src/WaylandGLESRenderer.cpp +++ b/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/src/WaylandGLESRenderer.cpp @@ -157,6 +157,11 @@ void WaylandGLESRenderer::signalWindowSystemRedraw() m_pWindowSystem->signalRedrawEvent(); } +void WaylandGLESRenderer::forceCompositionWindowSystem() +{ + m_pWindowSystem->m_damaged = true; +} + Shader* WaylandGLESRenderer::createShader(const string* vertexName, const string* fragmentName) { Shader *result = NULL; diff --git a/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/include/X11GLESRenderer.h b/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/include/X11GLESRenderer.h index 4d0071b..0ffd01c 100644 --- a/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/include/X11GLESRenderer.h +++ b/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/include/X11GLESRenderer.h @@ -38,6 +38,7 @@ public: uint* getScreenResolution(uint screenID); uint* getScreenIDs(uint* length); void signalWindowSystemRedraw(); + void forceCompositionWindowSystem(); Shader* createShader(const string* vertexName, const string* fragmentName); private: diff --git a/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/src/X11GLESRenderer.cpp b/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/src/X11GLESRenderer.cpp index 2d9b0a9..12a55b9 100644 --- a/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/src/X11GLESRenderer.cpp +++ b/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/src/X11GLESRenderer.cpp @@ -152,7 +152,12 @@ void X11GLESRenderer::signalWindowSystemRedraw() m_pWindowSystem->signalRedrawEvent(); } -Shader* X11GLESRenderer::createShader(const string* vertexName, const string* fragmentName) +void X11GLESRenderer::forceCompositionWindowSystem() +{ + m_pWindowSystem->m_damaged = true; +} + +Shader* X11GLESRenderer::createShader(const string* vertexName, const string* fragmentName) { Shader *result = NULL; m_pWindowSystem->setSystemState(WAKEUP_STATE); diff --git a/LayerManagerService/include/IRenderer.h b/LayerManagerService/include/IRenderer.h index 7dd6c44..a07197f 100644 --- a/LayerManagerService/include/IRenderer.h +++ b/LayerManagerService/include/IRenderer.h @@ -132,6 +132,12 @@ public: * \ingroup RendererAPI */ virtual void signalWindowSystemRedraw() = 0; + + /** + * \brief Force composition for entire scene + * \ingroup RendererAPI + */ + virtual void forceCompositionWindowSystem() = 0; }; #endif /* _IRENDERER_H_ */ -- 2.7.4