xref: /aosp_15_r20/external/mesa3d/src/glx/packrender.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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