diff --git a/stella/src/common/FrameBufferGL.cxx b/stella/src/common/FrameBufferGL.cxx index bddf54b6f..188bff154 100644 --- a/stella/src/common/FrameBufferGL.cxx +++ b/stella/src/common/FrameBufferGL.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferGL.cxx,v 1.119 2008-12-18 23:36:32 stephena Exp $ +// $Id: FrameBufferGL.cxx,v 1.120 2008-12-20 23:32:45 stephena Exp $ //============================================================================ #ifdef DISPLAY_OPENGL @@ -361,19 +361,28 @@ cerr << "dimensions: " << endl << " imageh = " << mode.image_h << endl << endl; + //////////////////////////////////////////////////////////////////// + // Note that the following must be done in the order given + // Basically, all surfaces must first be free'd before being + // recreated + // So, we delete the TIA surface first, then reset all other surfaces + // (which frees all surfaces and then reloads all surfaces), then + // re-create the TIA surface (if necessary) + // In this way, all free()'s come before all reload()'s + //////////////////////////////////////////////////////////////////// + // The framebuffer only takes responsibility for TIA surfaces // Other surfaces (such as the ones used for dialogs) are allocated // in the Dialog class - if(!inUIMode) - { - delete myTiaSurface; - myTiaSurface = new FBSurfaceGL(*this, baseWidth, baseHeight, - mode.image_w, mode.image_h); - } + delete myTiaSurface; myTiaSurface = NULL; // Any previously allocated textures currently in use by various UI items // need to be refreshed as well (only seems to be required for OSX) - reloadSurfaces(); + resetSurfaces(); + + if(!inUIMode) + myTiaSurface = new FBSurfaceGL(*this, baseWidth, baseHeight, + mode.image_w, mode.image_h); // Make sure any old parts of the screen are erased p_glClear(GL_COLOR_BUFFER_BIT); @@ -603,7 +612,7 @@ cerr << " FBSurfaceGL::~FBSurfaceGL(): myTexID = " << myTexID << " @ " << this if(myTexture) SDL_FreeSurface(myTexture); - p_glDeleteTextures(1, &myTexID); + free(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -787,6 +796,14 @@ void FBSurfaceGL::update() } } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void FBSurfaceGL::free() +{ + p_glDeleteTextures(1, &myTexID); + +cerr << " ==> FBSurfaceGL::free(): myTexID = " << myTexID << " @ " << this << endl; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FBSurfaceGL::reload() { @@ -813,8 +830,6 @@ void FBSurfaceGL::reload() myFilterParamName = "GL_NEAREST"; } */ - -// p_glDeleteTextures(1, &myTexID); p_glGenTextures(1, &myTexID); p_glBindTexture(myTexTarget, myTexID); p_glTexParameteri(myTexTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); diff --git a/stella/src/common/FrameBufferGL.hxx b/stella/src/common/FrameBufferGL.hxx index 41119780e..e2dbaa8c6 100644 --- a/stella/src/common/FrameBufferGL.hxx +++ b/stella/src/common/FrameBufferGL.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferGL.hxx,v 1.62 2008-12-14 21:44:06 stephena Exp $ +// $Id: FrameBufferGL.hxx,v 1.63 2008-12-20 23:32:46 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_GL_HXX @@ -35,7 +35,7 @@ class FBSurfaceGL; This class implements an SDL OpenGL framebuffer. @author Stephen Anthony - @version $Id: FrameBufferGL.hxx,v 1.62 2008-12-14 21:44:06 stephena Exp $ + @version $Id: FrameBufferGL.hxx,v 1.63 2008-12-20 23:32:46 stephena Exp $ */ class FrameBufferGL : public FrameBuffer { @@ -206,7 +206,7 @@ class FrameBufferGL : public FrameBuffer A surface suitable for OpenGL rendering mode. @author Stephen Anthony - @version $Id: FrameBufferGL.hxx,v 1.62 2008-12-14 21:44:06 stephena Exp $ + @version $Id: FrameBufferGL.hxx,v 1.63 2008-12-20 23:32:46 stephena Exp $ */ class FBSurfaceGL : public FBSurface { @@ -232,6 +232,7 @@ class FBSurfaceGL : public FBSurface void setHeight(uInt32 h); void translateCoords(Int32& x, Int32& y) const; void update(); + void free(); void reload(); private: diff --git a/stella/src/common/FrameBufferSoft.hxx b/stella/src/common/FrameBufferSoft.hxx index 9a5eca6ca..601841a50 100644 --- a/stella/src/common/FrameBufferSoft.hxx +++ b/stella/src/common/FrameBufferSoft.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferSoft.hxx,v 1.56 2008-12-12 15:51:06 stephena Exp $ +// $Id: FrameBufferSoft.hxx,v 1.57 2008-12-20 23:32:46 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_SOFT_HXX @@ -32,7 +32,7 @@ class RectList; This class implements an SDL software framebuffer. @author Stephen Anthony - @version $Id: FrameBufferSoft.hxx,v 1.56 2008-12-12 15:51:06 stephena Exp $ + @version $Id: FrameBufferSoft.hxx,v 1.57 2008-12-20 23:32:46 stephena Exp $ */ class FrameBufferSoft : public FrameBuffer { @@ -172,7 +172,7 @@ class FrameBufferSoft : public FrameBuffer A surface suitable for software rendering mode. @author Stephen Anthony - @version $Id: FrameBufferSoft.hxx,v 1.56 2008-12-12 15:51:06 stephena Exp $ + @version $Id: FrameBufferSoft.hxx,v 1.57 2008-12-20 23:32:46 stephena Exp $ */ class FBSurfaceSoft : public FBSurface { @@ -195,6 +195,7 @@ class FBSurfaceSoft : public FBSurface void setHeight(uInt32 h); void translateCoords(Int32& x, Int32& y) const; void update(); + void free() { } // Not required for software mode void reload() { } // Not required for software mode private: diff --git a/stella/src/debugger/gui/TiaOutputWidget.cxx b/stella/src/debugger/gui/TiaOutputWidget.cxx index ec31a7546..682f805fa 100644 --- a/stella/src/debugger/gui/TiaOutputWidget.cxx +++ b/stella/src/debugger/gui/TiaOutputWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: TiaOutputWidget.cxx,v 1.18 2008-07-25 12:41:41 stephena Exp $ +// $Id: TiaOutputWidget.cxx,v 1.19 2008-12-20 23:32:46 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -143,6 +143,7 @@ void TiaOutputWidget::handleCommand(CommandSender* sender, int cmd, int data, in // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void TiaOutputWidget::drawWidget(bool hilite) { +return; // FIXME - check if we're in 'greyed out mode' and act accordingly instance().frameBuffer().refresh(); instance().frameBuffer().drawMediaSource(); diff --git a/stella/src/emucore/FrameBuffer.cxx b/stella/src/emucore/FrameBuffer.cxx index fd1433ebc..d76ad8025 100644 --- a/stella/src/emucore/FrameBuffer.cxx +++ b/stella/src/emucore/FrameBuffer.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBuffer.cxx,v 1.144 2008-12-12 18:32:53 stephena Exp $ +// $Id: FrameBuffer.cxx,v 1.145 2008-12-20 23:32:46 stephena Exp $ //============================================================================ #include @@ -408,9 +408,17 @@ FBSurface* FrameBuffer::surface(int id) const } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void FrameBuffer::reloadSurfaces() +void FrameBuffer::resetSurfaces() { + // Free all resources for each surface, then reload them + // Due to possible timing and/or synchronization issues, all free()'s + // are done first, then all reload()'s + // Any derived FrameBuffer classes that call this method should be + // aware of these restrictions, and act accordingly + map::iterator iter; + for(iter = mySurfaceList.begin(); iter != mySurfaceList.end(); ++iter) + iter->second->free(); for(iter = mySurfaceList.begin(); iter != mySurfaceList.end(); ++iter) iter->second->reload(); } diff --git a/stella/src/emucore/FrameBuffer.hxx b/stella/src/emucore/FrameBuffer.hxx index 85131a511..4f49ac423 100644 --- a/stella/src/emucore/FrameBuffer.hxx +++ b/stella/src/emucore/FrameBuffer.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBuffer.hxx,v 1.106 2008-12-12 18:32:53 stephena Exp $ +// $Id: FrameBuffer.hxx,v 1.107 2008-12-20 23:32:46 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_HXX @@ -91,7 +91,7 @@ enum { turn drawn here as well. @author Stephen Anthony - @version $Id: FrameBuffer.hxx,v 1.106 2008-12-12 18:32:53 stephena Exp $ + @version $Id: FrameBuffer.hxx,v 1.107 2008-12-20 23:32:46 stephena Exp $ */ class FrameBuffer { @@ -387,10 +387,10 @@ class FrameBuffer virtual string about() const = 0; /** - Issues the 'reload' instruction to all surfaces that the + Issues a 'free' and 'reload' instruction to all surfaces that the framebuffer knows about. */ - void reloadSurfaces(); + void resetSurfaces(); protected: // The parent system for the framebuffer @@ -549,7 +549,7 @@ class FrameBuffer FrameBuffer type. @author Stephen Anthony - @version $Id: FrameBuffer.hxx,v 1.106 2008-12-12 18:32:53 stephena Exp $ + @version $Id: FrameBuffer.hxx,v 1.107 2008-12-20 23:32:46 stephena Exp $ */ // Text alignment modes for drawString() enum TextAlignment { @@ -683,8 +683,15 @@ class FBSurface */ virtual void update() = 0; + /** + This method should be called to free any resources being used by + the surface. + */ + virtual void free() = 0; + /** This method should be called to reload the surface data/state. + It will normally be called after free(). */ virtual void reload() = 0;