Changeset 506 for trunk


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
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/core/transform.hh

    r486 r506  
    3434                const vec3& get_position() const { return m_position; }
    3535                const quat& get_orientation() const { return m_orientation; }
     36                bool is_identity() const
     37                {
     38                        return m_position == vec3() && m_orientation == quat();
     39                }
    3640
    3741        public:
  • trunk/nv/engine/mesh_manager.hh

    r505 r506  
    2424{
    2525
    26         enum shader_type
     26        enum shader_geo
    2727        {
    2828                NORMAL = 0,
     
    3434                vertex_array va;
    3535                uint32       count;
    36                 shader_type  shader;
     36                shader_geo  shader;
    3737        };
    3838
  • trunk/nv/gl/gl_device.hh

    r501 r506  
    2828        };
    2929
     30        struct gl_shader_info : public shader_info
     31        {
     32                unsigned glid;
     33                unsigned ref;
     34        };
     35       
    3036        struct gl_program_info : public program_info
    3137        {
    3238                unsigned glid;
    33                 unsigned glidv;
    34                 unsigned glidf;
     39                shader vertex;
     40                shader fragment;
    3541                bool validated;
    3642        };
     
    4551                virtual image_data* create_image_data( const uint8* data, uint32 size ); // temporary
    4652
    47                 virtual program create_program( string_view vs_source, string_view fs_source );
     53                virtual shader create_shader( shader_type type, string_view sh_source );
     54                virtual program create_program( shader vs, shader fs );
    4855                virtual texture create_texture( texture_type type, pixel_format format );
    4956                virtual buffer create_buffer( buffer_type type, buffer_hint hint );
     57
     58                virtual void attach( program p, shader s );
     59                virtual void detach( program p, shader s );
    5060
    5161                virtual void release( buffer b );
    5262                virtual void release( texture t );
    5363                virtual void release( program p );
     64                virtual void release( shader s );
    5465                virtual const texture_info* get_texture_info( texture t ) const;
    5566                virtual const buffer_info* get_buffer_info( buffer t ) const;
     
    6879
    6980        private:
    70                 bool compile( gl_program_info* p, string_view vertex_program, string_view fragment_program );
     81                bool compile( program p, shader vp, shader fp );
    7182                bool compile( uint32 sh_type, string_view shader_code, unsigned& glid );
    7283                void update_uniforms( gl_program_info* p );
     
    7788                handle_store< gl_texture_info, texture >         m_textures;
    7889                handle_store< gl_buffer_info,  buffer >          m_buffers;
     90                handle_store< gl_shader_info, shader >           m_shaders;
    7991                handle_store< gl_program_info, program >         m_programs;
    8092        };
  • trunk/nv/gl/gl_enum.hh

    r503 r506  
    4242        unsigned int framebuffer_slot_to_enum( framebuffer_slot slot );
    4343        unsigned int output_slot_to_enum( output_slot slot );
     44        unsigned int shader_type_to_enum( shader_type type );
    4445
    4546        unsigned int buffer_access_to_bitfield( buffer_access type );
  • trunk/nv/interface/context.hh

    r505 r506  
    164164                virtual texture create_texture( texture_type type, pixel_format format ) { return m_device->create_texture( type, format ); }
    165165                // TODO: remove?
    166                 virtual texture create_texture( ivec2 size, image_format aformat, sampler asampler, const void* data = nullptr )
     166                texture create_texture( ivec2 size, image_format aformat, sampler asampler, const void* data = nullptr )
    167167                {
    168168                        return create_texture( TEXTURE_2D, size, aformat, asampler, data );
    169169                }
    170                 virtual texture create_texture( const image_data* data, sampler asampler )
     170                texture create_texture( const image_data* data, sampler asampler )
    171171                {
    172172                        return create_texture( data->get_size(), data->get_format(), asampler, data->get_data() );
    173173                }
    174 
    175 
    176                 virtual program create_program( string_view vs_source, string_view fs_source ) { return m_device->create_program( vs_source, fs_source ); }
     174                shader create_shader( shader_type type, string_view sh_source ) { return m_device->create_shader( type, sh_source ); }
     175                program create_program( shader vs, shader fs ) { return m_device->create_program( vs, fs ); }
     176                virtual program create_program( string_view vs_source, string_view fs_source )
     177                {
     178                        shader vs = create_shader( VERTEX_SHADER, vs_source );
     179                        if ( !vs ) return program();
     180                        shader fs = create_shader( FRAGMENT_SHADER, fs_source );
     181                        if ( !fs ) return program();
     182                        return create_program( vs, fs );
     183                }
    177184                virtual buffer create_buffer( buffer_type type, buffer_hint hint, size_t size, const void* source = nullptr ) = 0;
    178185                virtual void   create_buffer( buffer, size_t, const void* = nullptr ) = 0;
  • trunk/nv/interface/device.hh

    r501 r506  
    2525{
    2626        class window;
     27
     28        enum shader_type
     29        {
     30                VERTEX_SHADER,
     31                FRAGMENT_SHADER
     32        };
    2733
    2834        enum output_slot
     
    95101        struct texture_tag {};
    96102        struct buffer_tag {};
     103        struct shader_tag {};
    97104        struct program_tag {};
    98105
    99106        typedef handle< uint32, 16, 16, buffer_tag >       buffer;
    100107        typedef handle< uint32, 16, 16, texture_tag >      texture;
     108        typedef handle< uint32, 16, 16, shader_tag >       shader;
    101109        typedef handle< uint32, 16, 16, program_tag >      program;
    102110
    103111        NV_RTTI_DECLARE_NAME( buffer,  "buffer" )
    104112        NV_RTTI_DECLARE_NAME( texture, "texture" )
     113        NV_RTTI_DECLARE_NAME( shader,  "shader" )
    105114        NV_RTTI_DECLARE_NAME( program, "program" )
    106115
     
    184193        };
    185194
     195        struct shader_info
     196        {
     197                shader_type type;
     198        };
     199
    186200        struct program_info
    187201        {
     
    200214                }
    201215        protected:
    202                 virtual program create_program( string_view vs_source, string_view fs_source ) = 0;
     216                virtual shader create_shader( shader_type type, string_view sh_source ) = 0;
     217//              virtual program create_program( string_view vs_source, string_view fs_source ) = 0;
     218                virtual program create_program( shader vs, shader fs ) = 0;
    203219                virtual buffer  create_buffer( buffer_type type, buffer_hint hint ) = 0;
    204220                virtual texture create_texture( texture_type type, pixel_format format ) = 0;
     
    206222                // TODO: remove?
    207223//              virtual texture create_texture( ivec2 size, image_format aformat, sampler asampler, const void* data = nullptr ) { return create_texture( TEXTURE_2D, size, aformat, asampler, data ); }
     224                virtual void attach( program p, shader s ) = 0;
     225                virtual void detach( program p, shader s ) = 0;
    208226
    209227                virtual void release( texture ) = 0;
    210228                virtual void release( buffer ) = 0;
    211229                virtual void release( program ) = 0;
     230                virtual void release( shader ) = 0;
    212231        public:
    213232
  • 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.