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