/
meshVBO.cpp
97 lines (81 loc) · 2 KB
/
meshVBO.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <assert.h>
#include <stdio.h>
#define GLEW_STATIC
#include <GL/glew.h>
#include "meshVBO.h"
#include <memory.h>
#include <malloc.h>
namespace SCore {
unsigned int meshVBO::vboEnumToType( vboType type )
{
switch (type)
{
case vboVertex:
return GL_ARRAY_BUFFER_ARB;
case vboIndex:
return GL_ELEMENT_ARRAY_BUFFER_ARB;
case vboTextureBuffer:
return GL_TEXTURE_BUFFER_ARB;
default:
return 0;
}
}
unsigned int meshVBO::vboAccessToGl( vboAccess acc )
{
switch (acc)
{
case vboRead:
return GL_READ_ONLY;
case vboWrite:
return GL_WRITE_ONLY;
case vboReadWrite:
return GL_READ_WRITE;
default:
return 0;
}
}
void meshVBO::load( vboType t, unsigned int sz, void* data )
{
type = vboEnumToType( t );
size = sz;
glGenBuffersARB( 1, &vboID );
glBindBufferARB( type, vboID );
glBufferDataARB( type, sz, data, GL_STATIC_DRAW );
glBindBufferARB( type, 0 );
assert( glGetError() == GL_NO_ERROR );
}
void meshVBO::update( unsigned int start, unsigned int sz, void* data )
{
glBindBufferARB( type, vboID );
glBufferSubDataARB( type, start, sz, data );
glBindBufferARB( type, 0 );
assert( glGetError() == GL_NO_ERROR );
}
void* meshVBO::getContent()
{
void *memblock = malloc( size );
if (!memblock) return NULL;
glBindBufferARB( type, vboID );
void *buffer = glMapBufferARB( type, GL_READ_ONLY_ARB );
memcpy( memblock, buffer, size );
if ((glUnmapBufferARB( type ) == GL_FALSE) | (glGetError() != GL_NO_ERROR))
{
glBindBufferARB( type, 0 );
free( memblock );
return NULL;
}
glBindBufferARB( type, 0 );
return memblock;
}
uint64_t meshVBO::getBufferAddress( vboAccess acc )
{
uint64_t address = 0;
glMakeNamedBufferResidentNV( vboID, vboAccessToGl( acc ) );
glGetNamedBufferParameterui64vNV( vboID, GL_BUFFER_GPU_ADDRESS_NV, &address );
return address;
}
meshVBO::~meshVBO()
{
glDeleteBuffersARB( 1, &vboID );
}
};