render2swap.c revision 4642e01f
14642e01fSmrg/*
24642e01fSmrg * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
34642e01fSmrg * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
44642e01fSmrg *
54642e01fSmrg * Permission is hereby granted, free of charge, to any person obtaining a
64642e01fSmrg * copy of this software and associated documentation files (the "Software"),
74642e01fSmrg * to deal in the Software without restriction, including without limitation
84642e01fSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
94642e01fSmrg * and/or sell copies of the Software, and to permit persons to whom the
104642e01fSmrg * Software is furnished to do so, subject to the following conditions:
114642e01fSmrg *
124642e01fSmrg * The above copyright notice including the dates of first publication and
134642e01fSmrg * either this permission notice or a reference to
144642e01fSmrg * http://oss.sgi.com/projects/FreeB/
154642e01fSmrg * shall be included in all copies or substantial portions of the Software.
164642e01fSmrg *
174642e01fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
184642e01fSmrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
194642e01fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
204642e01fSmrg * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
214642e01fSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
224642e01fSmrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
234642e01fSmrg * SOFTWARE.
244642e01fSmrg *
254642e01fSmrg * Except as contained in this notice, the name of Silicon Graphics, Inc.
264642e01fSmrg * shall not be used in advertising or otherwise to promote the sale, use or
274642e01fSmrg * other dealings in this Software without prior written authorization from
284642e01fSmrg * Silicon Graphics, Inc.
294642e01fSmrg */
304642e01fSmrg
314642e01fSmrg/* #define NEED_REPLIES */
324642e01fSmrg#ifdef HAVE_DIX_CONFIG_H
334642e01fSmrg#include <dix-config.h>
344642e01fSmrg#endif
354642e01fSmrg
364642e01fSmrg#include "glxserver.h"
374642e01fSmrg#include "unpack.h"
384642e01fSmrg#include "indirect_size.h"
394642e01fSmrg#include "indirect_dispatch.h"
404642e01fSmrg#include "glapitable.h"
414642e01fSmrg#include "glapi.h"
424642e01fSmrg#include "glthread.h"
434642e01fSmrg#include "dispatch.h"
444642e01fSmrg
454642e01fSmrg
464642e01fSmrgvoid __glXDispSwap_Map1f(GLbyte *pc)
474642e01fSmrg{
484642e01fSmrg    GLint order, k;
494642e01fSmrg    GLfloat u1, u2, *points;
504642e01fSmrg    GLenum target;
514642e01fSmrg    GLint compsize;
524642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
534642e01fSmrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
544642e01fSmrg
554642e01fSmrg    __GLX_SWAP_INT(pc + 0);
564642e01fSmrg    __GLX_SWAP_INT(pc + 12);
574642e01fSmrg    __GLX_SWAP_FLOAT(pc + 4);
584642e01fSmrg    __GLX_SWAP_FLOAT(pc + 8);
594642e01fSmrg
604642e01fSmrg    target = *(GLenum *)(pc + 0);
614642e01fSmrg    order = *(GLint *)(pc + 12);
624642e01fSmrg    u1 = *(GLfloat *)(pc + 4);
634642e01fSmrg    u2 = *(GLfloat *)(pc + 8);
644642e01fSmrg    points = (GLfloat *)(pc + 16);
654642e01fSmrg    k = __glMap1f_size(target);
664642e01fSmrg
674642e01fSmrg    if (order <= 0 || k < 0) {
684642e01fSmrg	/* Erroneous command. */
694642e01fSmrg	compsize = 0;
704642e01fSmrg    } else {
714642e01fSmrg	compsize = order * k;
724642e01fSmrg    }
734642e01fSmrg    __GLX_SWAP_FLOAT_ARRAY(points, compsize);
744642e01fSmrg
754642e01fSmrg    CALL_Map1f( GET_DISPATCH(), (target, u1, u2, k, order, points) );
764642e01fSmrg}
774642e01fSmrg
784642e01fSmrgvoid __glXDispSwap_Map2f(GLbyte *pc)
794642e01fSmrg{
804642e01fSmrg    GLint uorder, vorder, ustride, vstride, k;
814642e01fSmrg    GLfloat u1, u2, v1, v2, *points;
824642e01fSmrg    GLenum target;
834642e01fSmrg    GLint compsize;
844642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
854642e01fSmrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
864642e01fSmrg
874642e01fSmrg    __GLX_SWAP_INT(pc + 0);
884642e01fSmrg    __GLX_SWAP_INT(pc + 12);
894642e01fSmrg    __GLX_SWAP_INT(pc + 24);
904642e01fSmrg    __GLX_SWAP_FLOAT(pc + 4);
914642e01fSmrg    __GLX_SWAP_FLOAT(pc + 8);
924642e01fSmrg    __GLX_SWAP_FLOAT(pc + 16);
934642e01fSmrg    __GLX_SWAP_FLOAT(pc + 20);
944642e01fSmrg
954642e01fSmrg    target = *(GLenum *)(pc + 0);
964642e01fSmrg    uorder = *(GLint *)(pc + 12);
974642e01fSmrg    vorder = *(GLint *)(pc + 24);
984642e01fSmrg    u1 = *(GLfloat *)(pc + 4);
994642e01fSmrg    u2 = *(GLfloat *)(pc + 8);
1004642e01fSmrg    v1 = *(GLfloat *)(pc + 16);
1014642e01fSmrg    v2 = *(GLfloat *)(pc + 20);
1024642e01fSmrg    points = (GLfloat *)(pc + 28);
1034642e01fSmrg
1044642e01fSmrg    k = __glMap2f_size(target);
1054642e01fSmrg    ustride = vorder * k;
1064642e01fSmrg    vstride = k;
1074642e01fSmrg
1084642e01fSmrg    if (vorder <= 0 || uorder <= 0 || k < 0) {
1094642e01fSmrg	/* Erroneous command. */
1104642e01fSmrg	compsize = 0;
1114642e01fSmrg    } else {
1124642e01fSmrg	compsize = uorder * vorder * k;
1134642e01fSmrg    }
1144642e01fSmrg    __GLX_SWAP_FLOAT_ARRAY(points, compsize);
1154642e01fSmrg
1164642e01fSmrg    CALL_Map2f( GET_DISPATCH(), (target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points) );
1174642e01fSmrg}
1184642e01fSmrg
1194642e01fSmrgvoid __glXDispSwap_Map1d(GLbyte *pc)
1204642e01fSmrg{
1214642e01fSmrg    GLint order, k, compsize;
1224642e01fSmrg    GLenum target;
1234642e01fSmrg    GLdouble u1, u2, *points;
1244642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
1254642e01fSmrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
1264642e01fSmrg
1274642e01fSmrg    __GLX_SWAP_DOUBLE(pc + 0);
1284642e01fSmrg    __GLX_SWAP_DOUBLE(pc + 8);
1294642e01fSmrg    __GLX_SWAP_INT(pc + 16);
1304642e01fSmrg    __GLX_SWAP_INT(pc + 20);
1314642e01fSmrg
1324642e01fSmrg    target = *(GLenum*) (pc + 16);
1334642e01fSmrg    order = *(GLint*) (pc + 20);
1344642e01fSmrg    k = __glMap1d_size(target);
1354642e01fSmrg    if (order <= 0 || k < 0) {
1364642e01fSmrg	/* Erroneous command. */
1374642e01fSmrg	compsize = 0;
1384642e01fSmrg    } else {
1394642e01fSmrg	compsize = order * k;
1404642e01fSmrg    }
1414642e01fSmrg    __GLX_GET_DOUBLE(u1,pc);
1424642e01fSmrg    __GLX_GET_DOUBLE(u2,pc+8);
1434642e01fSmrg    __GLX_SWAP_DOUBLE_ARRAY(pc+24, compsize);
1444642e01fSmrg    pc += 24;
1454642e01fSmrg
1464642e01fSmrg#ifdef __GLX_ALIGN64
1474642e01fSmrg    if (((unsigned long)pc) & 7) {
1484642e01fSmrg	/*
1494642e01fSmrg	** Copy the doubles up 4 bytes, trashing the command but aligning
1504642e01fSmrg	** the data in the process
1514642e01fSmrg	*/
1524642e01fSmrg	__GLX_MEM_COPY(pc-4, pc, compsize*8);
1534642e01fSmrg	points = (GLdouble*) (pc - 4);
1544642e01fSmrg    } else {
1554642e01fSmrg	points = (GLdouble*) pc;
1564642e01fSmrg    }
1574642e01fSmrg#else
1584642e01fSmrg    points = (GLdouble*) pc;
1594642e01fSmrg#endif
1604642e01fSmrg    CALL_Map1d( GET_DISPATCH(), (target, u1, u2, k, order, points) );
1614642e01fSmrg}
1624642e01fSmrg
1634642e01fSmrgvoid __glXDispSwap_Map2d(GLbyte *pc)
1644642e01fSmrg{
1654642e01fSmrg    GLdouble u1, u2, v1, v2, *points;
1664642e01fSmrg    GLint uorder, vorder, ustride, vstride, k, compsize;
1674642e01fSmrg    GLenum target;
1684642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
1694642e01fSmrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
1704642e01fSmrg
1714642e01fSmrg    __GLX_SWAP_DOUBLE(pc + 0);
1724642e01fSmrg    __GLX_SWAP_DOUBLE(pc + 8);
1734642e01fSmrg    __GLX_SWAP_DOUBLE(pc + 16);
1744642e01fSmrg    __GLX_SWAP_DOUBLE(pc + 24);
1754642e01fSmrg    __GLX_SWAP_INT(pc + 32);
1764642e01fSmrg    __GLX_SWAP_INT(pc + 36);
1774642e01fSmrg    __GLX_SWAP_INT(pc + 40);
1784642e01fSmrg
1794642e01fSmrg    target = *(GLenum *)(pc + 32);
1804642e01fSmrg    uorder = *(GLint *)(pc + 36);
1814642e01fSmrg    vorder = *(GLint *)(pc + 40);
1824642e01fSmrg    k = __glMap2d_size(target);
1834642e01fSmrg    if (vorder <= 0 || uorder <= 0 || k < 0) {
1844642e01fSmrg	/* Erroneous command. */
1854642e01fSmrg	compsize = 0;
1864642e01fSmrg    } else {
1874642e01fSmrg	compsize = uorder * vorder * k;
1884642e01fSmrg    }
1894642e01fSmrg    __GLX_GET_DOUBLE(u1,pc);
1904642e01fSmrg    __GLX_GET_DOUBLE(u2,pc+8);
1914642e01fSmrg    __GLX_GET_DOUBLE(v1,pc+16);
1924642e01fSmrg    __GLX_GET_DOUBLE(v2,pc+24);
1934642e01fSmrg    __GLX_SWAP_DOUBLE_ARRAY(pc+44, compsize);
1944642e01fSmrg    pc += 44;
1954642e01fSmrg    ustride = vorder * k;
1964642e01fSmrg    vstride = k;
1974642e01fSmrg
1984642e01fSmrg#ifdef __GLX_ALIGN64
1994642e01fSmrg    if (((unsigned long)pc) & 7) {
2004642e01fSmrg	/*
2014642e01fSmrg	** Copy the doubles up 4 bytes, trashing the command but aligning
2024642e01fSmrg	** the data in the process
2034642e01fSmrg	*/
2044642e01fSmrg	__GLX_MEM_COPY(pc-4, pc, compsize*8);
2054642e01fSmrg	points = (GLdouble*) (pc - 4);
2064642e01fSmrg    } else {
2074642e01fSmrg	points = (GLdouble*) pc;
2084642e01fSmrg    }
2094642e01fSmrg#else
2104642e01fSmrg    points = (GLdouble*) pc;
2114642e01fSmrg#endif
2124642e01fSmrg    CALL_Map2d( GET_DISPATCH(), (target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points) );
2134642e01fSmrg}
2144642e01fSmrg
2154642e01fSmrgstatic void swapArray(GLint numVals, GLenum datatype,
2164642e01fSmrg                      GLint stride, GLint numVertexes, GLbyte *pc)
2174642e01fSmrg{
2184642e01fSmrg    int i,j;
2194642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
2204642e01fSmrg
2214642e01fSmrg    switch (datatype) {
2224642e01fSmrg      case GL_BYTE:
2234642e01fSmrg      case GL_UNSIGNED_BYTE:
2244642e01fSmrg	/* don't need to swap */
2254642e01fSmrg	return;
2264642e01fSmrg      case GL_SHORT:
2274642e01fSmrg      case GL_UNSIGNED_SHORT:
2284642e01fSmrg	for (i=0; i<numVertexes; i++) {
2294642e01fSmrg	    GLshort *pVal = (GLshort *) pc;
2304642e01fSmrg	    for (j=0; j<numVals; j++) {
2314642e01fSmrg		__GLX_SWAP_SHORT(&pVal[j]);
2324642e01fSmrg	    }
2334642e01fSmrg	    pc += stride;
2344642e01fSmrg	}
2354642e01fSmrg	break;
2364642e01fSmrg      case GL_INT:
2374642e01fSmrg      case GL_UNSIGNED_INT:
2384642e01fSmrg	for (i=0; i<numVertexes; i++) {
2394642e01fSmrg	    GLint *pVal = (GLint *) pc;
2404642e01fSmrg	    for (j=0; j<numVals; j++) {
2414642e01fSmrg		__GLX_SWAP_INT(&pVal[j]);
2424642e01fSmrg	    }
2434642e01fSmrg	    pc += stride;
2444642e01fSmrg	}
2454642e01fSmrg	break;
2464642e01fSmrg      case GL_FLOAT:
2474642e01fSmrg	for (i=0; i<numVertexes; i++) {
2484642e01fSmrg	    GLfloat *pVal = (GLfloat *) pc;
2494642e01fSmrg	    for (j=0; j<numVals; j++) {
2504642e01fSmrg		__GLX_SWAP_FLOAT(&pVal[j]);
2514642e01fSmrg	    }
2524642e01fSmrg	    pc += stride;
2534642e01fSmrg	}
2544642e01fSmrg	break;
2554642e01fSmrg      case GL_DOUBLE:
2564642e01fSmrg	for (i=0; i<numVertexes; i++) {
2574642e01fSmrg	    GLdouble *pVal = (GLdouble *) pc;
2584642e01fSmrg	    for (j=0; j<numVals; j++) {
2594642e01fSmrg		__GLX_SWAP_DOUBLE(&pVal[j]);
2604642e01fSmrg	    }
2614642e01fSmrg	    pc += stride;
2624642e01fSmrg	}
2634642e01fSmrg	break;
2644642e01fSmrg      default:
2654642e01fSmrg	return;
2664642e01fSmrg    }
2674642e01fSmrg}
2684642e01fSmrg
2694642e01fSmrgvoid __glXDispSwap_DrawArrays(GLbyte *pc)
2704642e01fSmrg{
2714642e01fSmrg    __GLXdispatchDrawArraysHeader *hdr = (__GLXdispatchDrawArraysHeader *)pc;
2724642e01fSmrg    __GLXdispatchDrawArraysComponentHeader *compHeader;
2734642e01fSmrg    GLint numVertexes = hdr->numVertexes;
2744642e01fSmrg    GLint numComponents = hdr->numComponents;
2754642e01fSmrg    GLenum primType = hdr->primType;
2764642e01fSmrg    GLint stride = 0;
2774642e01fSmrg    int i;
2784642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
2794642e01fSmrg
2804642e01fSmrg    __GLX_SWAP_INT(&numVertexes);
2814642e01fSmrg    __GLX_SWAP_INT(&numComponents);
2824642e01fSmrg    __GLX_SWAP_INT(&primType);
2834642e01fSmrg
2844642e01fSmrg    pc += sizeof(__GLXdispatchDrawArraysHeader);
2854642e01fSmrg    compHeader = (__GLXdispatchDrawArraysComponentHeader *) pc;
2864642e01fSmrg
2874642e01fSmrg    /* compute stride (same for all component arrays) */
2884642e01fSmrg    for (i=0; i<numComponents; i++) {
2894642e01fSmrg	GLenum datatype = compHeader[i].datatype;
2904642e01fSmrg	GLint numVals = compHeader[i].numVals;
2914642e01fSmrg	GLenum component = compHeader[i].component;
2924642e01fSmrg
2934642e01fSmrg	__GLX_SWAP_INT(&datatype);
2944642e01fSmrg	__GLX_SWAP_INT(&numVals);
2954642e01fSmrg	__GLX_SWAP_INT(&component);
2964642e01fSmrg
2974642e01fSmrg        stride += __GLX_PAD(numVals * __glXTypeSize(datatype));
2984642e01fSmrg    }
2994642e01fSmrg
3004642e01fSmrg    pc += numComponents * sizeof(__GLXdispatchDrawArraysComponentHeader);
3014642e01fSmrg
3024642e01fSmrg    /* set up component arrays */
3034642e01fSmrg    for (i=0; i<numComponents; i++) {
3044642e01fSmrg	GLenum datatype = compHeader[i].datatype;
3054642e01fSmrg	GLint numVals = compHeader[i].numVals;
3064642e01fSmrg	GLenum component = compHeader[i].component;
3074642e01fSmrg
3084642e01fSmrg	__GLX_SWAP_INT(&datatype);
3094642e01fSmrg	__GLX_SWAP_INT(&numVals);
3104642e01fSmrg	__GLX_SWAP_INT(&component);
3114642e01fSmrg
3124642e01fSmrg	swapArray(numVals, datatype, stride, numVertexes, pc);
3134642e01fSmrg
3144642e01fSmrg        switch (component) {
3154642e01fSmrg          case GL_VERTEX_ARRAY:
3164642e01fSmrg	    CALL_EnableClientState( GET_DISPATCH(), (GL_VERTEX_ARRAY) );
3174642e01fSmrg	    CALL_VertexPointer( GET_DISPATCH(), (numVals, datatype, stride, pc) );
3184642e01fSmrg            break;
3194642e01fSmrg          case GL_NORMAL_ARRAY:
3204642e01fSmrg	    CALL_EnableClientState( GET_DISPATCH(), (GL_NORMAL_ARRAY) );
3214642e01fSmrg	    CALL_NormalPointer( GET_DISPATCH(), (datatype, stride, pc) );
3224642e01fSmrg            break;
3234642e01fSmrg          case GL_COLOR_ARRAY:
3244642e01fSmrg	    CALL_EnableClientState( GET_DISPATCH(), (GL_COLOR_ARRAY) );
3254642e01fSmrg	    CALL_ColorPointer( GET_DISPATCH(), (numVals, datatype, stride, pc) );
3264642e01fSmrg            break;
3274642e01fSmrg          case GL_INDEX_ARRAY:
3284642e01fSmrg	    CALL_EnableClientState( GET_DISPATCH(), (GL_INDEX_ARRAY) );
3294642e01fSmrg	    CALL_IndexPointer( GET_DISPATCH(), (datatype, stride, pc) );
3304642e01fSmrg            break;
3314642e01fSmrg          case GL_TEXTURE_COORD_ARRAY:
3324642e01fSmrg	    CALL_EnableClientState( GET_DISPATCH(), (GL_TEXTURE_COORD_ARRAY) );
3334642e01fSmrg	    CALL_TexCoordPointer( GET_DISPATCH(), (numVals, datatype, stride, pc) );
3344642e01fSmrg            break;
3354642e01fSmrg          case GL_EDGE_FLAG_ARRAY:
3364642e01fSmrg	    CALL_EnableClientState( GET_DISPATCH(), (GL_EDGE_FLAG_ARRAY) );
3374642e01fSmrg	    CALL_EdgeFlagPointer( GET_DISPATCH(), (stride, (const GLboolean *)pc) );
3384642e01fSmrg            break;
3394642e01fSmrg          case GL_SECONDARY_COLOR_ARRAY:
3404642e01fSmrg	    CALL_EnableClientState( GET_DISPATCH(), (GL_SECONDARY_COLOR_ARRAY) );
3414642e01fSmrg	    CALL_SecondaryColorPointerEXT( GET_DISPATCH(), (numVals, datatype, stride, pc) );
3424642e01fSmrg            break;
3434642e01fSmrg          case GL_FOG_COORD_ARRAY:
3444642e01fSmrg	    CALL_EnableClientState( GET_DISPATCH(), (GL_FOG_COORD_ARRAY) );
3454642e01fSmrg	    CALL_FogCoordPointerEXT( GET_DISPATCH(), (datatype, stride, pc) );
3464642e01fSmrg            break;
3474642e01fSmrg          default:
3484642e01fSmrg            break;
3494642e01fSmrg	}
3504642e01fSmrg
3514642e01fSmrg        pc += __GLX_PAD(numVals * __glXTypeSize(datatype));
3524642e01fSmrg    }
3534642e01fSmrg
3544642e01fSmrg    CALL_DrawArrays( GET_DISPATCH(), (primType, 0, numVertexes) );
3554642e01fSmrg
3564642e01fSmrg    /* turn off anything we might have turned on */
3574642e01fSmrg    CALL_DisableClientState( GET_DISPATCH(), (GL_VERTEX_ARRAY) );
3584642e01fSmrg    CALL_DisableClientState( GET_DISPATCH(), (GL_NORMAL_ARRAY) );
3594642e01fSmrg    CALL_DisableClientState( GET_DISPATCH(), (GL_COLOR_ARRAY) );
3604642e01fSmrg    CALL_DisableClientState( GET_DISPATCH(), (GL_INDEX_ARRAY) );
3614642e01fSmrg    CALL_DisableClientState( GET_DISPATCH(), (GL_TEXTURE_COORD_ARRAY) );
3624642e01fSmrg    CALL_DisableClientState( GET_DISPATCH(), (GL_EDGE_FLAG_ARRAY) );
3634642e01fSmrg    CALL_DisableClientState( GET_DISPATCH(), (GL_SECONDARY_COLOR_ARRAY) );
3644642e01fSmrg    CALL_DisableClientState( GET_DISPATCH(), (GL_FOG_COORD_ARRAY) );
3654642e01fSmrg}
3664642e01fSmrg
3674642e01fSmrgvoid __glXDispSwap_DrawArraysEXT(GLbyte *pc)
3684642e01fSmrg{
3694642e01fSmrg   __glXDispSwap_DrawArrays(pc);
3704642e01fSmrg}
371