Changeset 491 for trunk/src/gl/gl_context.cc
- Timestamp:
- 04/29/16 12:42:28 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gl/gl_context.cc
r487 r491 14 14 using namespace nv; 15 15 16 nv::vertex_array nv::gl_context::create_vertex_array( )16 nv::vertex_array nv::gl_context::create_vertex_array( const vertex_array_desc& desc ) 17 17 { 18 18 vertex_array result = m_vertex_arrays.create(); 19 vertex_array_info* info = m_vertex_arrays.get( result ); 20 info->count = 0; 21 info->index = buffer(); 22 info->index_owner = false; 23 info->index_type = USHORT; 19 gl_vertex_array_info* info = m_vertex_arrays.get( result ); 20 21 glGenVertexArrays( 1, &info->glid ); 22 info->count = desc.count; 23 info->index = desc.index; 24 info->index_owner = desc.index_owner; 25 info->index_type = desc.index_type; 26 27 for ( uint32 i = 0; i < desc.count; ++i ) 28 info->attr[i] = desc.attr[i]; 29 30 glBindVertexArray( info->glid ); 31 32 for ( uint32 i = 0; i < info->count; ++i ) 33 { 34 const vertex_buffer_attribute& vba = info->attr[i]; 35 uint32 location = static_cast<uint32>( vba.location ); 36 glEnableVertexAttribArray( location ); 37 const gl_buffer_info* vinfo = static_cast<const gl_buffer_info*>( m_device->get_buffer_info( vba.vbuffer ) ); 38 if ( vinfo && vinfo->type == VERTEX_BUFFER ) 39 glBindBuffer( GL_ARRAY_BUFFER, vinfo->glid ); 40 else 41 { 42 // TODO: report error 43 } 44 45 glVertexAttribPointer( 46 location, 47 static_cast<GLint>( vba.components ), 48 nv::datatype_to_gl_enum( vba.dtype ), 49 GL_FALSE, 50 static_cast<GLsizei>( vba.stride ), 51 reinterpret_cast<void*>( vba.offset ) 52 ); 53 } 54 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 55 56 if ( info->index.is_valid() ) 57 { 58 const gl_buffer_info* iinfo = static_cast<const gl_buffer_info*>( m_device->get_buffer_info( info->index ) ); 59 if ( iinfo && iinfo->type == INDEX_BUFFER ) 60 { 61 glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, iinfo->glid ); 62 } 63 else 64 { 65 // TODO: report error 66 } 67 } 68 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 69 glBindVertexArray( 0 ); 70 71 if ( info->index.is_valid() ) 72 { 73 glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); 74 } 75 76 for ( uint32 i = 0; i < info->count; ++i ) 77 { 78 glDisableVertexAttribArray( static_cast<uint32>( info->attr[i].location ) ); 79 } 80 81 24 82 return result; 25 83 } … … 27 85 nv::framebuffer nv::gl_context::create_framebuffer() 28 86 { 29 if ( is_gl_extension_loaded( GL_EXT_FRAMEBUFFER_OBJECT ) && is_gl_extension_loaded( GL_EXT_FRAMEBUFFER_BLIT ) ) 30 { 31 unsigned glid = 0; 32 glGenFramebuffers( 1, &glid ); 33 framebuffer result = m_framebuffers.create(); 34 gl_framebuffer_info* info = m_framebuffers.get( result ); 35 info->glid = glid; 36 info->depth_rb_glid = 0; 37 info->color_attachment_count = 0; 38 return result; 39 } 40 else return framebuffer(); 87 unsigned glid = 0; 88 glGenFramebuffers( 1, &glid ); 89 framebuffer result = m_framebuffers.create(); 90 gl_framebuffer_info* info = m_framebuffers.get( result ); 91 info->glid = glid; 92 info->depth_rb_glid = 0; 93 info->color_attachment_count = 0; 94 return result; 41 95 } 42 96 43 97 void nv::gl_context::release( vertex_array va ) 44 98 { 45 vertex_array_info* info = m_vertex_arrays.get( va );99 gl_vertex_array_info* info = m_vertex_arrays.get( va ); 46 100 if ( info ) 47 101 { … … 52 106 } 53 107 if ( info->index.is_valid() && info->index_owner) m_device->release( info->index ); 108 glDeleteVertexArrays( 1, &info->glid ); 54 109 m_vertex_arrays.destroy( va ); 55 110 } … … 71 126 } 72 127 73 const vertex_array_info* nv::gl_context::get_vertex_array_info( vertex_array va ) const74 {75 return m_vertex_arrays.get( va );76 }77 78 128 const framebuffer_info* nv::gl_context::get_framebuffer_info( framebuffer f ) const 79 129 { 80 130 return m_framebuffers.get( f ); 81 }82 83 vertex_array_info* nv::gl_context::get_vertex_array_info_mutable( vertex_array va )84 {85 return m_vertex_arrays.get( va );86 131 } 87 132 … … 170 215 glDrawBuffer( 0 ); 171 216 glReadBuffer( 0 ); 172 if ( is_gl_extension_loaded( GL_EXT_FRAMEBUFFER_OBJECT ) && is_gl_extension_loaded( GL_EXT_FRAMEBUFFER_BLIT ) ) 173 { 174 unsigned result = glCheckFramebufferStatus( framebuffer_slot_to_enum(ft) ); 175 if ( result == GL_FRAMEBUFFER_COMPLETE ) return true; 176 switch ( result ) 177 { 178 case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT : NV_LOG_ERROR( "gl_context::check : Framebuffer incomplete attachment!" ); break; 179 case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT : NV_LOG_ERROR( "gl_context::check : Framebuffer missing attachment!" ); break; 217 218 unsigned result = glCheckFramebufferStatus( framebuffer_slot_to_enum(ft) ); 219 if ( result == GL_FRAMEBUFFER_COMPLETE ) return true; 220 switch ( result ) 221 { 222 case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT : NV_LOG_ERROR( "gl_context::check : Framebuffer incomplete attachment!" ); break; 223 case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT : NV_LOG_ERROR( "gl_context::check : Framebuffer missing attachment!" ); break; 180 224 // case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS : NV_LOG_ERROR( "gl_context::check : Framebuffer incomplete dimensions!" ); break; 181 225 // case GL_FRAMEBUFFER_INCOMPLETE_FORMATS : NV_LOG_ERROR( "gl_context::check : Framebuffer incomplete formats!" ); break; 182 case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER : NV_LOG_ERROR( "gl_context::check : Framebuffer incomplete draw buffer!" ); break; 183 case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER : NV_LOG_ERROR( "gl_context::check : Framebuffer incomplete read buffer!" ); break; 184 case GL_FRAMEBUFFER_UNSUPPORTED : NV_LOG_ERROR( "gl_context::check : Framebuffer format combination unsupported!" ); break; 185 default: NV_LOG_ERROR( "gl_context::check : Unknown Framebuffer error! (", result, ")" ); break; 186 } 187 } 188 else 189 { 190 NV_LOG_ERROR( "gl_context::check : Framebuffer extensions not loaded!" ); 226 case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER : NV_LOG_ERROR( "gl_context::check : Framebuffer incomplete draw buffer!" ); break; 227 case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER : NV_LOG_ERROR( "gl_context::check : Framebuffer incomplete read buffer!" ); break; 228 case GL_FRAMEBUFFER_UNSUPPORTED : NV_LOG_ERROR( "gl_context::check : Framebuffer format combination unsupported!" ); break; 229 default: NV_LOG_ERROR( "gl_context::check : Unknown Framebuffer error! (", result, ")" ); break; 191 230 } 192 231 glDrawBuffer( GL_BACK ); … … 205 244 { 206 245 glBindFramebuffer( framebuffer_slot_to_enum(ft), 0 ); 246 } 247 } 248 249 void nv::gl_context::bind( buffer b, texture t ) 250 { 251 const gl_buffer_info* binfo = static_cast< const gl_buffer_info* >( m_device->get_buffer_info( b ) ); 252 const gl_texture_info* tinfo = static_cast< const gl_texture_info* >( m_device->get_texture_info( t ) ); 253 NV_ASSERT( binfo && tinfo, "Bad buffer or texture passed to create_texture" ); 254 if ( binfo && tinfo ) 255 { 256 NV_ASSERT_ALWAYS( binfo->type == TEXTURE_BUFFER && tinfo->type == TEXTURE_1D_BUFFER, "bad texture or buffer type!" ); 257 glActiveTexture( GL_TEXTURE0 ); 258 glBindTexture( GL_TEXTURE_BUFFER, tinfo->glid ); 259 glTexBuffer( GL_TEXTURE_BUFFER, image_format_to_internal_enum( tinfo->format.format ), binfo->glid ); 260 glBindTexture( GL_TEXTURE_BUFFER, 0 ); 207 261 } 208 262 } … … 252 306 void nv::gl_context::bind( vertex_array va ) 253 307 { 254 const vertex_array_info* info = m_vertex_arrays.get( va ); 255 if ( info ) 256 { 257 for ( uint32 i = 0; i < info->count; ++i ) 258 { 259 const vertex_buffer_attribute& vba = info->attr[i]; 260 uint32 location = static_cast<uint32>( vba.location ); 261 glEnableVertexAttribArray( location ); 262 const gl_buffer_info* vinfo = static_cast< const gl_buffer_info* >( m_device->get_buffer_info( vba.vbuffer ) ); 263 if ( vinfo && vinfo->type == VERTEX_BUFFER ) 264 glBindBuffer( GL_ARRAY_BUFFER, vinfo->glid ); 265 else 266 { 267 // TODO: report error 268 } 269 270 glVertexAttribPointer( 271 location, 272 static_cast<GLint>( vba.components ), 273 nv::datatype_to_gl_enum( vba.dtype ), 274 GL_FALSE, 275 static_cast<GLsizei>( vba.stride ), 276 reinterpret_cast<void*>( vba.offset ) 277 ); 278 } 279 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 280 281 if ( info->index.is_valid() ) 282 { 283 const gl_buffer_info* iinfo = static_cast< const gl_buffer_info* >( m_device->get_buffer_info( info->index ) ); 284 if ( iinfo && iinfo->type == INDEX_BUFFER ) 285 { 286 glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, iinfo->glid ); 287 } 288 else 289 { 290 // TODO: report error 291 } 292 } 308 gl_vertex_array_info* info = m_vertex_arrays.get( va ); 309 if ( info ) 310 { 311 glBindVertexArray( info->glid ); 293 312 } 294 313 } … … 313 332 if ( info ) 314 333 { 315 if ( info->index.is_valid() ) 316 { 317 glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); 318 } 319 320 for ( uint32 i = 0; i < info->count; ++i ) 321 { 322 glDisableVertexAttribArray( static_cast<uint32>( info->attr[i].location ) ); 323 } 334 glBindVertexArray( 0 ); 324 335 } 325 336 } … … 340 351 { 341 352 const gl_texture_info* info = static_cast< const gl_texture_info* >( m_device->get_texture_info( t ) ); 353 NV_ASSERT_ALWAYS( info->type != TEXTURE_1D_BUFFER, "Buffer texture passed to update!" ); 342 354 if ( info ) 343 355 { … … 347 359 348 360 glBindTexture( gl_type, info->glid ); 361 int this_should_be_subTexImage; 349 362 if ( info->type == TEXTURE_3D || info->type == TEXTURE_2D_ARRAY ) 350 363 glTexImage3D( gl_type, 0, static_cast<GLint>( nv::image_format_to_internal_enum( format.format ) ), size.x, size.y, size.z, 0, nv::image_format_to_enum( format.format ), nv::datatype_to_gl_enum( format.type ), data ); … … 722 735 { 723 736 // TODO: configurable: 724 load_gl_extensions( GL_EXT_FRAMEBUFFER_BLIT | GL_EXT_FRAMEBUFFER_OBJECT | GL_EXT_TEXTURE_ARRAY );737 // load_gl_extensions( GL_EXT_FRAMEBUFFER_BLIT | GL_EXT_FRAMEBUFFER_OBJECT | GL_EXT_TEXTURE_ARRAY ); 725 738 force_apply_render_state( m_render_state ); 726 727 739 } 728 740
Note: See TracChangeset
for help on using the changeset viewer.