From 4188adad17aeba0e9c5972bf4c8be2c4eb5089cc Mon Sep 17 00:00:00 2001 From: rachytski Date: Fri, 30 Nov 2012 11:20:11 +0300 Subject: [PATCH] every Renderer::Command should have valid RenderContext while executing. --- graphics/display_list.cpp | 9 +++++++-- graphics/opengl/renderer.cpp | 3 +++ graphics/opengl/renderer.hpp | 1 + graphics/packets_queue.cpp | 10 ++++++++++ graphics/packets_queue.hpp | 7 +++++++ map/basic_tiling_render_policy.cpp | 2 +- map/queued_renderer.cpp | 7 ++++++- map/queued_renderer.hpp | 9 ++++++++- 8 files changed, 43 insertions(+), 5 deletions(-) diff --git a/graphics/display_list.cpp b/graphics/display_list.cpp index bcced2c0b6..7bcf0520a0 100644 --- a/graphics/display_list.cpp +++ b/graphics/display_list.cpp @@ -1,4 +1,5 @@ #include "display_list.hpp" +#include "render_context.hpp" namespace graphics { @@ -98,7 +99,7 @@ namespace graphics mv(2, 0) = 0; mv(2, 1) = 0; mv(2, 2) = 1; mv(2, 3) = 0; mv(3, 0) = m(0, 2); mv(3, 1) = m(1, 2); mv(3, 2) = 0; mv(3, 3) = m(2, 2); - r->loadMatrix(EModelView, mv); + r->renderContext()->setMatrix(EModelView, mv); /// drawing collected geometry @@ -108,11 +109,15 @@ namespace graphics for (list >::const_iterator it = m_commands.begin(); it != m_commands.end(); ++it) + { + (*it)->setRenderContext(r->renderContext()); (*it)->perform(); + } if (m_isDebugging) LOG(LINFO, ("finished DisplayList::draw")); - r->loadMatrix(EModelView, math::Identity()); + + r->renderContext()->setMatrix(EModelView, math::Identity()); } } diff --git a/graphics/opengl/renderer.cpp b/graphics/opengl/renderer.cpp index 9f888dcf64..881ad88f53 100644 --- a/graphics/opengl/renderer.cpp +++ b/graphics/opengl/renderer.cpp @@ -325,7 +325,10 @@ namespace graphics renderQueue()->processPacket(Packet(command, type)); else if (command) + { + command->setRenderContext(m_renderContext.get()); command->perform(); + } } PacketsQueue * Renderer::renderQueue() diff --git a/graphics/opengl/renderer.hpp b/graphics/opengl/renderer.hpp index 9ff15d5671..43964842b5 100644 --- a/graphics/opengl/renderer.hpp +++ b/graphics/opengl/renderer.hpp @@ -14,6 +14,7 @@ namespace graphics { class ResourceManager; class RenderTarget; + class RenderContext; namespace gl { diff --git a/graphics/packets_queue.cpp b/graphics/packets_queue.cpp index c2fa838632..b788f74e43 100644 --- a/graphics/packets_queue.cpp +++ b/graphics/packets_queue.cpp @@ -13,6 +13,16 @@ namespace graphics m_isDebugging = flag; } + void Command::setRenderContext(RenderContext * ctx) + { + m_ctx = ctx; + } + + RenderContext * Command::renderContext() + { + return m_ctx; + } + Command::Command() : m_isDebugging(false) {} diff --git a/graphics/packets_queue.hpp b/graphics/packets_queue.hpp index 0ccf910195..ed4c6a4455 100644 --- a/graphics/packets_queue.hpp +++ b/graphics/packets_queue.hpp @@ -10,6 +10,8 @@ namespace graphics { + class RenderContext; + struct Command { private: @@ -17,11 +19,16 @@ namespace graphics bool m_isDebugging; string m_name; + RenderContext * m_ctx; + public: bool isDebugging() const; void setIsDebugging(bool flag); + void setRenderContext(RenderContext * ctx); + RenderContext * renderContext(); + Command(); virtual ~Command(); diff --git a/map/basic_tiling_render_policy.cpp b/map/basic_tiling_render_policy.cpp index 9c6cc8c2c9..2ad427cc1a 100644 --- a/map/basic_tiling_render_policy.cpp +++ b/map/basic_tiling_render_policy.cpp @@ -48,7 +48,7 @@ BasicTilingRenderPolicy::BasicTilingRenderPolicy(Params const & p, LOG(LINFO, ("ScreenSize=", p.m_screenWidth, "x", p.m_screenHeight, ", TileSize=", m_TileSize)); if (doUseQueuedRenderer) - m_QueuedRenderer.reset(new QueuedRenderer(GetPlatform().CpuCores() + 1)); + m_QueuedRenderer.reset(new QueuedRenderer(GetPlatform().CpuCores() + 1, p.m_primaryRC)); } void BasicTilingRenderPolicy::BeginFrame(shared_ptr const & e, ScreenBase const & s) diff --git a/map/queued_renderer.cpp b/map/queued_renderer.cpp index 9134347ba3..e1a43dec25 100644 --- a/map/queued_renderer.cpp +++ b/map/queued_renderer.cpp @@ -2,7 +2,8 @@ #include "../graphics/opengl/opengl.hpp" -QueuedRenderer::QueuedRenderer(int pipelinesCount) +QueuedRenderer::QueuedRenderer(int pipelinesCount, + shared_ptr const & rc) { m_Pipelines = new PacketsPipeline[pipelinesCount]; for (int i = 0; i < pipelinesCount; ++i) @@ -10,6 +11,7 @@ QueuedRenderer::QueuedRenderer(int pipelinesCount) m_PipelinesCount = pipelinesCount; m_CurrentPipeline = 0; m_ProcessSinglePipelineAtFrame = false; + m_RenderContext = rc; } QueuedRenderer::~QueuedRenderer() @@ -99,7 +101,10 @@ bool QueuedRenderer::RenderQueuedCommands(int pipelineNum) { it = m_Pipelines[pipelineNum].m_FrameCommands.begin(); if (it->m_command) + { + it->m_command->setRenderContext(m_RenderContext.get()); it->m_command->setIsDebugging(m_IsDebugging); + } if (bucketType == graphics::Packet::ECancelPoint) { diff --git a/map/queued_renderer.hpp b/map/queued_renderer.hpp index 0e7306a950..27692f6841 100644 --- a/map/queued_renderer.hpp +++ b/map/queued_renderer.hpp @@ -3,6 +3,11 @@ #include "../base/threaded_list.hpp" #include "../graphics/opengl/renderer.hpp" +namespace graphics +{ + class RenderContext; +} + /// Mixture-class for rendering policies, used on the /// devices that do not support OpenGL context sharing class QueuedRenderer @@ -45,9 +50,11 @@ private: bool m_IsDebugging; + shared_ptr m_RenderContext; + public: - QueuedRenderer(int pipelinesCount); + QueuedRenderer(int pipelinesCount, shared_ptr const & rc); ~QueuedRenderer(); void CopyQueuedCommands(list & l, list & r);