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
master
lukeph 2007-11-18 10:52:06 +00:00
parent fd3974a776
commit 1e51dbcbe4
3 changed files with 238 additions and 13 deletions

View File

@ -77,7 +77,10 @@ namespace video
EVDF_TEXTURE_NPOT,
//! Are framebuffer objects supported?
EVDF_FRAMEBUFFER_OBJECT
EVDF_FRAMEBUFFER_OBJECT,
//! Are vertex buffer objects supported?
EVDF_VERTEX_BUFFER_OBJECT
};
} // end namespace video
@ -86,3 +89,4 @@ namespace video
#endif

View File

@ -18,6 +18,7 @@ COpenGLExtensionHandler::COpenGLExtensionHandler() :
SeparateStencilExtension(false),
TextureCompressionExtension(false),
PackedDepthStencilExtension(false),
VertexBufferObjectExtension(false),
MaxTextureUnits(1), MaxLights(1), MaxIndices(65535),
MaxAnisotropy(1.0f), MaxUserClipPlanes(0),
Version(0), ShaderLanguageVersion(0)
@ -42,7 +43,12 @@ COpenGLExtensionHandler::COpenGLExtensionHandler() :
pGlBindFramebufferEXT(0), pGlDeleteFramebuffersEXT(0), pGlGenFramebuffersEXT(0),
pGlCheckFramebufferStatusEXT(0), pGlFramebufferTexture2DEXT(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_
{
for (u32 i=0; i<IRR_OpenGL_Feature_Count; ++i)
@ -100,6 +106,7 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
SeparateStencilExtension = FeatureAvailable[IRR_ATI_separate_stencil];
TextureCompressionExtension = FeatureAvailable[IRR_ARB_texture_compression];
PackedDepthStencilExtension = FeatureAvailable[IRR_EXT_packed_depth_stencil];
VertexBufferObjectExtension = FeatureAvailable[IRR_ARB_vertex_buffer_object];
StencilBuffer=stencilBuffer;
#ifdef _IRR_WINDOWS_API_
@ -147,17 +154,31 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
// compressed textures
pGlCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) wglGetProcAddress("glCompressedTexImage2D");
// FrameBufferObjects
pGlBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
pGlDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");
pGlGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
pGlCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
pGlFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
pGlBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) wglGetProcAddress("glBindRenderbufferEXT");
pGlDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) wglGetProcAddress("glDeleteRenderbuffersEXT");
pGlGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) wglGetProcAddress("glGenRenderbuffersEXT");
pGlRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) wglGetProcAddress("glRenderbufferStorageEXT");
pGlFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) wglGetProcAddress("glFramebufferRenderbufferEXT");
// FrameBufferObjects
pGlBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
pGlDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");
pGlGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
pGlCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
pGlFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
pGlBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) wglGetProcAddress("glBindRenderbufferEXT");
pGlDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) wglGetProcAddress("glDeleteRenderbuffersEXT");
pGlGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) wglGetProcAddress("glGenRenderbuffersEXT");
pGlRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) wglGetProcAddress("glRenderbufferStorageEXT");
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
wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC) wglGetProcAddress("wglSwapIntervalEXT");
@ -333,6 +354,40 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
pGlFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)
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_WINDOWS_API_
@ -417,6 +472,8 @@ bool COpenGLExtensionHandler::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
return FeatureAvailable[IRR_ARB_texture_non_power_of_two];
case EVDF_FRAMEBUFFER_OBJECT:
return FeatureAvailable[IRR_EXT_framebuffer_object];
case EVDF_VERTEX_BUFFER_OBJECT:
return FeatureAvailable[IRR_ARB_vertex_buffer_object];
default:
return false;
};
@ -428,3 +485,4 @@ bool COpenGLExtensionHandler::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
#endif

View File

@ -666,6 +666,7 @@ class COpenGLExtensionHandler
bool SeparateStencilExtension;
bool TextureCompressionExtension;
bool PackedDepthStencilExtension;
bool VertexBufferObjectExtension;
// Some non-boolean properties
//! Maxmimum texture layers supported by the fixed pipeline
@ -736,6 +737,20 @@ class COpenGLExtensionHandler
void extGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
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:
// the global feature array
bool FeatureAvailable[IRR_OpenGL_Feature_Count];
@ -792,6 +807,20 @@ class COpenGLExtensionHandler
PFNGLRENDERBUFFERSTORAGEEXTPROC pGlRenderbufferStorageEXT;
PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC pGlFramebufferRenderbufferEXT;
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
};
@ -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
}
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