1*61046927SAndroid Build Coastguard Worker #ifndef __GLX_packrender_h__ 2*61046927SAndroid Build Coastguard Worker #define __GLX_packrender_h__ 3*61046927SAndroid Build Coastguard Worker 4*61046927SAndroid Build Coastguard Worker /* 5*61046927SAndroid Build Coastguard Worker * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 6*61046927SAndroid Build Coastguard Worker * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 7*61046927SAndroid Build Coastguard Worker * 8*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: SGI-B-2.0 9*61046927SAndroid Build Coastguard Worker */ 10*61046927SAndroid Build Coastguard Worker 11*61046927SAndroid Build Coastguard Worker #include "glxclient.h" 12*61046927SAndroid Build Coastguard Worker 13*61046927SAndroid Build Coastguard Worker /* 14*61046927SAndroid Build Coastguard Worker ** The macros in this header convert the client machine's native data types to 15*61046927SAndroid Build Coastguard Worker ** wire protocol data types. The header is part of the porting layer of the 16*61046927SAndroid Build Coastguard Worker ** client library, and it is intended that hardware vendors will rewrite this 17*61046927SAndroid Build Coastguard Worker ** header to suit their own machines. 18*61046927SAndroid Build Coastguard Worker */ 19*61046927SAndroid Build Coastguard Worker 20*61046927SAndroid Build Coastguard Worker /* 21*61046927SAndroid Build Coastguard Worker ** Pad a count of bytes to the nearest multiple of 4. The X protocol 22*61046927SAndroid Build Coastguard Worker ** transfers data in 4 byte quantities, so this macro is used to 23*61046927SAndroid Build Coastguard Worker ** insure the right amount of data being sent. 24*61046927SAndroid Build Coastguard Worker */ 25*61046927SAndroid Build Coastguard Worker #define __GLX_PAD(a) (((a)+3) & ~3) 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker /* 28*61046927SAndroid Build Coastguard Worker ** Network size parameters 29*61046927SAndroid Build Coastguard Worker */ 30*61046927SAndroid Build Coastguard Worker #define sz_double 8 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker /* Setup for all commands */ 33*61046927SAndroid Build Coastguard Worker #define __GLX_DECLARE_VARIABLES() \ 34*61046927SAndroid Build Coastguard Worker struct glx_context *gc; \ 35*61046927SAndroid Build Coastguard Worker GLubyte *pc, *pixelHeaderPC; \ 36*61046927SAndroid Build Coastguard Worker GLuint compsize, cmdlen 37*61046927SAndroid Build Coastguard Worker 38*61046927SAndroid Build Coastguard Worker #define __GLX_LOAD_VARIABLES() \ 39*61046927SAndroid Build Coastguard Worker gc = __glXGetCurrentContext(); \ 40*61046927SAndroid Build Coastguard Worker pc = gc->pc; \ 41*61046927SAndroid Build Coastguard Worker /* Muffle compilers */ \ 42*61046927SAndroid Build Coastguard Worker cmdlen = 0; (void)cmdlen; \ 43*61046927SAndroid Build Coastguard Worker compsize = 0; (void)compsize; \ 44*61046927SAndroid Build Coastguard Worker pixelHeaderPC = NULL; (void)pixelHeaderPC 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker /* 47*61046927SAndroid Build Coastguard Worker ** Variable sized command support macro. This macro is used by calls 48*61046927SAndroid Build Coastguard Worker ** that are potentially larger than __GLX_SMALL_RENDER_CMD_SIZE. 49*61046927SAndroid Build Coastguard Worker ** Because of their size, they may not automatically fit in the buffer. 50*61046927SAndroid Build Coastguard Worker ** If the buffer can't hold the command then it is flushed so that 51*61046927SAndroid Build Coastguard Worker ** the command will fit in the next buffer. 52*61046927SAndroid Build Coastguard Worker */ 53*61046927SAndroid Build Coastguard Worker #define __GLX_BEGIN_VARIABLE(opcode,size) \ 54*61046927SAndroid Build Coastguard Worker if (pc + (size) > gc->bufEnd) { \ 55*61046927SAndroid Build Coastguard Worker pc = __glXFlushRenderBuffer(gc, pc); \ 56*61046927SAndroid Build Coastguard Worker } \ 57*61046927SAndroid Build Coastguard Worker __GLX_PUT_SHORT(0,size); \ 58*61046927SAndroid Build Coastguard Worker __GLX_PUT_SHORT(2,opcode) 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard Worker #define __GLX_BEGIN_VARIABLE_LARGE(opcode,size) \ 61*61046927SAndroid Build Coastguard Worker pc = __glXFlushRenderBuffer(gc, pc); \ 62*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(0,size); \ 63*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(4,opcode) 64*61046927SAndroid Build Coastguard Worker 65*61046927SAndroid Build Coastguard Worker #define __GLX_BEGIN_VARIABLE_WITH_PIXEL(opcode,size) \ 66*61046927SAndroid Build Coastguard Worker if (pc + (size) > gc->bufEnd) { \ 67*61046927SAndroid Build Coastguard Worker pc = __glXFlushRenderBuffer(gc, pc); \ 68*61046927SAndroid Build Coastguard Worker } \ 69*61046927SAndroid Build Coastguard Worker __GLX_PUT_SHORT(0,size); \ 70*61046927SAndroid Build Coastguard Worker __GLX_PUT_SHORT(2,opcode); \ 71*61046927SAndroid Build Coastguard Worker pc += __GLX_RENDER_HDR_SIZE; \ 72*61046927SAndroid Build Coastguard Worker pixelHeaderPC = pc; \ 73*61046927SAndroid Build Coastguard Worker pc += __GLX_PIXEL_HDR_SIZE 74*61046927SAndroid Build Coastguard Worker 75*61046927SAndroid Build Coastguard Worker #define __GLX_BEGIN_VARIABLE_LARGE_WITH_PIXEL(opcode,size) \ 76*61046927SAndroid Build Coastguard Worker pc = __glXFlushRenderBuffer(gc, pc); \ 77*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(0,size); \ 78*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(4,opcode); \ 79*61046927SAndroid Build Coastguard Worker pc += __GLX_RENDER_LARGE_HDR_SIZE; \ 80*61046927SAndroid Build Coastguard Worker pixelHeaderPC = pc; \ 81*61046927SAndroid Build Coastguard Worker pc += __GLX_PIXEL_HDR_SIZE 82*61046927SAndroid Build Coastguard Worker 83*61046927SAndroid Build Coastguard Worker #define __GLX_BEGIN_VARIABLE_WITH_PIXEL_3D(opcode,size) \ 84*61046927SAndroid Build Coastguard Worker if (pc + (size) > gc->bufEnd) { \ 85*61046927SAndroid Build Coastguard Worker pc = __glXFlushRenderBuffer(gc, pc); \ 86*61046927SAndroid Build Coastguard Worker } \ 87*61046927SAndroid Build Coastguard Worker __GLX_PUT_SHORT(0,size); \ 88*61046927SAndroid Build Coastguard Worker __GLX_PUT_SHORT(2,opcode); \ 89*61046927SAndroid Build Coastguard Worker pc += __GLX_RENDER_HDR_SIZE; \ 90*61046927SAndroid Build Coastguard Worker pixelHeaderPC = pc; \ 91*61046927SAndroid Build Coastguard Worker pc += __GLX_PIXEL_3D_HDR_SIZE 92*61046927SAndroid Build Coastguard Worker 93*61046927SAndroid Build Coastguard Worker #define __GLX_BEGIN_VARIABLE_LARGE_WITH_PIXEL_3D(opcode,size) \ 94*61046927SAndroid Build Coastguard Worker pc = __glXFlushRenderBuffer(gc, pc); \ 95*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(0,size); \ 96*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(4,opcode); \ 97*61046927SAndroid Build Coastguard Worker pc += __GLX_RENDER_LARGE_HDR_SIZE; \ 98*61046927SAndroid Build Coastguard Worker pixelHeaderPC = pc; \ 99*61046927SAndroid Build Coastguard Worker pc += __GLX_PIXEL_3D_HDR_SIZE 100*61046927SAndroid Build Coastguard Worker 101*61046927SAndroid Build Coastguard Worker /* 102*61046927SAndroid Build Coastguard Worker ** Fixed size command support macro. This macro is used by calls that 103*61046927SAndroid Build Coastguard Worker ** are never larger than __GLX_SMALL_RENDER_CMD_SIZE. Because they 104*61046927SAndroid Build Coastguard Worker ** always fit in the buffer, and because the buffer promises to 105*61046927SAndroid Build Coastguard Worker ** maintain enough room for them, we don't need to check for space 106*61046927SAndroid Build Coastguard Worker ** before doing the storage work. 107*61046927SAndroid Build Coastguard Worker */ 108*61046927SAndroid Build Coastguard Worker #define __GLX_BEGIN(opcode,size) \ 109*61046927SAndroid Build Coastguard Worker __GLX_PUT_SHORT(0,size); \ 110*61046927SAndroid Build Coastguard Worker __GLX_PUT_SHORT(2,opcode) 111*61046927SAndroid Build Coastguard Worker 112*61046927SAndroid Build Coastguard Worker /* 113*61046927SAndroid Build Coastguard Worker ** Finish a rendering command by advancing the pc. If the pc is now past 114*61046927SAndroid Build Coastguard Worker ** the limit pointer then there is no longer room for a 115*61046927SAndroid Build Coastguard Worker ** __GLX_SMALL_RENDER_CMD_SIZE sized command, which will break the 116*61046927SAndroid Build Coastguard Worker ** assumptions present in the __GLX_BEGIN macro. In this case the 117*61046927SAndroid Build Coastguard Worker ** rendering buffer is flushed out into the X protocol stream (which may 118*61046927SAndroid Build Coastguard Worker ** or may not do I/O). 119*61046927SAndroid Build Coastguard Worker */ 120*61046927SAndroid Build Coastguard Worker #define __GLX_END(size) \ 121*61046927SAndroid Build Coastguard Worker pc += size; \ 122*61046927SAndroid Build Coastguard Worker if (pc > gc->limit) { \ 123*61046927SAndroid Build Coastguard Worker (void) __glXFlushRenderBuffer(gc, pc); \ 124*61046927SAndroid Build Coastguard Worker } else { \ 125*61046927SAndroid Build Coastguard Worker gc->pc = pc; \ 126*61046927SAndroid Build Coastguard Worker } 127*61046927SAndroid Build Coastguard Worker 128*61046927SAndroid Build Coastguard Worker /* Array copy macros */ 129*61046927SAndroid Build Coastguard Worker #define __GLX_MEM_COPY(dest,src,bytes) \ 130*61046927SAndroid Build Coastguard Worker if (src && dest) \ 131*61046927SAndroid Build Coastguard Worker memcpy(dest, src, bytes) 132*61046927SAndroid Build Coastguard Worker 133*61046927SAndroid Build Coastguard Worker /* Single item copy macros */ 134*61046927SAndroid Build Coastguard Worker #define __GLX_PUT_CHAR(offset,a) \ 135*61046927SAndroid Build Coastguard Worker do { \ 136*61046927SAndroid Build Coastguard Worker int8_t __tmp = (a); \ 137*61046927SAndroid Build Coastguard Worker memcpy((pc + (offset)), &__tmp, 1); \ 138*61046927SAndroid Build Coastguard Worker } while (0) 139*61046927SAndroid Build Coastguard Worker 140*61046927SAndroid Build Coastguard Worker #define __GLX_PUT_SHORT(offset,a) \ 141*61046927SAndroid Build Coastguard Worker do { \ 142*61046927SAndroid Build Coastguard Worker int16_t __tmp = (a); \ 143*61046927SAndroid Build Coastguard Worker memcpy((pc + (offset)), &__tmp, 2); \ 144*61046927SAndroid Build Coastguard Worker } while (0) 145*61046927SAndroid Build Coastguard Worker 146*61046927SAndroid Build Coastguard Worker #define __GLX_PUT_LONG(offset,a) \ 147*61046927SAndroid Build Coastguard Worker do { \ 148*61046927SAndroid Build Coastguard Worker int32_t __tmp = (a); \ 149*61046927SAndroid Build Coastguard Worker memcpy((pc + (offset)), &__tmp, 4); \ 150*61046927SAndroid Build Coastguard Worker } while (0) 151*61046927SAndroid Build Coastguard Worker 152*61046927SAndroid Build Coastguard Worker #define __GLX_PUT_FLOAT(offset,a) \ 153*61046927SAndroid Build Coastguard Worker do { \ 154*61046927SAndroid Build Coastguard Worker float __tmp = (a); \ 155*61046927SAndroid Build Coastguard Worker memcpy((pc + (offset)), &__tmp, 4); \ 156*61046927SAndroid Build Coastguard Worker } while (0) 157*61046927SAndroid Build Coastguard Worker 158*61046927SAndroid Build Coastguard Worker #define __GLX_PUT_DOUBLE(offset,a) \ 159*61046927SAndroid Build Coastguard Worker do { \ 160*61046927SAndroid Build Coastguard Worker double __tmp = (a); \ 161*61046927SAndroid Build Coastguard Worker memcpy((pc + (offset)), &__tmp, 8); \ 162*61046927SAndroid Build Coastguard Worker } while (0) 163*61046927SAndroid Build Coastguard Worker 164*61046927SAndroid Build Coastguard Worker #define __GLX_PUT_CHAR_ARRAY(offset,a,alen) \ 165*61046927SAndroid Build Coastguard Worker __GLX_MEM_COPY(pc + offset, a, alen * __GLX_SIZE_INT8) 166*61046927SAndroid Build Coastguard Worker 167*61046927SAndroid Build Coastguard Worker #define __GLX_PUT_SHORT_ARRAY(offset,a,alen) \ 168*61046927SAndroid Build Coastguard Worker __GLX_MEM_COPY(pc + offset, a, alen * __GLX_SIZE_INT16) 169*61046927SAndroid Build Coastguard Worker 170*61046927SAndroid Build Coastguard Worker #define __GLX_PUT_LONG_ARRAY(offset,a,alen) \ 171*61046927SAndroid Build Coastguard Worker __GLX_MEM_COPY(pc + offset, a, alen * __GLX_SIZE_INT32) 172*61046927SAndroid Build Coastguard Worker 173*61046927SAndroid Build Coastguard Worker #define __GLX_PUT_FLOAT_ARRAY(offset,a,alen) \ 174*61046927SAndroid Build Coastguard Worker __GLX_MEM_COPY(pc + offset, a, alen * __GLX_SIZE_FLOAT32) 175*61046927SAndroid Build Coastguard Worker 176*61046927SAndroid Build Coastguard Worker #define __GLX_PUT_DOUBLE_ARRAY(offset,a,alen) \ 177*61046927SAndroid Build Coastguard Worker __GLX_MEM_COPY(pc + offset, a, alen * __GLX_SIZE_FLOAT64) 178*61046927SAndroid Build Coastguard Worker 179*61046927SAndroid Build Coastguard Worker 180*61046927SAndroid Build Coastguard Worker #endif /* !__GLX_packrender_h__ */ 181