13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the "Software"),
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * to deal in the Software without restriction, including without limitation
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Software is furnished to do so, subject to the following conditions:
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice including the dates of first publication and
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * either this permission notice or a reference to
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * http://oss.sgi.com/projects/FreeB/
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * shall be included in all copies or substantial portions of the Software.
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE.
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Except as contained in this notice, the name of Silicon Graphics, Inc.
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * shall not be used in advertising or otherwise to promote the sale, use or
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * other dealings in this Software without prior written authorization from
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Silicon Graphics, Inc.
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "packrender.h"
323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "indirect.h"
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "indirect_size.h"
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org** This file contains routines that might need to be transported as
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org** GLXRender or GLXRenderLarge commands, and these commands don't
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org** use the pixel header.  See renderpix.c for those routines.
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org*/
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride,
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                   GLint order, const GLdouble * pnts)
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_DECLARE_VARIABLES();
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLint k;
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_LOAD_VARIABLES();
493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   k = __glMap1d_size(target);
503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (k == 0) {
513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSetError(gc, GL_INVALID_ENUM);
523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else if (stride < k || order <= 0) {
553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSetError(gc, GL_INVALID_VALUE);
563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   compsize = k * order * __GLX_SIZE_FLOAT64;
593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdlen = 28 + compsize;
603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (!gc->currentDpy)
613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (cmdlen <= gc->maxSmallRenderCommandSize) {
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /* Use GLXRender protocol to send small command */
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE(X_GLrop_Map1d, cmdlen);
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(4, u1);
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(12, u2);
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, target);
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(24, order);
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /*
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       ** NOTE: the doubles that follow are not aligned because of 3
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       ** longs preceeding
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       */
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glFillMap1d(k, order, stride, pnts, (pc + 28));
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_END(cmdlen);
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /* Use GLXRenderLarge protocol to send command */
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map1d, cmdlen + 4);
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(8, u1);
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(16, u2);
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(24, target);
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(28, order);
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /*
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       ** NOTE: the doubles that follow are not aligned because of 3
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       ** longs preceeding
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       */
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (stride != k) {
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         GLubyte *buf;
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         buf = (GLubyte *) Xmalloc(compsize);
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         if (!buf) {
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            __glXSetError(gc, GL_OUT_OF_MEMORY);
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            return;
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         }
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glFillMap1d(k, order, stride, pnts, buf);
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glXSendLargeCommand(gc, pc, 32, buf, compsize);
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         Xfree((char *) buf);
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else {
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         /* Data is already packed.  Just send it out */
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glXSendLargeCommand(gc, pc, 32, pnts, compsize);
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride,
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                   GLint order, const GLfloat * pnts)
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_DECLARE_VARIABLES();
1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLint k;
1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_LOAD_VARIABLES();
1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   k = __glMap1f_size(target);
1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (k == 0) {
1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSetError(gc, GL_INVALID_ENUM);
1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else if (stride < k || order <= 0) {
1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSetError(gc, GL_INVALID_VALUE);
1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   compsize = k * order * __GLX_SIZE_FLOAT32;
1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdlen = 20 + compsize;
1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (!gc->currentDpy)
1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /*
1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    ** The order that arguments are packed is different from the order
1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    ** for glMap1d.
1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    */
1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (cmdlen <= gc->maxSmallRenderCommandSize) {
1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /* Use GLXRender protocol to send small command */
1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE(X_GLrop_Map1f, cmdlen);
1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(4, target);
1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(8, u1);
1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(12, u2);
1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(16, order);
1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glFillMap1f(k, order, stride, pnts, (GLubyte *) (pc + 20));
1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_END(cmdlen);
1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /* Use GLXRenderLarge protocol to send command */
1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map1f, cmdlen + 4);
1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(8, target);
1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(12, u1);
1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(16, u2);
1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, order);
1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (stride != k) {
1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         GLubyte *buf;
1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         buf = (GLubyte *) Xmalloc(compsize);
1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         if (!buf) {
1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            __glXSetError(gc, GL_OUT_OF_MEMORY);
1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            return;
1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         }
1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glFillMap1f(k, order, stride, pnts, buf);
1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glXSendLargeCommand(gc, pc, 24, buf, compsize);
1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         Xfree((char *) buf);
1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else {
1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         /* Data is already packed.  Just send it out */
1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glXSendLargeCommand(gc, pc, 24, pnts, compsize);
1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustr,
1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                   GLint uord, GLdouble v1, GLdouble v2, GLint vstr,
1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                   GLint vord, const GLdouble * pnts)
1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_DECLARE_VARIABLES();
1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLint k;
1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_LOAD_VARIABLES();
1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   k = __glMap2d_size(target);
1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (k == 0) {
1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSetError(gc, GL_INVALID_ENUM);
1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else if (vstr < k || ustr < k || vord <= 0 || uord <= 0) {
1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSetError(gc, GL_INVALID_VALUE);
1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   compsize = k * uord * vord * __GLX_SIZE_FLOAT64;
1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdlen = 48 + compsize;
1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (!gc->currentDpy)
1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (cmdlen <= gc->maxSmallRenderCommandSize) {
1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /* Use GLXRender protocol to send small command */
1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE(X_GLrop_Map2d, cmdlen);
1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(4, u1);
1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(12, u2);
1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(20, v1);
2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(28, v2);
2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(36, target);
2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(40, uord);
2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(44, vord);
2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /*
2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       ** Pack into a u-major ordering.
2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       ** NOTE: the doubles that follow are not aligned because of 5
2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       ** longs preceeding
2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       */
2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glFillMap2d(k, uord, vord, ustr, vstr, pnts, (GLdouble *) (pc + 48));
2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_END(cmdlen);
2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /* Use GLXRenderLarge protocol to send command */
2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map2d, cmdlen + 4);
2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(8, u1);
2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(16, u2);
2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(24, v1);
2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_DOUBLE(32, v2);
2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(40, target);
2203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(44, uord);
2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(48, vord);
2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /*
2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       ** NOTE: the doubles that follow are not aligned because of 5
2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       ** longs preceeding
2263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       */
2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if ((vstr != k) || (ustr != k * vord)) {
2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         GLdouble *buf;
2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         buf = (GLdouble *) Xmalloc(compsize);
2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         if (!buf) {
2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            __glXSetError(gc, GL_OUT_OF_MEMORY);
2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            return;
2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         }
2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         /*
2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          ** Pack into a u-major ordering.
2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          */
2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glFillMap2d(k, uord, vord, ustr, vstr, pnts, buf);
2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glXSendLargeCommand(gc, pc, 52, buf, compsize);
2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         Xfree((char *) buf);
2413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
2423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else {
2433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         /* Data is already packed.  Just send it out */
2443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glXSendLargeCommand(gc, pc, 52, pnts, compsize);
2453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
2463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
2503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustr,
2513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                   GLint uord, GLfloat v1, GLfloat v2, GLint vstr, GLint vord,
2523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                   const GLfloat * pnts)
2533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_DECLARE_VARIABLES();
2553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLint k;
2563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_LOAD_VARIABLES();
2583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   k = __glMap2f_size(target);
2593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (k == 0) {
2603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSetError(gc, GL_INVALID_ENUM);
2613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
2623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else if (vstr < k || ustr < k || vord <= 0 || uord <= 0) {
2643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSetError(gc, GL_INVALID_VALUE);
2653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
2663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   compsize = k * uord * vord * __GLX_SIZE_FLOAT32;
2683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdlen = 32 + compsize;
2693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (!gc->currentDpy)
2703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
2713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /*
2733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    ** The order that arguments are packed is different from the order
2743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    ** for glMap2d.
2753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    */
2763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (cmdlen <= gc->maxSmallRenderCommandSize) {
2773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /* Use GLXRender protocol to send small command */
2783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE(X_GLrop_Map2f, cmdlen);
2793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(4, target);
2803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(8, u1);
2813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(12, u2);
2823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(16, uord);
2833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(20, v1);
2843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(24, v2);
2853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(28, vord);
2863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /*
2873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       ** Pack into a u-major ordering.
2883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       */
2893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glFillMap2f(k, uord, vord, ustr, vstr, pnts, (GLfloat *) (pc + 32));
2903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_END(cmdlen);
2913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
2933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /* Use GLXRenderLarge protocol to send command */
2943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map2f, cmdlen + 4);
2953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(8, target);
2963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(12, u1);
2973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(16, u2);
2983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, uord);
2993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(24, v1);
3003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_FLOAT(28, v2);
3013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(32, vord);
3023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if ((vstr != k) || (ustr != k * vord)) {
3043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         GLfloat *buf;
3053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         buf = (GLfloat *) Xmalloc(compsize);
3073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         if (!buf) {
3083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            __glXSetError(gc, GL_OUT_OF_MEMORY);
3093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            return;
3103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         }
3113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         /*
3123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          ** Pack into a u-major ordering.
3133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          */
3143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glFillMap2f(k, uord, vord, ustr, vstr, pnts, buf);
3153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glXSendLargeCommand(gc, pc, 36, buf, compsize);
3163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         Xfree((char *) buf);
3173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
3183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else {
3193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         /* Data is already packed.  Just send it out */
3203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __glXSendLargeCommand(gc, pc, 36, pnts, compsize);
3213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
3223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
3263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glEnable(GLenum cap)
3273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_DECLARE_VARIABLES();
3293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_LOAD_VARIABLES();
3313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (!gc->currentDpy)
3323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
3333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   switch (cap) {
3353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_COLOR_ARRAY:
3363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_EDGE_FLAG_ARRAY:
3373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_INDEX_ARRAY:
3383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_NORMAL_ARRAY:
3393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_TEXTURE_COORD_ARRAY:
3403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_VERTEX_ARRAY:
3413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_SECONDARY_COLOR_ARRAY:
3423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_FOG_COORD_ARRAY:
3433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __indirect_glEnableClientState(cap);
3443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
3453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   default:
3463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
3473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_BEGIN(X_GLrop_Enable, 8);
3503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_PUT_LONG(4, cap);
3513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_END(8);
3523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
3553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glDisable(GLenum cap)
3563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_DECLARE_VARIABLES();
3583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_LOAD_VARIABLES();
3603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (!gc->currentDpy)
3613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
3623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   switch (cap) {
3643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_COLOR_ARRAY:
3653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_EDGE_FLAG_ARRAY:
3663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_INDEX_ARRAY:
3673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_NORMAL_ARRAY:
3683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_TEXTURE_COORD_ARRAY:
3693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_VERTEX_ARRAY:
3703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_SECONDARY_COLOR_ARRAY:
3713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case GL_FOG_COORD_ARRAY:
3723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __indirect_glDisableClientState(cap);
3733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
3743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   default:
3753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
3763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_BEGIN(X_GLrop_Disable, 8);
3793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_PUT_LONG(4, cap);
3803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_END(8);
3813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
382