xserver/GL/glx glxcmds.c, 1.16, 1.17 glxcmdsswap.c, 1.8,
1.9 glxext.c, 1.9, 1.10 glxscreens.c, 1.17, 1.18 glxserver.h,
1.10, 1.11 glxutil.c, 1.4, 1.5 singlesize.c, 1.9, 1.10
Dave Airlie
xserver-commit at pdx.freedesktop.org
Tue Jan 3 01:43:42 PST 2006
Committed by: airlied
Update of /cvs/xserver/xserver/GL/glx
In directory gabe:/tmp/cvs-serv14502/GL/glx
Modified Files:
glxcmds.c glxcmdsswap.c glxext.c glxscreens.c glxserver.h
glxutil.c singlesize.c
Log Message:
GL changes from Xgl codedrop
Index: glxcmds.c
===================================================================
RCS file: /cvs/xserver/xserver/GL/glx/glxcmds.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- glxcmds.c 23 Dec 2005 02:07:57 -0000 1.16
+++ glxcmds.c 3 Jan 2006 09:43:40 -0000 1.17
@@ -1161,17 +1161,23 @@
** The calling thread is swapping its current drawable. In this case,
** glxSwapBuffers is in both GL and X streams, in terms of
** sequentiality.
- */
+ *
+
+ * XXX: Xgl don't need this. However, removing the code like this
+ * is not the final solution. We need to make it possible for the DDX to
+ * decide if this context switch and glFinish call is needed or not.
+
if (__glXForceCurrent(cl, tag, &error)) {
- /*
+ *
** Do whatever is needed to make sure that all preceding requests
** in both streams are completed before the swap is executed.
- */
+ *
(*__glRenderTable->Finish)();
__GLX_NOTE_FLUSHED_CMDS(glxc);
} else {
return error;
}
+ */
}
if (pDraw) {
@@ -1254,8 +1260,7 @@
GLXDrawable drawId;
__GLXdrawablePrivate *glxPriv;
int numAttribs;
- int *sendBuf, *pSendBuf;
- int nReplyBytes;
+ int sendBuf[2];
pc += __GLX_VENDPRIV_HDR_SIZE;
@@ -1274,14 +1279,8 @@
reply.sequenceNumber = client->sequence;
reply.numAttribs = numAttribs;
- nReplyBytes = reply.length << 2;
- sendBuf = (int *) __glXMalloc ((size_t) nReplyBytes);
- if (sendBuf == NULL)
- return __glXBadContext; /* XXX: Is this correct? */
-
- pSendBuf = sendBuf;
- *pSendBuf++ = GLX_TEXTURE_TARGET_EXT;
- *pSendBuf++ = (int) (glxPriv->texTarget);
+ sendBuf[0] = GLX_TEXTURE_TARGET_EXT;
+ sendBuf[1] = (int) (glxPriv->texTarget);
if (client->swapped)
{
@@ -1291,11 +1290,9 @@
{
WriteToClient (client, sz_xGLXGetDrawableAttributesReply,
(char *) &reply);
- WriteToClient (client, nReplyBytes, (char *) sendBuf);
+ WriteToClient (client, sizeof (sendBuf), (char *) sendBuf);
}
-
- __glXFree ((char *) sendBuf);
-
+
return Success;
}
@@ -1311,8 +1308,8 @@
pc += __GLX_VENDPRIV_HDR_SIZE;
- drawId = *((GLXDrawable *) (pc));
- buffer = *((int *) (pc + 4));
+ drawId = *((CARD32 *) (pc));
+ buffer = *((INT32 *) (pc + 4));
cx = __glXForceCurrent (cl, req->contextTag, &error);
if (!cx)
@@ -1340,8 +1337,8 @@
pc += __GLX_VENDPRIV_HDR_SIZE;
- drawId = *((GLXDrawable *) (pc));
- buffer = *((int *) (pc + 4));
+ drawId = *((CARD32 *) (pc));
+ buffer = *((INT32 *) (pc + 4));
cx = __glXForceCurrent (cl, req->contextTag, &error);
if (!cx)
@@ -1360,6 +1357,186 @@
/************************************************************************/
+static int
+__glXRenderBeginEnd (__GLXclientState *cl,
+ int *commandsDone,
+ GLbyte **ppc,
+ int *pleft)
+{
+ ClientPtr client = cl->client;
+ int left, cmdlen;
+ CARD16 opcode;
+ __GLXrenderHeader *hdr;
+ GLbyte *pc;
+ __GLXrenderSizeData *entry;
+ int extra;
+ void (*proc) (GLbyte *);
+
+ pc = *ppc;
+ left = *pleft;
+ opcode = 0;
+
+ while (left > 0 && opcode != X_GLrop_End)
+ {
+ /*
+ ** Verify that the header length and the overall length agree.
+ ** Also, each command must be word aligned.
+ */
+ hdr = (__GLXrenderHeader *) pc;
+ cmdlen = hdr->length;
+ opcode = hdr->opcode;
+
+ /*
+ ** Check for core opcodes and grab entry data.
+ */
+ if ( (opcode >= __GLX_MIN_RENDER_OPCODE) &&
+ (opcode <= __GLX_MAX_RENDER_OPCODE) ) {
+ entry = &__glXRenderSizeTable[opcode];
+ proc = __glXRenderTable[opcode];
+#if __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT
+ } else if ( (opcode >= __GLX_MIN_RENDER_OPCODE_EXT) &&
+ (opcode <= __GLX_MAX_RENDER_OPCODE_EXT) ) {
+ entry =
+ &__glXRenderSizeTable_EXT[opcode -
+ __GLX_MIN_RENDER_OPCODE_EXT];
+ proc = __glXRenderTable_EXT[opcode -
+ __GLX_MIN_RENDER_OPCODE_EXT];
+#endif /* __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT */
+ } else {
+ client->errorValue = *commandsDone;
+ cl->beBufLen = 0;
+ return __glXBadRenderRequest;
+ }
+
+ if (!entry->bytes) {
+ /* unused opcode */
+ client->errorValue = *commandsDone;
+ cl->beBufLen = 0;
+ return __glXBadRenderRequest;
+ }
+ if (entry->varsize) {
+ /* variable size command */
+ extra = (*entry->varsize)(pc + __GLX_RENDER_HDR_SIZE, False);
+ if (extra < 0) {
+ extra = 0;
+ }
+ if (cmdlen != __GLX_PAD(entry->bytes + extra)) {
+ cl->beBufLen = 0;
+ return BadLength;
+ }
+ } else {
+ /* constant size command */
+ if (cmdlen != __GLX_PAD(entry->bytes)) {
+ cl->beBufLen = 0;
+ return BadLength;
+ }
+ }
+ if (left < cmdlen) {
+ cl->beBufLen = 0;
+ return BadLength;
+ }
+
+ (*commandsDone)++;
+
+ pc += cmdlen;
+ left -= cmdlen;
+ }
+
+ if (opcode == X_GLrop_End)
+ {
+ pc = cl->beBuf;
+ left = cl->beBufLen;
+ opcode = 0;
+
+ while (left > 0 && opcode != X_GLrop_End)
+ {
+ hdr = (__GLXrenderHeader *) pc;
+ cmdlen = hdr->length;
+ opcode = hdr->opcode;
+
+ if ((opcode >= __GLX_MIN_RENDER_OPCODE) &&
+ (opcode <= __GLX_MAX_RENDER_OPCODE))
+ {
+ entry = &__glXRenderSizeTable[opcode];
+ proc = __glXRenderTable[opcode];
+ }
+
+#if __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT
+ else
+ {
+ int index = opcode - __GLX_MIN_RENDER_OPCODE_EXT;
+
+ entry = &__glXRenderSizeTable_EXT[index];
+ proc = __glXRenderTable_EXT[index];
+ }
+#endif
+
+ (*proc) (pc + __GLX_RENDER_HDR_SIZE);
+
+ pc += cmdlen;
+ left -= cmdlen;
+ }
+
+ cl->beBufLen = 0;
+
+ pc = *ppc;
+ left = *pleft;
+ opcode = 0;
+
+ while (opcode != X_GLrop_End)
+ {
+ hdr = (__GLXrenderHeader *) pc;
+ cmdlen = hdr->length;
+ opcode = hdr->opcode;
+
+ if ((opcode >= __GLX_MIN_RENDER_OPCODE) &&
+ (opcode <= __GLX_MAX_RENDER_OPCODE))
+ {
+ entry = &__glXRenderSizeTable[opcode];
+ proc = __glXRenderTable[opcode];
+ }
+
+#if __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT
+ else
+ {
+ int index = opcode - __GLX_MIN_RENDER_OPCODE_EXT;
+ entry = &__glXRenderSizeTable_EXT[index];
+ proc = __glXRenderTable_EXT[index];
+ }
+#endif
+
+ (*proc) (pc + __GLX_RENDER_HDR_SIZE);
+
+ pc += cmdlen;
+ left -= cmdlen;
+ }
+ }
+ else
+ {
+ int size;
+
+ size = pc - *ppc;
+ if (cl->beBufSize < cl->beBufLen + size)
+ {
+ cl->beBuf = (GLbyte *) Xrealloc (cl->beBuf, cl->beBufLen + size);
+ if (!cl->beBuf)
+ cl->beBufLen = size = 0;
+
+ cl->beBufSize = cl->beBufLen + size;
+ }
+
+ if (size)
+ memcpy (cl->beBuf + cl->beBufLen, *ppc, size);
+
+ cl->beBufLen += size;
+ }
+
+ *ppc = pc;
+ *pleft = left;
+
+ return Success;
+}
+
/*
** Render and Renderlarge are not in the GLX API. They are used by the GLX
** client library to send batches of GL rendering commands.
@@ -1451,18 +1628,28 @@
return BadLength;
}
- /*
- ** Skip over the header and execute the command. We allow the
- ** caller to trash the command memory. This is useful especially
- ** for things that require double alignment - they can just shift
- ** the data towards lower memory (trashing the header) by 4 bytes
- ** and achieve the required alignment.
- */
- (*proc)(pc + __GLX_RENDER_HDR_SIZE);
- pc += cmdlen;
- left -= cmdlen;
- commandsDone++;
+ if (opcode == X_GLrop_Begin || cl->beBufLen > 0)
+ {
+ error = __glXRenderBeginEnd (cl, &commandsDone, &pc, &left);
+ if (error != Success)
+ return error;
+ }
+ else
+ {
+ /*
+ ** Skip over the header and execute the command. We allow the
+ ** caller to trash the command memory. This is useful especially
+ ** for things that require double alignment - they can just shift
+ ** the data towards lower memory (trashing the header) by 4 bytes
+ ** and achieve the required alignment.
+ */
+ (*proc)(pc + __GLX_RENDER_HDR_SIZE);
+ pc += cmdlen;
+ left -= cmdlen;
+ commandsDone++;
+ }
}
+
__GLX_NOTE_UNFLUSHED_CMDS(glxc);
return Success;
}
Index: glxcmdsswap.c
===================================================================
RCS file: /cvs/xserver/xserver/GL/glx/glxcmdsswap.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- glxcmdsswap.c 10 Jun 2005 12:30:39 -0000 1.8
+++ glxcmdsswap.c 3 Jan 2006 09:43:40 -0000 1.9
@@ -519,6 +519,184 @@
/************************************************************************/
+static int
+__glXSwapRenderBeginEnd (__GLXclientState *cl,
+ int *commandsDone,
+ GLbyte **ppc,
+ int *pleft)
+{
+ ClientPtr client = cl->client;
+ int left, cmdlen;
+ CARD16 opcode;
+ __GLXrenderHeader *hdr;
+ GLbyte *pc;
+ __GLXrenderSizeData *entry;
+ int extra;
+ void (*proc) (GLbyte *);
+
+ __GLX_DECLARE_SWAP_VARIABLES;
+
+ pc = *ppc;
+ left = *pleft;
+ opcode = 0;
+
+ while (left > 0 && opcode != X_GLrop_End)
+ {
+ /*
+ ** Verify that the header length and the overall length agree.
+ ** Also, each command must be word aligned.
+ */
+ hdr = (__GLXrenderHeader *) pc;
+ __GLX_SWAP_SHORT(&hdr->length);
+ __GLX_SWAP_SHORT(&hdr->opcode);
+ cmdlen = hdr->length;
+ opcode = hdr->opcode;
+
+ if ( (opcode >= __GLX_MIN_RENDER_OPCODE) &&
+ (opcode <= __GLX_MAX_RENDER_OPCODE) ) {
+ entry = &__glXRenderSizeTable[opcode];
+ proc = __glXSwapRenderTable[opcode];
+#if __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT
+ } else if ( (opcode >= __GLX_MIN_RENDER_OPCODE_EXT) &&
+ (opcode <= __GLX_MAX_RENDER_OPCODE_EXT) ) {
+ int index = opcode - __GLX_MIN_RENDER_OPCODE_EXT;
+ entry = &__glXRenderSizeTable_EXT[index];
+ proc = __glXSwapRenderTable_EXT[index];
+#endif /* __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT */
+ } else {
+ client->errorValue = *commandsDone;
+ cl->beBufLen = 0;
+ return __glXBadRenderRequest;
+ }
+
+ if (!entry->bytes) {
+ /* unused opcode */
+ client->errorValue = *commandsDone;
+ cl->beBufLen = 0;
+ return __glXBadRenderRequest;
+ }
+ if (entry->varsize) {
+ /* variable size command */
+ extra = (*entry->varsize)(pc + __GLX_RENDER_HDR_SIZE, True);
+ if (extra < 0) {
+ extra = 0;
+ }
+ if (cmdlen != __GLX_PAD(entry->bytes + extra)) {
+ cl->beBufLen = 0;
+ return BadLength;
+ }
+ } else {
+ /* constant size command */
+ if (cmdlen != __GLX_PAD(entry->bytes)) {
+ cl->beBufLen = 0;
+ return BadLength;
+ }
+ }
+ if (left < cmdlen) {
+ cl->beBufLen = 0;
+ return BadLength;
+ }
+
+ (*commandsDone)++;
+
+ pc += cmdlen;
+ left -= cmdlen;
+ }
+
+ if (opcode == X_GLrop_End)
+ {
+ pc = cl->beBuf;
+ left = cl->beBufLen;
+ opcode = 0;
+
+ while (left > 0 && opcode != X_GLrop_End)
+ {
+ hdr = (__GLXrenderHeader *) pc;
+ cmdlen = hdr->length;
+ opcode = hdr->opcode;
+
+ if ((opcode >= __GLX_MIN_RENDER_OPCODE) &&
+ (opcode <= __GLX_MAX_RENDER_OPCODE))
+ {
+ entry = &__glXRenderSizeTable[opcode];
+ proc = __glXSwapRenderTable[opcode];
+ }
+
+#if __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT
+ else
+ {
+ int index = opcode - __GLX_MIN_RENDER_OPCODE_EXT;
+
+ entry = &__glXRenderSizeTable_EXT[index];
+ proc = __glXSwapRenderTable_EXT[index];
+ }
+#endif
+
+ (*proc) (pc + __GLX_RENDER_HDR_SIZE);
+
+ pc += cmdlen;
+ left -= cmdlen;
+ }
+
+ cl->beBufLen = 0;
+
+ pc = *ppc;
+ left = *pleft;
+ opcode = 0;
+
+ while (opcode != X_GLrop_End)
+ {
+ hdr = (__GLXrenderHeader *) pc;
+ cmdlen = hdr->length;
+ opcode = hdr->opcode;
+
+ if ((opcode >= __GLX_MIN_RENDER_OPCODE) &&
+ (opcode <= __GLX_MAX_RENDER_OPCODE))
+ {
+ entry = &__glXRenderSizeTable[opcode];
+ proc = __glXRenderTable[opcode];
+ }
+
+#if __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT
+ else
+ {
+ int index = opcode - __GLX_MIN_RENDER_OPCODE_EXT;
+
+ entry = &__glXRenderSizeTable_EXT[index];
+ proc = __glXRenderTable_EXT[index];
+ }
+#endif
+
+ (*proc) (pc + __GLX_RENDER_HDR_SIZE);
+
+ pc += cmdlen;
+ left -= cmdlen;
+ }
+ }
+ else
+ {
+ int size;
+
+ size = pc - *ppc;
+ if (cl->beBufSize < cl->beBufLen + size)
+ {
+ cl->beBuf = (GLbyte *) Xrealloc (cl->beBuf, cl->beBufLen + size);
+ if (!cl->beBuf)
+ cl->beBufLen = size = 0;
+
+ cl->beBufSize = cl->beBufLen + size;
+ }
+
+ if (size)
+ memcpy (cl->beBuf + cl->beBufLen, *ppc, size);
+ }
+
+ *ppc = pc;
+ *pleft = left;
+
+ return Success;
+}
+
/*
** Render and Renderlarge are not in the GLX API. They are used by the GLX
** client library to send batches of GL rendering commands.
@@ -607,17 +785,26 @@
return BadLength;
}
- /*
- ** Skip over the header and execute the command. We allow the
- ** caller to trash the command memory. This is useful especially
- ** for things that require double alignment - they can just shift
- ** the data towards lower memory (trashing the header) by 4 bytes
- ** and achieve the required alignment.
- */
- (*proc)(pc + __GLX_RENDER_HDR_SIZE);
- pc += cmdlen;
- left -= cmdlen;
- commandsDone++;
+ if (opcode == X_GLrop_Begin || cl->beBufLen > 0)
+ {
+ error = __glXSwapRenderBeginEnd (cl, &commandsDone, &pc, &left);
+ if (error != Success)
+ return error;
+ }
+ else
+ {
+ /*
+ ** Skip over the header and execute the command. We allow the
+ ** caller to trash the command memory. This is useful especially
+ ** for things that require double alignment - they can just shift
+ ** the data towards lower memory (trashing the header) by 4 bytes
+ ** and achieve the required alignment.
+ */
+ (*proc)(pc + __GLX_RENDER_HDR_SIZE);
+ pc += cmdlen;
+ left -= cmdlen;
+ commandsDone++;
+ }
}
__GLX_NOTE_UNFLUSHED_CMDS(cx);
return Success;
Index: glxext.c
===================================================================
RCS file: /cvs/xserver/xserver/GL/glx/glxext.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- glxext.c 23 Dec 2005 02:07:57 -0000 1.9
+++ glxext.c 3 Jan 2006 09:43:40 -0000 1.10
@@ -72,6 +72,7 @@
__GLXclientState *cl = __glXClients[clientIndex];
if (cl->returnBuf) __glXFree(cl->returnBuf);
+ if (cl->beBuf) __glXFree(cl->beBuf);
if (cl->largeCmdBuf) __glXFree(cl->largeCmdBuf);
if (cl->currentContexts) __glXFree(cl->currentContexts);
if (cl->GLClientextensions) __glXFree(cl->GLClientextensions);
Index: glxscreens.c
===================================================================
RCS file: /cvs/xserver/xserver/GL/glx/glxscreens.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- glxscreens.c 7 Jun 2005 15:25:02 -0000 1.17
+++ glxscreens.c 3 Jan 2006 09:43:40 -0000 1.18
@@ -34,6 +34,9 @@
**
*/
+#include "glxserver.h"
+#include "glxutil.h"
+
#ifdef IN_MODULE
#include <xf86_ansic.h>
#else
@@ -43,9 +46,6 @@
#include <windowstr.h>
-#include "glxserver.h"
-#include "glxutil.h"
-
static const char GLServerExtensions[] =
"GL_ARB_depth_texture "
"GL_ARB_imaging "
@@ -63,6 +63,7 @@
"GL_ARB_texture_mirrored_repeat "
"GL_ARB_transpose_matrix "
"GL_ARB_window_pos "
+ "GL_ARB_texture_non_power_of_two "
"GL_EXT_abgr "
"GL_EXT_bgra "
"GL_EXT_blend_color "
@@ -95,6 +96,7 @@
"GL_EXT_texture_object "
"GL_EXT_texture_rectangle "
"GL_EXT_vertex_array "
+ "GL_EXT_texture_filter_anisotropic "
"GL_APPLE_packed_pixels "
"GL_ATI_texture_mirror_once "
"GL_ATI_texture_env_combine3 "
@@ -112,6 +114,7 @@
"GL_NV_point_sprite "
"GL_NV_texgen_reflection "
"GL_NV_texture_rectangle "
+ "GL_NV_texture_env_combine4 "
"GL_SGIS_generate_mipmap "
"GL_SGIS_texture_border_clamp "
"GL_SGIS_texture_edge_clamp "
@@ -119,7 +122,6 @@
"GL_SGIX_depth_texture "
"GL_SGIX_shadow "
"GL_SGIX_shadow_ambient "
- "GL_ARB_texture_non_power_of_two "
;
/*
@@ -133,15 +135,11 @@
"GLX_EXT_visual_info "
"GLX_EXT_visual_rating "
"GLX_EXT_import_context "
- "GLX_SGI_make_current_read "
+/* "GLX_SGI_make_current_read " */
"GLX_SGIS_multisample "
"GLX_MESA_render_texture "
;
-/*
-** This comes from the GL library that the server will link with. Right
-** now, that is the DDX Sample OpenGL.
-*/
extern __GLXscreenInfo __glDDXScreenInfo;
__GLXscreenInfo *__glXScreens[] = {
Index: glxserver.h
===================================================================
RCS file: /cvs/xserver/xserver/GL/glx/glxserver.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- glxserver.h 3 Jan 2006 07:39:40 -0000 1.10
+++ glxserver.h 3 Jan 2006 09:43:40 -0000 1.11
@@ -40,7 +40,6 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-
#include <X11/X.h>
#include <X11/Xproto.h>
#include <X11/Xmd.h>
@@ -140,6 +139,13 @@
GLint returnBufSize;
/*
+ ** Begin/End buffer.
+ */
+ GLbyte *beBuf;
+ GLint beBufLen;
+ GLint beBufSize;
+
+ /*
** Keep track of large rendering commands, which span multiple requests.
*/
GLint largeCmdBytesSoFar; /* bytes received so far */
Index: glxutil.c
===================================================================
RCS file: /cvs/xserver/xserver/GL/glx/glxutil.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- glxutil.c 3 Jul 2003 18:05:13 -0000 1.4
+++ glxutil.c 3 Jan 2006 09:43:40 -0000 1.5
@@ -296,7 +296,7 @@
assert(glxc->readPriv->width == 0);
assert(glxc->readPriv->height == 0);
(*glci->exports.notifyDestroy)(gc);
- __glXDeassociateContext(glxc);
+ /* __glXDeassociateContext(glxc); */
assert((glxc->pendingState & __GLX_PENDING_DESTROY) == 0x0);
}
if (glxc->pendingState & __GLX_PENDING_SWAP) {
Index: singlesize.c
===================================================================
RCS file: /cvs/xserver/xserver/GL/glx/singlesize.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- singlesize.c 7 Jun 2005 15:25:02 -0000 1.9
+++ singlesize.c 3 Jan 2006 09:43:40 -0000 1.10
@@ -1083,6 +1083,10 @@
case GL_MODELVIEW1_MATRIX_EXT:
return 32;
+ /* GL_EXT_texture_filter_anisotropic */
+ case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
+ return 1;
+
/* GL_ARB_texture_comrpession / GL 1.3 */
case GL_COMPRESSED_TEXTURE_FORMATS: {
GLint temp;
More information about the xserver-commit
mailing list