Commit 1e51dbcb authored by lukeph's avatar lukeph

added some VBO (vertex buffer object) extensions to the openGL driver.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1059 dfc29bdd-3216-0410-991c-e03cc46cb475
parent fd3974a7
...@@ -77,7 +77,10 @@ namespace video ...@@ -77,7 +77,10 @@ namespace video
EVDF_TEXTURE_NPOT, EVDF_TEXTURE_NPOT,
//! Are framebuffer objects supported? //! Are framebuffer objects supported?
EVDF_FRAMEBUFFER_OBJECT EVDF_FRAMEBUFFER_OBJECT,
//! Are vertex buffer objects supported?
EVDF_VERTEX_BUFFER_OBJECT
}; };
} // end namespace video } // end namespace video
...@@ -86,3 +89,4 @@ namespace video ...@@ -86,3 +89,4 @@ namespace video
#endif #endif
...@@ -18,6 +18,7 @@ COpenGLExtensionHandler::COpenGLExtensionHandler() : ...@@ -18,6 +18,7 @@ COpenGLExtensionHandler::COpenGLExtensionHandler() :
SeparateStencilExtension(false), SeparateStencilExtension(false),
TextureCompressionExtension(false), TextureCompressionExtension(false),
PackedDepthStencilExtension(false), PackedDepthStencilExtension(false),
VertexBufferObjectExtension(false),
MaxTextureUnits(1), MaxLights(1), MaxIndices(65535), MaxTextureUnits(1), MaxLights(1), MaxIndices(65535),
MaxAnisotropy(1.0f), MaxUserClipPlanes(0), MaxAnisotropy(1.0f), MaxUserClipPlanes(0),
Version(0), ShaderLanguageVersion(0) Version(0), ShaderLanguageVersion(0)
...@@ -42,7 +43,12 @@ COpenGLExtensionHandler::COpenGLExtensionHandler() : ...@@ -42,7 +43,12 @@ COpenGLExtensionHandler::COpenGLExtensionHandler() :
pGlBindFramebufferEXT(0), pGlDeleteFramebuffersEXT(0), pGlGenFramebuffersEXT(0), pGlBindFramebufferEXT(0), pGlDeleteFramebuffersEXT(0), pGlGenFramebuffersEXT(0),
pGlCheckFramebufferStatusEXT(0), pGlFramebufferTexture2DEXT(0), pGlCheckFramebufferStatusEXT(0), pGlFramebufferTexture2DEXT(0),
pGlBindRenderbufferEXT(0), pGlDeleteRenderbuffersEXT(0), pGlGenRenderbuffersEXT(0), pGlBindRenderbufferEXT(0), pGlDeleteRenderbuffersEXT(0), pGlGenRenderbuffersEXT(0),
pGlRenderbufferStorageEXT(0), pGlFramebufferRenderbufferEXT(0) pGlRenderbufferStorageEXT(0), pGlFramebufferRenderbufferEXT(0),
pGlGenBuffersARB(0), pGlBindBufferARB(0), pGlBufferDataARB(0), pGlDeleteBuffersARB(0),
pGlBufferSubDataARB(0), pGlGetBufferSubDataARB(0), pGlMapBufferARB(0), pGlUnmapBufferARB(0),
pGlIsBufferARB(0), pGlGetBufferParameterivARB(0), pGlGetBufferPointervARB(0)
#endif // _IRR_OPENGL_USE_EXTPOINTER_ #endif // _IRR_OPENGL_USE_EXTPOINTER_
{ {
for (u32 i=0; i<IRR_OpenGL_Feature_Count; ++i) for (u32 i=0; i<IRR_OpenGL_Feature_Count; ++i)
...@@ -100,6 +106,7 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer) ...@@ -100,6 +106,7 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
SeparateStencilExtension = FeatureAvailable[IRR_ATI_separate_stencil]; SeparateStencilExtension = FeatureAvailable[IRR_ATI_separate_stencil];
TextureCompressionExtension = FeatureAvailable[IRR_ARB_texture_compression]; TextureCompressionExtension = FeatureAvailable[IRR_ARB_texture_compression];
PackedDepthStencilExtension = FeatureAvailable[IRR_EXT_packed_depth_stencil]; PackedDepthStencilExtension = FeatureAvailable[IRR_EXT_packed_depth_stencil];
VertexBufferObjectExtension = FeatureAvailable[IRR_ARB_vertex_buffer_object];
StencilBuffer=stencilBuffer; StencilBuffer=stencilBuffer;
#ifdef _IRR_WINDOWS_API_ #ifdef _IRR_WINDOWS_API_
...@@ -159,6 +166,20 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer) ...@@ -159,6 +166,20 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
pGlRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) wglGetProcAddress("glRenderbufferStorageEXT"); pGlRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) wglGetProcAddress("glRenderbufferStorageEXT");
pGlFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) wglGetProcAddress("glFramebufferRenderbufferEXT"); pGlFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) wglGetProcAddress("glFramebufferRenderbufferEXT");
// get vertex buffer extension
pGlGenBuffersARB = (PFNGLGENBUFFERSARBPROC) wglGetProcAddress("glGenBuffersARB");
pGlBindBufferARB = (PFNGLBINDBUFFERARBPROC) wglGetProcAddress("glBindBufferARB");
pGlBufferDataARB = (PFNGLBUFFERDATAARBPROC) wglGetProcAddress("glBufferDataARB");
pGlDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) wglGetProcAddress("glDeleteBuffersARB");
pGlBufferSubDataARB= (PFNGLBUFFERSUBDATAARBPROC) wglGetProcAddress("glBufferSubDataARB");
pGlGetBufferSubDataARB= (PFNGLGETBUFFERSUBDATAARBPROC)wglGetProcAddress("glGetBufferSubDataARB");
pGlMapBufferARB= (PFNGLMAPBUFFERARBPROC) wglGetProcAddress("glMapBufferARB");
pGlUnmapBufferARB= (PFNGLUNMAPBUFFERARBPROC) wglGetProcAddress("glUnmapBufferARB");
pGlIsBufferARB= (PFNGLISBUFFERARBPROC) wglGetProcAddress("glIsBufferARB");
pGlGetBufferParameterivARB= (PFNGLGETBUFFERPARAMETERIVARBPROC) wglGetProcAddress("glGetBufferParameterivARB");
pGlGetBufferPointervARB= (PFNGLGETBUFFERPOINTERVARBPROC) wglGetProcAddress("glGetBufferPointervARB");
// vsync extension // vsync extension
wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC) wglGetProcAddress("wglSwapIntervalEXT"); wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC) wglGetProcAddress("wglSwapIntervalEXT");
...@@ -333,6 +354,40 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer) ...@@ -333,6 +354,40 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
pGlFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) pGlFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glFramebufferRenderbufferEXT")); IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glFramebufferRenderbufferEXT"));
pGlGenBuffersARB = (PFNGLGENBUFFERSARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGenBuffersARB"));
pGlBindBufferARB = (PFNGLBINDBUFFERARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glBindBufferARB"));
pGlBufferDataARB = (PFNGLBUFFERDATAARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glBufferDataARB"));
pGlDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glDeleteBuffersARB"));
pGlBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glBufferSubDataARB"));
pGlGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetBufferSubDataARB"));
pGlMapBufferARB = (PFNGLMAPBUFFERARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glMapBufferARB"));
pGlUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glUnmapBufferARB"));
pGlIsBufferARB = (PFNGLISBUFFERARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glIsBufferARB"));
pGlGetBufferParameterivARB = (PFNGLDELETEBUFFERSARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetBufferParameterivARB"));
pGlGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetBufferPointervARB"));
#endif // _IRR_OPENGL_USE_EXTPOINTER_ #endif // _IRR_OPENGL_USE_EXTPOINTER_
#endif // _IRR_WINDOWS_API_ #endif // _IRR_WINDOWS_API_
...@@ -417,6 +472,8 @@ bool COpenGLExtensionHandler::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const ...@@ -417,6 +472,8 @@ bool COpenGLExtensionHandler::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
return FeatureAvailable[IRR_ARB_texture_non_power_of_two]; return FeatureAvailable[IRR_ARB_texture_non_power_of_two];
case EVDF_FRAMEBUFFER_OBJECT: case EVDF_FRAMEBUFFER_OBJECT:
return FeatureAvailable[IRR_EXT_framebuffer_object]; return FeatureAvailable[IRR_EXT_framebuffer_object];
case EVDF_VERTEX_BUFFER_OBJECT:
return FeatureAvailable[IRR_ARB_vertex_buffer_object];
default: default:
return false; return false;
}; };
...@@ -428,3 +485,4 @@ bool COpenGLExtensionHandler::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const ...@@ -428,3 +485,4 @@ bool COpenGLExtensionHandler::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
#endif #endif
...@@ -666,6 +666,7 @@ class COpenGLExtensionHandler ...@@ -666,6 +666,7 @@ class COpenGLExtensionHandler
bool SeparateStencilExtension; bool SeparateStencilExtension;
bool TextureCompressionExtension; bool TextureCompressionExtension;
bool PackedDepthStencilExtension; bool PackedDepthStencilExtension;
bool VertexBufferObjectExtension;
// Some non-boolean properties // Some non-boolean properties
//! Maxmimum texture layers supported by the fixed pipeline //! Maxmimum texture layers supported by the fixed pipeline
...@@ -736,6 +737,20 @@ class COpenGLExtensionHandler ...@@ -736,6 +737,20 @@ class COpenGLExtensionHandler
void extGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); void extGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
void extGlActiveStencilFace(GLenum face); void extGlActiveStencilFace(GLenum face);
// vertex buffer object
void extGlGenBuffers(GLsizei n, GLuint *buffers);
void extGlBindBuffer(GLenum target, GLuint buffer);
void extGlBufferData(GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage);
void extGlDeleteBuffers(GLsizei n, const GLuint *buffers);
void extGlBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data);
void extGlGetBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data);
void *extGlMapBuffer (GLenum target, GLenum access);
GLboolean extGlUnmapBuffer (GLenum target);
GLboolean extGlIsBuffer (GLuint buffer);
void extGlGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
void extGlGetBufferPointerv (GLenum target, GLenum pname, GLvoid **params);
protected: protected:
// the global feature array // the global feature array
bool FeatureAvailable[IRR_OpenGL_Feature_Count]; bool FeatureAvailable[IRR_OpenGL_Feature_Count];
...@@ -792,6 +807,20 @@ class COpenGLExtensionHandler ...@@ -792,6 +807,20 @@ class COpenGLExtensionHandler
PFNGLRENDERBUFFERSTORAGEEXTPROC pGlRenderbufferStorageEXT; PFNGLRENDERBUFFERSTORAGEEXTPROC pGlRenderbufferStorageEXT;
PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC pGlFramebufferRenderbufferEXT; PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC pGlFramebufferRenderbufferEXT;
PFNGLACTIVESTENCILFACEEXTPROC pGlActiveStencilFaceEXT; PFNGLACTIVESTENCILFACEEXTPROC pGlActiveStencilFaceEXT;
PFNGLGENBUFFERSARBPROC pGlGenBuffersARB;
PFNGLBINDBUFFERARBPROC pGlBindBufferARB;
PFNGLBUFFERDATAARBPROC pGlBufferDataARB;
PFNGLDELETEBUFFERSARBPROC pGlDeleteBuffersARB;
PFNGLBUFFERSUBDATAARBPROC pGlBufferSubDataARB;
PFNGLGETBUFFERSUBDATAARBPROC pGlGetBufferSubDataARB;
PFNGLMAPBUFFERARBPROC pGlMapBufferARB;
PFNGLUNMAPBUFFERARBPROC pGlUnmapBufferARB;
PFNGLISBUFFERARBPROC pGlIsBufferARB;
PFNGLGETBUFFERPARAMETERIVARBPROC pGlGetBufferParameterivARB;
PFNGLGETBUFFERPOINTERVARBPROC pGlGetBufferPointervARB;
#endif #endif
}; };
...@@ -1323,8 +1352,142 @@ inline void COpenGLExtensionHandler::extGlActiveStencilFace(GLenum face) ...@@ -1323,8 +1352,142 @@ inline void COpenGLExtensionHandler::extGlActiveStencilFace(GLenum face)
} }
inline void COpenGLExtensionHandler::extGlGenBuffers(GLsizei n, GLuint *buffers)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGenBuffersARB)
pGlGenBuffersARB(n, buffers);
#elif defined(GL_ARB_vertex_buffer_object)
glGenBuffers(n, buffers);
#else
os::Printer::log("glGenBuffers not supported", ELL_ERROR);
#endif
} }
inline void COpenGLExtensionHandler::extGlBindBuffer(GLenum target, GLuint buffer)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlBindBufferARB)
pGlBindBufferARB(target, buffer);
#elif defined(GL_ARB_vertex_buffer_object)
glBindBuffer(target, buffer);
#else
os::Printer::log("glBindBuffer not supported", ELL_ERROR);
#endif
} }
inline void COpenGLExtensionHandler::extGlBufferData(GLenum target, int size, const GLvoid *data, GLenum usage)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlBufferDataARB)
pGlBufferDataARB(target, size, data, usage);
#elif defined(GL_ARB_vertex_buffer_object)
glBufferData(target, size, data, usage);
#else
os::Printer::log("glBufferData not supported", ELL_ERROR);
#endif #endif
}
inline void COpenGLExtensionHandler::extGlDeleteBuffers(GLsizei n, const GLuint *buffers)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlDeleteBuffersARB)
pGlDeleteBuffersARB(n, buffers);
#elif defined(GL_ARB_vertex_buffer_object)
glDeleteBuffers(n, buffers);
#else
os::Printer::log("glDeleteBuffers not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlBufferSubDataARB)
pGlBufferSubDataARB(target, offset, size, data);
#elif defined(GL_ARB_vertex_buffer_object)
glBufferSubData(target, offset, size, data);
#else
os::Printer::log("glBufferSubData not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlGetBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetBufferSubDataARB)
pGlGetBufferSubDataARB(target, offset, size, data);
#elif defined(GL_ARB_vertex_buffer_object)
glGetBufferSubData(target, offset, size, data);
#else
os::Printer::log("glGetBufferSubData not supported", ELL_ERROR);
#endif
}
inline void *COpenGLExtensionHandler::extGlMapBuffer (GLenum target, GLenum access)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlMapBufferARB)
pGlMapBufferARB(target, access);
#elif defined(GL_ARB_vertex_buffer_object)
glMapBuffer(target, access);
#else
os::Printer::log("glMapBuffer not supported", ELL_ERROR);
#endif
}
inline GLboolean COpenGLExtensionHandler::extGlUnmapBuffer (GLenum target)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlUnmapBufferARB)
pGlUnmapBufferARB(target);
#elif defined(GL_ARB_vertex_buffer_object)
glUnmapBuffer(target);
#else
os::Printer::log("glUnmapBuffer not supported", ELL_ERROR);
#endif
}
inline GLboolean COpenGLExtensionHandler::extGlIsBuffer (GLuint buffer)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlIsBufferARB)
pGlIsBufferARB(buffer);
#elif defined(GL_ARB_vertex_buffer_object)
glIsBuffer(buffer);
#else
os::Printer::log("glDeleteBuffers not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlGetBufferParameteriv (GLenum target, GLenum pname, GLint *params)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetBufferParameterivARB)
pGlGetBufferParameterivARB(target, pname, params);
#elif defined(GL_ARB_vertex_buffer_object)
glGetBufferParameteriv(target, pname, params);
#else
os::Printer::log("glGetBufferParameteriv not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlGetBufferPointerv (GLenum target, GLenum pname, GLvoid **params)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetBufferPointervARB)
pGlGetBufferPointervARB(target, pname, params);
#elif defined(GL_ARB_vertex_buffer_object)
glGetBufferPointerv(target, pname, params);
#else
os::Printer::log("glGetBufferPointerv not supported", ELL_ERROR);
#endif
}
}
}
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment