From 532053d3199176dd94422591765720c888a2e3c1 Mon Sep 17 00:00:00 2001 From: auria Date: Mon, 2 May 2011 01:39:23 +0000 Subject: [PATCH] Fix some RTT-related leaks git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@8503 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- src/graphics/irr_driver.cpp | 10 ++++++++-- src/graphics/irr_driver.hpp | 4 +++- src/guiengine/widgets/model_view_widget.cpp | 8 +++++++- src/guiengine/widgets/model_view_widget.hpp | 2 ++ src/states_screens/race_gui_base.cpp | 2 +- src/tracks/quad_graph.cpp | 2 +- 6 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index 7ea6b164d..8fe3ae54d 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -1354,10 +1354,13 @@ bool IrrDriver::OnEvent(const irr::SEvent &event) /** Begins a rendering to a texture. * \param dimension The size of the texture. * \param name Name of the texture. + * \param persistent_texture Whether the created RTT texture should persist in + * memory after the RTTProvider is deleted */ IrrDriver::RTTProvider::RTTProvider(const core::dimension2du &dimension, - const std::string &name) -{ + const std::string &name, bool persistent_texture) +{ + m_persistent_texture = persistent_texture; m_video_driver = irr_driver->getVideoDriver(); m_render_target_texture = m_video_driver->addRenderTargetTexture(dimension, @@ -1377,6 +1380,9 @@ IrrDriver::RTTProvider::RTTProvider(const core::dimension2du &dimension, IrrDriver::RTTProvider::~RTTProvider() { tearDownRTTScene(); + + if (!m_persistent_texture) + irr_driver->removeTexture(m_render_target_texture); } // ~RTTProvider // ---------------------------------------------------------------------------- diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index 7a674cafa..790d6dd3a 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -194,6 +194,8 @@ public: * in between beginRenderToTexture() and endRenderToTexture calls. */ video::ITexture *m_render_target_texture; + bool m_persistent_texture; + /** Main node of the RTT scene */ scene::ISceneNode *m_rtt_main_node; @@ -206,7 +208,7 @@ public: public: RTTProvider(const core::dimension2du &dimension, - const std::string &name); + const std::string &name, bool persistent_texture); ~RTTProvider(); diff --git a/src/guiengine/widgets/model_view_widget.cpp b/src/guiengine/widgets/model_view_widget.cpp index 5aa321e4a..8f6b70141 100644 --- a/src/guiengine/widgets/model_view_widget.cpp +++ b/src/guiengine/widgets/model_view_widget.cpp @@ -150,7 +150,7 @@ void ModelViewWidget::update(float delta) { std::string name = "model view "; name += m_properties[PROP_ID].c_str(); - m_rtt_provider = new IrrDriver::RTTProvider(core::dimension2d< u32 >(512, 512), name ); + m_rtt_provider = new IrrDriver::RTTProvider(core::dimension2d< u32 >(512, 512), name, false); m_rtt_provider->setupRTTScene(m_models, m_model_location, m_model_scale, m_model_frames); } @@ -184,3 +184,9 @@ void ModelViewWidget::setRotateTo(float targetAngle, float speed) m_rotation_target = targetAngle; } +void ModelViewWidget::elementRemoved() +{ + delete m_rtt_provider; + m_rtt_provider = NULL; + IconButtonWidget::elementRemoved(); +} diff --git a/src/guiengine/widgets/model_view_widget.hpp b/src/guiengine/widgets/model_view_widget.hpp index b2bf0eda1..c3f196254 100644 --- a/src/guiengine/widgets/model_view_widget.hpp +++ b/src/guiengine/widgets/model_view_widget.hpp @@ -71,6 +71,8 @@ namespace GUIEngine void update(float delta); + virtual void elementRemoved(); + /** Disables any model rotation */ void setRotateOff(); diff --git a/src/states_screens/race_gui_base.cpp b/src/states_screens/race_gui_base.cpp index a83538af7..a442e0140 100644 --- a/src/states_screens/race_gui_base.cpp +++ b/src/states_screens/race_gui_base.cpp @@ -83,7 +83,7 @@ void RaceGUIBase::createMarkerTexture() IrrDriver::RTTProvider rttProvider(core::dimension2du(m_marker_rendered_size *npower2, m_marker_rendered_size), - "RaceGUI::markers"); + "RaceGUI::markers", true); scene::ICameraSceneNode *camera = irr_driver->addCameraSceneNode(); core::matrix4 projection; projection.buildProjectionMatrixOrthoLH((float)(m_marker_rendered_size*npower2), diff --git a/src/tracks/quad_graph.cpp b/src/tracks/quad_graph.cpp index 40099a149..e7b1341aa 100644 --- a/src/tracks/quad_graph.cpp +++ b/src/tracks/quad_graph.cpp @@ -624,7 +624,7 @@ video::ITexture *QuadGraph::makeMiniMap(const core::dimension2du &dimension, const std::string &name, const video::SColor &fill_color) { - IrrDriver::RTTProvider rttProvider(dimension, name); + IrrDriver::RTTProvider rttProvider(dimension, name, true); video::SColor red(128, 255, 0, 0); createMesh(/*show_invisible part of the track*/ false, /*track_color*/ &fill_color,