Changeset 543 for trunk/src/gl


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/gl
Files:
2 edited

Legend:

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