Module neither: Change committed
coderjoe at icculus.org
coderjoe at icculus.org
Sat Mar 27 06:30:50 EST 2004
Commiter : coderjoe
CVSROOT : /cvs/cvsroot/neither
Module : neither
Commit time: 2004-03-27 11:30:49 UTC
Log message:
flesh out the DynGL stubs system.
(for some reason I cannot figure out, I get a warning on the three functions that take no parameters.)
Stub functions still don't do the error checking they are intended to do, but everything renders properly.
Modified files:
darkwar/renderer/dyngl.c darkwar/renderer/dyngl.h
darkwar/renderer/dynglstubs.c darkwar/renderer/dynglstubs.h
darkwar/renderer/renderer.dsp
------=MIME.73d8eff9f75062cf1bd7d05590e13677
Content-Type: text/plain; name="neither.20040327.113049.coderjoe.diff"
Content-Disposition: attachment; filename="neither.20040327.113049.coderjoe.diff"
Content-Transfer-Encoding: 8bit
Index: neither/darkwar/renderer/dyngl.c
diff -u neither/darkwar/renderer/dyngl.c:1.6 neither/darkwar/renderer/dyngl.c:1.7
--- neither/darkwar/renderer/dyngl.c:1.6 Sat Mar 27 00:09:47 2004
+++ neither/darkwar/renderer/dyngl.c Sat Mar 27 06:30:39 2004
@@ -11,7 +11,7 @@
other less-evolved hacks which usually don't work right. ;)
*/
static const char rcsid[] =
-"$Id: dyngl.c,v 1.6 2004/03/27 05:09:47 coderjoe Exp $";
+"$Id: dyngl.c,v 1.7 2004/03/27 11:30:39 coderjoe Exp $";
#include "dwconfig.h"
@@ -22,6 +22,7 @@
#include "SDL.h"
#include "dyngl.h"
+#include "dynglstubs.h"
#include "matrixlib.h"
/*
@@ -87,6 +88,16 @@
#undef DYNGL_NEED
#undef DYNGL_EXT
#undef DYNGL_WANT
+/* this set of function pointers contains the real functions, for use with the stub
+ * system.
+ */
+#define DYNGL_NEED(ret, name, args) ret (DYNGLENTRY * DynGL_Real_##name) args = NULL;
+#define DYNGL_EXT(ret, name, args, extension) ret (DYNGLENTRY * DynGL_Real_##name) args = NULL;
+#define DYNGL_WANT(ret, name, args, alt) ret (DYNGLENTRY * DynGL_Real_##name) args = NULL;
+#include "dglfuncs.h"
+#undef DYNGL_NEED
+#undef DYNGL_EXT
+#undef DYNGL_WANT
/* Internal flag for shutting things down properly */
@@ -262,6 +273,13 @@
#undef DYNGL_NEED
#undef DYNGL_EXT
#undef DYNGL_WANT
+#define DYNGL_NEED(ret, name, args) DynGL_Real_##name = NULL;
+#define DYNGL_EXT(ret, name, args, extension) DynGL_Real_##name = NULL;
+#define DYNGL_WANT(ret, name, args, alt) DynGL_Real_##name = NULL;
+#include "dglfuncs.h"
+#undef DYNGL_NEED
+#undef DYNGL_EXT
+#undef DYNGL_WANT
return;
}
@@ -354,22 +372,22 @@
/* Assign all of the functions, except extensions */
#define DYNGL_NEED(ret, name, args) \
- if (!(q##name = SDL_GL_GetProcAddress (#name))) \
+ if (!(DynGL_Real_##name = SDL_GL_GetProcAddress (#name))) \
{ \
SDL_SetError ("DynGL_GetFunctions: can't find %s", #name); \
return SDL_FALSE; \
}
#define DYNGL_EXT(ret, name, args, extension)
#define DYNGL_WANT(ret, name, args, alt) \
- if (!(q##name = SDL_GL_GetProcAddress (#name))) \
- q##name = alt;
+ if (!(DynGL_Real_##name = SDL_GL_GetProcAddress (#name))) \
+ DynGL_Real_##name = alt;
#include "dglfuncs.h"
#undef DYNGL_NEED
#undef DYNGL_EXT
#undef DYNGL_WANT
/* Now we need the extensions list */
- gl_extensions_list = strdup (qglGetString (GL_EXTENSIONS));
+ gl_extensions_list = strdup (DynGL_Real_glGetString (GL_EXTENSIONS));
p = gl_extensions_list;
last = p + strlen (p);
@@ -388,7 +406,7 @@
#define DYNGL_NEED(ret, name, args)
#define DYNGL_EXT(ret, name, args, extension) \
if (DynGL_HasExtension (extension)) \
- if (!(q##name = SDL_GL_GetProcAddress (#name))) \
+ if (!(DynGL_Real_##name = SDL_GL_GetProcAddress (#name))) \
{ \
DynGL_BadExtension (extension); \
if (errfunc != NULL) \
@@ -405,12 +423,13 @@
*/
#define DYNGL_EXT(ret, name, args, extension) \
if (!DynGL_HasExtension (extension)) \
- q##name = NULL;
+ DynGL_Real_##name = NULL;
#include "dglfuncs.h"
#undef DYNGL_NEED
#undef DYNGL_EXT
#undef DYNGL_WANT
+ DynGL_UseStubs (SDL_TRUE);
return SDL_TRUE;
}
@@ -452,3 +471,33 @@
return SDL_FALSE;
}
+/* DynGL_UseStubs - enables or disables the debugging stub functions. */
+SDL_bool
+DynGL_UseStubs (SDL_bool UseThem)
+{
+ if (!dyngl_loaded)
+ {
+ SDL_SetError ("DynGL_UseStubs: no OpenGL library loaded");
+ return SDL_FALSE;
+ }
+
+ if (UseThem) {
+#define DYNGL_NEED(ret, name, args) q##name = DynGL_Stub_##name;
+#define DYNGL_EXT(ret, name, args, extension) q##name = DynGL_Stub_##name;
+#define DYNGL_WANT(ret, name, args, alt) q##name = DynGL_Stub_##name;
+#include "dglfuncs.h"
+#undef DYNGL_NEED
+#undef DYNGL_EXT
+#undef DYNGL_WANT
+ } else {
+#define DYNGL_NEED(ret, name, args) q##name = DynGL_Real_##name;
+#define DYNGL_EXT(ret, name, args, extension) q##name = DynGL_Real_##name;
+#define DYNGL_WANT(ret, name, args, alt) q##name = DynGL_Real_##name;
+#include "dglfuncs.h"
+#undef DYNGL_NEED
+#undef DYNGL_EXT
+#undef DYNGL_WANT
+ }
+
+ return SDL_TRUE;
+}
Index: neither/darkwar/renderer/dyngl.h
diff -u neither/darkwar/renderer/dyngl.h:1.4 neither/darkwar/renderer/dyngl.h:1.5
--- neither/darkwar/renderer/dyngl.h:1.4 Fri Mar 26 08:02:06 2004
+++ neither/darkwar/renderer/dyngl.h Sat Mar 27 06:30:39 2004
@@ -29,7 +29,7 @@
whatsoever, express or implied, in the hopes that others will use it
instead of other less-evolved hacks which usually don't work right. ;)
- $Id: dyngl.h,v 1.4 2004/03/26 13:02:06 coderjoe Exp $
+ $Id: dyngl.h,v 1.5 2004/03/27 11:30:39 coderjoe Exp $
*/
#ifndef __dyngl_h
@@ -99,6 +99,9 @@
* If the function is an ALT then it will be replaced
* with the alternate function. If the function is a
* NEED then errfunc will be called.
+ * DynGL_UseStubs - Enables or disables the use of debugging stubs,
+ * defined in dynglstubs.[ch], to do error checking
+ * transparently to the caller.
*/
SDL_bool DynGL_LoadLibrary (const char *name);
void DynGL_CloseLibrary (void);
@@ -106,6 +109,7 @@
SDL_bool DynGL_BadFunction (const char *func, void (*errfunc)(const char *fmt, ...));
SDL_bool DynGL_HasExtension (const char *ext);
void DynGL_BadExtension (const char *ext);
+SDL_bool DynGL_UseStubs (SDL_bool UseThem);
/*
* Types
Index: neither/darkwar/renderer/dynglstubs.c
diff -u neither/darkwar/renderer/dynglstubs.c:1.1 neither/darkwar/renderer/dynglstubs.c:1.2
--- neither/darkwar/renderer/dynglstubs.c:1.1 Sat Mar 27 02:44:35 2004
+++ neither/darkwar/renderer/dynglstubs.c Sat Mar 27 06:30:39 2004
@@ -7,125 +7,190 @@
#include "dwconfig.h"
#include "dyngl.h"
#include "dynglstubs.h"
+#include "ntypes.h"
+
+Nbool InImmediateMode = false;
// glGetError is not allowed between glBegin and glEnd. if it is called between
// them, we need to scream loudly.
-DYNGLCALL GLenum DYNGLENTRY DynGL_Stub_glGetError ()
+GLenum DYNGLENTRY
+DynGL_Stub_glGetError ()
{
+ if(InImmediateMode) {
+ // TODO: COMPLAIN here.
+ }
+ return DynGL_Real_glGetError ();
}
// need to disable the error checking when glBegin is called
// and re-enable it when glEnd is called.
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glBegin (GLenum mode)
+void DYNGLENTRY
+DynGL_Stub_glBegin (GLenum mode)
{
+ InImmediateMode = true;
+ DynGL_Real_glBegin (mode);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glEnd ()
+void DYNGLENTRY
+DynGL_Stub_glEnd ()
{
+ InImmediateMode = false;
+ DynGL_Real_glEnd ();
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glBindTexture (GLenum target, GLuint texture)
+void DYNGLENTRY
+DynGL_Stub_glBindTexture (GLenum target, GLuint texture)
{
+ DynGL_Real_glBindTexture (target, texture);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glClear (GLbitfield mask)
+void DYNGLENTRY
+DynGL_Stub_glClear (GLbitfield mask)
{
+ DynGL_Real_glClear (mask);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+void DYNGLENTRY
+DynGL_Stub_glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
{
+ DynGL_Real_glColor4f (red, green, blue, alpha);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glDeleteTextures (GLsizei n, const GLuint * textures)
+void DYNGLENTRY
+DynGL_Stub_glDeleteTextures (GLsizei n, const GLuint * textures)
{
+ DynGL_Real_glDeleteTextures(n, textures);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glDisable (GLenum cap)
+void DYNGLENTRY
+DynGL_Stub_glDisable (GLenum cap)
{
+ DynGL_Real_glDisable (cap);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glEnable (GLenum cap)
+void DYNGLENTRY
+DynGL_Stub_glEnable (GLenum cap)
{
+ DynGL_Real_glEnable (cap);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+void DYNGLENTRY
+DynGL_Stub_glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
{
+ DynGL_Real_glFrustum (left, right, bottom, top, zNear, zFar);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glGenTextures (GLsizei n, GLuint * textures)
+void DYNGLENTRY
+DynGL_Stub_glGenTextures (GLsizei n, GLuint * textures)
{
+ DynGL_Real_glGenTextures (n, textures);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glGetIntegerv (GLenum pname, GLint * params)
+void DYNGLENTRY
+DynGL_Stub_glGetIntegerv (GLenum pname, GLint * params)
{
+ DynGL_Real_glGetIntegerv (pname, params);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glLoadIdentity ()
+void DYNGLENTRY
+DynGL_Stub_glLoadIdentity ()
{
+ DynGL_Real_glLoadIdentity ();
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glLoadMatrixd (const GLdouble * m)
+void DYNGLENTRY
+DynGL_Stub_glLoadMatrixd (const GLdouble * m)
{
+ DynGL_Real_glLoadMatrixd (m);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glMatrixMode (GLenum mode)
+void DYNGLENTRY
+DynGL_Stub_glMatrixMode (GLenum mode)
{
+ DynGL_Real_glMatrixMode (mode);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+void DYNGLENTRY
+DynGL_Stub_glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
{
+ DynGL_Real_glOrtho (left, right, bottom, top, zNear, zFar);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glTexCoord2f (GLfloat s, GLfloat t)
+void DYNGLENTRY
+DynGL_Stub_glTexCoord2f (GLfloat s, GLfloat t)
{
+ DynGL_Real_glTexCoord2f (s, t);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels)
+void DYNGLENTRY
+DynGL_Stub_glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels)
{
+ DynGL_Real_glTexImage2D (target, level, internalformat, width, height, border, format, type, pixels);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glTexParameteri (GLenum target, GLenum pname, GLint param)
+void DYNGLENTRY
+DynGL_Stub_glTexParameteri (GLenum target, GLenum pname, GLint param)
{
+ DynGL_Real_glTexParameteri (target, pname, param);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glVertex3f (GLfloat x, GLfloat y, GLfloat z)
+void DYNGLENTRY
+DynGL_Stub_glVertex3f (GLfloat x, GLfloat y, GLfloat z)
{
+ DynGL_Real_glVertex3f (x, y, z);
}
-
-DYNGLCALL const GLubyte * DYNGLENTRY DynGL_Stub_glGetString (GLenum name)
+const GLubyte * DYNGLENTRY
+DynGL_Stub_glGetString (GLenum name)
{
+ return DynGL_Real_glGetString (name);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glMultMatrixd (const GLdouble * m)
+void DYNGLENTRY
+DynGL_Stub_glMultMatrixd (const GLdouble * m)
{
+ DynGL_Real_glMultMatrixd (m);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices)
+void DYNGLENTRY
+DynGL_Stub_glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices)
{
+ DynGL_Real_glDrawElements (mode, count, type, indices);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+void DYNGLENTRY
+DynGL_Stub_glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
{
+ DynGL_Real_glDrawRangeElements (mode, start, end, count, type, indices);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+void DYNGLENTRY
+DynGL_Stub_glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
{
+ DynGL_Real_glDrawRangeElementsEXT (mode, start, end, count, type, indices);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glLoadTransposeMatrixd (const GLdouble * m)
+void DYNGLENTRY
+DynGL_Stub_glLoadTransposeMatrixd (const GLdouble * m)
{
+ DynGL_Real_glLoadTransposeMatrixd (m);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glMultTransposeMatrixd (const GLdouble * m)
+void DYNGLENTRY
+DynGL_Stub_glMultTransposeMatrixd (const GLdouble * m)
{
+ DynGL_Real_glMultTransposeMatrixd (m);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glLoadTransposeMatrixdARB (const GLdouble * m)
+void DYNGLENTRY
+DynGL_Stub_glLoadTransposeMatrixdARB (const GLdouble * m)
{
+ DynGL_Real_glLoadTransposeMatrixdARB (m);
}
-DYNGLCALL void DYNGLENTRY DynGL_Stub_glMultTransposeMatrixdARB (const GLdouble * m)
+void DYNGLENTRY
+DynGL_Stub_glMultTransposeMatrixdARB (const GLdouble * m)
{
+ DynGL_Real_glMultTransposeMatrixdARB (m);
}
Index: neither/darkwar/renderer/dynglstubs.h
diff -u neither/darkwar/renderer/dynglstubs.h:1.1 neither/darkwar/renderer/dynglstubs.h:1.2
--- neither/darkwar/renderer/dynglstubs.h:1.1 Sat Mar 27 02:44:35 2004
+++ neither/darkwar/renderer/dynglstubs.h Sat Mar 27 06:30:39 2004
@@ -1,4 +1,8 @@
-/* this file declares stubs for all the OpenGL functions. */
+/*
+ dynglstubs.h - declares prototypes for stub functions based
+ on dglfuncs.h. this file is only meant to be included by
+ dyngl.c and dynglstubs.c.
+*/
#ifndef _dynglstubs_h_
#define _dynglstubs_h_
@@ -17,4 +21,20 @@
#undef DYNGL_EXT
#undef DYNGL_WANT
+/* and now a set of function pointers to hold the REAL opengl functions. the
+ qgl* functions just get switched between these...
+ (these are here because they are private between dyngl.c and dynglstubs.c)
+ */
+#define DYNGL_NEED(ret, name, args) \
+ DYNGLCALL ret (DYNGLENTRY * DynGL_Real_##name) args;
+#define DYNGL_EXT(ret, name, args, extension) \
+ DYNGLCALL ret (DYNGLENTRY * DynGL_Real_##name) args;
+#define DYNGL_WANT(ret, name, args, alt) \
+ DYNGLCALL ret (DYNGLENTRY * DynGL_Real_##name) args;
+#include "dglfuncs.h"
+#undef DYNGL_NEED
+#undef DYNGL_EXT
+#undef DYNGL_WANT
+
+
#endif /* _dynglstubs_h_ */
Index: neither/darkwar/renderer/renderer.dsp
diff -u neither/darkwar/renderer/renderer.dsp:1.2 neither/darkwar/renderer/renderer.dsp:1.3
--- neither/darkwar/renderer/renderer.dsp:1.2 Fri Mar 26 18:34:42 2004
+++ neither/darkwar/renderer/renderer.dsp Sat Mar 27 06:30:39 2004
@@ -89,6 +89,10 @@
# End Source File
# Begin Source File
+SOURCE=.\dynglstubs.c
+# End Source File
+# Begin Source File
+
SOURCE=.\main.c
# End Source File
# Begin Source File
@@ -113,6 +117,10 @@
# End Source File
# Begin Source File
+SOURCE=.\dynglstubs.h
+# End Source File
+# Begin Source File
+
SOURCE=.\ngl.h
# End Source File
# Begin Source File
More information about the neither-commits
mailing list