Ignore:
Timestamp:
04/29/16 12:42:28 (9 years ago)
Author:
epyon
Message:
  • mass update (will try to do atomic from now)
File:
1 edited

Legend:

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

    r487 r491  
    1414using namespace nv;
    1515
    16 nv::vertex_array nv::gl_context::create_vertex_array()
     16nv::vertex_array nv::gl_context::create_vertex_array( const vertex_array_desc& desc )
    1717{
    1818        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
    2482        return result;
    2583}
     
    2785nv::framebuffer nv::gl_context::create_framebuffer()
    2886{
    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;
    4195}
    4296
    4397void nv::gl_context::release( vertex_array va )
    4498{
    45         vertex_array_info* info = m_vertex_arrays.get( va );
     99        gl_vertex_array_info* info = m_vertex_arrays.get( va );
    46100        if ( info )
    47101        {
     
    52106                }
    53107                if ( info->index.is_valid() && info->index_owner) m_device->release( info->index );
     108                glDeleteVertexArrays( 1, &info->glid );
    54109                m_vertex_arrays.destroy( va );
    55110        }
     
    71126}
    72127
    73 const vertex_array_info* nv::gl_context::get_vertex_array_info( vertex_array va ) const
    74 {
    75         return m_vertex_arrays.get( va );
    76 }
    77 
    78128const framebuffer_info* nv::gl_context::get_framebuffer_info( framebuffer f ) const
    79129{
    80130        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 );
    86131}
    87132
     
    170215        glDrawBuffer( 0 );
    171216        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;
    180224//              case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS         : NV_LOG_ERROR( "gl_context::check : Framebuffer incomplete dimensions!" ); break;
    181225//              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;
    191230        }
    192231        glDrawBuffer( GL_BACK );
     
    205244        {
    206245                glBindFramebuffer( framebuffer_slot_to_enum(ft), 0 );
     246        }
     247}
     248
     249void 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 );
    207261        }
    208262}
     
    252306void nv::gl_context::bind( vertex_array va )
    253307{
    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 );
    293312        }
    294313}
     
    313332        if ( info )
    314333        {
    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 );
    324335        }
    325336}
     
    340351{
    341352        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!" );
    342354        if ( info )
    343355        {
     
    347359
    348360                glBindTexture( gl_type, info->glid );
     361                int this_should_be_subTexImage;
    349362                if ( info->type == TEXTURE_3D || info->type == TEXTURE_2D_ARRAY )
    350363                        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 );
     
    722735{
    723736        // 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 );
    725738        force_apply_render_state( m_render_state );
    726 
    727739}
    728740
Note: See TracChangeset for help on using the changeset viewer.