Hi
I've been working for a while with XFree 4.0.3 and noticed a few bugs while
using XFree glx as client and Nvidia closed source glx server for indirect
rendering. There are minor bugs in the client and also in the server (crash
when requesting extensions and no move/resize possible) but these part remains
to nvidia if they may listen.
-no call to ClientInfo (removed btw 4.0.1 and 4.0.2 ?)
-wrong opcode number in glPolygonOffset (for an 1.2 implementation)
I finally discovered that these bugs have been corrected in the dri glx client
part (and also imaging subset and multitexturing) but not included in the XFree
core which is strange because more recent dri changes (radeon code) have been
included in XFree.
It would be nice to have all this code included in the next Xfree release.
In the dri code, the multitexture vertex array part is not fully finished : no
call to glMultitexcoord done. Here is included a patch to solve this
issue.
regards
Alexis
diff -c -r /tmp/dri/xc/xc/lib/GL/glx/glxclient.h xc/lib/GL/glx/glxclient.h
*** /tmp/dri/xc/xc/lib/GL/glx/glxclient.h Tue Apr 10 02:13:55 2001
--- xc/lib/GL/glx/glxclient.h Fri Apr 20 17:44:35 2001
***************
*** 236,241 ****
--- 236,242 ----
typedef struct __GLXvertexArrayPointerStateRec {
GLboolean enable;
void (*proc)(const void *);
+ void (*mtproc)(GLenum,const void *);
const GLubyte *ptr;
GLsizei skip;
GLint size;
***************
*** 253,258 ****
--- 254,260 ----
GLint maxElementsVertices;
GLint maxElementsIndices;
GLint activeTexture;
+ GLint multitexturing;
} __GLXvertArrayState;
typedef struct __GLXattributeRec {
diff -c -r /tmp/dri/xc/xc/lib/GL/glx/vertarr.c xc/lib/GL/glx/vertarr.c
*** /tmp/dri/xc/xc/lib/GL/glx/vertarr.c Mon Apr 9 23:55:48 2001
--- xc/lib/GL/glx/vertarr.c Wed Apr 25 14:27:20 2001
***************
*** 81,86 ****
--- 81,98 ----
texCoordPointer->proc = (void (*)(const void *))glTexCoord4##let##v; \
break
+ #define __GL_MULTITEXTURE_FUNC(NAME, let) \
+ case GL_##NAME: \
+ if (size == 1) \
+ texCoordPointer->mtproc = (void (*)(GLenum,const void *))glMultiTexCoord1##let##vARB; \
+ else if (size == 2) \
+ texCoordPointer->mtproc = (void (*)(GLenum,const void *))glMultiTexCoord2##let##vARB; \
+ else if (size == 3) \
+ texCoordPointer->mtproc = (void (*)(GLenum,const void *))glMultiTexCoord3##let##vARB; \
+ else if (size == 4) \
+ texCoordPointer->mtproc = (void (*)(GLenum,const void *))glMultiTexCoord4##let##vARB; \
+ break
+
static GLuint __glXTypeSize(GLenum enm)
{
switch (enm) {
***************
*** 156,161 ****
--- 168,176 ----
va->maxElementsVertices = INT_MAX;
va->maxElementsIndices = INT_MAX;
+
+ va->activeTexture=0;
+ va->multitexturing=0;
}
/*****************************************************************************/
***************
*** 312,334 ****
__GLXcontext *gc = __glXGetCurrentContext();
__GLXvertexArrayPointerState *texCoordPointer =
&gc->state.vertArray.texCoord[gc->state.vertArray.activeTexture];
!
! /* Check arguments */
if (size < 1 || size > 4 || stride < 0) {
__glXSetError(gc, GL_INVALID_VALUE);
return;
}
/* Choose appropriate api proc */
! switch(type) {
! __GL_TEXTURE_FUNC(SHORT, s);
! __GL_TEXTURE_FUNC(INT, i);
! __GL_TEXTURE_FUNC(FLOAT, f);
! __GL_TEXTURE_FUNC(DOUBLE, d);
default:
__glXSetError(gc, GL_INVALID_ENUM);
return;
}
texCoordPointer->size = size;
texCoordPointer->type = type;
--- 327,361 ----
__GLXcontext *gc = __glXGetCurrentContext();
__GLXvertexArrayPointerState *texCoordPointer =
&gc->state.vertArray.texCoord[gc->state.vertArray.activeTexture];
!
! /* CHECK arguments */
if (size < 1 || size > 4 || stride < 0) {
__glXSetError(gc, GL_INVALID_VALUE);
return;
}
/* Choose appropriate api proc */
! if (gc->state.vertArray.multitexturing==GL_TRUE) {
! switch(type) {
! __GL_MULTITEXTURE_FUNC(SHORT, s);
! __GL_MULTITEXTURE_FUNC(INT, i);
! __GL_MULTITEXTURE_FUNC(FLOAT, f);
! __GL_MULTITEXTURE_FUNC(DOUBLE, d);
default:
__glXSetError(gc, GL_INVALID_ENUM);
return;
}
+ } else {
+ switch(type) {
+ __GL_TEXTURE_FUNC(SHORT, s);
+ __GL_TEXTURE_FUNC(INT, i);
+ __GL_TEXTURE_FUNC(FLOAT, f);
+ __GL_TEXTURE_FUNC(DOUBLE, d);
+ default:
+ __glXSetError(gc, GL_INVALID_ENUM);
+ return;
+ }
+ }
texCoordPointer->size = size;
texCoordPointer->type = type;
***************
*** 537,552 ****
__GLXcontext *gc = __glXGetCurrentContext();
__GLXvertArrayState *va = &gc->state.vertArray;
GLint j;
if (va->edgeFlag.enable == GL_TRUE) {
(*va->edgeFlag.proc)(va->edgeFlag.ptr+i*va->edgeFlag.skip);
}
! for (j=0; j<__GLX_MAX_TEXTURE_UNITS; ++j) {
! if (va->texCoord[j].enable == GL_TRUE) {
(*va->texCoord[j].proc)(va->texCoord[j].ptr+i*va->texCoord[j].skip);
! }
! }
if (va->color.enable == GL_TRUE) {
(*va->color.proc)(va->color.ptr+i*va->color.skip);
--- 564,588 ----
__GLXcontext *gc = __glXGetCurrentContext();
__GLXvertArrayState *va = &gc->state.vertArray;
GLint j;
+ GLuint unit=gc->state.vertArray.activeTexture;
if (va->edgeFlag.enable == GL_TRUE) {
(*va->edgeFlag.proc)(va->edgeFlag.ptr+i*va->edgeFlag.skip);
}
! if (gc->state.vertArray.multitexturing==GL_FALSE) {
! for (j=0; j<__GLX_MAX_TEXTURE_UNITS; ++j) {
! if (va->texCoord[j].enable == GL_TRUE) {
(*va->texCoord[j].proc)(va->texCoord[j].ptr+i*va->texCoord[j].skip);
! }
! }
! } else {
! for (j=0; j<__GLX_MAX_TEXTURE_UNITS; ++j) {
! if (va->texCoord[j].enable == GL_TRUE) {
! (*va->texCoord[j].mtproc)(GL_TEXTURE0_ARB+j,va->texCoord[j].ptr+i*va->texCoord[j].skip);
! }
! }
! }
if (va->color.enable == GL_TRUE) {
(*va->color.proc)(va->color.ptr+i*va->color.skip);
***************
*** 573,578 ****
--- 609,615 ----
*iaPtr = NULL, *tcaPtr[__GLX_MAX_TEXTURE_UNITS];
const GLboolean *efaPtr = NULL;
GLint i, j;
+ GLuint unit=gc->state.vertArray.activeTexture;
switch(mode) {
case GL_POINTS:
***************
*** 620,631 ****
(*va->edgeFlag.proc)(efaPtr);
efaPtr += va->edgeFlag.skip;
}
! for (j=0; j<__GLX_MAX_TEXTURE_UNITS; ++j) {
! if (va->texCoord[j].enable == GL_TRUE) {
(*va->texCoord[j].proc)(tcaPtr[j]);
tcaPtr[j] += va->texCoord[j].skip;
! }
! }
if (va->color.enable == GL_TRUE) {
(*va->color.proc)(caPtr);
caPtr += va->color.skip;
--- 657,678 ----
(*va->edgeFlag.proc)(efaPtr);
efaPtr += va->edgeFlag.skip;
}
! if (gc->state.vertArray.multitexturing==GL_FALSE) {
! for (j=0; j<__GLX_MAX_TEXTURE_UNITS; ++j) {
! if (va->texCoord[j].enable == GL_TRUE) {
(*va->texCoord[j].proc)(tcaPtr[j]);
tcaPtr[j] += va->texCoord[j].skip;
! }
! }
! } else {
! for (j=0; j<__GLX_MAX_TEXTURE_UNITS; ++j) {
! if (va->texCoord[j].enable == GL_TRUE) {
! (*va->texCoord[j].mtproc)(GL_TEXTURE0_ARB+j,tcaPtr[j]);
! tcaPtr[j] += va->texCoord[j].skip;
! }
! }
! }
!
if (va->color.enable == GL_TRUE) {
(*va->color.proc)(caPtr);
caPtr += va->color.skip;
***************
*** 655,660 ****
--- 702,708 ----
const GLushort *iPtr2 = NULL;
const GLuint *iPtr3 = NULL;
GLint i, j, offset = 0;
+ GLuint unit=gc->state.vertArray.activeTexture;
switch (mode) {
case GL_POINTS:
***************
*** 709,719 ****
if (va->edgeFlag.enable == GL_TRUE) {
(*va->edgeFlag.proc)(va->edgeFlag.ptr+(offset*va->edgeFlag.skip));
}
! for (j=0; j<__GLX_MAX_TEXTURE_UNITS; ++j) {
! if (va->texCoord[j].enable == GL_TRUE) {
! (*va->texCoord[j].proc)(va->texCoord[j].ptr+
! (offset*va->texCoord[j].skip));
! }
}
if (va->color.enable == GL_TRUE) {
(*va->color.proc)(va->color.ptr+(offset*va->color.skip));
--- 757,776 ----
if (va->edgeFlag.enable == GL_TRUE) {
(*va->edgeFlag.proc)(va->edgeFlag.ptr+(offset*va->edgeFlag.skip));
}
! if (gc->state.vertArray.multitexturing==GL_FALSE) {
! for (j=0; j<__GLX_MAX_TEXTURE_UNITS; ++j) {
! if (va->texCoord[j].enable == GL_TRUE) {
! (*va->texCoord[j].proc)(va->texCoord[j].ptr+
! (offset*va->texCoord[j].skip));
! }
! }
! } else {
! for (j=0; j<__GLX_MAX_TEXTURE_UNITS; ++j) {
! if (va->texCoord[j].enable == GL_TRUE) {
! (*va->texCoord[j].mtproc)(GL_TEXTURE0_ARB+j,va->texCoord[j].ptr+
! (offset*va->texCoord[j].skip));
! }
! }
}
if (va->color.enable == GL_TRUE) {
(*va->color.proc)(va->color.ptr+(offset*va->color.skip));
***************
*** 754,758 ****
__glXSetError(gc, GL_INVALID_ENUM);
return;
}
! gc->state.vertArray.activeTexture = unit;
}
--- 811,818 ----
__glXSetError(gc, GL_INVALID_ENUM);
return;
}
! if (gc->state.vertArray.multitexturing==GL_FALSE) {
! gc->state.vertArray.multitexturing=GL_TRUE;
! }
! gc->state.vertArray.activeTexture = unit;
}