Changeset 543 for trunk/src


Ignore:
Timestamp:
02/06/17 21:13:58 (8 years ago)
Author:
epyon
Message:
  • fixes in handle store
  • removal of get_handle
  • indices instead of handles
  • efficient handle store clears
Location:
trunk/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine/particle_engine.cc

    r534 r543  
    350350}
    351351
     352void nv::particle_engine::release( particle_system_info* info )
     353{
     354        if ( info )
     355        {
     356                m_pgm->unref( info->group );
     357                delete[] info->particles;
     358        }
     359}
     360
    352361void nv::particle_engine::clear()
    353362{
    354         while ( m_systems.size() > 0 )
    355                 release( m_systems.get_handle( 0 ) );
     363        for ( auto& s : m_systems )
     364                release( &s );
     365        m_systems.clear();
    356366        if ( m_pgm )
    357367                m_pgm->reset();
     
    363373void nv::particle_engine::release( particle_system system )
    364374{
    365         particle_system_info* info = m_systems.get( system );
    366         if ( info )
    367         {
    368                 m_pgm->unref( info->group );
    369                 delete[] info->particles;
     375        if ( particle_system_info* info = m_systems.get( system ) )
     376        {
     377                release( info );
    370378                m_systems.destroy( system );
    371379        }
  • trunk/src/engine/particle_group.cc

    r520 r543  
    3333void particle_group_manager::release( particle_group group )
    3434{
    35         particle_group_info* info = m_groups.get( group );
    36         if ( info )
    37         {
    38                 delete[] info->quads;
    39                 m_context->release( info->vtx_array );
     35        if ( particle_group_info* info = m_groups.get( group ) )
     36        {
     37                release( info );
    4038                m_groups.destroy( group );
    4139        }
     
    194192}
    195193
     194void nv::particle_group_manager::release( particle_group_info* info )
     195{
     196        if ( info )
     197        {
     198                delete[] info->quads;
     199                m_context->release( info->vtx_array );
     200        }
     201}
     202
    196203particle_group_manager::~particle_group_manager()
    197204{
     
    201208void particle_group_manager::clear()
    202209{
    203         while ( m_groups.size() > 0 )
    204                 release( m_groups.get_handle( 0 ) );
     210        for ( auto& g : m_groups )
     211                release( &g );
     212        m_groups.clear();
    205213}
    206214
  • trunk/src/fmod/fmod_audio.cc

    r406 r543  
    107107{
    108108        sound_info* info = m_sounds.get( a_sound );
     109        release( info );
     110        m_sounds.destroy( a_sound );
     111}
     112
     113void nv::fmod::audio::release( sound_info* info )
     114{
    109115        if ( info )
    110         {
    111116                FMOD_Sound_Release( static_cast<FMOD_SOUND*>( info->fmod_sound ) );
    112                 m_sounds.destroy( a_sound );
    113         }
    114117}
    115118
     
    146149fmod::audio::~audio()
    147150{
    148         while ( m_sounds.size() > 0 )
    149                 release( m_sounds.get_handle(0) );
     151        for ( auto& s : m_sounds )
     152                release( &s );
     153        m_sounds.clear();
    150154        FMOD_System_Release( static_cast<FMOD_SYSTEM*>( m_system ) );
    151155}
  • trunk/src/gl/gl_context.cc

    r535 r543  
    9797void nv::gl_context::release( vertex_array va )
    9898{
    99         gl_vertex_array_info* info = m_vertex_arrays.get( va );
     99        if ( gl_vertex_array_info* info = m_vertex_arrays.get( va ) )
     100        {
     101                release( info );
     102                m_vertex_arrays.destroy( va );
     103        }
     104}
     105
     106void nv::gl_context::release( gl_vertex_array_info* info )
     107{
    100108        if ( info )
    101109        {
    102110                for ( uint32 i = 0; i < info->count; ++i )
    103111                {
    104                         if ( info->attr[i].owner ) 
     112                        if ( info->attr[i].owner )
    105113                                release( info->attr[i].vbuffer );
    106114                }
    107                 if ( info->index.is_valid() && info->index_owner) release( info->index );
     115                if ( info->index.is_valid() && info->index_owner ) release( info->index );
    108116                glDeleteVertexArrays( 1, &info->glid );
    109                 m_vertex_arrays.destroy( va );
    110117        }
    111118}
     
    113120void nv::gl_context::release( framebuffer f )
    114121{
    115         gl_framebuffer_info* info = m_framebuffers.get( f );
     122        if ( gl_framebuffer_info* info = m_framebuffers.get( f ) )
     123        {
     124                release( info );
     125                m_framebuffers.destroy( f );
     126        }
     127}
     128
     129void nv::gl_context::release( gl_framebuffer_info* info )
     130{
    116131        if ( info )
    117132        {
     
    122137                        glDeleteRenderbuffers( 1, &info->depth_rb_glid );
    123138                glDeleteFramebuffers( 1, &info->glid );
    124                 m_framebuffers.destroy( f );
    125139        }
    126140}
     
    881895nv::gl_context::~gl_context()
    882896{
    883         while ( m_framebuffers.size() > 0 )
    884                 release( m_framebuffers.get_handle(0) );
    885         while ( m_vertex_arrays.size() > 0 )
    886                 release( m_vertex_arrays.get_handle(0) );
     897        for ( auto& info : m_framebuffers )
     898                release( &info );
     899        for ( auto& info : m_vertex_arrays )
     900                release( &info );
    887901}
    888902
  • trunk/src/gl/gl_device.cc

    r535 r543  
    6969gl_device::~gl_device()
    7070{
    71         while ( m_textures.size() > 0 )
    72                 release( m_textures.get_handle(0) );
    73         while ( m_buffers.size() > 0 )
    74                 release( m_buffers.get_handle(0) );
    75         while ( m_programs.size() > 0 )
    76                 release( m_programs.get_handle(0) );
    77         while ( m_shaders.size() > 0 )
    78                 release( m_shaders.get_handle( 0 ) );
     71        for ( auto& t : m_textures )
     72                release( &t );
     73        for ( auto& b : m_buffers )
     74                release( &b );
     75        for ( auto& p : m_programs )
     76                release( &p );
     77        for ( auto& s : m_shaders )
     78                release( &s );
    7979}
    8080
     
    131131void nv::gl_device::release( texture t )
    132132{
    133         gl_texture_info* info = m_textures.get( t );
    134         if ( info )
    135         {
    136                 if ( info->glid != 0 )
    137                 {
    138                         glDeleteTextures( 1, &(info->glid) );
    139                 }
     133        if ( auto info = m_textures.get( t ) )
     134        {
     135                release( info );
    140136                m_textures.destroy( t );
    141137        }
    142138}
    143139
     140void nv::gl_device::release( gl_shader_info* s )
     141{
     142        if ( s && s->ref == 0 && s->glid != 0 )
     143                glDeleteShader( s->glid );
     144}
     145
     146void nv::gl_device::release( gl_program_info* p )
     147{
     148        if ( p && p->glid != 0 )
     149        {
     150                for ( auto& i : *p->m_uniform_map )
     151                        delete i.second;
     152
     153                gl_shader_info* vi = m_shaders.get( p->vertex );
     154                gl_shader_info* fi = m_shaders.get( p->fragment );
     155                if ( vi )
     156                {
     157                        glDetachShader( p->glid, vi->glid );
     158                        vi->ref--;
     159                        release( vi );
     160                }
     161                if ( fi )
     162                {
     163                        glDetachShader( p->glid, fi->glid );
     164                        fi->ref--;
     165                        release( fi );
     166                }
     167                glDeleteProgram( p->glid );
     168
     169                delete p->m_attribute_map;
     170                delete p->m_engine_uniforms;
     171                delete p->m_uniform_map;
     172        }
     173
     174}
     175
     176void nv::gl_device::release( gl_texture_info* t )
     177{
     178        if ( t && t->glid != 0 )
     179                glDeleteTextures( 1, &( t->glid ) );
     180}
     181
     182void nv::gl_device::release( gl_buffer_info* b )
     183{
     184        if ( b && b->glid != 0 )
     185                glDeleteBuffers( 1, &( b->glid ) );
     186}
     187
    144188void nv::gl_device::release( buffer b )
    145189{
    146         gl_buffer_info* info = m_buffers.get( b );
    147         if ( info )
    148         {
    149                 if ( info->glid != 0 )
    150                 {
    151                         glDeleteBuffers( 1, &(info->glid) );
    152                 }
     190        if ( auto info = m_buffers.get( b ) )
     191        {
     192                release( info );
    153193                m_buffers.destroy( b );
    154194        }
     
    204244void nv::gl_device::release( program p )
    205245{
    206         gl_program_info* info = m_programs.get( p );
    207         if ( info )
    208         {
    209                 for ( auto& i : *info->m_uniform_map )
    210                         delete i.second;
    211 
    212                 detach( p, info->vertex );
    213                 detach( p, info->fragment );
    214                 glDeleteProgram( info->glid );
    215 
    216                 delete info->m_attribute_map;
    217                 delete info->m_engine_uniforms;
    218                 delete info->m_uniform_map;
    219 
     246        if ( auto info = m_programs.get( p ) )
     247        {
     248                release( info );
    220249                m_programs.destroy( p );
    221250        }
     
    224253void nv::gl_device::release( shader s )
    225254{
    226         gl_shader_info* info = m_shaders.get( s );
    227         if ( info && info->ref == 0 )
    228         {
    229                 glDeleteShader( info->glid );
     255        if ( auto info = m_shaders.get( s ) )
     256        {
     257                release( info );
    230258                m_shaders.destroy( s );
    231259        }
  • trunk/src/sdl/sdl_audio.cc

    r454 r543  
    111111nv::sdl::audio::~audio()
    112112{
    113         while ( m_sounds.size() > 0 )
    114                 release( m_sounds.get_handle(0) );
     113        for ( auto& s : m_sounds )
     114                release( &s );
    115115        Mix_CloseAudio();
    116116        // TODO: should we do it here?
     
    121121{
    122122        sound_info* info = m_sounds.get( a_sound );
     123        release( info );
     124        m_sounds.destroy( a_sound );
     125}
     126
     127void nv::sdl::audio::release( sound_info* info )
     128{
    123129        if ( info )
    124         {
    125130                Mix_FreeChunk( static_cast<Mix_Chunk*>( info->sdl_sound ) );
    126                 m_sounds.destroy( a_sound );
    127         }
    128131}
    129132
Note: See TracChangeset for help on using the changeset viewer.