From 20573bce434c08d18293e3f8a093eab809e34d83 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 1 Oct 2017 18:59:01 -0500 Subject: [PATCH] Don't link to libGL at compile time Get all OpenGL functions using SDL_GL_GetProcAddress(). This makes it easier to cross-arch compile on Linux and add support for OpenGL ES in the future. Users still have to supply their own libSDL2 for cross-arch compiling on Linux. But now the user does not have to re-install libgl1-mesa-dev package for i386 or amd64 on Debian when switching between compiling ioquake3 for x86 and x86_64. --- Makefile | 12 +- code/renderercommon/qgl.h | 410 +++++++------------------------------ code/renderergl2/tr_init.c | 2 +- code/sdl/sdl_glimp.c | 87 +++++++- 4 files changed, 163 insertions(+), 348 deletions(-) diff --git a/Makefile b/Makefile index e40c0da7..54ea5d3c 100644 --- a/Makefile +++ b/Makefile @@ -381,7 +381,7 @@ ifneq (,$(findstring "$(PLATFORM)", "linux" "gnu_kfreebsd" "kfreebsd-gnu" "gnu") AUTOUPDATER_LIBS += -ldl CLIENT_LIBS=$(SDL_LIBS) - RENDERER_LIBS = $(SDL_LIBS) -lGL + RENDERER_LIBS = $(SDL_LIBS) ifeq ($(USE_OPENAL),1) ifneq ($(USE_OPENAL_DLOPEN),1) @@ -613,7 +613,7 @@ ifdef MINGW CLIENT_LDFLAGS += -mwindows endif CLIENT_LIBS = -lgdi32 -lole32 - RENDERER_LIBS = -lgdi32 -lole32 -lopengl32 -static-libgcc + RENDERER_LIBS = -lgdi32 -lole32 -static-libgcc ifeq ($(USE_FREETYPE),1) FREETYPE_CFLAGS = -Ifreetype2 @@ -699,7 +699,7 @@ ifeq ($(PLATFORM),freebsd) CLIENT_LIBS = CLIENT_LIBS += $(SDL_LIBS) - RENDERER_LIBS = $(SDL_LIBS) -lGL + RENDERER_LIBS = $(SDL_LIBS) # optional features/libraries ifeq ($(USE_OPENAL),1) @@ -790,7 +790,7 @@ ifeq ($(PLATFORM),openbsd) CLIENT_LIBS = CLIENT_LIBS += $(SDL_LIBS) - RENDERER_LIBS = $(SDL_LIBS) -lGL + RENDERER_LIBS = $(SDL_LIBS) ifeq ($(USE_OPENAL),1) ifneq ($(USE_OPENAL_DLOPEN),1) @@ -853,7 +853,7 @@ ifeq ($(PLATFORM),irix64) # FIXME: The X libraries probably aren't necessary? CLIENT_LIBS=-L/usr/X11/$(LIB) $(SDL_LIBS) \ -lX11 -lXext -lm - RENDERER_LIBS = $(SDL_LIBS) -lGL + RENDERER_LIBS = $(SDL_LIBS) else # ifeq IRIX @@ -909,7 +909,7 @@ ifeq ($(PLATFORM),sunos) BOTCFLAGS=-O0 CLIENT_LIBS +=$(SDL_LIBS) -lX11 -lXext -liconv -lm - RENDERER_LIBS = $(SDL_LIBS) -lGL + RENDERER_LIBS = $(SDL_LIBS) else # ifeq sunos diff --git a/code/renderercommon/qgl.h b/code/renderercommon/qgl.h index 8f76c92f..d490f3ff 100644 --- a/code/renderercommon/qgl.h +++ b/code/renderercommon/qgl.h @@ -42,342 +42,80 @@ extern void (APIENTRYP qglUnlockArraysEXT) (void); //=========================================================================== -#define qglAccum glAccum -#define qglAlphaFunc glAlphaFunc -#define qglAreTexturesResident glAreTexturesResident -#define qglArrayElement glArrayElement -#define qglBegin glBegin -#define qglBindTexture glBindTexture -#define qglBitmap glBitmap -#define qglBlendFunc glBlendFunc -#define qglCallList glCallList -#define qglCallLists glCallLists -#define qglClear glClear -#define qglClearAccum glClearAccum -#define qglClearColor glClearColor -#define qglClearDepth glClearDepth -#define qglClearIndex glClearIndex -#define qglClearStencil glClearStencil -#define qglClipPlane glClipPlane -#define qglColor3b glColor3b -#define qglColor3bv glColor3bv -#define qglColor3d glColor3d -#define qglColor3dv glColor3dv -#define qglColor3f glColor3f -#define qglColor3fv glColor3fv -#define qglColor3i glColor3i -#define qglColor3iv glColor3iv -#define qglColor3s glColor3s -#define qglColor3sv glColor3sv -#define qglColor3ub glColor3ub -#define qglColor3ubv glColor3ubv -#define qglColor3ui glColor3ui -#define qglColor3uiv glColor3uiv -#define qglColor3us glColor3us -#define qglColor3usv glColor3usv -#define qglColor4b glColor4b -#define qglColor4bv glColor4bv -#define qglColor4d glColor4d -#define qglColor4dv glColor4dv -#define qglColor4f glColor4f -#define qglColor4fv glColor4fv -#define qglColor4i glColor4i -#define qglColor4iv glColor4iv -#define qglColor4s glColor4s -#define qglColor4sv glColor4sv -#define qglColor4ub glColor4ub -#define qglColor4ubv glColor4ubv -#define qglColor4ui glColor4ui -#define qglColor4uiv glColor4uiv -#define qglColor4us glColor4us -#define qglColor4usv glColor4usv -#define qglColorMask glColorMask -#define qglColorMaterial glColorMaterial -#define qglColorPointer glColorPointer -#define qglCopyPixels glCopyPixels -#define qglCopyTexImage1D glCopyTexImage1D -#define qglCopyTexImage2D glCopyTexImage2D -#define qglCopyTexSubImage1D glCopyTexSubImage1D -#define qglCopyTexSubImage2D glCopyTexSubImage2D -#define qglCullFace glCullFace -#define qglDeleteLists glDeleteLists -#define qglDeleteTextures glDeleteTextures -#define qglDepthFunc glDepthFunc -#define qglDepthMask glDepthMask -#define qglDepthRange glDepthRange -#define qglDisable glDisable -#define qglDisableClientState glDisableClientState -#define qglDrawArrays glDrawArrays -#define qglDrawBuffer glDrawBuffer -#define qglDrawElements glDrawElements -#define qglDrawPixels glDrawPixels -#define qglEdgeFlag glEdgeFlag -#define qglEdgeFlagPointer glEdgeFlagPointer -#define qglEdgeFlagv glEdgeFlagv -#define qglEnable glEnable -#define qglEnableClientState glEnableClientState -#define qglEnd glEnd -#define qglEndList glEndList -#define qglEvalCoord1d glEvalCoord1d -#define qglEvalCoord1dv glEvalCoord1dv -#define qglEvalCoord1f glEvalCoord1f -#define qglEvalCoord1fv glEvalCoord1fv -#define qglEvalCoord2d glEvalCoord2d -#define qglEvalCoord2dv glEvalCoord2dv -#define qglEvalCoord2f glEvalCoord2f -#define qglEvalCoord2fv glEvalCoord2fv -#define qglEvalMesh1 glEvalMesh1 -#define qglEvalMesh2 glEvalMesh2 -#define qglEvalPoint1 glEvalPoint1 -#define qglEvalPoint2 glEvalPoint2 -#define qglFeedbackBuffer glFeedbackBuffer -#define qglFinish glFinish -#define qglFlush glFlush -#define qglFogf glFogf -#define qglFogfv glFogfv -#define qglFogi glFogi -#define qglFogiv glFogiv -#define qglFrontFace glFrontFace -#define qglFrustum glFrustum -#define qglGenLists glGenLists -#define qglGenTextures glGenTextures -#define qglGetBooleanv glGetBooleanv -#define qglGetClipPlane glGetClipPlane -#define qglGetDoublev glGetDoublev -#define qglGetError glGetError -#define qglGetFloatv glGetFloatv -#define qglGetIntegerv glGetIntegerv -#define qglGetLightfv glGetLightfv -#define qglGetLightiv glGetLightiv -#define qglGetMapdv glGetMapdv -#define qglGetMapfv glGetMapfv -#define qglGetMapiv glGetMapiv -#define qglGetMaterialfv glGetMaterialfv -#define qglGetMaterialiv glGetMaterialiv -#define qglGetPixelMapfv glGetPixelMapfv -#define qglGetPixelMapuiv glGetPixelMapuiv -#define qglGetPixelMapusv glGetPixelMapusv -#define qglGetPointerv glGetPointerv -#define qglGetPolygonStipple glGetPolygonStipple -#define qglGetString glGetString -#define qglGetTexGendv glGetTexGendv -#define qglGetTexGenfv glGetTexGenfv -#define qglGetTexGeniv glGetTexGeniv -#define qglGetTexImage glGetTexImage -#define qglGetTexLevelParameterfv glGetTexLevelParameterfv -#define qglGetTexLevelParameteriv glGetTexLevelParameteriv -#define qglGetTexParameterfv glGetTexParameterfv -#define qglGetTexParameteriv glGetTexParameteriv -#define qglHint glHint -#define qglIndexMask glIndexMask -#define qglIndexPointer glIndexPointer -#define qglIndexd glIndexd -#define qglIndexdv glIndexdv -#define qglIndexf glIndexf -#define qglIndexfv glIndexfv -#define qglIndexi glIndexi -#define qglIndexiv glIndexiv -#define qglIndexs glIndexs -#define qglIndexsv glIndexsv -#define qglIndexub glIndexub -#define qglIndexubv glIndexubv -#define qglInitNames glInitNames -#define qglInterleavedArrays glInterleavedArrays -#define qglIsEnabled glIsEnabled -#define qglIsList glIsList -#define qglIsTexture glIsTexture -#define qglLightModelf glLightModelf -#define qglLightModelfv glLightModelfv -#define qglLightModeli glLightModeli -#define qglLightModeliv glLightModeliv -#define qglLightf glLightf -#define qglLightfv glLightfv -#define qglLighti glLighti -#define qglLightiv glLightiv -#define qglLineStipple glLineStipple -#define qglLineWidth glLineWidth -#define qglListBase glListBase -#define qglLoadIdentity glLoadIdentity -#define qglLoadMatrixd glLoadMatrixd -#define qglLoadMatrixf glLoadMatrixf -#define qglLoadName glLoadName -#define qglLogicOp glLogicOp -#define qglMap1d glMap1d -#define qglMap1f glMap1f -#define qglMap2d glMap2d -#define qglMap2f glMap2f -#define qglMapGrid1d glMapGrid1d -#define qglMapGrid1f glMapGrid1f -#define qglMapGrid2d glMapGrid2d -#define qglMapGrid2f glMapGrid2f -#define qglMaterialf glMaterialf -#define qglMaterialfv glMaterialfv -#define qglMateriali glMateriali -#define qglMaterialiv glMaterialiv -#define qglMatrixMode glMatrixMode -#define qglMultMatrixd glMultMatrixd -#define qglMultMatrixf glMultMatrixf -#define qglNewList glNewList -#define qglNormal3b glNormal3b -#define qglNormal3bv glNormal3bv -#define qglNormal3d glNormal3d -#define qglNormal3dv glNormal3dv -#define qglNormal3f glNormal3f -#define qglNormal3fv glNormal3fv -#define qglNormal3i glNormal3i -#define qglNormal3iv glNormal3iv -#define qglNormal3s glNormal3s -#define qglNormal3sv glNormal3sv -#define qglNormalPointer glNormalPointer -#define qglOrtho glOrtho -#define qglPassThrough glPassThrough -#define qglPixelMapfv glPixelMapfv -#define qglPixelMapuiv glPixelMapuiv -#define qglPixelMapusv glPixelMapusv -#define qglPixelStoref glPixelStoref -#define qglPixelStorei glPixelStorei -#define qglPixelTransferf glPixelTransferf -#define qglPixelTransferi glPixelTransferi -#define qglPixelZoom glPixelZoom -#define qglPointSize glPointSize -#define qglPolygonMode glPolygonMode -#define qglPolygonOffset glPolygonOffset -#define qglPolygonStipple glPolygonStipple -#define qglPopAttrib glPopAttrib -#define qglPopClientAttrib glPopClientAttrib -#define qglPopMatrix glPopMatrix -#define qglPopName glPopName -#define qglPrioritizeTextures glPrioritizeTextures -#define qglPushAttrib glPushAttrib -#define qglPushClientAttrib glPushClientAttrib -#define qglPushMatrix glPushMatrix -#define qglPushName glPushName -#define qglRasterPos2d glRasterPos2d -#define qglRasterPos2dv glRasterPos2dv -#define qglRasterPos2f glRasterPos2f -#define qglRasterPos2fv glRasterPos2fv -#define qglRasterPos2i glRasterPos2i -#define qglRasterPos2iv glRasterPos2iv -#define qglRasterPos2s glRasterPos2s -#define qglRasterPos2sv glRasterPos2sv -#define qglRasterPos3d glRasterPos3d -#define qglRasterPos3dv glRasterPos3dv -#define qglRasterPos3f glRasterPos3f -#define qglRasterPos3fv glRasterPos3fv -#define qglRasterPos3i glRasterPos3i -#define qglRasterPos3iv glRasterPos3iv -#define qglRasterPos3s glRasterPos3s -#define qglRasterPos3sv glRasterPos3sv -#define qglRasterPos4d glRasterPos4d -#define qglRasterPos4dv glRasterPos4dv -#define qglRasterPos4f glRasterPos4f -#define qglRasterPos4fv glRasterPos4fv -#define qglRasterPos4i glRasterPos4i -#define qglRasterPos4iv glRasterPos4iv -#define qglRasterPos4s glRasterPos4s -#define qglRasterPos4sv glRasterPos4sv -#define qglReadBuffer glReadBuffer -#define qglReadPixels glReadPixels -#define qglRectd glRectd -#define qglRectdv glRectdv -#define qglRectf glRectf -#define qglRectfv glRectfv -#define qglRecti glRecti -#define qglRectiv glRectiv -#define qglRects glRects -#define qglRectsv glRectsv -#define qglRenderMode glRenderMode -#define qglRotated glRotated -#define qglRotatef glRotatef -#define qglScaled glScaled -#define qglScalef glScalef -#define qglScissor glScissor -#define qglSelectBuffer glSelectBuffer -#define qglShadeModel glShadeModel -#define qglStencilFunc glStencilFunc -#define qglStencilMask glStencilMask -#define qglStencilOp glStencilOp -#define qglTexCoord1d glTexCoord1d -#define qglTexCoord1dv glTexCoord1dv -#define qglTexCoord1f glTexCoord1f -#define qglTexCoord1fv glTexCoord1fv -#define qglTexCoord1i glTexCoord1i -#define qglTexCoord1iv glTexCoord1iv -#define qglTexCoord1s glTexCoord1s -#define qglTexCoord1sv glTexCoord1sv -#define qglTexCoord2d glTexCoord2d -#define qglTexCoord2dv glTexCoord2dv -#define qglTexCoord2f glTexCoord2f -#define qglTexCoord2fv glTexCoord2fv -#define qglTexCoord2i glTexCoord2i -#define qglTexCoord2iv glTexCoord2iv -#define qglTexCoord2s glTexCoord2s -#define qglTexCoord2sv glTexCoord2sv -#define qglTexCoord3d glTexCoord3d -#define qglTexCoord3dv glTexCoord3dv -#define qglTexCoord3f glTexCoord3f -#define qglTexCoord3fv glTexCoord3fv -#define qglTexCoord3i glTexCoord3i -#define qglTexCoord3iv glTexCoord3iv -#define qglTexCoord3s glTexCoord3s -#define qglTexCoord3sv glTexCoord3sv -#define qglTexCoord4d glTexCoord4d -#define qglTexCoord4dv glTexCoord4dv -#define qglTexCoord4f glTexCoord4f -#define qglTexCoord4fv glTexCoord4fv -#define qglTexCoord4i glTexCoord4i -#define qglTexCoord4iv glTexCoord4iv -#define qglTexCoord4s glTexCoord4s -#define qglTexCoord4sv glTexCoord4sv -#define qglTexCoordPointer glTexCoordPointer -#define qglTexEnvf glTexEnvf -#define qglTexEnvfv glTexEnvfv -#define qglTexEnvi glTexEnvi -#define qglTexEnviv glTexEnviv -#define qglTexGend glTexGend -#define qglTexGendv glTexGendv -#define qglTexGenf glTexGenf -#define qglTexGenfv glTexGenfv -#define qglTexGeni glTexGeni -#define qglTexGeniv glTexGeniv -#define qglTexImage1D glTexImage1D -#define qglTexImage2D glTexImage2D -#define qglTexParameterf glTexParameterf -#define qglTexParameterfv glTexParameterfv -#define qglTexParameteri glTexParameteri -#define qglTexParameteriv glTexParameteriv -#define qglTexSubImage1D glTexSubImage1D -#define qglTexSubImage2D glTexSubImage2D -#define qglTranslated glTranslated -#define qglTranslatef glTranslatef -#define qglVertex2d glVertex2d -#define qglVertex2dv glVertex2dv -#define qglVertex2f glVertex2f -#define qglVertex2fv glVertex2fv -#define qglVertex2i glVertex2i -#define qglVertex2iv glVertex2iv -#define qglVertex2s glVertex2s -#define qglVertex2sv glVertex2sv -#define qglVertex3d glVertex3d -#define qglVertex3dv glVertex3dv -#define qglVertex3f glVertex3f -#define qglVertex3fv glVertex3fv -#define qglVertex3i glVertex3i -#define qglVertex3iv glVertex3iv -#define qglVertex3s glVertex3s -#define qglVertex3sv glVertex3sv -#define qglVertex4d glVertex4d -#define qglVertex4dv glVertex4dv -#define qglVertex4f glVertex4f -#define qglVertex4fv glVertex4fv -#define qglVertex4i glVertex4i -#define qglVertex4iv glVertex4iv -#define qglVertex4s glVertex4s -#define qglVertex4sv glVertex4sv -#define qglVertexPointer glVertexPointer -#define qglViewport glViewport - // GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a +// get missing functions from code/SDL2/include/SDL_opengl.h + +// OpenGL 1.0 +#define QGL_1_0_PROCS \ + GLE(void, AlphaFunc, GLenum func, GLclampf ref) \ + GLE(void, Begin, GLenum mode) \ + GLE(void, BlendFunc, GLenum sfactor, GLenum dfactor) \ + GLE(void, ClearColor, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) \ + GLE(void, ClearDepth, GLclampd depth) \ + GLE(void, Clear, GLbitfield mask) \ + GLE(void, ClearStencil, GLint s) \ + GLE(void, ClipPlane, GLenum plane, const GLdouble *equation) \ + GLE(void, Color3f, GLfloat red, GLfloat green, GLfloat blue) \ + GLE(void, Color4f, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) \ + GLE(void, Color4ubv, const GLubyte *v) \ + GLE(void, ColorMask, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) \ + GLE(void, CullFace, GLenum mode) \ + GLE(void, DepthFunc, GLenum func) \ + GLE(void, DepthMask, GLboolean flag) \ + GLE(void, DepthRange, GLclampd near_val, GLclampd far_val) \ + GLE(void, Disable, GLenum cap) \ + GLE(void, DrawBuffer, GLenum mode) \ + GLE(void, Enable, GLenum cap) \ + GLE(void, End, void) \ + GLE(void, Finish, void) \ + GLE(void, Flush, void) \ + GLE(void, Frustum, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val) \ + GLE(void, GetBooleanv, GLenum pname, GLboolean *params) \ + GLE(GLenum, GetError, void) \ + GLE(void, GetIntegerv, GLenum pname, GLint *params) \ + GLE(const GLubyte *, GetString, GLenum name) \ + GLE(void, LineWidth, GLfloat width) \ + GLE(void, LoadIdentity, void) \ + GLE(void, LoadMatrixf, const GLfloat *m) \ + GLE(void, MatrixMode, GLenum mode) \ + GLE(void, Ortho, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val) \ + GLE(void, PolygonMode, GLenum face, GLenum mode) \ + GLE(void, PolygonOffset, GLfloat factor, GLfloat units) \ + GLE(void, PopMatrix, void) \ + GLE(void, PushMatrix, void) \ + GLE(void, ReadPixels, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels) \ + GLE(void, Scissor, GLint x, GLint y, GLsizei width, GLsizei height) \ + GLE(void, ShadeModel, GLenum mode) \ + GLE(void, StencilFunc, GLenum func, GLint ref, GLuint mask) \ + GLE(void, StencilMask, GLuint mask) \ + GLE(void, StencilOp, GLenum fail, GLenum zfail, GLenum zpass) \ + GLE(void, TexCoord2f, GLfloat s, GLfloat t) \ + GLE(void, TexCoord2fv, const GLfloat *v) \ + GLE(void, TexEnvf, GLenum target, GLenum pname, GLfloat param) \ + GLE(void, TexImage2D, GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) \ + GLE(void, TexParameterf, GLenum target, GLenum pname, GLfloat param) \ + GLE(void, TexParameteri, GLenum target, GLenum pname, GLint param) \ + GLE(void, Translatef, GLfloat x, GLfloat y, GLfloat z) \ + GLE(void, Vertex2f, GLfloat x, GLfloat y) \ + GLE(void, Vertex3f, GLfloat x, GLfloat y, GLfloat z) \ + GLE(void, Vertex3fv, const GLfloat *v) \ + GLE(void, Viewport, GLint x, GLint y, GLsizei width, GLsizei height) \ + +// OpenGL 1.1 +#define QGL_1_1_PROCS \ + GLE(void, GenTextures, GLsizei n, GLuint *textures ) \ + GLE(void, DeleteTextures, GLsizei n, const GLuint *textures) \ + GLE(void, BindTexture, GLenum target, GLuint texture) \ + GLE(void, EnableClientState, GLenum cap) \ + GLE(void, DisableClientState, GLenum cap) \ + GLE(void, ArrayElement, GLint i) \ + GLE(void, DrawArrays, GLenum mode, GLint first, GLsizei count) \ + GLE(void, DrawElements, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) \ + GLE(void, TexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) \ + GLE(void, CopyTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) \ + GLE(void, VertexPointer, GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) \ + GLE(void, ColorPointer, GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) \ + GLE(void, TexCoordPointer, GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) \ // OpenGL 1.3, was GL_ARB_texture_compression #define QGL_1_3_PROCS \ @@ -556,6 +294,8 @@ extern void (APIENTRYP qglUnlockArraysEXT) (void); GLE(GLvoid, NamedFramebufferRenderbufferEXT, GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) \ #define GLE(ret, name, ...) typedef ret APIENTRY name##proc(__VA_ARGS__); extern name##proc * qgl##name; +QGL_1_0_PROCS; +QGL_1_1_PROCS; QGL_1_3_PROCS; QGL_1_5_PROCS; QGL_2_0_PROCS; diff --git a/code/renderergl2/tr_init.c b/code/renderergl2/tr_init.c index 583a04b6..212cacb1 100644 --- a/code/renderergl2/tr_init.c +++ b/code/renderergl2/tr_init.c @@ -1036,7 +1036,7 @@ void GfxInfo_f( void ) GLint numExtensions; int i; - glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); + qglGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); for (i = 0; i < numExtensions; i++) { ri.Printf(PRINT_ALL, "%s ", qglGetStringi(GL_EXTENSIONS, i)); diff --git a/code/sdl/sdl_glimp.c b/code/sdl/sdl_glimp.c index 454c2bf3..c81d38b0 100644 --- a/code/sdl/sdl_glimp.c +++ b/code/sdl/sdl_glimp.c @@ -60,6 +60,11 @@ void (APIENTRYP qglMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); void (APIENTRYP qglLockArraysEXT) (GLint first, GLsizei count); void (APIENTRYP qglUnlockArraysEXT) (void); +#define GLE(ret, name, ...) name##proc * qgl##name; +QGL_1_0_PROCS; +QGL_1_1_PROCS; +#undef GLE + /* =============== GLimp_Shutdown @@ -210,6 +215,50 @@ static void GLimp_DetectAvailableModes(void) SDL_free( modes ); } +/* +=============== +GLimp_GetProcAddresses + +Get addresses for OpenGL functions. +=============== +*/ +static qboolean GLimp_GetProcAddresses( void ) { + qboolean success = qtrue; + +#ifdef __SDL_NOGETPROCADDR__ +#define GLE( ret, name, ... ) qgl##name = gl#name; +#else +#define GLE( ret, name, ... ) qgl##name = (name##proc *) SDL_GL_GetProcAddress("gl" #name); \ + if ( qgl##name == NULL ) { \ + ri.Printf( PRINT_ALL, "ERROR: Missing OpenGL function %s\n", "gl" #name ); \ + success = qfalse; \ + } +#endif + + QGL_1_0_PROCS; + QGL_1_1_PROCS; + +#undef GLE + + return success; +} + +/* +=============== +GLimp_ClearProcAddresses + +Clear addresses for OpenGL functions. +=============== +*/ +static void GLimp_ClearProcAddresses( void ) { +#define GLE( ret, name, ... ) qgl##name = NULL; + + QGL_1_0_PROCS; + QGL_1_1_PROCS; + +#undef GLE +} + /* =============== GLimp_SetMode @@ -309,6 +358,7 @@ static int GLimp_SetMode(int mode, qboolean fullscreen, qboolean noborder, qbool // Destroy existing state if it exists if( SDL_glContext != NULL ) { + GLimp_ClearProcAddresses(); SDL_GL_DeleteContext( SDL_glContext ); SDL_glContext = NULL; } @@ -503,11 +553,22 @@ static int GLimp_SetMode(int mode, qboolean fullscreen, qboolean noborder, qbool ri.Printf(PRINT_ALL, "SDL_GL_CreateContext succeeded.\n"); - renderer = (const char *)qglGetString(GL_RENDERER); - if (renderer && (strstr(renderer, "Software Renderer") || strstr(renderer, "Software Rasterizer"))) + if ( GLimp_GetProcAddresses() ) { - ri.Printf(PRINT_ALL, "GL_RENDERER is %s, rejecting context\n", renderer); + renderer = (const char *)qglGetString(GL_RENDERER); + } + else + { + ri.Printf( PRINT_ALL, "GLimp_GetProcAddresses() failed for OpenGL 3.2 core context\n" ); + renderer = NULL; + } + if (!renderer || (strstr(renderer, "Software Renderer") || strstr(renderer, "Software Rasterizer"))) + { + if ( renderer ) + ri.Printf(PRINT_ALL, "GL_RENDERER is %s, rejecting context\n", renderer); + + GLimp_ClearProcAddresses(); SDL_GL_DeleteContext(SDL_glContext); SDL_glContext = NULL; @@ -522,10 +583,24 @@ static int GLimp_SetMode(int mode, qboolean fullscreen, qboolean noborder, qbool SDL_glContext = NULL; } - if( !SDL_glContext && ( SDL_glContext = SDL_GL_CreateContext( SDL_window ) ) == NULL ) + if ( !SDL_glContext ) { - ri.Printf( PRINT_DEVELOPER, "SDL_GL_CreateContext failed: %s\n", SDL_GetError( ) ); - continue; + if( ( SDL_glContext = SDL_GL_CreateContext( SDL_window ) ) == NULL ) + { + ri.Printf( PRINT_DEVELOPER, "SDL_GL_CreateContext failed: %s\n", SDL_GetError( ) ); + continue; + } + + if ( !GLimp_GetProcAddresses() ) + { + ri.Printf( PRINT_ALL, "GLimp_GetProcAddresses() failed\n" ); + GLimp_ClearProcAddresses(); + SDL_GL_DeleteContext( SDL_glContext ); + SDL_glContext = NULL; + SDL_DestroyWindow( SDL_window ); + SDL_window = NULL; + continue; + } } qglClearColor( 0, 0, 0, 1 );