Changeset 506 for trunk/src/gl/gl_device.cc
- Timestamp:
- 07/13/16 19:54:34 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gl/gl_device.cc
r505 r506 22 22 for ( auto& i : get_link_uniform_factory() ) 23 23 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;40 24 } 41 25 … … 92 76 while ( m_programs.size() > 0 ) 93 77 release( m_programs.get_handle(0) ); 78 while ( m_shaders.size() > 0 ) 79 release( m_shaders.get_handle( 0 ) ); 80 } 81 82 nv::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 97 nv::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 94 113 } 95 114 … … 156 175 } 157 176 177 void 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 190 void 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 } 158 200 const buffer_info* nv::gl_device::get_buffer_info( buffer t ) const 159 201 { … … 169 211 delete i.second; 170 212 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 ); 175 215 glDeleteProgram( info->glid ); 176 216 … … 182 222 } 183 223 } 224 225 void 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 184 235 185 236 nv::gl_texture_info* nv::gl_device::get_full_texture_info( texture t ) … … 285 336 } 286 337 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; } 338 bool 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; 291 343 292 344 glBindAttribLocation( p->glid, static_cast<GLuint>( slot::POSITION ), "nv_position" ); … … 298 350 glBindAttribLocation( p->glid, static_cast<GLuint>( slot::BONEWEIGHT ), "nv_boneweight"); 299 351 300 glAttachShader( p->glid, p->glidf);301 glAttachShader( p->glid, p->glidv);352 attach( pp, p->vertex ); 353 attach( pp, p->fragment ); 302 354 glLinkProgram( p->glid ); 303 355
Note: See TracChangeset
for help on using the changeset viewer.