mirror of
https://github.com/holub/mame
synced 2025-05-14 18:08:13 +03:00
Fix MT4161. The render_texture() object was doing work in its
destructor which was inappropriate, as textures are allocated and recycled via a fixed size allocator.
This commit is contained in:
parent
c00b57ae6d
commit
1fcd9aa6dc
@ -356,8 +356,19 @@ void render_primitive_list::append_or_return(render_primitive &prim, bool clippe
|
||||
//-------------------------------------------------
|
||||
|
||||
render_texture::render_texture()
|
||||
: m_manager(NULL),
|
||||
m_next(NULL),
|
||||
m_bitmap(NULL),
|
||||
m_palette(NULL),
|
||||
m_format(TEXFORMAT_ARGB32),
|
||||
m_scaler(NULL),
|
||||
m_param(NULL),
|
||||
m_curseq(0),
|
||||
m_bcglookup(NULL),
|
||||
m_bcglookup_entries(0)
|
||||
{
|
||||
// no initialization because we rely on reset() to do it
|
||||
m_sbounds.min_x = m_sbounds.min_y = m_sbounds.max_x = m_sbounds.max_y = 0;
|
||||
memset(m_scaled, 0, sizeof(m_scaled));
|
||||
}
|
||||
|
||||
|
||||
@ -367,22 +378,7 @@ render_texture::render_texture()
|
||||
|
||||
render_texture::~render_texture()
|
||||
{
|
||||
// free all scaled versions
|
||||
for (int scalenum = 0; scalenum < ARRAY_LENGTH(m_scaled); scalenum++)
|
||||
{
|
||||
m_manager->invalidate_all(m_scaled[scalenum].bitmap);
|
||||
auto_free(&m_manager->machine(), m_scaled[scalenum].bitmap);
|
||||
}
|
||||
|
||||
// invalidate references to the original bitmap as well
|
||||
m_manager->invalidate_all(m_bitmap);
|
||||
|
||||
// release palette references
|
||||
if (m_palette != NULL)
|
||||
palette_deref(m_palette);
|
||||
|
||||
// free any B/C/G lookup tables
|
||||
auto_free(&m_manager->machine(), m_bcglookup);
|
||||
release();
|
||||
}
|
||||
|
||||
|
||||
@ -394,13 +390,45 @@ render_texture::~render_texture()
|
||||
void render_texture::reset(render_manager &manager, texture_scaler_func scaler, void *param)
|
||||
{
|
||||
m_manager = &manager;
|
||||
memset(&m_next, 0, FPTR(&m_bcglookup_entries + 1) - FPTR(&m_next));
|
||||
m_format = TEXFORMAT_ARGB32;
|
||||
m_scaler = scaler;
|
||||
m_param = param;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// release - release resources when we are freed
|
||||
//-------------------------------------------------
|
||||
|
||||
void render_texture::release()
|
||||
{
|
||||
// free all scaled versions
|
||||
for (int scalenum = 0; scalenum < ARRAY_LENGTH(m_scaled); scalenum++)
|
||||
{
|
||||
m_manager->invalidate_all(m_scaled[scalenum].bitmap);
|
||||
auto_free(&m_manager->machine(), m_scaled[scalenum].bitmap);
|
||||
m_scaled[scalenum].bitmap = NULL;
|
||||
m_scaled[scalenum].seqid = 0;
|
||||
}
|
||||
|
||||
// invalidate references to the original bitmap as well
|
||||
m_manager->invalidate_all(m_bitmap);
|
||||
m_bitmap = NULL;
|
||||
m_sbounds.min_x = m_sbounds.min_y = m_sbounds.max_x = m_sbounds.max_y = 0;
|
||||
m_format = TEXFORMAT_ARGB32;
|
||||
m_curseq = 0;
|
||||
|
||||
// release palette references
|
||||
if (m_palette != NULL)
|
||||
palette_deref(m_palette);
|
||||
m_palette = NULL;
|
||||
|
||||
// free any B/C/G lookup tables
|
||||
auto_free(&m_manager->machine(), m_bcglookup);
|
||||
m_bcglookup = NULL;
|
||||
m_bcglookup_entries = 0;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// set_bitmap - set a new source bitmap
|
||||
//-------------------------------------------------
|
||||
@ -2580,7 +2608,10 @@ render_texture *render_manager::texture_alloc(texture_scaler_func scaler, void *
|
||||
void render_manager::texture_free(render_texture *texture)
|
||||
{
|
||||
if (texture != NULL)
|
||||
{
|
||||
m_live_textures--;
|
||||
texture->release();
|
||||
}
|
||||
m_texture_allocator.reclaim(texture);
|
||||
}
|
||||
|
||||
|
@ -417,6 +417,9 @@ class render_texture
|
||||
|
||||
// reset before re-use
|
||||
void reset(render_manager &manager, texture_scaler_func scaler = NULL, void *param = NULL);
|
||||
|
||||
// release resources when freed
|
||||
void release();
|
||||
|
||||
public:
|
||||
// getters
|
||||
|
Loading…
Reference in New Issue
Block a user