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-e03cc46cb475master
parent
fd3974a776
commit
1e51dbcbe4
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue