/** * Internal function used for \c glCompressedTexImage1D and * \c glCompressedTexImage2D. */ static void CompressedTexImage1D2D( GLenum target, GLint level, GLenum internal_format, GLsizei width, GLsizei height, GLint border, GLsizei image_size, const GLvoid *data, CARD32 rop ) { __GLX_DECLARE_VARIABLES(); __GLX_LOAD_VARIABLES(); if ( gc->currentDpy == NULL ) { return; } if ( (target == GL_PROXY_TEXTURE_1D) || (target == GL_PROXY_TEXTURE_2D) || (target == GL_PROXY_TEXTURE_CUBE_MAP) ) { compsize = 0; } else { compsize = image_size; } cmdlen = __GLX_PAD( __GLX_COMPRESSED_TEXIMAGE_CMD_HDR_SIZE + compsize ); if ( cmdlen <= gc->maxSmallRenderCommandSize ) { __GLX_BEGIN_VARIABLE( rop, cmdlen ); __GLX_PUT_LONG( 4, target ); __GLX_PUT_LONG( 8, level ); __GLX_PUT_LONG( 12, internal_format ); __GLX_PUT_LONG( 16, width ); __GLX_PUT_LONG( 20, height ); __GLX_PUT_LONG( 24, border ); __GLX_PUT_LONG( 28, image_size ); if ( compsize != 0 ) { __GLX_PUT_CHAR_ARRAY( __GLX_COMPRESSED_TEXIMAGE_CMD_HDR_SIZE, data, image_size ); } __GLX_END( cmdlen ); } else { assert( compsize != 0 ); __GLX_BEGIN_VARIABLE_LARGE( rop, cmdlen + 4 ); __GLX_PUT_LONG( 8, target ); __GLX_PUT_LONG( 12, level ); __GLX_PUT_LONG( 16, internal_format ); __GLX_PUT_LONG( 20, width ); __GLX_PUT_LONG( 24, height ); __GLX_PUT_LONG( 28, border ); __GLX_PUT_LONG( 32, image_size ); __glXSendLargeCommand( gc, gc->pc, __GLX_COMPRESSED_TEXIMAGE_CMD_HDR_SIZE + 4, data, image_size ); } }
void __indirect_glCompressedTexSubImage3DARB( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei image_size, const GLvoid *data ) { __GLX_DECLARE_VARIABLES(); __GLX_LOAD_VARIABLES(); if ( gc->currentDpy == NULL ) { return; } cmdlen = __GLX_PAD( __GLX_COMPRESSED_TEXSUBIMAGE_3D_CMD_HDR_SIZE + image_size ); if ( cmdlen <= gc->maxSmallRenderCommandSize ) { __GLX_BEGIN_VARIABLE( X_GLrop_CompressedTexSubImage3D, cmdlen ); __GLX_PUT_LONG( 4, target ); __GLX_PUT_LONG( 8, level ); __GLX_PUT_LONG( 12, xoffset ); __GLX_PUT_LONG( 16, yoffset ); __GLX_PUT_LONG( 20, zoffset ); __GLX_PUT_LONG( 24, width ); __GLX_PUT_LONG( 28, height ); __GLX_PUT_LONG( 32, depth ); __GLX_PUT_LONG( 36, format ); __GLX_PUT_LONG( 40, image_size ); if ( image_size != 0 ) { __GLX_PUT_CHAR_ARRAY( __GLX_COMPRESSED_TEXSUBIMAGE_3D_CMD_HDR_SIZE, data, image_size ); } __GLX_END( cmdlen ); } else { __GLX_BEGIN_VARIABLE_LARGE( X_GLrop_CompressedTexSubImage3D, cmdlen + 4 ); __GLX_PUT_LONG( 8, target ); __GLX_PUT_LONG( 12, level ); __GLX_PUT_LONG( 16, xoffset ); __GLX_PUT_LONG( 20, yoffset ); __GLX_PUT_LONG( 24, zoffset ); __GLX_PUT_LONG( 28, width ); __GLX_PUT_LONG( 32, height ); __GLX_PUT_LONG( 36, depth ); __GLX_PUT_LONG( 40, format ); __GLX_PUT_LONG( 44, image_size ); __glXSendLargeCommand( gc, gc->pc, __GLX_COMPRESSED_TEXSUBIMAGE_3D_CMD_HDR_SIZE + 4, data, image_size ); } }
void __indirect_glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * pnts) { __GLX_DECLARE_VARIABLES(); GLint k; __GLX_LOAD_VARIABLES(); k = __glMap1d_size(target); if (k == 0) { __glXSetError(gc, GL_INVALID_ENUM); return; } else if (stride < k || order <= 0) { __glXSetError(gc, GL_INVALID_VALUE); return; } compsize = k * order * __GLX_SIZE_FLOAT64; cmdlen = 28 + compsize; if (!gc->currentDpy) return; if (cmdlen <= gc->maxSmallRenderCommandSize) { /* Use GLXRender protocol to send small command */ __GLX_BEGIN_VARIABLE(X_GLrop_Map1d, cmdlen); __GLX_PUT_DOUBLE(4, u1); __GLX_PUT_DOUBLE(12, u2); __GLX_PUT_LONG(20, target); __GLX_PUT_LONG(24, order); /* ** NOTE: the doubles that follow are not aligned because of 3 ** longs preceeding */ __glFillMap1d(k, order, stride, pnts, (pc + 28)); __GLX_END(cmdlen); } else { /* Use GLXRenderLarge protocol to send command */ __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map1d, cmdlen + 4); __GLX_PUT_DOUBLE(8, u1); __GLX_PUT_DOUBLE(16, u2); __GLX_PUT_LONG(24, target); __GLX_PUT_LONG(28, order); /* ** NOTE: the doubles that follow are not aligned because of 3 ** longs preceeding */ if (stride != k) { GLubyte *buf; buf = (GLubyte *) Xmalloc(compsize); if (!buf) { __glXSetError(gc, GL_OUT_OF_MEMORY); return; } __glFillMap1d(k, order, stride, pnts, buf); __glXSendLargeCommand(gc, pc, 32, buf, compsize); Xfree((char *) buf); } else { /* Data is already packed. Just send it out */ __glXSendLargeCommand(gc, pc, 32, pnts, compsize); } } }
void __indirect_glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustr, GLint uord, GLfloat v1, GLfloat v2, GLint vstr, GLint vord, const GLfloat * pnts) { __GLX_DECLARE_VARIABLES(); GLint k; __GLX_LOAD_VARIABLES(); k = __glMap2f_size(target); if (k == 0) { __glXSetError(gc, GL_INVALID_ENUM); return; } else if (vstr < k || ustr < k || vord <= 0 || uord <= 0) { __glXSetError(gc, GL_INVALID_VALUE); return; } compsize = k * uord * vord * __GLX_SIZE_FLOAT32; cmdlen = 32 + compsize; if (!gc->currentDpy) return; /* ** The order that arguments are packed is different from the order ** for glMap2d. */ if (cmdlen <= gc->maxSmallRenderCommandSize) { /* Use GLXRender protocol to send small command */ __GLX_BEGIN_VARIABLE(X_GLrop_Map2f, cmdlen); __GLX_PUT_LONG(4, target); __GLX_PUT_FLOAT(8, u1); __GLX_PUT_FLOAT(12, u2); __GLX_PUT_LONG(16, uord); __GLX_PUT_FLOAT(20, v1); __GLX_PUT_FLOAT(24, v2); __GLX_PUT_LONG(28, vord); /* ** Pack into a u-major ordering. */ __glFillMap2f(k, uord, vord, ustr, vstr, pnts, (GLfloat *) (pc + 32)); __GLX_END(cmdlen); } else { /* Use GLXRenderLarge protocol to send command */ __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map2f, cmdlen + 4); __GLX_PUT_LONG(8, target); __GLX_PUT_FLOAT(12, u1); __GLX_PUT_FLOAT(16, u2); __GLX_PUT_LONG(20, uord); __GLX_PUT_FLOAT(24, v1); __GLX_PUT_FLOAT(28, v2); __GLX_PUT_LONG(32, vord); if ((vstr != k) || (ustr != k * vord)) { GLfloat *buf; buf = (GLfloat *) Xmalloc(compsize); if (!buf) { __glXSetError(gc, GL_OUT_OF_MEMORY); return; } /* ** Pack into a u-major ordering. */ __glFillMap2f(k, uord, vord, ustr, vstr, pnts, buf); __glXSendLargeCommand(gc, pc, 36, buf, compsize); Xfree((char *) buf); } else { /* Data is already packed. Just send it out */ __glXSendLargeCommand(gc, pc, 36, pnts, compsize); } } }
void __indirect_glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustr, GLint uord, GLdouble v1, GLdouble v2, GLint vstr, GLint vord, const GLdouble * pnts) { __GLX_DECLARE_VARIABLES(); GLint k; __GLX_LOAD_VARIABLES(); k = __glMap2d_size(target); if (k == 0) { __glXSetError(gc, GL_INVALID_ENUM); return; } else if (vstr < k || ustr < k || vord <= 0 || uord <= 0) { __glXSetError(gc, GL_INVALID_VALUE); return; } compsize = k * uord * vord * __GLX_SIZE_FLOAT64; cmdlen = 48 + compsize; if (!gc->currentDpy) return; if (cmdlen <= gc->maxSmallRenderCommandSize) { /* Use GLXRender protocol to send small command */ __GLX_BEGIN_VARIABLE(X_GLrop_Map2d, cmdlen); __GLX_PUT_DOUBLE(4, u1); __GLX_PUT_DOUBLE(12, u2); __GLX_PUT_DOUBLE(20, v1); __GLX_PUT_DOUBLE(28, v2); __GLX_PUT_LONG(36, target); __GLX_PUT_LONG(40, uord); __GLX_PUT_LONG(44, vord); /* ** Pack into a u-major ordering. ** NOTE: the doubles that follow are not aligned because of 5 ** longs preceeding */ __glFillMap2d(k, uord, vord, ustr, vstr, pnts, (GLdouble *) (pc + 48)); __GLX_END(cmdlen); } else { /* Use GLXRenderLarge protocol to send command */ __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map2d, cmdlen + 4); __GLX_PUT_DOUBLE(8, u1); __GLX_PUT_DOUBLE(16, u2); __GLX_PUT_DOUBLE(24, v1); __GLX_PUT_DOUBLE(32, v2); __GLX_PUT_LONG(40, target); __GLX_PUT_LONG(44, uord); __GLX_PUT_LONG(48, vord); /* ** NOTE: the doubles that follow are not aligned because of 5 ** longs preceeding */ if ((vstr != k) || (ustr != k * vord)) { GLdouble *buf; buf = (GLdouble *) Xmalloc(compsize); if (!buf) { __glXSetError(gc, GL_OUT_OF_MEMORY); return; } /* ** Pack into a u-major ordering. */ __glFillMap2d(k, uord, vord, ustr, vstr, pnts, buf); __glXSendLargeCommand(gc, pc, 52, buf, compsize); Xfree((char *) buf); } else { /* Data is already packed. Just send it out */ __glXSendLargeCommand(gc, pc, 52, pnts, compsize); } } }
void __indirect_glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * pnts) { __GLX_DECLARE_VARIABLES(); GLint k; __GLX_LOAD_VARIABLES(); k = __glMap1f_size(target); if (k == 0) { __glXSetError(gc, GL_INVALID_ENUM); return; } else if (stride < k || order <= 0) { __glXSetError(gc, GL_INVALID_VALUE); return; } compsize = k * order * __GLX_SIZE_FLOAT32; cmdlen = 20 + compsize; if (!gc->currentDpy) return; /* ** The order that arguments are packed is different from the order ** for glMap1d. */ if (cmdlen <= gc->maxSmallRenderCommandSize) { /* Use GLXRender protocol to send small command */ __GLX_BEGIN_VARIABLE(X_GLrop_Map1f, cmdlen); __GLX_PUT_LONG(4, target); __GLX_PUT_FLOAT(8, u1); __GLX_PUT_FLOAT(12, u2); __GLX_PUT_LONG(16, order); __glFillMap1f(k, order, stride, pnts, (GLubyte *) (pc + 20)); __GLX_END(cmdlen); } else { /* Use GLXRenderLarge protocol to send command */ __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map1f, cmdlen + 4); __GLX_PUT_LONG(8, target); __GLX_PUT_FLOAT(12, u1); __GLX_PUT_FLOAT(16, u2); __GLX_PUT_LONG(20, order); if (stride != k) { GLubyte *buf; buf = (GLubyte *) Xmalloc(compsize); if (!buf) { __glXSetError(gc, GL_OUT_OF_MEMORY); return; } __glFillMap1f(k, order, stride, pnts, buf); __glXSendLargeCommand(gc, pc, 24, buf, compsize); Xfree((char *) buf); } else { /* Data is already packed. Just send it out */ __glXSendLargeCommand(gc, pc, 24, pnts, compsize); } } }
/** * Emit GLX DrawArrays protocol using a GLXRenderLarge packet. */ static void emit_RenderLarge_DrawArrays(__GLXcontext * gc, const struct array_info * arrays, GLsizei first, GLsizei count, GLsizei num_arrays, GLenum mode, GLsizei cmdlen, GLsizei total_vertex_size) { GLubyte * pc = gc->pc; GLsizei offset; GLsizei i; GLint maxSize; GLint totalRequests; GLint requestNumber; GLsizei elements_per_request; /* Calculate the maximum amount of data can be stuffed into a single * packet. sz_xGLXRenderReq is added because bufSize is the maximum * packet size minus sz_xGLXRenderReq. * * The important value here is elements_per_request. This is the number * of complete array elements that will fit in a single buffer. There * may be some wasted space at the end of the buffer, but splitting * elements across buffer boundries would be painful. */ maxSize = (gc->bufSize + sz_xGLXRenderReq) - sz_xGLXRenderLargeReq; elements_per_request = maxSize / total_vertex_size; totalRequests = ((count + (elements_per_request - 1)) / elements_per_request) + 1; /* Fill in the header data and send it away. */ __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_DrawArrays, cmdlen+4); emit_header(pc + 8, arrays, num_arrays, count, mode); gc->pc = pc + (__GLX_DRAWARRAYS_CMD_HDR_SIZE + 4) + (__GLX_COMPONENT_HDR_SIZE * num_arrays); __glXSendLargeChunk(gc, 1, totalRequests, gc->buf, gc->pc - gc->buf); /* Write the actual array data. */ offset = 0; requestNumber = 2; for ( i = 0 ; i < count ; i++ ) { if ( i == elements_per_request ) { __glXSendLargeChunk(gc, requestNumber, totalRequests, gc->buf, offset); requestNumber++; offset = 0; count -= i; first += i; i = 0; } offset = emit_vertex(gc->buf, arrays, num_arrays, i + first, offset); } /* If the buffer isn't empty, emit the last, partial request. */ if ( offset != 0 ) { assert(requestNumber == totalRequests); __glXSendLargeChunk(gc, requestNumber, totalRequests, gc->buf, offset); } gc->pc = gc->buf; }