mirror of https://github.com/stella-emu/stella.git
A few more fixes for some OpenGL crashes. The allocation/deallocation
of FBSurfaces should belong solely to FrameBuffer, so that different parts of the code don't try to delete what they don't own. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1561 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
203cdaf323
commit
9aa6eb820c
|
@ -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.113 2008-12-12 15:51:06 stephena Exp $
|
||||
// $Id: FrameBufferGL.cxx,v 1.114 2008-12-12 18:32:53 stephena Exp $
|
||||
//============================================================================
|
||||
|
||||
#ifdef DISPLAY_OPENGL
|
||||
|
@ -352,9 +352,14 @@ cerr << "dimensions: " << endl
|
|||
<< " imageh = " << mode.image_h << endl
|
||||
<< endl;
|
||||
|
||||
delete myBaseSurface;
|
||||
myBaseSurface = new FBSurfaceGL(*this, baseWidth, baseHeight,
|
||||
mode.image_w, mode.image_h);
|
||||
if(1)//!inUIMode)
|
||||
{
|
||||
delete myBaseSurface;
|
||||
myBaseSurface = new FBSurfaceGL(*this, baseWidth, baseHeight,
|
||||
mode.image_w, mode.image_h);
|
||||
|
||||
}
|
||||
// myOSystem->setUIPalette();
|
||||
|
||||
// Old textures currently in use by various UI items need to be
|
||||
// refreshed as well (only seems to be required for OSX)
|
||||
|
@ -539,7 +544,7 @@ FBSurfaceGL::FBSurfaceGL(FrameBufferGL& buffer,
|
|||
myWidth(scaleWidth),
|
||||
myHeight(scaleHeight)
|
||||
{
|
||||
cerr << " FBSurfaceGL::FBSurfaceGL: w = " << baseWidth << ", h = " << baseHeight << endl;
|
||||
cerr << " FBSurfaceGL::FBSurfaceGL: w = " << baseWidth << ", h = " << baseHeight << " : " << this << endl;
|
||||
|
||||
// Fill buffer struct with valid data
|
||||
// This changes depending on the texturing used
|
||||
|
|
|
@ -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.143 2008-12-12 15:51:07 stephena Exp $
|
||||
// $Id: FrameBuffer.cxx,v 1.144 2008-12-12 18:32:53 stephena Exp $
|
||||
//============================================================================
|
||||
|
||||
#include <algorithm>
|
||||
|
@ -57,8 +57,13 @@ FrameBuffer::FrameBuffer(OSystem* osystem)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
FrameBuffer::~FrameBuffer(void)
|
||||
{
|
||||
freeSurface(myMsg.surfaceID);
|
||||
freeSurface(myStatsMsg.surfaceID);
|
||||
// Free all allocated surfaces
|
||||
while(!mySurfaceList.empty())
|
||||
{
|
||||
cerr << " delete id = " << (*mySurfaceList.begin()).first << ", " << (*mySurfaceList.begin()).second << endl;
|
||||
delete (*mySurfaceList.begin()).second;
|
||||
mySurfaceList.erase(mySurfaceList.begin());
|
||||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -395,22 +400,6 @@ int FrameBuffer::allocateSurface(int w, int h, bool useBase)
|
|||
return mySurfaceCount - 1;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
int FrameBuffer::freeSurface(int id)
|
||||
{
|
||||
// Really delete the surface this time
|
||||
// That means actually deleting the FBSurface object, and removing it
|
||||
// from the list
|
||||
map<int,FBSurface*>::iterator iter = mySurfaceList.find(id);
|
||||
if(iter != mySurfaceList.end())
|
||||
{
|
||||
cerr << " delete id = " << iter->first << ", " << iter->second << endl;
|
||||
delete iter->second;
|
||||
mySurfaceList.erase(iter);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
FBSurface* FrameBuffer::surface(int id) const
|
||||
{
|
||||
|
|
|
@ -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.105 2008-12-12 15:51:07 stephena Exp $
|
||||
// $Id: FrameBuffer.hxx,v 1.106 2008-12-12 18:32:53 stephena Exp $
|
||||
//============================================================================
|
||||
|
||||
#ifndef FRAMEBUFFER_HXX
|
||||
|
@ -91,7 +91,7 @@ enum {
|
|||
turn drawn here as well.
|
||||
|
||||
@author Stephen Anthony
|
||||
@version $Id: FrameBuffer.hxx,v 1.105 2008-12-12 15:51:07 stephena Exp $
|
||||
@version $Id: FrameBuffer.hxx,v 1.106 2008-12-12 18:32:53 stephena Exp $
|
||||
*/
|
||||
class FrameBuffer
|
||||
{
|
||||
|
@ -152,7 +152,9 @@ class FrameBuffer
|
|||
void enableMessages(bool enable);
|
||||
|
||||
/**
|
||||
Allocate a new surface with a unique ID.
|
||||
Allocate a new surface with a unique ID. The FrameBuffer class takes
|
||||
all responsibility for freeing this surface (ie, other classes must not
|
||||
delete it directly).
|
||||
|
||||
@param w The requested width of the new surface.
|
||||
@param h The requested height of the new surface.
|
||||
|
@ -162,16 +164,6 @@ class FrameBuffer
|
|||
*/
|
||||
int allocateSurface(int w, int h, bool useBase = false);
|
||||
|
||||
/**
|
||||
De-allocate a previously allocated surface. Other classes should
|
||||
call this method when a surface is no longer needed; it shouldn't
|
||||
try to manually delete the surface object.
|
||||
|
||||
@param id The ID for the surface to de-allocate.
|
||||
@return The ID indicating a non-existent surface (-1).
|
||||
*/
|
||||
int freeSurface(int id);
|
||||
|
||||
/**
|
||||
Retrieve the surface associated with the given ID.
|
||||
|
||||
|
@ -557,7 +549,7 @@ class FrameBuffer
|
|||
FrameBuffer type.
|
||||
|
||||
@author Stephen Anthony
|
||||
@version $Id: FrameBuffer.hxx,v 1.105 2008-12-12 15:51:07 stephena Exp $
|
||||
@version $Id: FrameBuffer.hxx,v 1.106 2008-12-12 18:32:53 stephena Exp $
|
||||
*/
|
||||
// Text alignment modes for drawString()
|
||||
enum TextAlignment {
|
||||
|
|
|
@ -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: OSystem.cxx,v 1.131 2008-05-30 19:07:55 stephena Exp $
|
||||
// $Id: OSystem.cxx,v 1.132 2008-12-12 18:32:53 stephena Exp $
|
||||
//============================================================================
|
||||
|
||||
#include <cassert>
|
||||
|
@ -347,9 +347,6 @@ bool OSystem::createFrameBuffer(bool showmessage)
|
|||
// Let the system know that we've possibly resized the display
|
||||
if(changeBuffer) myEventHandler->handleResizeEvent();
|
||||
|
||||
// Update the UI palette
|
||||
setUIPalette();
|
||||
|
||||
if(showmessage)
|
||||
{
|
||||
switch(myFrameBuffer->type())
|
||||
|
|
|
@ -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: Dialog.cxx,v 1.65 2008-12-12 15:51:07 stephena Exp $
|
||||
// $Id: Dialog.cxx,v 1.66 2008-12-12 18:32:53 stephena Exp $
|
||||
//
|
||||
// Based on code from ScummVM - Scumm Interpreter
|
||||
// Copyright (C) 2002-2004 The ScummVM project
|
||||
|
@ -62,9 +62,6 @@ Dialog::~Dialog()
|
|||
_firstWidget = NULL;
|
||||
|
||||
_ourButtonGroup.clear();
|
||||
|
||||
_surfaceID = instance().frameBuffer().freeSurface(_surfaceID);
|
||||
_surface = NULL;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -89,25 +86,14 @@ void Dialog::open()
|
|||
}
|
||||
else if((uInt32)_w > _surface->getWidth() || (uInt32)_h > _surface->getHeight())
|
||||
{
|
||||
cerr << "!!!! surface is too small !!!!" << endl;
|
||||
/*
|
||||
_surfaceID = instance().frameBuffer().freeSurface(_surfaceID);
|
||||
_surfaceID = instance().frameBuffer().allocateSurface(_w, _h, _isBase);
|
||||
_surface = instance().frameBuffer().surface(_surfaceID);
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
_surface->setWidth(_w);
|
||||
_surface->setHeight(_h);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
if(_surface == NULL)
|
||||
_surface = instance().frameBuffer().createSurface(_w, _h, _isBase);
|
||||
else if((uInt32)_w > _surface->getWidth() || (uInt32)_h > _surface->getHeight())
|
||||
{
|
||||
delete _surface;
|
||||
_surface = instance().frameBuffer().createSurface(_w, _h, _isBase);
|
||||
}
|
||||
else
|
||||
{
|
||||
_surface->setWidth(_w);
|
||||
|
@ -115,6 +101,7 @@ void Dialog::open()
|
|||
}
|
||||
*/
|
||||
|
||||
instance().setUIPalette();
|
||||
|
||||
center();
|
||||
|
||||
|
|
Loading…
Reference in New Issue