Changeset 506 for trunk/src/gl


Ignore:
Timestamp:
07/13/16 19:54:34 (9 years ago)
Author:
epyon
Message:
  • split shader objects from programs to allow separate compilation
  • minor additions
Location:
trunk/src/gl
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gl/gl_device.cc

    r505 r506  
    2222        for ( auto& i : get_link_uniform_factory() )
    2323                m_shader_header.append( "uniform sampler2D "+i.first +";\n" );
    24 }
    25 
    26 program gl_device::create_program( string_view vs_source, string_view fs_source )
    27 {
    28         program result = m_programs.create();
    29         gl_program_info* info = m_programs.get( result );
    30 
    31         info->m_attribute_map   = new attribute_map;
    32         info->m_engine_uniforms = new engine_uniform_list;
    33         info->m_uniform_map     = new uniform_map;
    34 
    35         info->glid = glCreateProgram();
    36         info->validated = false;
    37         compile( info, vs_source, fs_source );
    38         prepare_program( result );
    39         return result;
    4024}
    4125
     
    9276        while ( m_programs.size() > 0 )
    9377                release( m_programs.get_handle(0) );
     78        while ( m_shaders.size() > 0 )
     79                release( m_shaders.get_handle( 0 ) );
     80}
     81
     82nv::shader nv::gl_device::create_shader( shader_type type, string_view sh_source )
     83{
     84        uint32 glid = 0;
     85        if ( !compile( shader_type_to_enum( type ), sh_source, glid ) )
     86                return shader();
     87
     88        shader result = m_shaders.create();
     89        gl_shader_info* info = m_shaders.get( result );
     90        info->type = type;
     91        info->glid = glid;
     92        info->ref  = 0;
     93
     94        return result;
     95}
     96
     97nv::program nv::gl_device::create_program( shader vs, shader fs )
     98{
     99        program result = m_programs.create();
     100        gl_program_info* info = m_programs.get( result );
     101
     102        info->m_attribute_map = new attribute_map;
     103        info->m_engine_uniforms = new engine_uniform_list;
     104        info->m_uniform_map = new uniform_map;
     105
     106        info->glid = glCreateProgram();
     107        info->validated = false;
     108
     109        compile( result, vs, fs );
     110        prepare_program( result );
     111        return result;
     112
    94113}
    95114
     
    156175}
    157176
     177void nv::gl_device::attach( program p, shader s )
     178{
     179        gl_program_info* pinfo = m_programs.get( p );
     180        gl_shader_info*  sinfo = m_shaders.get( s );
     181
     182        if ( sinfo && pinfo )
     183        {
     184                glAttachShader( pinfo->glid, sinfo->glid );
     185                sinfo->ref++;
     186        }
     187
     188}
     189
     190void nv::gl_device::detach( program p, shader s )
     191{
     192        gl_program_info* pinfo = m_programs.get( p );
     193        gl_shader_info*  sinfo = m_shaders.get( s );
     194        if ( sinfo && pinfo )
     195        {
     196                glDetachShader( pinfo->glid, sinfo->glid );
     197                sinfo->ref--;
     198        }
     199}
    158200const buffer_info* nv::gl_device::get_buffer_info( buffer t ) const
    159201{
     
    169211                        delete i.second;
    170212
    171                 glDetachShader( info->glid, info->glidv );
    172                 glDetachShader( info->glid, info->glidf );
    173                 glDeleteShader( info->glidv );
    174                 glDeleteShader( info->glidf );
     213                detach( p, info->vertex );
     214                detach( p, info->fragment );
    175215                glDeleteProgram( info->glid );
    176216
     
    182222        }
    183223}
     224
     225void nv::gl_device::release( shader s )
     226{
     227        gl_shader_info* info = m_shaders.get( s );
     228        if ( info && info->ref == 0 )
     229        {
     230                glDeleteShader( info->glid );
     231                m_shaders.destroy( s );
     232        }
     233}
     234
    184235
    185236nv::gl_texture_info* nv::gl_device::get_full_texture_info( texture t )
     
    285336}
    286337
    287 bool nv::gl_device::compile( gl_program_info* p, string_view vertex_program, string_view fragment_program )
    288 {
    289         if (!compile( GL_VERTEX_SHADER,   vertex_program, p->glidv ))   { return false; }
    290         if (!compile( GL_FRAGMENT_SHADER, fragment_program, p->glidf )) { return false; }
     338bool nv::gl_device::compile( program pp, shader vp, shader fp )
     339{
     340        gl_program_info* p = m_programs.get( pp );
     341        p->vertex = vp;
     342        p->fragment = fp;
    291343
    292344        glBindAttribLocation( p->glid, static_cast<GLuint>( slot::POSITION   ), "nv_position"  );
     
    298350        glBindAttribLocation( p->glid, static_cast<GLuint>( slot::BONEWEIGHT ), "nv_boneweight");
    299351
    300         glAttachShader( p->glid, p->glidf );
    301         glAttachShader( p->glid, p->glidv );
     352        attach( pp, p->vertex );
     353        attach( pp, p->fragment );
    302354        glLinkProgram( p->glid );
    303355
  • trunk/src/gl/gl_enum.cc

    r503 r506  
    319319}
    320320
     321
     322unsigned int nv::shader_type_to_enum( shader_type type )
     323{
     324        switch ( type )
     325        {
     326        case VERTEX_SHADER:   return GL_VERTEX_SHADER;
     327        case FRAGMENT_SHADER: return GL_FRAGMENT_SHADER;
     328                NV_RETURN_COVERED_DEFAULT( 0 );
     329        }
     330}
    321331
    322332unsigned int nv::buffer_access_to_bitfield( buffer_access type )
Note: See TracChangeset for help on using the changeset viewer.