Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef GLBufferObject_INCLUDE_ONCE
00033 #define GLBufferObject_INCLUDE_ONCE
00034
00035 #include <vlCore/Vector2.hpp>
00036 #include <vlCore/Vector3.hpp>
00037 #include <vlCore/Vector4.hpp>
00038 #include <vlCore/Buffer.hpp>
00039 #include <vlGraphics/OpenGL.hpp>
00040 #include <vlCore/vlnamespace.hpp>
00041 #include <vlCore/Vector4.hpp>
00042 #include <vlCore/Sphere.hpp>
00043 #include <vlCore/AABB.hpp>
00044
00045 namespace vl
00046 {
00047
00048
00049
00055 class GLBufferObject: public Buffer
00056 {
00057 VL_INSTRUMENT_CLASS(vl::GLBufferObject, Buffer)
00058
00059 public:
00060 GLBufferObject()
00061 {
00062 VL_DEBUG_SET_OBJECT_NAME()
00063 mHandle = 0;
00064 mUsage = BU_STATIC_DRAW;
00065 mByteCountGPU = 0;
00066 }
00067
00068 GLBufferObject(const GLBufferObject& other): Buffer(other)
00069 {
00070 VL_DEBUG_SET_OBJECT_NAME()
00071 mHandle = 0;
00072 mUsage = BU_STATIC_DRAW;
00073 mByteCountGPU = 0;
00074
00075 *this = other;
00076 }
00077
00078
00079 GLBufferObject& operator=(const GLBufferObject& other)
00080 {
00081 deleteGLBufferObject();
00082 Buffer::operator=(other);
00083 return *this;
00084 }
00085
00086
00087 void swap(GLBufferObject& other)
00088 {
00089
00090 Buffer::swap(other);
00091
00092 unsigned int tmp_handle = mHandle;
00093 EGLBufferUsage tmp_usage = mUsage;
00094 GLsizeiptr tmp_bytes = mByteCountGPU;
00095
00096 mHandle = other.mHandle;
00097 mUsage = tmp_usage;
00098 mByteCountGPU = other.mByteCountGPU;
00099
00100 other.mHandle = tmp_handle;
00101 other.mUsage = tmp_usage;
00102 other.mByteCountGPU = tmp_bytes;
00103 }
00104
00105 ~GLBufferObject()
00106 {
00107 deleteGLBufferObject();
00108 }
00109
00110 void setHandle(unsigned int handle) { mHandle = handle; }
00111
00112 unsigned int handle() const { return mHandle; }
00113
00114 GLsizeiptr byteCountGPU() const { return mByteCountGPU; }
00115
00116 void createGLBufferObject()
00117 {
00118 VL_CHECK(Has_VBO)
00119 if(!Has_VBO)
00120 return;
00121 if (handle() == 0)
00122 {
00123 VL_CHECK(mByteCountGPU == 0)
00124 VL_glGenBuffers( 1, &mHandle );
00125 mByteCountGPU = 0;
00126 }
00127 VL_CHECK(handle())
00128 }
00129
00130 void deleteGLBufferObject()
00131 {
00132 if (handle() != 0)
00133 {
00134 VL_glDeleteBuffers( 1, &mHandle );
00135 mHandle = 0;
00136 mByteCountGPU = 0;
00137 }
00138 }
00139
00140 void downloadGLBufferObject()
00141 {
00142 if ( handle() )
00143 {
00144 resize( byteCountGPU() );
00145 void* gpu_ptr = mapGPUBuffer(GBA_READ_ONLY);
00146 memcpy( ptr(), gpu_ptr, byteCountGPU() );
00147 unmapGPUBuffer();
00148 }
00149 }
00150
00151
00152
00153 void setBufferData( EGLBufferUsage usage, bool discard_local_storage=false )
00154 {
00155 setBufferData( (int)bytesUsed(), ptr(), usage );
00156 mUsage = usage;
00157 if (discard_local_storage)
00158 clear();
00159 }
00160
00161
00162
00163 void setBufferSubData( GLintptr offset=0, GLsizeiptr byte_count=-1, bool discard_local_storage=false )
00164 {
00165 byte_count = byte_count < 0 ? byteCountGPU() : byte_count;
00166 setBufferSubData( offset, byte_count, ptr() );
00167 if (discard_local_storage)
00168 clear();
00169 }
00170
00171
00172
00173 void setBufferData( GLsizeiptr byte_count, const GLvoid* data, EGLBufferUsage usage )
00174 {
00175 VL_CHECK_OGL();
00176 VL_CHECK(Has_VBO)
00177 if ( !Has_VBO )
00178 return;
00179
00180
00181 createGLBufferObject();
00182
00183 VL_glBindBuffer( GL_ARRAY_BUFFER, handle() );
00184 VL_glBufferData( GL_ARRAY_BUFFER, byte_count, data, usage );
00185 VL_glBindBuffer( GL_ARRAY_BUFFER, 0 );
00186 mByteCountGPU = byte_count;
00187 mUsage = usage;
00188 VL_CHECK_OGL();
00189 }
00190
00191 void setBufferSubData( GLintptr offset, GLsizeiptr byte_count, const GLvoid* data )
00192 {
00193 VL_CHECK(Has_VBO)
00194 if ( !Has_VBO )
00195 return;
00196 createGLBufferObject();
00197
00198 VL_glBindBuffer( GL_ARRAY_BUFFER, handle() );
00199 VL_glBufferSubData( GL_ARRAY_BUFFER, offset, byte_count, data );
00200 VL_glBindBuffer( GL_ARRAY_BUFFER, 0 );
00201 }
00202
00203
00204
00205 void* mapGPUBuffer(EGLBufferAccess access)
00206 {
00207 VL_CHECK(Has_VBO)
00208 if ( !Has_VBO )
00209 return NULL;
00210 createGLBufferObject(); VL_CHECK_OGL();
00211 VL_glBindBuffer( GL_ARRAY_BUFFER, handle() ); VL_CHECK_OGL();
00212 void* ptr = VL_glMapBuffer( GL_ARRAY_BUFFER, access ); VL_CHECK_OGL();
00213 VL_glBindBuffer( GL_ARRAY_BUFFER, 0 );
00214 return ptr;
00215 }
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 bool unmapGPUBuffer()
00227 {
00228 VL_CHECK(Has_VBO)
00229 if ( !Has_VBO )
00230 return false;
00231 VL_CHECK_OGL();
00232 createGLBufferObject();
00233 VL_glBindBuffer( GL_ARRAY_BUFFER, handle() );
00234 bool ok = VL_glUnmapBuffer( GL_ARRAY_BUFFER ) == GL_TRUE;
00235 VL_CHECK(ok);
00236 VL_glBindBuffer( GL_ARRAY_BUFFER, 0 );
00237 VL_CHECK_OGL();
00238 return ok;
00239 }
00240
00241 EGLBufferUsage usage() const { return mUsage; }
00242
00243 protected:
00244 unsigned int mHandle;
00245 GLsizeiptr mByteCountGPU;
00246 EGLBufferUsage mUsage;
00247 };
00248 }
00249
00250 #endif