- Timestamp:
- 07/13/16 19:54:34 (9 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/core/transform.hh
r486 r506 34 34 const vec3& get_position() const { return m_position; } 35 35 const quat& get_orientation() const { return m_orientation; } 36 bool is_identity() const 37 { 38 return m_position == vec3() && m_orientation == quat(); 39 } 36 40 37 41 public: -
trunk/nv/engine/mesh_manager.hh
r505 r506 24 24 { 25 25 26 enum shader_ type26 enum shader_geo 27 27 { 28 28 NORMAL = 0, … … 34 34 vertex_array va; 35 35 uint32 count; 36 shader_ typeshader;36 shader_geo shader; 37 37 }; 38 38 -
trunk/nv/gl/gl_device.hh
r501 r506 28 28 }; 29 29 30 struct gl_shader_info : public shader_info 31 { 32 unsigned glid; 33 unsigned ref; 34 }; 35 30 36 struct gl_program_info : public program_info 31 37 { 32 38 unsigned glid; 33 unsigned glidv;34 unsigned glidf;39 shader vertex; 40 shader fragment; 35 41 bool validated; 36 42 }; … … 45 51 virtual image_data* create_image_data( const uint8* data, uint32 size ); // temporary 46 52 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 ); 48 55 virtual texture create_texture( texture_type type, pixel_format format ); 49 56 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 ); 50 60 51 61 virtual void release( buffer b ); 52 62 virtual void release( texture t ); 53 63 virtual void release( program p ); 64 virtual void release( shader s ); 54 65 virtual const texture_info* get_texture_info( texture t ) const; 55 66 virtual const buffer_info* get_buffer_info( buffer t ) const; … … 68 79 69 80 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 ); 71 82 bool compile( uint32 sh_type, string_view shader_code, unsigned& glid ); 72 83 void update_uniforms( gl_program_info* p ); … … 77 88 handle_store< gl_texture_info, texture > m_textures; 78 89 handle_store< gl_buffer_info, buffer > m_buffers; 90 handle_store< gl_shader_info, shader > m_shaders; 79 91 handle_store< gl_program_info, program > m_programs; 80 92 }; -
trunk/nv/gl/gl_enum.hh
r503 r506 42 42 unsigned int framebuffer_slot_to_enum( framebuffer_slot slot ); 43 43 unsigned int output_slot_to_enum( output_slot slot ); 44 unsigned int shader_type_to_enum( shader_type type ); 44 45 45 46 unsigned int buffer_access_to_bitfield( buffer_access type ); -
trunk/nv/interface/context.hh
r505 r506 164 164 virtual texture create_texture( texture_type type, pixel_format format ) { return m_device->create_texture( type, format ); } 165 165 // TODO: remove? 166 virtualtexture 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 ) 167 167 { 168 168 return create_texture( TEXTURE_2D, size, aformat, asampler, data ); 169 169 } 170 virtualtexture create_texture( const image_data* data, sampler asampler )170 texture create_texture( const image_data* data, sampler asampler ) 171 171 { 172 172 return create_texture( data->get_size(), data->get_format(), asampler, data->get_data() ); 173 173 } 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 } 177 184 virtual buffer create_buffer( buffer_type type, buffer_hint hint, size_t size, const void* source = nullptr ) = 0; 178 185 virtual void create_buffer( buffer, size_t, const void* = nullptr ) = 0; -
trunk/nv/interface/device.hh
r501 r506 25 25 { 26 26 class window; 27 28 enum shader_type 29 { 30 VERTEX_SHADER, 31 FRAGMENT_SHADER 32 }; 27 33 28 34 enum output_slot … … 95 101 struct texture_tag {}; 96 102 struct buffer_tag {}; 103 struct shader_tag {}; 97 104 struct program_tag {}; 98 105 99 106 typedef handle< uint32, 16, 16, buffer_tag > buffer; 100 107 typedef handle< uint32, 16, 16, texture_tag > texture; 108 typedef handle< uint32, 16, 16, shader_tag > shader; 101 109 typedef handle< uint32, 16, 16, program_tag > program; 102 110 103 111 NV_RTTI_DECLARE_NAME( buffer, "buffer" ) 104 112 NV_RTTI_DECLARE_NAME( texture, "texture" ) 113 NV_RTTI_DECLARE_NAME( shader, "shader" ) 105 114 NV_RTTI_DECLARE_NAME( program, "program" ) 106 115 … … 184 193 }; 185 194 195 struct shader_info 196 { 197 shader_type type; 198 }; 199 186 200 struct program_info 187 201 { … … 200 214 } 201 215 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; 203 219 virtual buffer create_buffer( buffer_type type, buffer_hint hint ) = 0; 204 220 virtual texture create_texture( texture_type type, pixel_format format ) = 0; … … 206 222 // TODO: remove? 207 223 // 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; 208 226 209 227 virtual void release( texture ) = 0; 210 228 virtual void release( buffer ) = 0; 211 229 virtual void release( program ) = 0; 230 virtual void release( shader ) = 0; 212 231 public: 213 232 -
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 -
trunk/src/gl/gl_enum.cc
r503 r506 319 319 } 320 320 321 322 unsigned 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 } 321 331 322 332 unsigned int nv::buffer_access_to_bitfield( buffer_access type )
Note: See TracChangeset
for help on using the changeset viewer.