diff options
Diffstat (limited to 'xorg-server/glx/indirect_program.c')
-rw-r--r-- | xorg-server/glx/indirect_program.c | 50 |
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); } |