aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/glx/indirect_program.c
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/glx/indirect_program.c')
-rw-r--r--xorg-server/glx/indirect_program.c50
1 files changed, 34 insertions, 16 deletions
diff --git a/xorg-server/glx/indirect_program.c b/xorg-server/glx/indirect_program.c
index db22d845d..17204c17d 100644
--- a/xorg-server/glx/indirect_program.c
+++ b/xorg-server/glx/indirect_program.c
@@ -32,6 +32,7 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
+#include "glheader.h"
#include "glxserver.h"
#include "glxbyteorder.h"
@@ -40,15 +41,28 @@
#include "unpack.h"
#include "indirect_size_get.h"
#include "indirect_dispatch.h"
+#include "glapitable.h"
+#include "glapi.h"
+#include "glthread.h"
+#include "dispatch.h"
+
+static int DoGetProgramString(struct __GLXclientStateRec *cl, GLbyte * pc,
+ unsigned get_programiv_offset,
+ unsigned get_program_string_offset, Bool do_swap);
/**
* Handle both types of glGetProgramString calls.
+ *
+ * This single function handles both \c glGetProgramStringARB and
+ * \c glGetProgramStringNV. The dispatch offsets for the functions to use
+ * for \c glGetProgramivARB and \c glGetProgramStringARB are passed in by the
+ * caller. These can be the offsets of either the ARB versions or the NV
+ * versions.
*/
-static int
+int
DoGetProgramString(struct __GLXclientStateRec *cl, GLbyte * pc,
- PFNGLGETPROGRAMIVARBPROC get_programiv,
- PFNGLGETPROGRAMSTRINGARBPROC get_program_string,
- Bool do_swap)
+ unsigned get_programiv_offset,
+ unsigned get_program_string_offset, Bool do_swap)
{
xGLXVendorPrivateWithReplyReq *const req =
(xGLXVendorPrivateWithReplyReq *) pc;
@@ -75,13 +89,19 @@ DoGetProgramString(struct __GLXclientStateRec *cl, GLbyte * pc,
/* The value of the GL_PROGRAM_LENGTH_ARB and GL_PROGRAM_LENGTH_NV
* enumerants is the same.
*/
- get_programiv(target, GL_PROGRAM_LENGTH_ARB, &compsize);
+ CALL_by_offset(GET_DISPATCH(),
+ (void (GLAPIENTRYP) (GLuint, GLenum, GLint *)),
+ get_programiv_offset,
+ (target, GL_PROGRAM_LENGTH_ARB, &compsize));
if (compsize != 0) {
__GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1);
__glXClearErrorOccured();
- get_program_string(target, pname, (GLubyte *) answer);
+ CALL_by_offset(GET_DISPATCH(),
+ (void (GLAPIENTRYP) (GLuint, GLenum, GLubyte *)),
+ get_program_string_offset,
+ (target, pname, (GLubyte *) answer));
}
if (__glXErrorOccured()) {
@@ -104,29 +124,27 @@ DoGetProgramString(struct __GLXclientStateRec *cl, GLbyte * pc,
int
__glXDisp_GetProgramStringARB(struct __GLXclientStateRec *cl, GLbyte * pc)
{
- return DoGetProgramString(cl, pc, glGetProgramivARB,
- glGetProgramStringARB, False);
+ return DoGetProgramString(cl, pc, _gloffset_GetProgramivARB,
+ _gloffset_GetProgramStringARB, False);
}
int
__glXDispSwap_GetProgramStringARB(struct __GLXclientStateRec *cl, GLbyte * pc)
{
- return DoGetProgramString(cl, pc, glGetProgramivARB,
- glGetProgramStringARB, True);
+ return DoGetProgramString(cl, pc, _gloffset_GetProgramivARB,
+ _gloffset_GetProgramStringARB, True);
}
int
__glXDisp_GetProgramStringNV(struct __GLXclientStateRec *cl, GLbyte * pc)
{
- return DoGetProgramString(cl, pc, (PFNGLGETPROGRAMIVARBPROC)glGetProgramivNV,
- (PFNGLGETPROGRAMSTRINGARBPROC)glGetProgramStringNV,
- False);
+ return DoGetProgramString(cl, pc, _gloffset_GetProgramivNV,
+ _gloffset_GetProgramStringNV, False);
}
int
__glXDispSwap_GetProgramStringNV(struct __GLXclientStateRec *cl, GLbyte * pc)
{
- return DoGetProgramString(cl, pc, (PFNGLGETPROGRAMIVARBPROC)glGetProgramivNV,
- (PFNGLGETPROGRAMSTRINGARBPROC)glGetProgramStringNV,
- True);
+ return DoGetProgramString(cl, pc, _gloffset_GetProgramivNV,
+ _gloffset_GetProgramStringNV, True);
}