• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2012 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23 
24 #ifndef _GLTHREAD_H
25 #define _GLTHREAD_H
26 
27 /* The size of one batch and the maximum size of one call.
28  *
29  * This should be as low as possible, so that:
30  * - multiple synchronizations within a frame don't slow us down much
31  * - a smaller number of calls per frame can still get decent parallelism
32  * - the memory footprint of the queue is low, and with that comes a lower
33  *   chance of experiencing CPU cache thrashing
34  * but it should be high enough so that u_queue overhead remains negligible.
35  */
36 #define MARSHAL_MAX_CMD_SIZE (8 * 1024)
37 
38 /* The number of batch slots in memory.
39  *
40  * One batch is being executed, one batch is being filled, the rest are
41  * waiting batches. There must be at least 1 slot for a waiting batch,
42  * so the minimum number of batches is 3.
43  */
44 #define MARSHAL_MAX_BATCHES 8
45 
46 /* Special value for glEnableClientState(GL_PRIMITIVE_RESTART_NV). */
47 #define VERT_ATTRIB_PRIMITIVE_RESTART_NV -1
48 
49 #include <inttypes.h>
50 #include <stdbool.h>
51 #include "util/u_queue.h"
52 #include "GL/gl.h"
53 #include "compiler/shader_enums.h"
54 #include "main/config.h"
55 
56 #ifdef __cplusplus
57 extern "C" {
58 #endif
59 
60 struct gl_context;
61 struct gl_buffer_object;
62 struct _mesa_HashTable;
63 
64 struct glthread_attrib_binding {
65    struct gl_buffer_object *buffer; /**< where non-VBO data was uploaded */
66    int offset;                      /**< offset to uploaded non-VBO data */
67    const void *original_pointer;    /**< restore this pointer after the draw */
68 };
69 
70 struct glthread_vao {
71    GLuint Name;
72    GLuint CurrentElementBufferName;
73    GLbitfield UserEnabled; /**< Vertex attribs enabled by the user. */
74    GLbitfield Enabled; /**< UserEnabled with POS vs GENERIC0 aliasing resolved. */
75    GLbitfield BufferEnabled; /**< "Enabled" converted to buffer bindings. */
76    GLbitfield BufferInterleaved; /**< Bitmask of buffers used by multiple attribs. */
77    GLbitfield UserPointerMask; /**< Bitmask of buffer bindings. */
78    GLbitfield NonZeroDivisorMask; /**< Bitmask of buffer bindings. */
79 
80    struct {
81       /* Per attrib: */
82       GLuint ElementSize;
83       GLuint RelativeOffset;
84       GLuint BufferIndex; /**< Referring to Attrib[BufferIndex]. */
85 
86       /* Per buffer binding: */
87       GLsizei Stride;
88       GLuint Divisor;
89       int EnabledAttribCount; /**< Number of enabled attribs using this buffer. */
90       const void *Pointer;
91    } Attrib[VERT_ATTRIB_MAX];
92 };
93 
94 /** A single batch of commands queued up for execution. */
95 struct glthread_batch
96 {
97    /** Batch fence for waiting for the execution to finish. */
98    struct util_queue_fence fence;
99 
100    /** The worker thread will access the context with this. */
101    struct gl_context *ctx;
102 
103    /**
104     * Number of uint64_t elements filled already.
105     * This is 0 when it's being filled because glthread::used holds the real
106     * value temporarily, and glthread::used is copied to this variable when
107     * the batch is submitted.
108     */
109    unsigned used;
110 
111    /** Data contained in the command buffer. */
112    uint64_t buffer[MARSHAL_MAX_CMD_SIZE / 8];
113 };
114 
115 struct glthread_client_attrib {
116    struct glthread_vao VAO;
117    GLuint CurrentArrayBufferName;
118    int ClientActiveTexture;
119    GLuint RestartIndex;
120    bool PrimitiveRestart;
121    bool PrimitiveRestartFixedIndex;
122 
123    /** Whether this element of the client attrib stack contains saved state. */
124    bool Valid;
125 };
126 
127 /* For glPushAttrib / glPopAttrib. */
128 struct glthread_attrib_node {
129    GLbitfield Mask;
130    int ActiveTexture;
131    GLenum MatrixMode;
132    bool CullFace;
133    bool DepthTest;
134 };
135 
136 typedef enum {
137    M_MODELVIEW,
138    M_PROJECTION,
139    M_PROGRAM0,
140    M_PROGRAM_LAST = M_PROGRAM0 + MAX_PROGRAM_MATRICES - 1,
141    M_TEXTURE0,
142    M_TEXTURE_LAST = M_TEXTURE0 + MAX_TEXTURE_UNITS - 1,
143    M_DUMMY, /* used instead of reporting errors */
144    M_NUM_MATRIX_STACKS,
145 } gl_matrix_index;
146 
147 struct glthread_state
148 {
149    /** Multithreaded queue. */
150    struct util_queue queue;
151 
152    /** This is sent to the driver for framebuffer overlay / HUD. */
153    struct util_queue_monitoring stats;
154 
155    /** Whether GLThread is enabled. */
156    bool enabled;
157 
158    /** Display lists. */
159    GLenum ListMode; /**< Zero if not inside display list, else list mode. */
160    unsigned ListBase;
161    unsigned ListCallDepth;
162 
163    /** For L3 cache pinning. */
164    unsigned pin_thread_counter;
165 
166    /** The ring of batches in memory. */
167    struct glthread_batch batches[MARSHAL_MAX_BATCHES];
168 
169    /** Pointer to the batch currently being filled. */
170    struct glthread_batch *next_batch;
171 
172    /** Index of the last submitted batch. */
173    unsigned last;
174 
175    /** Index of the batch being filled and about to be submitted. */
176    unsigned next;
177 
178    /** Number of uint64_t elements filled already. */
179    unsigned used;
180 
181    /** Upload buffer. */
182    struct gl_buffer_object *upload_buffer;
183    uint8_t *upload_ptr;
184    unsigned upload_offset;
185    int upload_buffer_private_refcount;
186 
187    /** Caps. */
188    GLboolean SupportsBufferUploads;
189    GLboolean SupportsNonVBOUploads;
190 
191    /** Primitive restart state. */
192    bool PrimitiveRestart;
193    bool PrimitiveRestartFixedIndex;
194    bool _PrimitiveRestart;
195    GLuint RestartIndex;
196    GLuint _RestartIndex[4]; /**< Restart index for index_size = 1,2,4. */
197 
198    /** Vertex Array objects tracked by glthread independently of Mesa. */
199    struct _mesa_HashTable *VAOs;
200    struct glthread_vao *CurrentVAO;
201    struct glthread_vao *LastLookedUpVAO;
202    struct glthread_vao DefaultVAO;
203    struct glthread_client_attrib ClientAttribStack[MAX_CLIENT_ATTRIB_STACK_DEPTH];
204    int ClientAttribStackTop;
205    int ClientActiveTexture;
206 
207    /** Currently-bound buffer object IDs. */
208    GLuint CurrentArrayBufferName;
209    GLuint CurrentDrawIndirectBufferName;
210    GLuint CurrentPixelPackBufferName;
211    GLuint CurrentPixelUnpackBufferName;
212    GLuint CurrentQueryBufferName;
213 
214    /**
215     * The batch index of the last occurence of glLinkProgram or
216     * glDeleteProgram or -1 if there is no such enqueued call.
217     */
218    int LastProgramChangeBatch;
219 
220    /**
221     * The batch index of the last occurence of glEndList or
222     * glDeleteLists or -1 if there is no such enqueued call.
223     */
224    int LastDListChangeBatchIndex;
225 
226    /** Basic matrix state tracking. */
227    int ActiveTexture;
228    GLenum MatrixMode;
229    gl_matrix_index MatrixIndex;
230    struct glthread_attrib_node AttribStack[MAX_ATTRIB_STACK_DEPTH];
231    int AttribStackDepth;
232    int MatrixStackDepth[M_NUM_MATRIX_STACKS];
233 
234    /** Enable states. */
235    bool DepthTest;
236    bool CullFace;
237 
238    GLuint CurrentDrawFramebuffer;
239    GLuint CurrentProgram;
240 };
241 
242 void _mesa_glthread_init(struct gl_context *ctx);
243 void _mesa_glthread_destroy(struct gl_context *ctx, const char *reason);
244 
245 void _mesa_glthread_flush_batch(struct gl_context *ctx);
246 void _mesa_glthread_finish(struct gl_context *ctx);
247 void _mesa_glthread_finish_before(struct gl_context *ctx, const char *func);
248 void _mesa_glthread_upload(struct gl_context *ctx, const void *data,
249                            GLsizeiptr size, unsigned *out_offset,
250                            struct gl_buffer_object **out_buffer,
251                            uint8_t **out_ptr);
252 void _mesa_glthread_reset_vao(struct glthread_vao *vao);
253 void _mesa_error_glthread_safe(struct gl_context *ctx, GLenum error,
254                                bool glthread, const char *format, ...);
255 void _mesa_glthread_execute_list(struct gl_context *ctx, GLuint list);
256 
257 void _mesa_glthread_BindBuffer(struct gl_context *ctx, GLenum target,
258                                GLuint buffer);
259 void _mesa_glthread_DeleteBuffers(struct gl_context *ctx, GLsizei n,
260                                   const GLuint *buffers);
261 
262 void _mesa_glthread_BindVertexArray(struct gl_context *ctx, GLuint id);
263 void _mesa_glthread_DeleteVertexArrays(struct gl_context *ctx,
264                                        GLsizei n, const GLuint *ids);
265 void _mesa_glthread_GenVertexArrays(struct gl_context *ctx,
266                                     GLsizei n, GLuint *arrays);
267 void _mesa_glthread_set_prim_restart(struct gl_context *ctx, GLenum cap,
268                                      bool value);
269 void _mesa_glthread_PrimitiveRestartIndex(struct gl_context *ctx, GLuint index);
270 void _mesa_glthread_ClientState(struct gl_context *ctx, GLuint *vaobj,
271                                 gl_vert_attrib attrib, bool enable);
272 void _mesa_glthread_AttribDivisor(struct gl_context *ctx, const GLuint *vaobj,
273                                   gl_vert_attrib attrib, GLuint divisor);
274 void _mesa_glthread_AttribPointer(struct gl_context *ctx, gl_vert_attrib attrib,
275                                   GLint size, GLenum type, GLsizei stride,
276                                   const void *pointer);
277 void _mesa_glthread_DSAAttribPointer(struct gl_context *ctx, GLuint vao,
278                                      GLuint buffer, gl_vert_attrib attrib,
279                                      GLint size, GLenum type, GLsizei stride,
280                                      GLintptr offset);
281 void _mesa_glthread_AttribFormat(struct gl_context *ctx, GLuint attribindex,
282                                  GLint size, GLenum type,  GLuint relativeoffset);
283 void _mesa_glthread_DSAAttribFormat(struct gl_context *ctx, GLuint vaobj,
284                                     GLuint attribindex, GLint size, GLenum type,
285                                     GLuint relativeoffset);
286 void _mesa_glthread_VertexBuffer(struct gl_context *ctx, GLuint bindingindex,
287                                  GLuint buffer, GLintptr offset, GLsizei stride);
288 void _mesa_glthread_DSAVertexBuffer(struct gl_context *ctx, GLuint vaobj,
289                                     GLuint bindingindex, GLuint buffer,
290                                     GLintptr offset, GLsizei stride);
291 void _mesa_glthread_DSAVertexBuffers(struct gl_context *ctx, GLuint vaobj,
292                                      GLuint first, GLsizei count,
293                                      const GLuint *buffers,
294                                      const GLintptr *offsets,
295                                      const GLsizei *strides);
296 void _mesa_glthread_BindingDivisor(struct gl_context *ctx, GLuint bindingindex,
297                                    GLuint divisor);
298 void _mesa_glthread_DSABindingDivisor(struct gl_context *ctx, GLuint vaobj,
299                                       GLuint bindingindex, GLuint divisor);
300 void _mesa_glthread_AttribBinding(struct gl_context *ctx, GLuint attribindex,
301                                   GLuint bindingindex);
302 void _mesa_glthread_DSAAttribBinding(struct gl_context *ctx, GLuint vaobj,
303                                      GLuint attribindex, GLuint bindingindex);
304 void _mesa_glthread_DSAElementBuffer(struct gl_context *ctx, GLuint vaobj,
305                                      GLuint buffer);
306 void _mesa_glthread_PushClientAttrib(struct gl_context *ctx, GLbitfield mask,
307                                      bool set_default);
308 void _mesa_glthread_PopClientAttrib(struct gl_context *ctx);
309 void _mesa_glthread_ClientAttribDefault(struct gl_context *ctx, GLbitfield mask);
310 void _mesa_glthread_InterleavedArrays(struct gl_context *ctx, GLenum format,
311                                       GLsizei stride, const GLvoid *pointer);
312 void _mesa_glthread_ProgramChanged(struct gl_context *ctx);
313 
314 #ifdef __cplusplus
315 }
316 #endif
317 
318 #endif /* _GLTHREAD_H*/
319