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