xref: /aosp_15_r20/external/mesa3d/src/mesa/main/glthread_marshal.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2012 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker /** \file glthread_marshal.h
25*61046927SAndroid Build Coastguard Worker  *
26*61046927SAndroid Build Coastguard Worker  * Declarations of functions related to marshalling GL calls from a client
27*61046927SAndroid Build Coastguard Worker  * thread to a server thread.
28*61046927SAndroid Build Coastguard Worker  */
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker #ifndef MARSHAL_H
31*61046927SAndroid Build Coastguard Worker #define MARSHAL_H
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker #include "main/glthread.h"
34*61046927SAndroid Build Coastguard Worker #include "main/context.h"
35*61046927SAndroid Build Coastguard Worker #include "main/macros.h"
36*61046927SAndroid Build Coastguard Worker #include "main/matrix.h"
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker /* 32-bit signed integer clamped to 0..UINT16_MAX to compress parameters
39*61046927SAndroid Build Coastguard Worker  * for glthread. All values < 0 and >= UINT16_MAX are expected to throw
40*61046927SAndroid Build Coastguard Worker  * GL_INVALID_VALUE. Negative values are mapped to UINT16_MAX.
41*61046927SAndroid Build Coastguard Worker  */
42*61046927SAndroid Build Coastguard Worker typedef uint16_t GLpacked16i;
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker /* 32-bit signed integer clamped to 16 bits. */
45*61046927SAndroid Build Coastguard Worker typedef int16_t GLclamped16i;
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker struct marshal_cmd_base
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker    /**
50*61046927SAndroid Build Coastguard Worker     * Type of command.  See enum marshal_dispatch_cmd_id.
51*61046927SAndroid Build Coastguard Worker     */
52*61046927SAndroid Build Coastguard Worker    uint16_t cmd_id;
53*61046927SAndroid Build Coastguard Worker };
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker /* This must be included after "struct marshal_cmd_base" because it uses it. */
56*61046927SAndroid Build Coastguard Worker #include "marshal_generated.h"
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker typedef uint32_t (*_mesa_unmarshal_func)(struct gl_context *ctx,
59*61046927SAndroid Build Coastguard Worker                                          const void *restrict cmd);
60*61046927SAndroid Build Coastguard Worker extern const _mesa_unmarshal_func _mesa_unmarshal_dispatch[NUM_DISPATCH_CMD];
61*61046927SAndroid Build Coastguard Worker extern const char *_mesa_unmarshal_func_name[NUM_DISPATCH_CMD];
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker struct marshal_cmd_DrawElementsUserBuf
64*61046927SAndroid Build Coastguard Worker {
65*61046927SAndroid Build Coastguard Worker    struct marshal_cmd_base cmd_base;
66*61046927SAndroid Build Coastguard Worker    GLenum8 mode;
67*61046927SAndroid Build Coastguard Worker    GLindextype type;
68*61046927SAndroid Build Coastguard Worker    uint16_t num_slots;
69*61046927SAndroid Build Coastguard Worker    GLsizei count;
70*61046927SAndroid Build Coastguard Worker    GLsizei instance_count;
71*61046927SAndroid Build Coastguard Worker    GLint basevertex;
72*61046927SAndroid Build Coastguard Worker    GLuint baseinstance;
73*61046927SAndroid Build Coastguard Worker    GLuint drawid;
74*61046927SAndroid Build Coastguard Worker    GLuint user_buffer_mask;
75*61046927SAndroid Build Coastguard Worker    const GLvoid *indices;
76*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object *index_buffer;
77*61046927SAndroid Build Coastguard Worker };
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker struct marshal_cmd_DrawElementsUserBufPacked
80*61046927SAndroid Build Coastguard Worker {
81*61046927SAndroid Build Coastguard Worker    struct marshal_cmd_base cmd_base;
82*61046927SAndroid Build Coastguard Worker    GLenum8 mode;
83*61046927SAndroid Build Coastguard Worker    GLindextype type;
84*61046927SAndroid Build Coastguard Worker    uint16_t num_slots;
85*61046927SAndroid Build Coastguard Worker    GLushort count;
86*61046927SAndroid Build Coastguard Worker    GLuint user_buffer_mask;
87*61046927SAndroid Build Coastguard Worker    GLuint indices;
88*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object *index_buffer;
89*61046927SAndroid Build Coastguard Worker };
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker static inline void *
_mesa_glthread_allocate_command(struct gl_context * ctx,uint16_t cmd_id,unsigned size)92*61046927SAndroid Build Coastguard Worker _mesa_glthread_allocate_command(struct gl_context *ctx,
93*61046927SAndroid Build Coastguard Worker                                 uint16_t cmd_id,
94*61046927SAndroid Build Coastguard Worker                                 unsigned size)
95*61046927SAndroid Build Coastguard Worker {
96*61046927SAndroid Build Coastguard Worker    struct glthread_state *glthread = &ctx->GLThread;
97*61046927SAndroid Build Coastguard Worker    const unsigned num_elements = align(size, 8) / 8;
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    assert (num_elements <= MARSHAL_MAX_CMD_SIZE / 8);
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker    if (unlikely(glthread->used + num_elements > MARSHAL_MAX_CMD_SIZE / 8))
102*61046927SAndroid Build Coastguard Worker       _mesa_glthread_flush_batch(ctx);
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker    struct glthread_batch *next = glthread->next_batch;
105*61046927SAndroid Build Coastguard Worker    struct marshal_cmd_base *cmd_base =
106*61046927SAndroid Build Coastguard Worker       (struct marshal_cmd_base *)&next->buffer[glthread->used];
107*61046927SAndroid Build Coastguard Worker    glthread->used += num_elements;
108*61046927SAndroid Build Coastguard Worker    cmd_base->cmd_id = cmd_id;
109*61046927SAndroid Build Coastguard Worker    return cmd_base;
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker static inline GLenum
_mesa_decode_index_type(GLindextype type)113*61046927SAndroid Build Coastguard Worker _mesa_decode_index_type(GLindextype type)
114*61046927SAndroid Build Coastguard Worker {
115*61046927SAndroid Build Coastguard Worker    return (GLenum)type.value + GL_UNSIGNED_BYTE - 1;
116*61046927SAndroid Build Coastguard Worker }
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker static inline struct marshal_cmd_base *
_mesa_glthread_get_cmd(uint64_t * opaque_cmd)119*61046927SAndroid Build Coastguard Worker _mesa_glthread_get_cmd(uint64_t *opaque_cmd)
120*61046927SAndroid Build Coastguard Worker {
121*61046927SAndroid Build Coastguard Worker    return (struct marshal_cmd_base*)opaque_cmd;
122*61046927SAndroid Build Coastguard Worker }
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker static inline uint64_t *
_mesa_glthread_next_cmd(uint64_t * opaque_cmd,unsigned cmd_size)125*61046927SAndroid Build Coastguard Worker _mesa_glthread_next_cmd(uint64_t *opaque_cmd, unsigned cmd_size)
126*61046927SAndroid Build Coastguard Worker {
127*61046927SAndroid Build Coastguard Worker    return opaque_cmd + cmd_size;
128*61046927SAndroid Build Coastguard Worker }
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker static inline bool
_mesa_glthread_call_is_last(struct glthread_state * glthread,struct marshal_cmd_base * last,uint16_t num_slots)131*61046927SAndroid Build Coastguard Worker _mesa_glthread_call_is_last(struct glthread_state *glthread,
132*61046927SAndroid Build Coastguard Worker                             struct marshal_cmd_base *last, uint16_t num_slots)
133*61046927SAndroid Build Coastguard Worker {
134*61046927SAndroid Build Coastguard Worker    return last &&
135*61046927SAndroid Build Coastguard Worker           (uint64_t*)last + num_slots ==
136*61046927SAndroid Build Coastguard Worker           &glthread->next_batch->buffer[glthread->used];
137*61046927SAndroid Build Coastguard Worker }
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker static inline bool
_mesa_glthread_has_pack_buffer(const struct gl_context * ctx)140*61046927SAndroid Build Coastguard Worker _mesa_glthread_has_pack_buffer(const struct gl_context *ctx)
141*61046927SAndroid Build Coastguard Worker {
142*61046927SAndroid Build Coastguard Worker    return ctx->GLThread.CurrentPixelPackBufferName != 0;
143*61046927SAndroid Build Coastguard Worker }
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker static inline bool
_mesa_glthread_has_unpack_buffer(const struct gl_context * ctx)146*61046927SAndroid Build Coastguard Worker _mesa_glthread_has_unpack_buffer(const struct gl_context *ctx)
147*61046927SAndroid Build Coastguard Worker {
148*61046927SAndroid Build Coastguard Worker    return ctx->GLThread.CurrentPixelUnpackBufferName != 0;
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_buffer_enum_to_count(GLenum buffer)152*61046927SAndroid Build Coastguard Worker _mesa_buffer_enum_to_count(GLenum buffer)
153*61046927SAndroid Build Coastguard Worker {
154*61046927SAndroid Build Coastguard Worker    switch (buffer) {
155*61046927SAndroid Build Coastguard Worker    case GL_COLOR:
156*61046927SAndroid Build Coastguard Worker       return 4;
157*61046927SAndroid Build Coastguard Worker    case GL_DEPTH_STENCIL:
158*61046927SAndroid Build Coastguard Worker       return 2;
159*61046927SAndroid Build Coastguard Worker    case GL_STENCIL:
160*61046927SAndroid Build Coastguard Worker    case GL_DEPTH:
161*61046927SAndroid Build Coastguard Worker       return 1;
162*61046927SAndroid Build Coastguard Worker    default:
163*61046927SAndroid Build Coastguard Worker       return 0;
164*61046927SAndroid Build Coastguard Worker    }
165*61046927SAndroid Build Coastguard Worker }
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_tex_param_enum_to_count(GLenum pname)168*61046927SAndroid Build Coastguard Worker _mesa_tex_param_enum_to_count(GLenum pname)
169*61046927SAndroid Build Coastguard Worker {
170*61046927SAndroid Build Coastguard Worker    switch (pname) {
171*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_MIN_FILTER:
172*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_MAG_FILTER:
173*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_WRAP_S:
174*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_WRAP_T:
175*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_WRAP_R:
176*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_BASE_LEVEL:
177*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_MAX_LEVEL:
178*61046927SAndroid Build Coastguard Worker    case GL_GENERATE_MIPMAP_SGIS:
179*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COMPARE_MODE_ARB:
180*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COMPARE_FUNC_ARB:
181*61046927SAndroid Build Coastguard Worker    case GL_DEPTH_TEXTURE_MODE_ARB:
182*61046927SAndroid Build Coastguard Worker    case GL_DEPTH_STENCIL_TEXTURE_MODE:
183*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_SRGB_DECODE_EXT:
184*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_REDUCTION_MODE_EXT:
185*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_CUBE_MAP_SEAMLESS:
186*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_SWIZZLE_R:
187*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_SWIZZLE_G:
188*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_SWIZZLE_B:
189*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_SWIZZLE_A:
190*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_MIN_LOD:
191*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_MAX_LOD:
192*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_PRIORITY:
193*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_MAX_ANISOTROPY_EXT:
194*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_LOD_BIAS:
195*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_TILING_EXT:
196*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_SPARSE_ARB:
197*61046927SAndroid Build Coastguard Worker    case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB:
198*61046927SAndroid Build Coastguard Worker    case GL_NUM_SPARSE_LEVELS_ARB:
199*61046927SAndroid Build Coastguard Worker       return 1;
200*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_CROP_RECT_OES:
201*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_SWIZZLE_RGBA:
202*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_BORDER_COLOR:
203*61046927SAndroid Build Coastguard Worker       return 4;
204*61046927SAndroid Build Coastguard Worker    default:
205*61046927SAndroid Build Coastguard Worker       return 0;
206*61046927SAndroid Build Coastguard Worker    }
207*61046927SAndroid Build Coastguard Worker }
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_fog_enum_to_count(GLenum pname)210*61046927SAndroid Build Coastguard Worker _mesa_fog_enum_to_count(GLenum pname)
211*61046927SAndroid Build Coastguard Worker {
212*61046927SAndroid Build Coastguard Worker    switch (pname) {
213*61046927SAndroid Build Coastguard Worker    case GL_FOG_MODE:
214*61046927SAndroid Build Coastguard Worker    case GL_FOG_DENSITY:
215*61046927SAndroid Build Coastguard Worker    case GL_FOG_START:
216*61046927SAndroid Build Coastguard Worker    case GL_FOG_END:
217*61046927SAndroid Build Coastguard Worker    case GL_FOG_INDEX:
218*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORDINATE_SOURCE_EXT:
219*61046927SAndroid Build Coastguard Worker    case GL_FOG_DISTANCE_MODE_NV:
220*61046927SAndroid Build Coastguard Worker       return 1;
221*61046927SAndroid Build Coastguard Worker    case GL_FOG_COLOR:
222*61046927SAndroid Build Coastguard Worker       return 4;
223*61046927SAndroid Build Coastguard Worker    default:
224*61046927SAndroid Build Coastguard Worker       return 0;
225*61046927SAndroid Build Coastguard Worker    }
226*61046927SAndroid Build Coastguard Worker }
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_light_enum_to_count(GLenum pname)229*61046927SAndroid Build Coastguard Worker _mesa_light_enum_to_count(GLenum pname)
230*61046927SAndroid Build Coastguard Worker {
231*61046927SAndroid Build Coastguard Worker    switch (pname) {
232*61046927SAndroid Build Coastguard Worker    case GL_AMBIENT:
233*61046927SAndroid Build Coastguard Worker    case GL_DIFFUSE:
234*61046927SAndroid Build Coastguard Worker    case GL_SPECULAR:
235*61046927SAndroid Build Coastguard Worker    case GL_POSITION:
236*61046927SAndroid Build Coastguard Worker       return 4;
237*61046927SAndroid Build Coastguard Worker    case GL_SPOT_DIRECTION:
238*61046927SAndroid Build Coastguard Worker       return 3;
239*61046927SAndroid Build Coastguard Worker    case GL_SPOT_EXPONENT:
240*61046927SAndroid Build Coastguard Worker    case GL_SPOT_CUTOFF:
241*61046927SAndroid Build Coastguard Worker    case GL_CONSTANT_ATTENUATION:
242*61046927SAndroid Build Coastguard Worker    case GL_LINEAR_ATTENUATION:
243*61046927SAndroid Build Coastguard Worker    case GL_QUADRATIC_ATTENUATION:
244*61046927SAndroid Build Coastguard Worker       return 1;
245*61046927SAndroid Build Coastguard Worker    default:
246*61046927SAndroid Build Coastguard Worker       return 0;
247*61046927SAndroid Build Coastguard Worker    }
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_light_model_enum_to_count(GLenum pname)251*61046927SAndroid Build Coastguard Worker _mesa_light_model_enum_to_count(GLenum pname)
252*61046927SAndroid Build Coastguard Worker {
253*61046927SAndroid Build Coastguard Worker    switch (pname) {
254*61046927SAndroid Build Coastguard Worker    case GL_LIGHT_MODEL_AMBIENT:
255*61046927SAndroid Build Coastguard Worker       return 4;
256*61046927SAndroid Build Coastguard Worker    case GL_LIGHT_MODEL_LOCAL_VIEWER:
257*61046927SAndroid Build Coastguard Worker    case GL_LIGHT_MODEL_TWO_SIDE:
258*61046927SAndroid Build Coastguard Worker    case GL_LIGHT_MODEL_COLOR_CONTROL:
259*61046927SAndroid Build Coastguard Worker       return 1;
260*61046927SAndroid Build Coastguard Worker    default:
261*61046927SAndroid Build Coastguard Worker       return 0;
262*61046927SAndroid Build Coastguard Worker    }
263*61046927SAndroid Build Coastguard Worker }
264*61046927SAndroid Build Coastguard Worker 
265*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_texenv_enum_to_count(GLenum pname)266*61046927SAndroid Build Coastguard Worker _mesa_texenv_enum_to_count(GLenum pname)
267*61046927SAndroid Build Coastguard Worker {
268*61046927SAndroid Build Coastguard Worker    switch (pname) {
269*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_ENV_MODE:
270*61046927SAndroid Build Coastguard Worker    case GL_COMBINE_RGB:
271*61046927SAndroid Build Coastguard Worker    case GL_COMBINE_ALPHA:
272*61046927SAndroid Build Coastguard Worker    case GL_SOURCE0_RGB:
273*61046927SAndroid Build Coastguard Worker    case GL_SOURCE1_RGB:
274*61046927SAndroid Build Coastguard Worker    case GL_SOURCE2_RGB:
275*61046927SAndroid Build Coastguard Worker    case GL_SOURCE3_RGB_NV:
276*61046927SAndroid Build Coastguard Worker    case GL_SOURCE0_ALPHA:
277*61046927SAndroid Build Coastguard Worker    case GL_SOURCE1_ALPHA:
278*61046927SAndroid Build Coastguard Worker    case GL_SOURCE2_ALPHA:
279*61046927SAndroid Build Coastguard Worker    case GL_SOURCE3_ALPHA_NV:
280*61046927SAndroid Build Coastguard Worker    case GL_OPERAND0_RGB:
281*61046927SAndroid Build Coastguard Worker    case GL_OPERAND1_RGB:
282*61046927SAndroid Build Coastguard Worker    case GL_OPERAND2_RGB:
283*61046927SAndroid Build Coastguard Worker    case GL_OPERAND3_RGB_NV:
284*61046927SAndroid Build Coastguard Worker    case GL_OPERAND0_ALPHA:
285*61046927SAndroid Build Coastguard Worker    case GL_OPERAND1_ALPHA:
286*61046927SAndroid Build Coastguard Worker    case GL_OPERAND2_ALPHA:
287*61046927SAndroid Build Coastguard Worker    case GL_OPERAND3_ALPHA_NV:
288*61046927SAndroid Build Coastguard Worker    case GL_RGB_SCALE:
289*61046927SAndroid Build Coastguard Worker    case GL_ALPHA_SCALE:
290*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_LOD_BIAS_EXT:
291*61046927SAndroid Build Coastguard Worker    case GL_COORD_REPLACE:
292*61046927SAndroid Build Coastguard Worker       return 1;
293*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_ENV_COLOR:
294*61046927SAndroid Build Coastguard Worker       return 4;
295*61046927SAndroid Build Coastguard Worker    default:
296*61046927SAndroid Build Coastguard Worker       return 0;
297*61046927SAndroid Build Coastguard Worker    }
298*61046927SAndroid Build Coastguard Worker }
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_texgen_enum_to_count(GLenum pname)301*61046927SAndroid Build Coastguard Worker _mesa_texgen_enum_to_count(GLenum pname)
302*61046927SAndroid Build Coastguard Worker {
303*61046927SAndroid Build Coastguard Worker    switch (pname) {
304*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_GEN_MODE:
305*61046927SAndroid Build Coastguard Worker       return 1;
306*61046927SAndroid Build Coastguard Worker    case GL_OBJECT_PLANE:
307*61046927SAndroid Build Coastguard Worker    case GL_EYE_PLANE:
308*61046927SAndroid Build Coastguard Worker       return 4;
309*61046927SAndroid Build Coastguard Worker    default:
310*61046927SAndroid Build Coastguard Worker       return 0;
311*61046927SAndroid Build Coastguard Worker    }
312*61046927SAndroid Build Coastguard Worker }
313*61046927SAndroid Build Coastguard Worker 
314*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_material_enum_to_count(GLenum pname)315*61046927SAndroid Build Coastguard Worker _mesa_material_enum_to_count(GLenum pname)
316*61046927SAndroid Build Coastguard Worker {
317*61046927SAndroid Build Coastguard Worker    switch (pname) {
318*61046927SAndroid Build Coastguard Worker    case GL_EMISSION:
319*61046927SAndroid Build Coastguard Worker    case GL_AMBIENT:
320*61046927SAndroid Build Coastguard Worker    case GL_DIFFUSE:
321*61046927SAndroid Build Coastguard Worker    case GL_SPECULAR:
322*61046927SAndroid Build Coastguard Worker    case GL_AMBIENT_AND_DIFFUSE:
323*61046927SAndroid Build Coastguard Worker       return 4;
324*61046927SAndroid Build Coastguard Worker    case GL_COLOR_INDEXES:
325*61046927SAndroid Build Coastguard Worker       return 3;
326*61046927SAndroid Build Coastguard Worker    case GL_SHININESS:
327*61046927SAndroid Build Coastguard Worker       return 1;
328*61046927SAndroid Build Coastguard Worker    default:
329*61046927SAndroid Build Coastguard Worker       return 0;
330*61046927SAndroid Build Coastguard Worker    }
331*61046927SAndroid Build Coastguard Worker }
332*61046927SAndroid Build Coastguard Worker 
333*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_point_param_enum_to_count(GLenum pname)334*61046927SAndroid Build Coastguard Worker _mesa_point_param_enum_to_count(GLenum pname)
335*61046927SAndroid Build Coastguard Worker {
336*61046927SAndroid Build Coastguard Worker    switch (pname) {
337*61046927SAndroid Build Coastguard Worker    case GL_DISTANCE_ATTENUATION_EXT:
338*61046927SAndroid Build Coastguard Worker       return 3;
339*61046927SAndroid Build Coastguard Worker    case GL_POINT_SIZE_MIN_EXT:
340*61046927SAndroid Build Coastguard Worker    case GL_POINT_SIZE_MAX_EXT:
341*61046927SAndroid Build Coastguard Worker    case GL_POINT_FADE_THRESHOLD_SIZE_EXT:
342*61046927SAndroid Build Coastguard Worker    case GL_POINT_SPRITE_COORD_ORIGIN:
343*61046927SAndroid Build Coastguard Worker       return 1;
344*61046927SAndroid Build Coastguard Worker    default:
345*61046927SAndroid Build Coastguard Worker       return 0;
346*61046927SAndroid Build Coastguard Worker    }
347*61046927SAndroid Build Coastguard Worker }
348*61046927SAndroid Build Coastguard Worker 
349*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_calllists_enum_to_count(GLenum type)350*61046927SAndroid Build Coastguard Worker _mesa_calllists_enum_to_count(GLenum type)
351*61046927SAndroid Build Coastguard Worker {
352*61046927SAndroid Build Coastguard Worker    switch (type) {
353*61046927SAndroid Build Coastguard Worker    case GL_BYTE:
354*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_BYTE:
355*61046927SAndroid Build Coastguard Worker       return 1;
356*61046927SAndroid Build Coastguard Worker    case GL_SHORT:
357*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_SHORT:
358*61046927SAndroid Build Coastguard Worker    case GL_2_BYTES:
359*61046927SAndroid Build Coastguard Worker       return 2;
360*61046927SAndroid Build Coastguard Worker    case GL_3_BYTES:
361*61046927SAndroid Build Coastguard Worker       return 3;
362*61046927SAndroid Build Coastguard Worker    case GL_INT:
363*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_INT:
364*61046927SAndroid Build Coastguard Worker    case GL_FLOAT:
365*61046927SAndroid Build Coastguard Worker    case GL_4_BYTES:
366*61046927SAndroid Build Coastguard Worker       return 4;
367*61046927SAndroid Build Coastguard Worker    default:
368*61046927SAndroid Build Coastguard Worker       return 0;
369*61046927SAndroid Build Coastguard Worker    }
370*61046927SAndroid Build Coastguard Worker }
371*61046927SAndroid Build Coastguard Worker 
372*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_patch_param_enum_to_count(GLenum pname)373*61046927SAndroid Build Coastguard Worker _mesa_patch_param_enum_to_count(GLenum pname)
374*61046927SAndroid Build Coastguard Worker {
375*61046927SAndroid Build Coastguard Worker    switch (pname) {
376*61046927SAndroid Build Coastguard Worker    case GL_PATCH_DEFAULT_OUTER_LEVEL:
377*61046927SAndroid Build Coastguard Worker       return 4;
378*61046927SAndroid Build Coastguard Worker    case GL_PATCH_DEFAULT_INNER_LEVEL:
379*61046927SAndroid Build Coastguard Worker       return 2;
380*61046927SAndroid Build Coastguard Worker    default:
381*61046927SAndroid Build Coastguard Worker       return 0;
382*61046927SAndroid Build Coastguard Worker    }
383*61046927SAndroid Build Coastguard Worker }
384*61046927SAndroid Build Coastguard Worker 
385*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_memobj_enum_to_count(GLenum pname)386*61046927SAndroid Build Coastguard Worker _mesa_memobj_enum_to_count(GLenum pname)
387*61046927SAndroid Build Coastguard Worker {
388*61046927SAndroid Build Coastguard Worker    switch (pname) {
389*61046927SAndroid Build Coastguard Worker    case GL_DEDICATED_MEMORY_OBJECT_EXT:
390*61046927SAndroid Build Coastguard Worker       return 1;
391*61046927SAndroid Build Coastguard Worker    default:
392*61046927SAndroid Build Coastguard Worker       return 0;
393*61046927SAndroid Build Coastguard Worker    }
394*61046927SAndroid Build Coastguard Worker }
395*61046927SAndroid Build Coastguard Worker 
396*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_semaphore_enum_to_count(GLenum pname)397*61046927SAndroid Build Coastguard Worker _mesa_semaphore_enum_to_count(GLenum pname)
398*61046927SAndroid Build Coastguard Worker {
399*61046927SAndroid Build Coastguard Worker    switch (pname) {
400*61046927SAndroid Build Coastguard Worker    /* EXT_semaphore and EXT_semaphore_fd define no parameters */
401*61046927SAndroid Build Coastguard Worker    default:
402*61046927SAndroid Build Coastguard Worker       return 0;
403*61046927SAndroid Build Coastguard Worker    }
404*61046927SAndroid Build Coastguard Worker }
405*61046927SAndroid Build Coastguard Worker 
406*61046927SAndroid Build Coastguard Worker static inline gl_vert_attrib
_mesa_array_to_attrib(struct gl_context * ctx,GLenum array)407*61046927SAndroid Build Coastguard Worker _mesa_array_to_attrib(struct gl_context *ctx, GLenum array)
408*61046927SAndroid Build Coastguard Worker {
409*61046927SAndroid Build Coastguard Worker    switch (array) {
410*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY:
411*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_POS;
412*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY:
413*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_NORMAL;
414*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY:
415*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_COLOR0;
416*61046927SAndroid Build Coastguard Worker    case GL_INDEX_ARRAY:
417*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_COLOR_INDEX;
418*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY:
419*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_TEX(ctx->GLThread.ClientActiveTexture);
420*61046927SAndroid Build Coastguard Worker    case GL_EDGE_FLAG_ARRAY:
421*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_EDGEFLAG;
422*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORDINATE_ARRAY:
423*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_FOG;
424*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY:
425*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_COLOR1;
426*61046927SAndroid Build Coastguard Worker    case GL_POINT_SIZE_ARRAY_OES:
427*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_POINT_SIZE;
428*61046927SAndroid Build Coastguard Worker    case GL_PRIMITIVE_RESTART_NV:
429*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_PRIMITIVE_RESTART_NV;
430*61046927SAndroid Build Coastguard Worker    default:
431*61046927SAndroid Build Coastguard Worker       if (array >= GL_TEXTURE0 && array <= GL_TEXTURE7)
432*61046927SAndroid Build Coastguard Worker          return VERT_ATTRIB_TEX(array - GL_TEXTURE0);
433*61046927SAndroid Build Coastguard Worker       return VERT_ATTRIB_MAX;
434*61046927SAndroid Build Coastguard Worker    }
435*61046927SAndroid Build Coastguard Worker }
436*61046927SAndroid Build Coastguard Worker 
437*61046927SAndroid Build Coastguard Worker static inline gl_matrix_index
_mesa_get_matrix_index(struct gl_context * ctx,GLenum mode)438*61046927SAndroid Build Coastguard Worker _mesa_get_matrix_index(struct gl_context *ctx, GLenum mode)
439*61046927SAndroid Build Coastguard Worker {
440*61046927SAndroid Build Coastguard Worker    if (mode == GL_MODELVIEW || mode == GL_PROJECTION)
441*61046927SAndroid Build Coastguard Worker       return M_MODELVIEW + (mode - GL_MODELVIEW);
442*61046927SAndroid Build Coastguard Worker 
443*61046927SAndroid Build Coastguard Worker    if (mode == GL_TEXTURE)
444*61046927SAndroid Build Coastguard Worker       return M_TEXTURE0 + ctx->GLThread.ActiveTexture;
445*61046927SAndroid Build Coastguard Worker 
446*61046927SAndroid Build Coastguard Worker    if (mode >= GL_TEXTURE0 && mode <= GL_TEXTURE0 + MAX_TEXTURE_UNITS - 1)
447*61046927SAndroid Build Coastguard Worker       return M_TEXTURE0 + (mode - GL_TEXTURE0);
448*61046927SAndroid Build Coastguard Worker 
449*61046927SAndroid Build Coastguard Worker    if (mode >= GL_MATRIX0_ARB && mode <= GL_MATRIX0_ARB + MAX_PROGRAM_MATRICES - 1)
450*61046927SAndroid Build Coastguard Worker       return M_PROGRAM0 + (mode - GL_MATRIX0_ARB);
451*61046927SAndroid Build Coastguard Worker 
452*61046927SAndroid Build Coastguard Worker    return M_DUMMY;
453*61046927SAndroid Build Coastguard Worker }
454*61046927SAndroid Build Coastguard Worker 
455*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_Enable(struct gl_context * ctx,GLenum cap)456*61046927SAndroid Build Coastguard Worker _mesa_glthread_Enable(struct gl_context *ctx, GLenum cap)
457*61046927SAndroid Build Coastguard Worker {
458*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
459*61046927SAndroid Build Coastguard Worker       return;
460*61046927SAndroid Build Coastguard Worker 
461*61046927SAndroid Build Coastguard Worker    switch (cap) {
462*61046927SAndroid Build Coastguard Worker    case GL_PRIMITIVE_RESTART:
463*61046927SAndroid Build Coastguard Worker    case GL_PRIMITIVE_RESTART_FIXED_INDEX:
464*61046927SAndroid Build Coastguard Worker       _mesa_glthread_set_prim_restart(ctx, cap, true);
465*61046927SAndroid Build Coastguard Worker       break;
466*61046927SAndroid Build Coastguard Worker    case GL_BLEND:
467*61046927SAndroid Build Coastguard Worker       ctx->GLThread.Blend = true;
468*61046927SAndroid Build Coastguard Worker       break;
469*61046927SAndroid Build Coastguard Worker    case GL_DEBUG_OUTPUT_SYNCHRONOUS:
470*61046927SAndroid Build Coastguard Worker       _mesa_glthread_disable(ctx);
471*61046927SAndroid Build Coastguard Worker       ctx->GLThread.DebugOutputSynchronous = true;
472*61046927SAndroid Build Coastguard Worker       break;
473*61046927SAndroid Build Coastguard Worker    case GL_DEPTH_TEST:
474*61046927SAndroid Build Coastguard Worker       ctx->GLThread.DepthTest = true;
475*61046927SAndroid Build Coastguard Worker       break;
476*61046927SAndroid Build Coastguard Worker    case GL_CULL_FACE:
477*61046927SAndroid Build Coastguard Worker       ctx->GLThread.CullFace = true;
478*61046927SAndroid Build Coastguard Worker       break;
479*61046927SAndroid Build Coastguard Worker    case GL_LIGHTING:
480*61046927SAndroid Build Coastguard Worker       ctx->GLThread.Lighting = true;
481*61046927SAndroid Build Coastguard Worker       break;
482*61046927SAndroid Build Coastguard Worker    case GL_POLYGON_STIPPLE:
483*61046927SAndroid Build Coastguard Worker       ctx->GLThread.PolygonStipple = true;
484*61046927SAndroid Build Coastguard Worker       break;
485*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY:
486*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY:
487*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY:
488*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY:
489*61046927SAndroid Build Coastguard Worker    case GL_INDEX_ARRAY:
490*61046927SAndroid Build Coastguard Worker    case GL_EDGE_FLAG_ARRAY:
491*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORDINATE_ARRAY:
492*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY:
493*61046927SAndroid Build Coastguard Worker    case GL_POINT_SIZE_ARRAY_OES:
494*61046927SAndroid Build Coastguard Worker       _mesa_glthread_ClientState(ctx, NULL, _mesa_array_to_attrib(ctx, cap),
495*61046927SAndroid Build Coastguard Worker                                  true);
496*61046927SAndroid Build Coastguard Worker       break;
497*61046927SAndroid Build Coastguard Worker    }
498*61046927SAndroid Build Coastguard Worker }
499*61046927SAndroid Build Coastguard Worker 
500*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_Disable(struct gl_context * ctx,GLenum cap)501*61046927SAndroid Build Coastguard Worker _mesa_glthread_Disable(struct gl_context *ctx, GLenum cap)
502*61046927SAndroid Build Coastguard Worker {
503*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
504*61046927SAndroid Build Coastguard Worker       return;
505*61046927SAndroid Build Coastguard Worker 
506*61046927SAndroid Build Coastguard Worker    switch (cap) {
507*61046927SAndroid Build Coastguard Worker    case GL_PRIMITIVE_RESTART:
508*61046927SAndroid Build Coastguard Worker    case GL_PRIMITIVE_RESTART_FIXED_INDEX:
509*61046927SAndroid Build Coastguard Worker       _mesa_glthread_set_prim_restart(ctx, cap, false);
510*61046927SAndroid Build Coastguard Worker       break;
511*61046927SAndroid Build Coastguard Worker    case GL_BLEND:
512*61046927SAndroid Build Coastguard Worker       ctx->GLThread.Blend = false;
513*61046927SAndroid Build Coastguard Worker       break;
514*61046927SAndroid Build Coastguard Worker    case GL_CULL_FACE:
515*61046927SAndroid Build Coastguard Worker       ctx->GLThread.CullFace = false;
516*61046927SAndroid Build Coastguard Worker       break;
517*61046927SAndroid Build Coastguard Worker    case GL_DEBUG_OUTPUT_SYNCHRONOUS:
518*61046927SAndroid Build Coastguard Worker       ctx->GLThread.DebugOutputSynchronous = false;
519*61046927SAndroid Build Coastguard Worker       _mesa_glthread_enable(ctx);
520*61046927SAndroid Build Coastguard Worker       break;
521*61046927SAndroid Build Coastguard Worker    case GL_DEPTH_TEST:
522*61046927SAndroid Build Coastguard Worker       ctx->GLThread.DepthTest = false;
523*61046927SAndroid Build Coastguard Worker       break;
524*61046927SAndroid Build Coastguard Worker    case GL_LIGHTING:
525*61046927SAndroid Build Coastguard Worker       ctx->GLThread.Lighting = false;
526*61046927SAndroid Build Coastguard Worker       break;
527*61046927SAndroid Build Coastguard Worker    case GL_POLYGON_STIPPLE:
528*61046927SAndroid Build Coastguard Worker       ctx->GLThread.PolygonStipple = false;
529*61046927SAndroid Build Coastguard Worker       break;
530*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY:
531*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY:
532*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY:
533*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY:
534*61046927SAndroid Build Coastguard Worker    case GL_INDEX_ARRAY:
535*61046927SAndroid Build Coastguard Worker    case GL_EDGE_FLAG_ARRAY:
536*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORDINATE_ARRAY:
537*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY:
538*61046927SAndroid Build Coastguard Worker    case GL_POINT_SIZE_ARRAY_OES:
539*61046927SAndroid Build Coastguard Worker       _mesa_glthread_ClientState(ctx, NULL, _mesa_array_to_attrib(ctx, cap),
540*61046927SAndroid Build Coastguard Worker                                  false);
541*61046927SAndroid Build Coastguard Worker       break;
542*61046927SAndroid Build Coastguard Worker    }
543*61046927SAndroid Build Coastguard Worker }
544*61046927SAndroid Build Coastguard Worker 
545*61046927SAndroid Build Coastguard Worker static inline int
_mesa_glthread_IsEnabled(struct gl_context * ctx,GLenum cap)546*61046927SAndroid Build Coastguard Worker _mesa_glthread_IsEnabled(struct gl_context *ctx, GLenum cap)
547*61046927SAndroid Build Coastguard Worker {
548*61046927SAndroid Build Coastguard Worker    /* This will generate GL_INVALID_OPERATION, as it should. */
549*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.inside_begin_end)
550*61046927SAndroid Build Coastguard Worker       return -1;
551*61046927SAndroid Build Coastguard Worker 
552*61046927SAndroid Build Coastguard Worker    switch (cap) {
553*61046927SAndroid Build Coastguard Worker    case GL_BLEND:
554*61046927SAndroid Build Coastguard Worker       return ctx->GLThread.Blend;
555*61046927SAndroid Build Coastguard Worker    case GL_CULL_FACE:
556*61046927SAndroid Build Coastguard Worker       return ctx->GLThread.CullFace;
557*61046927SAndroid Build Coastguard Worker    case GL_DEBUG_OUTPUT_SYNCHRONOUS:
558*61046927SAndroid Build Coastguard Worker       return ctx->GLThread.DebugOutputSynchronous;
559*61046927SAndroid Build Coastguard Worker    case GL_DEPTH_TEST:
560*61046927SAndroid Build Coastguard Worker       return ctx->GLThread.DepthTest;
561*61046927SAndroid Build Coastguard Worker    case GL_LIGHTING:
562*61046927SAndroid Build Coastguard Worker       return ctx->GLThread.Lighting;
563*61046927SAndroid Build Coastguard Worker    case GL_POLYGON_STIPPLE:
564*61046927SAndroid Build Coastguard Worker       return ctx->GLThread.PolygonStipple;
565*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY:
566*61046927SAndroid Build Coastguard Worker       return !!(ctx->GLThread.CurrentVAO->UserEnabled & VERT_BIT_POS);
567*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY:
568*61046927SAndroid Build Coastguard Worker       return !!(ctx->GLThread.CurrentVAO->UserEnabled & VERT_BIT_NORMAL);
569*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY:
570*61046927SAndroid Build Coastguard Worker       return !!(ctx->GLThread.CurrentVAO->UserEnabled & VERT_BIT_COLOR0);
571*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY:
572*61046927SAndroid Build Coastguard Worker       return !!(ctx->GLThread.CurrentVAO->UserEnabled &
573*61046927SAndroid Build Coastguard Worker                 (1 << VERT_ATTRIB_TEX(ctx->GLThread.ClientActiveTexture)));
574*61046927SAndroid Build Coastguard Worker    default:
575*61046927SAndroid Build Coastguard Worker       return -1; /* sync and call _mesa_IsEnabled. */
576*61046927SAndroid Build Coastguard Worker    }
577*61046927SAndroid Build Coastguard Worker }
578*61046927SAndroid Build Coastguard Worker 
579*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_PushAttrib(struct gl_context * ctx,GLbitfield mask)580*61046927SAndroid Build Coastguard Worker _mesa_glthread_PushAttrib(struct gl_context *ctx, GLbitfield mask)
581*61046927SAndroid Build Coastguard Worker {
582*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
583*61046927SAndroid Build Coastguard Worker       return;
584*61046927SAndroid Build Coastguard Worker 
585*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.AttribStackDepth >= MAX_ATTRIB_STACK_DEPTH)
586*61046927SAndroid Build Coastguard Worker       return;
587*61046927SAndroid Build Coastguard Worker 
588*61046927SAndroid Build Coastguard Worker    struct glthread_attrib_node *attr =
589*61046927SAndroid Build Coastguard Worker       &ctx->GLThread.AttribStack[ctx->GLThread.AttribStackDepth++];
590*61046927SAndroid Build Coastguard Worker 
591*61046927SAndroid Build Coastguard Worker    attr->Mask = mask;
592*61046927SAndroid Build Coastguard Worker 
593*61046927SAndroid Build Coastguard Worker    if (mask & GL_ENABLE_BIT)
594*61046927SAndroid Build Coastguard Worker       attr->Blend = ctx->GLThread.Blend;
595*61046927SAndroid Build Coastguard Worker 
596*61046927SAndroid Build Coastguard Worker    if (mask & (GL_POLYGON_BIT | GL_ENABLE_BIT)) {
597*61046927SAndroid Build Coastguard Worker       attr->CullFace = ctx->GLThread.CullFace;
598*61046927SAndroid Build Coastguard Worker       attr->PolygonStipple = ctx->GLThread.PolygonStipple;
599*61046927SAndroid Build Coastguard Worker    }
600*61046927SAndroid Build Coastguard Worker 
601*61046927SAndroid Build Coastguard Worker    if (mask & (GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT))
602*61046927SAndroid Build Coastguard Worker       attr->DepthTest = ctx->GLThread.DepthTest;
603*61046927SAndroid Build Coastguard Worker 
604*61046927SAndroid Build Coastguard Worker    if (mask & (GL_LIGHTING_BIT | GL_ENABLE_BIT))
605*61046927SAndroid Build Coastguard Worker       attr->Lighting = ctx->GLThread.Lighting;
606*61046927SAndroid Build Coastguard Worker 
607*61046927SAndroid Build Coastguard Worker    if (mask & GL_TEXTURE_BIT)
608*61046927SAndroid Build Coastguard Worker       attr->ActiveTexture = ctx->GLThread.ActiveTexture;
609*61046927SAndroid Build Coastguard Worker 
610*61046927SAndroid Build Coastguard Worker    if (mask & GL_TRANSFORM_BIT)
611*61046927SAndroid Build Coastguard Worker       attr->MatrixMode = ctx->GLThread.MatrixMode;
612*61046927SAndroid Build Coastguard Worker }
613*61046927SAndroid Build Coastguard Worker 
614*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_PopAttrib(struct gl_context * ctx)615*61046927SAndroid Build Coastguard Worker _mesa_glthread_PopAttrib(struct gl_context *ctx)
616*61046927SAndroid Build Coastguard Worker {
617*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
618*61046927SAndroid Build Coastguard Worker       return;
619*61046927SAndroid Build Coastguard Worker 
620*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.AttribStackDepth == 0)
621*61046927SAndroid Build Coastguard Worker       return;
622*61046927SAndroid Build Coastguard Worker 
623*61046927SAndroid Build Coastguard Worker    struct glthread_attrib_node *attr =
624*61046927SAndroid Build Coastguard Worker       &ctx->GLThread.AttribStack[--ctx->GLThread.AttribStackDepth];
625*61046927SAndroid Build Coastguard Worker    unsigned mask = attr->Mask;
626*61046927SAndroid Build Coastguard Worker 
627*61046927SAndroid Build Coastguard Worker    if (mask & GL_ENABLE_BIT)
628*61046927SAndroid Build Coastguard Worker       ctx->GLThread.Blend = attr->Blend;
629*61046927SAndroid Build Coastguard Worker 
630*61046927SAndroid Build Coastguard Worker    if (mask & (GL_POLYGON_BIT | GL_ENABLE_BIT)) {
631*61046927SAndroid Build Coastguard Worker       ctx->GLThread.CullFace = attr->CullFace;
632*61046927SAndroid Build Coastguard Worker       ctx->GLThread.PolygonStipple = attr->PolygonStipple;
633*61046927SAndroid Build Coastguard Worker    }
634*61046927SAndroid Build Coastguard Worker 
635*61046927SAndroid Build Coastguard Worker    if (mask & (GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT))
636*61046927SAndroid Build Coastguard Worker       ctx->GLThread.DepthTest = attr->DepthTest;
637*61046927SAndroid Build Coastguard Worker 
638*61046927SAndroid Build Coastguard Worker    if (mask & (GL_LIGHTING_BIT | GL_ENABLE_BIT))
639*61046927SAndroid Build Coastguard Worker       ctx->GLThread.Lighting = attr->Lighting;
640*61046927SAndroid Build Coastguard Worker 
641*61046927SAndroid Build Coastguard Worker    if (mask & GL_TEXTURE_BIT)
642*61046927SAndroid Build Coastguard Worker       ctx->GLThread.ActiveTexture = attr->ActiveTexture;
643*61046927SAndroid Build Coastguard Worker 
644*61046927SAndroid Build Coastguard Worker    if (mask & GL_TRANSFORM_BIT) {
645*61046927SAndroid Build Coastguard Worker       ctx->GLThread.MatrixMode = attr->MatrixMode;
646*61046927SAndroid Build Coastguard Worker       ctx->GLThread.MatrixIndex = _mesa_get_matrix_index(ctx, attr->MatrixMode);
647*61046927SAndroid Build Coastguard Worker    }
648*61046927SAndroid Build Coastguard Worker }
649*61046927SAndroid Build Coastguard Worker 
650*61046927SAndroid Build Coastguard Worker static bool
is_matrix_stack_full(struct gl_context * ctx,gl_matrix_index idx)651*61046927SAndroid Build Coastguard Worker is_matrix_stack_full(struct gl_context *ctx, gl_matrix_index idx)
652*61046927SAndroid Build Coastguard Worker {
653*61046927SAndroid Build Coastguard Worker    int max_stack_depth = 0;
654*61046927SAndroid Build Coastguard Worker    if (M_MODELVIEW == ctx->GLThread.MatrixIndex) {
655*61046927SAndroid Build Coastguard Worker       max_stack_depth = MAX_MODELVIEW_STACK_DEPTH;
656*61046927SAndroid Build Coastguard Worker    } else if (M_PROJECTION == ctx->GLThread.MatrixIndex) {
657*61046927SAndroid Build Coastguard Worker       max_stack_depth = MAX_PROJECTION_STACK_DEPTH;
658*61046927SAndroid Build Coastguard Worker    } else if (M_PROGRAM_LAST >= ctx->GLThread.MatrixIndex) {
659*61046927SAndroid Build Coastguard Worker       max_stack_depth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
660*61046927SAndroid Build Coastguard Worker    } else if (M_TEXTURE_LAST >= ctx->GLThread.MatrixIndex) {
661*61046927SAndroid Build Coastguard Worker       max_stack_depth = MAX_TEXTURE_STACK_DEPTH;
662*61046927SAndroid Build Coastguard Worker    }
663*61046927SAndroid Build Coastguard Worker    assert(max_stack_depth);
664*61046927SAndroid Build Coastguard Worker 
665*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.MatrixStackDepth[idx] + 1 >= max_stack_depth)
666*61046927SAndroid Build Coastguard Worker       return true;
667*61046927SAndroid Build Coastguard Worker 
668*61046927SAndroid Build Coastguard Worker    return false;
669*61046927SAndroid Build Coastguard Worker }
670*61046927SAndroid Build Coastguard Worker 
671*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_MatrixPushEXT(struct gl_context * ctx,GLenum matrixMode)672*61046927SAndroid Build Coastguard Worker _mesa_glthread_MatrixPushEXT(struct gl_context *ctx, GLenum matrixMode)
673*61046927SAndroid Build Coastguard Worker {
674*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
675*61046927SAndroid Build Coastguard Worker       return;
676*61046927SAndroid Build Coastguard Worker 
677*61046927SAndroid Build Coastguard Worker    if (is_matrix_stack_full(ctx, _mesa_get_matrix_index(ctx, matrixMode)))
678*61046927SAndroid Build Coastguard Worker       return;
679*61046927SAndroid Build Coastguard Worker 
680*61046927SAndroid Build Coastguard Worker    ctx->GLThread.MatrixStackDepth[_mesa_get_matrix_index(ctx, matrixMode)]++;
681*61046927SAndroid Build Coastguard Worker }
682*61046927SAndroid Build Coastguard Worker 
683*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_MatrixPopEXT(struct gl_context * ctx,GLenum matrixMode)684*61046927SAndroid Build Coastguard Worker _mesa_glthread_MatrixPopEXT(struct gl_context *ctx, GLenum matrixMode)
685*61046927SAndroid Build Coastguard Worker {
686*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
687*61046927SAndroid Build Coastguard Worker       return;
688*61046927SAndroid Build Coastguard Worker 
689*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.MatrixStackDepth[_mesa_get_matrix_index(ctx, matrixMode)] == 0)
690*61046927SAndroid Build Coastguard Worker       return;
691*61046927SAndroid Build Coastguard Worker 
692*61046927SAndroid Build Coastguard Worker    ctx->GLThread.MatrixStackDepth[_mesa_get_matrix_index(ctx, matrixMode)]--;
693*61046927SAndroid Build Coastguard Worker }
694*61046927SAndroid Build Coastguard Worker 
695*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_ActiveTexture(struct gl_context * ctx,GLenum texture)696*61046927SAndroid Build Coastguard Worker _mesa_glthread_ActiveTexture(struct gl_context *ctx, GLenum texture)
697*61046927SAndroid Build Coastguard Worker {
698*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
699*61046927SAndroid Build Coastguard Worker       return;
700*61046927SAndroid Build Coastguard Worker 
701*61046927SAndroid Build Coastguard Worker    ctx->GLThread.ActiveTexture = texture - GL_TEXTURE0;
702*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.MatrixMode == GL_TEXTURE)
703*61046927SAndroid Build Coastguard Worker       ctx->GLThread.MatrixIndex = _mesa_get_matrix_index(ctx, texture);
704*61046927SAndroid Build Coastguard Worker }
705*61046927SAndroid Build Coastguard Worker 
706*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_PushMatrix(struct gl_context * ctx)707*61046927SAndroid Build Coastguard Worker _mesa_glthread_PushMatrix(struct gl_context *ctx)
708*61046927SAndroid Build Coastguard Worker {
709*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
710*61046927SAndroid Build Coastguard Worker       return;
711*61046927SAndroid Build Coastguard Worker 
712*61046927SAndroid Build Coastguard Worker    if (is_matrix_stack_full(ctx, ctx->GLThread.MatrixIndex))
713*61046927SAndroid Build Coastguard Worker       return;
714*61046927SAndroid Build Coastguard Worker 
715*61046927SAndroid Build Coastguard Worker    ctx->GLThread.MatrixStackDepth[ctx->GLThread.MatrixIndex]++;
716*61046927SAndroid Build Coastguard Worker }
717*61046927SAndroid Build Coastguard Worker 
718*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_PopMatrix(struct gl_context * ctx)719*61046927SAndroid Build Coastguard Worker _mesa_glthread_PopMatrix(struct gl_context *ctx)
720*61046927SAndroid Build Coastguard Worker {
721*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
722*61046927SAndroid Build Coastguard Worker       return;
723*61046927SAndroid Build Coastguard Worker 
724*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.MatrixStackDepth[ctx->GLThread.MatrixIndex] == 0)
725*61046927SAndroid Build Coastguard Worker       return;
726*61046927SAndroid Build Coastguard Worker 
727*61046927SAndroid Build Coastguard Worker    ctx->GLThread.MatrixStackDepth[ctx->GLThread.MatrixIndex]--;
728*61046927SAndroid Build Coastguard Worker }
729*61046927SAndroid Build Coastguard Worker 
730*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_MatrixMode(struct gl_context * ctx,GLenum mode)731*61046927SAndroid Build Coastguard Worker _mesa_glthread_MatrixMode(struct gl_context *ctx, GLenum mode)
732*61046927SAndroid Build Coastguard Worker {
733*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
734*61046927SAndroid Build Coastguard Worker       return;
735*61046927SAndroid Build Coastguard Worker 
736*61046927SAndroid Build Coastguard Worker    ctx->GLThread.MatrixIndex = _mesa_get_matrix_index(ctx, mode);
737*61046927SAndroid Build Coastguard Worker    ctx->GLThread.MatrixMode = MIN2(mode, 0xffff);
738*61046927SAndroid Build Coastguard Worker }
739*61046927SAndroid Build Coastguard Worker 
740*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_ListBase(struct gl_context * ctx,GLuint base)741*61046927SAndroid Build Coastguard Worker _mesa_glthread_ListBase(struct gl_context *ctx, GLuint base)
742*61046927SAndroid Build Coastguard Worker {
743*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
744*61046927SAndroid Build Coastguard Worker       return;
745*61046927SAndroid Build Coastguard Worker 
746*61046927SAndroid Build Coastguard Worker    ctx->GLThread.ListBase = base;
747*61046927SAndroid Build Coastguard Worker }
748*61046927SAndroid Build Coastguard Worker 
749*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_init_call_fence(int * last_batch_index_where_called)750*61046927SAndroid Build Coastguard Worker _mesa_glthread_init_call_fence(int *last_batch_index_where_called)
751*61046927SAndroid Build Coastguard Worker {
752*61046927SAndroid Build Coastguard Worker    *last_batch_index_where_called = -1;
753*61046927SAndroid Build Coastguard Worker }
754*61046927SAndroid Build Coastguard Worker 
755*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_fence_call(struct gl_context * ctx,int * last_batch_index_where_called)756*61046927SAndroid Build Coastguard Worker _mesa_glthread_fence_call(struct gl_context *ctx,
757*61046927SAndroid Build Coastguard Worker                           int *last_batch_index_where_called)
758*61046927SAndroid Build Coastguard Worker {
759*61046927SAndroid Build Coastguard Worker    p_atomic_set(last_batch_index_where_called, ctx->GLThread.next);
760*61046927SAndroid Build Coastguard Worker    /* Flush, so that the fenced call is last in the batch. */
761*61046927SAndroid Build Coastguard Worker    _mesa_glthread_flush_batch(ctx);
762*61046927SAndroid Build Coastguard Worker }
763*61046927SAndroid Build Coastguard Worker 
764*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_signal_call(int * last_batch_index_where_called,int batch_index)765*61046927SAndroid Build Coastguard Worker _mesa_glthread_signal_call(int *last_batch_index_where_called, int batch_index)
766*61046927SAndroid Build Coastguard Worker {
767*61046927SAndroid Build Coastguard Worker    /* Atomically set this to -1 if it's equal to batch_index. */
768*61046927SAndroid Build Coastguard Worker    p_atomic_cmpxchg(last_batch_index_where_called, batch_index, -1);
769*61046927SAndroid Build Coastguard Worker }
770*61046927SAndroid Build Coastguard Worker 
771*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_wait_for_call(struct gl_context * ctx,int * last_batch_index_where_called)772*61046927SAndroid Build Coastguard Worker _mesa_glthread_wait_for_call(struct gl_context *ctx,
773*61046927SAndroid Build Coastguard Worker                              int *last_batch_index_where_called)
774*61046927SAndroid Build Coastguard Worker {
775*61046927SAndroid Build Coastguard Worker    int batch = p_atomic_read(last_batch_index_where_called);
776*61046927SAndroid Build Coastguard Worker    if (batch != -1) {
777*61046927SAndroid Build Coastguard Worker       util_queue_fence_wait(&ctx->GLThread.batches[batch].fence);
778*61046927SAndroid Build Coastguard Worker       assert(p_atomic_read(last_batch_index_where_called) == -1);
779*61046927SAndroid Build Coastguard Worker    }
780*61046927SAndroid Build Coastguard Worker }
781*61046927SAndroid Build Coastguard Worker 
782*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_CallList(struct gl_context * ctx,GLuint list)783*61046927SAndroid Build Coastguard Worker _mesa_glthread_CallList(struct gl_context *ctx, GLuint list)
784*61046927SAndroid Build Coastguard Worker {
785*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
786*61046927SAndroid Build Coastguard Worker       return;
787*61046927SAndroid Build Coastguard Worker 
788*61046927SAndroid Build Coastguard Worker    /* Wait for all glEndList and glDeleteLists calls to finish to ensure that
789*61046927SAndroid Build Coastguard Worker     * all display lists are up to date and the driver thread is not
790*61046927SAndroid Build Coastguard Worker     * modifiying them. We will be executing them in the application thread.
791*61046927SAndroid Build Coastguard Worker     */
792*61046927SAndroid Build Coastguard Worker    _mesa_glthread_wait_for_call(ctx, &ctx->GLThread.LastDListChangeBatchIndex);
793*61046927SAndroid Build Coastguard Worker 
794*61046927SAndroid Build Coastguard Worker    if (!ctx->Shared->DisplayListsAffectGLThread)
795*61046927SAndroid Build Coastguard Worker       return;
796*61046927SAndroid Build Coastguard Worker 
797*61046927SAndroid Build Coastguard Worker    /* Clear GL_COMPILE_AND_EXECUTE if needed. We only execute here. */
798*61046927SAndroid Build Coastguard Worker    unsigned saved_mode = ctx->GLThread.ListMode;
799*61046927SAndroid Build Coastguard Worker    ctx->GLThread.ListMode = 0;
800*61046927SAndroid Build Coastguard Worker 
801*61046927SAndroid Build Coastguard Worker    _mesa_glthread_execute_list(ctx, list);
802*61046927SAndroid Build Coastguard Worker 
803*61046927SAndroid Build Coastguard Worker    ctx->GLThread.ListMode = saved_mode;
804*61046927SAndroid Build Coastguard Worker }
805*61046927SAndroid Build Coastguard Worker 
806*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_CallLists(struct gl_context * ctx,GLsizei n,GLenum type,const GLvoid * lists)807*61046927SAndroid Build Coastguard Worker _mesa_glthread_CallLists(struct gl_context *ctx, GLsizei n, GLenum type,
808*61046927SAndroid Build Coastguard Worker                          const GLvoid *lists)
809*61046927SAndroid Build Coastguard Worker {
810*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.ListMode == GL_COMPILE)
811*61046927SAndroid Build Coastguard Worker       return;
812*61046927SAndroid Build Coastguard Worker 
813*61046927SAndroid Build Coastguard Worker    if (n <= 0 || !lists)
814*61046927SAndroid Build Coastguard Worker       return;
815*61046927SAndroid Build Coastguard Worker 
816*61046927SAndroid Build Coastguard Worker    /* Wait for all glEndList and glDeleteLists calls to finish to ensure that
817*61046927SAndroid Build Coastguard Worker     * all display lists are up to date and the driver thread is not
818*61046927SAndroid Build Coastguard Worker     * modifiying them. We will be executing them in the application thread.
819*61046927SAndroid Build Coastguard Worker     */
820*61046927SAndroid Build Coastguard Worker    _mesa_glthread_wait_for_call(ctx, &ctx->GLThread.LastDListChangeBatchIndex);
821*61046927SAndroid Build Coastguard Worker 
822*61046927SAndroid Build Coastguard Worker    /* Clear GL_COMPILE_AND_EXECUTE if needed. We only execute here. */
823*61046927SAndroid Build Coastguard Worker    unsigned saved_mode = ctx->GLThread.ListMode;
824*61046927SAndroid Build Coastguard Worker    ctx->GLThread.ListMode = 0;
825*61046927SAndroid Build Coastguard Worker 
826*61046927SAndroid Build Coastguard Worker    unsigned base = ctx->GLThread.ListBase;
827*61046927SAndroid Build Coastguard Worker 
828*61046927SAndroid Build Coastguard Worker    GLbyte *bptr;
829*61046927SAndroid Build Coastguard Worker    GLubyte *ubptr;
830*61046927SAndroid Build Coastguard Worker    GLshort *sptr;
831*61046927SAndroid Build Coastguard Worker    GLushort *usptr;
832*61046927SAndroid Build Coastguard Worker    GLint *iptr;
833*61046927SAndroid Build Coastguard Worker    GLuint *uiptr;
834*61046927SAndroid Build Coastguard Worker    GLfloat *fptr;
835*61046927SAndroid Build Coastguard Worker 
836*61046927SAndroid Build Coastguard Worker    switch (type) {
837*61046927SAndroid Build Coastguard Worker    case GL_BYTE:
838*61046927SAndroid Build Coastguard Worker       bptr = (GLbyte *) lists;
839*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++)
840*61046927SAndroid Build Coastguard Worker          _mesa_glthread_CallList(ctx, base + bptr[i]);
841*61046927SAndroid Build Coastguard Worker       break;
842*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_BYTE:
843*61046927SAndroid Build Coastguard Worker       ubptr = (GLubyte *) lists;
844*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++)
845*61046927SAndroid Build Coastguard Worker          _mesa_glthread_CallList(ctx, base + ubptr[i]);
846*61046927SAndroid Build Coastguard Worker       break;
847*61046927SAndroid Build Coastguard Worker    case GL_SHORT:
848*61046927SAndroid Build Coastguard Worker       sptr = (GLshort *) lists;
849*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++)
850*61046927SAndroid Build Coastguard Worker          _mesa_glthread_CallList(ctx, base + sptr[i]);
851*61046927SAndroid Build Coastguard Worker       break;
852*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_SHORT:
853*61046927SAndroid Build Coastguard Worker       usptr = (GLushort *) lists;
854*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++)
855*61046927SAndroid Build Coastguard Worker          _mesa_glthread_CallList(ctx, base + usptr[i]);
856*61046927SAndroid Build Coastguard Worker       break;
857*61046927SAndroid Build Coastguard Worker    case GL_INT:
858*61046927SAndroid Build Coastguard Worker       iptr = (GLint *) lists;
859*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++)
860*61046927SAndroid Build Coastguard Worker          _mesa_glthread_CallList(ctx, base + iptr[i]);
861*61046927SAndroid Build Coastguard Worker       break;
862*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_INT:
863*61046927SAndroid Build Coastguard Worker       uiptr = (GLuint *) lists;
864*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++)
865*61046927SAndroid Build Coastguard Worker          _mesa_glthread_CallList(ctx, base + uiptr[i]);
866*61046927SAndroid Build Coastguard Worker       break;
867*61046927SAndroid Build Coastguard Worker    case GL_FLOAT:
868*61046927SAndroid Build Coastguard Worker       fptr = (GLfloat *) lists;
869*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++)
870*61046927SAndroid Build Coastguard Worker          _mesa_glthread_CallList(ctx, base + fptr[i]);
871*61046927SAndroid Build Coastguard Worker       break;
872*61046927SAndroid Build Coastguard Worker    case GL_2_BYTES:
873*61046927SAndroid Build Coastguard Worker       ubptr = (GLubyte *) lists;
874*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++) {
875*61046927SAndroid Build Coastguard Worker          _mesa_glthread_CallList(ctx, base +
876*61046927SAndroid Build Coastguard Worker                                  (GLint)ubptr[2 * i] * 256 +
877*61046927SAndroid Build Coastguard Worker                                  (GLint)ubptr[2 * i + 1]);
878*61046927SAndroid Build Coastguard Worker       }
879*61046927SAndroid Build Coastguard Worker       break;
880*61046927SAndroid Build Coastguard Worker    case GL_3_BYTES:
881*61046927SAndroid Build Coastguard Worker       ubptr = (GLubyte *) lists;
882*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++) {
883*61046927SAndroid Build Coastguard Worker          _mesa_glthread_CallList(ctx, base +
884*61046927SAndroid Build Coastguard Worker                                  (GLint)ubptr[3 * i] * 65536 +
885*61046927SAndroid Build Coastguard Worker                                  (GLint)ubptr[3 * i + 1] * 256 +
886*61046927SAndroid Build Coastguard Worker                                  (GLint)ubptr[3 * i + 2]);
887*61046927SAndroid Build Coastguard Worker       }
888*61046927SAndroid Build Coastguard Worker       break;
889*61046927SAndroid Build Coastguard Worker    case GL_4_BYTES:
890*61046927SAndroid Build Coastguard Worker       ubptr = (GLubyte *) lists;
891*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++) {
892*61046927SAndroid Build Coastguard Worker          _mesa_glthread_CallList(ctx, base +
893*61046927SAndroid Build Coastguard Worker                                  (GLint)ubptr[4 * i] * 16777216 +
894*61046927SAndroid Build Coastguard Worker                                  (GLint)ubptr[4 * i + 1] * 65536 +
895*61046927SAndroid Build Coastguard Worker                                  (GLint)ubptr[4 * i + 2] * 256 +
896*61046927SAndroid Build Coastguard Worker                                  (GLint)ubptr[4 * i + 3]);
897*61046927SAndroid Build Coastguard Worker       }
898*61046927SAndroid Build Coastguard Worker       break;
899*61046927SAndroid Build Coastguard Worker    }
900*61046927SAndroid Build Coastguard Worker 
901*61046927SAndroid Build Coastguard Worker    ctx->GLThread.ListMode = saved_mode;
902*61046927SAndroid Build Coastguard Worker }
903*61046927SAndroid Build Coastguard Worker 
904*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_NewList(struct gl_context * ctx,GLuint list,GLenum mode)905*61046927SAndroid Build Coastguard Worker _mesa_glthread_NewList(struct gl_context *ctx, GLuint list, GLenum mode)
906*61046927SAndroid Build Coastguard Worker {
907*61046927SAndroid Build Coastguard Worker    if (!ctx->GLThread.ListMode)
908*61046927SAndroid Build Coastguard Worker       ctx->GLThread.ListMode = MIN2(mode, 0xffff);
909*61046927SAndroid Build Coastguard Worker }
910*61046927SAndroid Build Coastguard Worker 
911*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_EndList(struct gl_context * ctx)912*61046927SAndroid Build Coastguard Worker _mesa_glthread_EndList(struct gl_context *ctx)
913*61046927SAndroid Build Coastguard Worker {
914*61046927SAndroid Build Coastguard Worker    if (!ctx->GLThread.ListMode)
915*61046927SAndroid Build Coastguard Worker       return;
916*61046927SAndroid Build Coastguard Worker 
917*61046927SAndroid Build Coastguard Worker    ctx->GLThread.ListMode = 0;
918*61046927SAndroid Build Coastguard Worker 
919*61046927SAndroid Build Coastguard Worker    /* Track the last display list change. */
920*61046927SAndroid Build Coastguard Worker    _mesa_glthread_fence_call(ctx, &ctx->GLThread.LastDListChangeBatchIndex);
921*61046927SAndroid Build Coastguard Worker }
922*61046927SAndroid Build Coastguard Worker 
923*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_DeleteLists(struct gl_context * ctx,GLsizei range)924*61046927SAndroid Build Coastguard Worker _mesa_glthread_DeleteLists(struct gl_context *ctx, GLsizei range)
925*61046927SAndroid Build Coastguard Worker {
926*61046927SAndroid Build Coastguard Worker    if (range < 0)
927*61046927SAndroid Build Coastguard Worker       return;
928*61046927SAndroid Build Coastguard Worker 
929*61046927SAndroid Build Coastguard Worker    /* Track the last display list change. */
930*61046927SAndroid Build Coastguard Worker    _mesa_glthread_fence_call(ctx, &ctx->GLThread.LastDListChangeBatchIndex);
931*61046927SAndroid Build Coastguard Worker }
932*61046927SAndroid Build Coastguard Worker 
933*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_BindFramebuffer(struct gl_context * ctx,GLenum target,GLuint id)934*61046927SAndroid Build Coastguard Worker _mesa_glthread_BindFramebuffer(struct gl_context *ctx, GLenum target, GLuint id)
935*61046927SAndroid Build Coastguard Worker {
936*61046927SAndroid Build Coastguard Worker    switch (target) {
937*61046927SAndroid Build Coastguard Worker    case GL_FRAMEBUFFER:
938*61046927SAndroid Build Coastguard Worker       ctx->GLThread.CurrentDrawFramebuffer = id;
939*61046927SAndroid Build Coastguard Worker       ctx->GLThread.CurrentReadFramebuffer = id;
940*61046927SAndroid Build Coastguard Worker       break;
941*61046927SAndroid Build Coastguard Worker    case GL_DRAW_FRAMEBUFFER:
942*61046927SAndroid Build Coastguard Worker       ctx->GLThread.CurrentDrawFramebuffer = id;
943*61046927SAndroid Build Coastguard Worker       break;
944*61046927SAndroid Build Coastguard Worker    case GL_READ_FRAMEBUFFER:
945*61046927SAndroid Build Coastguard Worker       ctx->GLThread.CurrentReadFramebuffer = id;
946*61046927SAndroid Build Coastguard Worker       break;
947*61046927SAndroid Build Coastguard Worker    }
948*61046927SAndroid Build Coastguard Worker }
949*61046927SAndroid Build Coastguard Worker 
950*61046927SAndroid Build Coastguard Worker static inline void
_mesa_glthread_DeleteFramebuffers(struct gl_context * ctx,GLsizei n,const GLuint * ids)951*61046927SAndroid Build Coastguard Worker _mesa_glthread_DeleteFramebuffers(struct gl_context *ctx, GLsizei n,
952*61046927SAndroid Build Coastguard Worker                                   const GLuint *ids)
953*61046927SAndroid Build Coastguard Worker {
954*61046927SAndroid Build Coastguard Worker    if (ctx->GLThread.CurrentDrawFramebuffer) {
955*61046927SAndroid Build Coastguard Worker       for (int i = 0; i < n; i++) {
956*61046927SAndroid Build Coastguard Worker          if (ctx->GLThread.CurrentDrawFramebuffer == ids[i])
957*61046927SAndroid Build Coastguard Worker             ctx->GLThread.CurrentDrawFramebuffer = 0;
958*61046927SAndroid Build Coastguard Worker          if (ctx->GLThread.CurrentReadFramebuffer == ids[i])
959*61046927SAndroid Build Coastguard Worker             ctx->GLThread.CurrentReadFramebuffer = 0;
960*61046927SAndroid Build Coastguard Worker       }
961*61046927SAndroid Build Coastguard Worker    }
962*61046927SAndroid Build Coastguard Worker }
963*61046927SAndroid Build Coastguard Worker 
964*61046927SAndroid Build Coastguard Worker #endif /* MARSHAL_H */
965