xref: /aosp_15_r20/external/mesa3d/src/glx/packsingle.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker #ifndef __GLX_packsingle_h__
2*61046927SAndroid Build Coastguard Worker #define __GLX_packsingle_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 "packrender.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker /*
14*61046927SAndroid Build Coastguard Worker ** The macros in this header convert wire protocol data types to the client
15*61046927SAndroid Build Coastguard Worker ** machine's native data types.  The header is part of the porting layer of
16*61046927SAndroid Build Coastguard Worker ** the client library, and it is intended that hardware vendors will rewrite
17*61046927SAndroid Build Coastguard Worker ** this 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 ** Dummy define to make the GetReqExtra macro happy.  The value is not
22*61046927SAndroid Build Coastguard Worker ** used, but instead the code in __GLX_SINGLE_BEGIN issues its own store
23*61046927SAndroid Build Coastguard Worker ** to req->reqType with the proper code (our extension code).
24*61046927SAndroid Build Coastguard Worker */
25*61046927SAndroid Build Coastguard Worker #define X_GLXSingle 0
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker /* Declare common variables used during a single command */
28*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_DECLARE_VARIABLES()         \
29*61046927SAndroid Build Coastguard Worker    struct glx_context *gc = __glXGetCurrentContext();  \
30*61046927SAndroid Build Coastguard Worker    GLubyte *pc, *pixelHeaderPC;                  \
31*61046927SAndroid Build Coastguard Worker    GLuint compsize, cmdlen;                      \
32*61046927SAndroid Build Coastguard Worker    Display *dpy = gc->currentDpy;                \
33*61046927SAndroid Build Coastguard Worker    xGLXSingleReq *req
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_LOAD_VARIABLES()           \
36*61046927SAndroid Build Coastguard Worker    pc = gc->pc;                                 \
37*61046927SAndroid Build Coastguard Worker    /* Muffle compilers */                       \
38*61046927SAndroid Build Coastguard Worker    pixelHeaderPC = NULL;  (void)pixelHeaderPC;     \
39*61046927SAndroid Build Coastguard Worker    compsize = 0;       (void)compsize;          \
40*61046927SAndroid Build Coastguard Worker    cmdlen = 0;         (void)cmdlen
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker /* Start a single command */
43*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_BEGIN(opcode,bytes)        \
44*61046927SAndroid Build Coastguard Worker    if (dpy) {                                   \
45*61046927SAndroid Build Coastguard Worker    (void) __glXFlushRenderBuffer(gc, pc);       \
46*61046927SAndroid Build Coastguard Worker    LockDisplay(dpy);                            \
47*61046927SAndroid Build Coastguard Worker    GetReqExtra(GLXSingle,bytes,req);            \
48*61046927SAndroid Build Coastguard Worker    req->reqType = gc->majorOpcode;              \
49*61046927SAndroid Build Coastguard Worker    req->glxCode = opcode;                       \
50*61046927SAndroid Build Coastguard Worker    req->contextTag = gc->currentContextTag;     \
51*61046927SAndroid Build Coastguard Worker    pc = ((GLubyte *)(req) + sz_xGLXSingleReq)
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker /* End a single command */
54*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_END()       \
55*61046927SAndroid Build Coastguard Worker    UnlockDisplay(dpy);           \
56*61046927SAndroid Build Coastguard Worker    SyncHandle();                 \
57*61046927SAndroid Build Coastguard Worker    }
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker /* Store data to sending for a single command */
60*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_PUT_CHAR(offset,a)         \
61*61046927SAndroid Build Coastguard Worker    *((INT8 *) (pc + offset)) = a
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_PUT_SHORT(offset,a)        \
64*61046927SAndroid Build Coastguard Worker    *((INT16 *) (pc + offset)) = a
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_PUT_LONG(offset,a)         \
67*61046927SAndroid Build Coastguard Worker    *((INT32 *) (pc + offset)) = a
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_PUT_FLOAT(offset,a)        \
70*61046927SAndroid Build Coastguard Worker    *((FLOAT32 *) (pc + offset)) = a
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker /* Read support macros */
73*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_READ_XREPLY()                    \
74*61046927SAndroid Build Coastguard Worker    (void) _XReply(dpy, (xReply*) &reply, 0, False)
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_RETVAL(a,cast)         \
77*61046927SAndroid Build Coastguard Worker    a = (cast) reply.retval
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_SIZE(a)                \
80*61046927SAndroid Build Coastguard Worker    a = (GLint) reply.size
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_CHAR(p)                \
83*61046927SAndroid Build Coastguard Worker    memcpy((p), &reply.pad3, 1);
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_SHORT(p)               \
86*61046927SAndroid Build Coastguard Worker    memcpy((p), &reply.pad3, 2);
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_LONG(p)                \
89*61046927SAndroid Build Coastguard Worker    memcpy((p), &reply.pad3, 4);
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_FLOAT(p)               \
92*61046927SAndroid Build Coastguard Worker    memcpy((p), &reply.pad3, 4);
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_DOUBLE(p)              \
95*61046927SAndroid Build Coastguard Worker    memcpy((p), &reply.pad3, 8);
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker /* Get an array of typed data */
98*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_VOID_ARRAY(a,alen)     \
99*61046927SAndroid Build Coastguard Worker    {                                            \
100*61046927SAndroid Build Coastguard Worker       GLint slop = alen*__GLX_SIZE_INT8 & 3;    \
101*61046927SAndroid Build Coastguard Worker       _XRead(dpy,(char *)a,alen*__GLX_SIZE_INT8);  \
102*61046927SAndroid Build Coastguard Worker       if (slop) _XEatData(dpy,4-slop);             \
103*61046927SAndroid Build Coastguard Worker    }
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_CHAR_ARRAY(a,alen)     \
106*61046927SAndroid Build Coastguard Worker    {                                            \
107*61046927SAndroid Build Coastguard Worker       GLint slop = alen*__GLX_SIZE_INT8 & 3;    \
108*61046927SAndroid Build Coastguard Worker       _XRead(dpy,(char *)a,alen*__GLX_SIZE_INT8);  \
109*61046927SAndroid Build Coastguard Worker       if (slop) _XEatData(dpy,4-slop);             \
110*61046927SAndroid Build Coastguard Worker    }
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_SHORT_ARRAY(a,alen)    \
114*61046927SAndroid Build Coastguard Worker    {                                            \
115*61046927SAndroid Build Coastguard Worker       GLint slop = (alen*__GLX_SIZE_INT16) & 3;    \
116*61046927SAndroid Build Coastguard Worker       _XRead(dpy,(char *)a,alen*__GLX_SIZE_INT16); \
117*61046927SAndroid Build Coastguard Worker       if (slop) _XEatData(dpy,4-slop);             \
118*61046927SAndroid Build Coastguard Worker    }
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_LONG_ARRAY(a,alen)        \
121*61046927SAndroid Build Coastguard Worker    _XRead(dpy,(char *)a,alen*__GLX_SIZE_INT32);
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_FLOAT_ARRAY(a,alen)       \
124*61046927SAndroid Build Coastguard Worker    _XRead(dpy,(char *)a,alen*__GLX_SIZE_FLOAT32);
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker #define __GLX_SINGLE_GET_DOUBLE_ARRAY(a,alen)      \
127*61046927SAndroid Build Coastguard Worker    _XRead(dpy,(char *)a,alen*__GLX_SIZE_FLOAT64);
128*61046927SAndroid Build Coastguard Worker 
129*61046927SAndroid Build Coastguard Worker #endif /* !__GLX_packsingle_h__ */
130