• 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 struct gl_context;
57 struct gl_buffer_object;
58 struct _mesa_HashTable;
59 
60 struct glthread_attrib_binding {
61    struct gl_buffer_object *buffer; /**< where non-VBO data was uploaded */
62    int offset;                      /**< offset to uploaded non-VBO data */
63    const void *original_pointer;    /**< restore this pointer after the draw */
64 };
65 
66 struct glthread_vao {
67    GLuint Name;
68    GLuint CurrentElementBufferName;
69    GLbitfield UserEnabled; /**< Vertex attribs enabled by the user. */
70    GLbitfield Enabled; /**< UserEnabled with POS vs GENERIC0 aliasing resolved. */
71    GLbitfield BufferEnabled; /**< "Enabled" converted to buffer bindings. */
72    GLbitfield BufferInterleaved; /**< Bitmask of buffers used by multiple attribs. */
73    GLbitfield UserPointerMask; /**< Bitmask of buffer bindings. */
74    GLbitfield NonZeroDivisorMask; /**< Bitmask of buffer bindings. */
75 
76    struct {
77       /* Per attrib: */
78       GLuint ElementSize;
79       GLuint RelativeOffset;
80       GLuint BufferIndex; /**< Referring to Attrib[BufferIndex]. */
81 
82       /* Per buffer binding: */
83       GLsizei Stride;
84       GLuint Divisor;
85       int EnabledAttribCount; /**< Number of enabled attribs using this buffer. */
86       const void *Pointer;
87    } Attrib[VERT_ATTRIB_MAX];
88 };
89 
90 /** A single batch of commands queued up for execution. */
91 struct glthread_batch
92 {
93    /** Batch fence for waiting for the execution to finish. */
94    struct util_queue_fence fence;
95 
96    /** The worker thread will access the context with this. */
97    struct gl_context *ctx;
98 
99    /** Amount of data used by batch commands, in bytes. */
100    int used;
101 
102    /** Data contained in the command buffer. */
103 #ifdef _MSC_VER
104    __declspec(align(8))
105 #else
106    __attribute__((aligned(8)))
107 #endif
108    uint8_t buffer[MARSHAL_MAX_CMD_SIZE];
109 };
110 
111 struct glthread_client_attrib {
112    struct glthread_vao VAO;
113    GLuint CurrentArrayBufferName;
114    int ClientActiveTexture;
115    GLuint RestartIndex;
116    bool PrimitiveRestart;
117    bool PrimitiveRestartFixedIndex;
118 
119    /** Whether this element of the client attrib stack contains saved state. */
120    bool Valid;
121 };
122 
123 struct glthread_state
124 {
125    /** Multithreaded queue. */
126    struct util_queue queue;
127 
128    /** This is sent to the driver for framebuffer overlay / HUD. */
129    struct util_queue_monitoring stats;
130 
131    /** Whether GLThread is enabled. */
132    bool enabled;
133 
134    /** Whether GLThread is inside a display list generation. */
135    bool inside_dlist;
136 
137    /** For L3 cache pinning. */
138    unsigned pin_thread_counter;
139 
140    /** The ring of batches in memory. */
141    struct glthread_batch batches[MARSHAL_MAX_BATCHES];
142 
143    /** Pointer to the batch currently being filled. */
144    struct glthread_batch *next_batch;
145 
146    /** Index of the last submitted batch. */
147    unsigned last;
148 
149    /** Index of the batch being filled and about to be submitted. */
150    unsigned next;
151 
152    /** Upload buffer. */
153    struct gl_buffer_object *upload_buffer;
154    uint8_t *upload_ptr;
155    unsigned upload_offset;
156    int upload_buffer_private_refcount;
157 
158    /** Caps. */
159    GLboolean SupportsBufferUploads;
160    GLboolean SupportsNonVBOUploads;
161 
162    /** Primitive restart state. */
163    bool PrimitiveRestart;
164    bool PrimitiveRestartFixedIndex;
165    bool _PrimitiveRestart;
166    GLuint RestartIndex;
167    GLuint _RestartIndex[4]; /**< Restart index for index_size = 1,2,4. */
168 
169    /** Vertex Array objects tracked by glthread independently of Mesa. */
170    struct _mesa_HashTable *VAOs;
171    struct glthread_vao *CurrentVAO;
172    struct glthread_vao *LastLookedUpVAO;
173    struct glthread_vao DefaultVAO;
174    struct glthread_client_attrib ClientAttribStack[MAX_CLIENT_ATTRIB_STACK_DEPTH];
175    int ClientAttribStackTop;
176    int ClientActiveTexture;
177 
178    /** Currently-bound buffer object IDs. */
179    GLuint CurrentArrayBufferName;
180    GLuint CurrentDrawIndirectBufferName;
181 };
182 
183 void _mesa_glthread_init(struct gl_context *ctx);
184 void _mesa_glthread_destroy(struct gl_context *ctx);
185 
186 void _mesa_glthread_restore_dispatch(struct gl_context *ctx, const char *func);
187 void _mesa_glthread_disable(struct gl_context *ctx, const char *func);
188 void _mesa_glthread_flush_batch(struct gl_context *ctx);
189 void _mesa_glthread_finish(struct gl_context *ctx);
190 void _mesa_glthread_finish_before(struct gl_context *ctx, const char *func);
191 void _mesa_glthread_upload(struct gl_context *ctx, const void *data,
192                            GLsizeiptr size, unsigned *out_offset,
193                            struct gl_buffer_object **out_buffer,
194                            uint8_t **out_ptr);
195 void _mesa_glthread_reset_vao(struct glthread_vao *vao);
196 
197 void _mesa_glthread_BindBuffer(struct gl_context *ctx, GLenum target,
198                                GLuint buffer);
199 void _mesa_glthread_DeleteBuffers(struct gl_context *ctx, GLsizei n,
200                                   const GLuint *buffers);
201 
202 void _mesa_glthread_BindVertexArray(struct gl_context *ctx, GLuint id);
203 void _mesa_glthread_DeleteVertexArrays(struct gl_context *ctx,
204                                        GLsizei n, const GLuint *ids);
205 void _mesa_glthread_GenVertexArrays(struct gl_context *ctx,
206                                     GLsizei n, GLuint *arrays);
207 void _mesa_glthread_set_prim_restart(struct gl_context *ctx, GLenum cap,
208                                      bool value);
209 void _mesa_glthread_PrimitiveRestartIndex(struct gl_context *ctx, GLuint index);
210 void _mesa_glthread_ClientState(struct gl_context *ctx, GLuint *vaobj,
211                                 gl_vert_attrib attrib, bool enable);
212 void _mesa_glthread_AttribDivisor(struct gl_context *ctx, const GLuint *vaobj,
213                                   gl_vert_attrib attrib, GLuint divisor);
214 void _mesa_glthread_AttribPointer(struct gl_context *ctx, gl_vert_attrib attrib,
215                                   GLint size, GLenum type, GLsizei stride,
216                                   const void *pointer);
217 void _mesa_glthread_DSAAttribPointer(struct gl_context *ctx, GLuint vao,
218                                      GLuint buffer, gl_vert_attrib attrib,
219                                      GLint size, GLenum type, GLsizei stride,
220                                      GLintptr offset);
221 void _mesa_glthread_AttribFormat(struct gl_context *ctx, GLuint attribindex,
222                                  GLint size, GLenum type,  GLuint relativeoffset);
223 void _mesa_glthread_DSAAttribFormat(struct gl_context *ctx, GLuint vaobj,
224                                     GLuint attribindex, GLint size, GLenum type,
225                                     GLuint relativeoffset);
226 void _mesa_glthread_VertexBuffer(struct gl_context *ctx, GLuint bindingindex,
227                                  GLuint buffer, GLintptr offset, GLsizei stride);
228 void _mesa_glthread_DSAVertexBuffer(struct gl_context *ctx, GLuint vaobj,
229                                     GLuint bindingindex, GLuint buffer,
230                                     GLintptr offset, GLsizei stride);
231 void _mesa_glthread_DSAVertexBuffers(struct gl_context *ctx, GLuint vaobj,
232                                      GLuint first, GLsizei count,
233                                      const GLuint *buffers,
234                                      const GLintptr *offsets,
235                                      const GLsizei *strides);
236 void _mesa_glthread_BindingDivisor(struct gl_context *ctx, GLuint bindingindex,
237                                    GLuint divisor);
238 void _mesa_glthread_DSABindingDivisor(struct gl_context *ctx, GLuint vaobj,
239                                       GLuint bindingindex, GLuint divisor);
240 void _mesa_glthread_AttribBinding(struct gl_context *ctx, GLuint attribindex,
241                                   GLuint bindingindex);
242 void _mesa_glthread_DSAAttribBinding(struct gl_context *ctx, GLuint vaobj,
243                                      GLuint attribindex, GLuint bindingindex);
244 void _mesa_glthread_DSAElementBuffer(struct gl_context *ctx, GLuint vaobj,
245                                      GLuint buffer);
246 void _mesa_glthread_PushClientAttrib(struct gl_context *ctx, GLbitfield mask,
247                                      bool set_default);
248 void _mesa_glthread_PopClientAttrib(struct gl_context *ctx);
249 void _mesa_glthread_ClientAttribDefault(struct gl_context *ctx, GLbitfield mask);
250 void _mesa_glthread_InterleavedArrays(struct gl_context *ctx, GLenum format,
251                                       GLsizei stride, const GLvoid *pointer);
252 
253 #endif /* _GLTHREAD_H*/
254