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
File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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        }
Note: See TracChangeset for help on using the changeset viewer.