Ignore:
Timestamp:
08/07/14 19:06:34 (11 years ago)
Author:
epyon
Message:
  • buffers and vertex_arrays are now handle based
File:
1 edited

Legend:

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

    r301 r302  
    77#include "nv/gl/gl_window.hh"
    88#include "nv/gl/gl_program.hh"
    9 #include "nv/gl/gl_vertex_buffer.hh"
    109#include "nv/logging.hh"
    1110#include "nv/lib/sdl.hh"
     
    5655}
    5756
    58 vertex_buffer* gl_device::create_vertex_buffer( buffer_hint hint, size_t size, const void* source /*= nullptr */ )
    59 {
    60         return new gl_vertex_buffer( hint, size, source );
    61 }
    62 
    63 index_buffer* gl_device::create_index_buffer( buffer_hint hint, size_t size, const void* source /*= nullptr */ )
    64 {
    65         return new gl_index_buffer( hint, size, source );
    66 }
    67 
    68 vertex_array* gl_device::create_vertex_array()
    69 {
    70         return new vertex_array();
    71 }
    72 
    7357// this is a temporary function that will be removed once we find a way to
    7458// pass binary file data around
     
    10185gl_device::~gl_device()
    10286{
    103         // TODO: better use release_texture
    104         for ( auto& t : m_textures ) glDeleteTextures( 1, &t.glid );
     87        while ( m_textures.size() > 0 )
     88                release( m_textures.get_handle(0) );
     89        while ( m_buffers.size() > 0 )
     90                release( m_buffers.get_handle(0) );
    10591
    10692        SDL_Quit();
     
    142128}
    143129
    144 void nv::gl_device::release_texture( texture t )
     130void nv::gl_device::release( texture t )
    145131{
    146132        gl_texture_info* info = m_textures.get( t );
    147133        if ( info )
    148134        {
    149                 glDeleteTextures( 1, &(info->glid) );
     135                if ( info->glid != 0 )
     136                {
     137                        glDeleteTextures( 1, &(info->glid) );
     138                }
    150139                m_textures.destroy( t );
     140        }
     141}
     142
     143void nv::gl_device::release( buffer b )
     144{
     145        gl_buffer_info* info = m_buffers.get( b );
     146        if ( info )
     147        {
     148                if ( info->glid != 0 )
     149                {
     150                        glDeleteBuffers( 1, &(info->glid) );
     151                }
     152                m_buffers.destroy( b );
    151153        }
    152154}
     
    157159}
    158160
     161nv::buffer nv::gl_device::create_buffer( buffer_type type, buffer_hint hint, size_t size, const void* source /*= nullptr */ )
     162{
     163        unsigned glid   = 0;
     164        unsigned glenum = buffer_type_to_enum( type );
     165        glGenBuffers( 1, &glid );
     166
     167        glBindBuffer( glenum, glid );
     168        glBufferData( glenum, (GLsizeiptr)size, source, buffer_hint_to_enum( hint ) );
     169        glBindBuffer( glenum, 0 );
     170
     171        buffer result = m_buffers.create();
     172        gl_buffer_info* info = m_buffers.get( result );
     173        info->type = type;
     174        info->hint = hint;
     175        info->size = size;
     176        info->glid = glid;
     177        return result;
     178}
     179
     180const buffer_info* nv::gl_device::get_buffer_info( buffer t )
     181{
     182        return m_buffers.get( t );
     183}
Note: See TracChangeset for help on using the changeset viewer.