1 /**************************************************************************
2 *
3 * Copyright 2003 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 #ifndef ST_CONTEXT_H
29 #define ST_CONTEXT_H
30
31 #include "main/arrayobj.h"
32 #include "main/mtypes.h"
33 #include "frontend/api.h"
34 #include "main/fbobject.h"
35 #include "state_tracker/st_atom.h"
36 #include "util/u_helpers.h"
37 #include "util/u_inlines.h"
38 #include "util/list.h"
39 #include "vbo/vbo.h"
40 #include "util/list.h"
41 #include "cso_cache/cso_context.h"
42
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48
49 struct dd_function_table;
50 struct draw_context;
51 struct draw_stage;
52 struct gen_mipmap_state;
53 struct st_context;
54 struct st_program;
55 struct st_perf_monitor_group;
56 struct u_upload_mgr;
57
58
59 struct st_bitmap_cache
60 {
61 /** Window pos to render the cached image */
62 GLint xpos, ypos;
63 /** Bounds of region used in window coords */
64 GLint xmin, ymin, xmax, ymax;
65
66 GLfloat color[4];
67
68 /** Bitmap's Z position */
69 GLfloat zpos;
70
71 struct pipe_resource *texture;
72 struct pipe_transfer *trans;
73
74 GLboolean empty;
75
76 /** An I8 texture image: */
77 ubyte *buffer;
78 };
79
80 struct st_bound_handles
81 {
82 unsigned num_handles;
83 uint64_t *handles;
84 };
85
86
87 #define NUM_DRAWPIX_CACHE_ENTRIES 4
88
89 struct drawpix_cache_entry
90 {
91 GLsizei width, height;
92 GLenum format, type;
93 const void *user_pointer; /**< Last user 'pixels' pointer */
94 void *image; /**< Copy of the glDrawPixels image data */
95 struct pipe_resource *texture;
96 unsigned age;
97 };
98
99
100 /*
101 * Node for a linked list of dead sampler views.
102 */
103 struct st_zombie_sampler_view_node
104 {
105 struct pipe_sampler_view *view;
106 struct list_head node;
107 };
108
109
110 /*
111 * Node for a linked list of dead shaders.
112 */
113 struct st_zombie_shader_node
114 {
115 void *shader;
116 enum pipe_shader_type type;
117 struct list_head node;
118 };
119
120
121 struct st_context
122 {
123 struct st_context_iface iface;
124
125 struct gl_context *ctx;
126
127 struct pipe_context *pipe;
128
129 struct draw_context *draw; /**< For selection/feedback/rastpos only */
130 struct draw_stage *feedback_stage; /**< For GL_FEEDBACK rendermode */
131 struct draw_stage *selection_stage; /**< For GL_SELECT rendermode */
132 struct draw_stage *rastpos_stage; /**< For glRasterPos */
133 GLboolean clamp_frag_color_in_shader;
134 GLboolean clamp_vert_color_in_shader;
135 boolean clamp_frag_depth_in_shader;
136 boolean has_stencil_export; /**< can do shader stencil export? */
137 boolean has_time_elapsed;
138 boolean has_etc1;
139 boolean has_etc2;
140 boolean has_astc_2d_ldr;
141 boolean has_astc_5x5_ldr;
142 boolean prefer_blit_based_texture_transfer;
143 boolean force_persample_in_shader;
144 boolean has_shareable_shaders;
145 boolean has_half_float_packing;
146 boolean has_multi_draw_indirect;
147 boolean has_single_pipe_stat;
148 boolean has_indep_blend_func;
149 boolean needs_rgb_dst_alpha_override;
150 boolean can_bind_const_buffer_as_vertex;
151 boolean lower_flatshade;
152 boolean lower_alpha_test;
153 boolean lower_point_size;
154 boolean lower_two_sided_color;
155 boolean lower_ucp;
156
157 /* There are consequences for drivers wanting to call st_finalize_nir
158 * twice, once before shader caching and once after lowering for shader
159 * variants. If shader variants use lowering passes that are not ready
160 * for that, things can blow up.
161 *
162 * If this is true, st_finalize_nir and pipe_screen::finalize_nir will be
163 * called before the result is stored in the shader cache. If lowering for
164 * shader variants is invoked, the functions will be called again.
165 */
166 boolean allow_st_finalize_nir_twice;
167
168 /**
169 * If a shader can be created when we get its source.
170 * This means it has only 1 variant, not counting glBitmap and
171 * glDrawPixels.
172 */
173 boolean shader_has_one_variant[MESA_SHADER_STAGES];
174
175 boolean needs_texcoord_semantic;
176 boolean apply_texture_swizzle_to_border_color;
177
178 /* On old libGL's for linux we need to invalidate the drawables
179 * on glViewpport calls, this is set via a option.
180 */
181 boolean invalidate_on_gl_viewport;
182 boolean draw_needs_minmax_index;
183 boolean has_hw_atomics;
184
185
186 /* driver supports scissored clears */
187 boolean can_scissor_clear;
188
189 /* Some state is contained in constant objects.
190 * Other state is just parameter values.
191 */
192 struct {
193 struct pipe_blend_state blend;
194 struct pipe_depth_stencil_alpha_state depth_stencil;
195 struct pipe_rasterizer_state rasterizer;
196 struct pipe_sampler_state vert_samplers[PIPE_MAX_SAMPLERS];
197 struct pipe_sampler_state frag_samplers[PIPE_MAX_SAMPLERS];
198 GLuint num_vert_samplers;
199 GLuint num_frag_samplers;
200 struct pipe_sampler_view *vert_sampler_views[PIPE_MAX_SAMPLERS];
201 struct pipe_sampler_view *frag_sampler_views[PIPE_MAX_SAMPLERS];
202 GLuint num_sampler_views[PIPE_SHADER_TYPES];
203 struct pipe_clip_state clip;
204 struct {
205 void *ptr;
206 unsigned size;
207 } constants[PIPE_SHADER_TYPES];
208 unsigned fb_width;
209 unsigned fb_height;
210 unsigned fb_num_samples;
211 unsigned fb_num_layers;
212 unsigned fb_num_cb;
213 unsigned num_viewports;
214 struct pipe_scissor_state scissor[PIPE_MAX_VIEWPORTS];
215 struct pipe_viewport_state viewport[PIPE_MAX_VIEWPORTS];
216 struct {
217 unsigned num;
218 boolean include;
219 struct pipe_scissor_state rects[PIPE_MAX_WINDOW_RECTANGLES];
220 } window_rects;
221
222 GLuint poly_stipple[32]; /**< In OpenGL's bottom-to-top order */
223
224 GLuint fb_orientation;
225
226 bool enable_sample_locations;
227 unsigned sample_locations_samples;
228 uint8_t sample_locations[
229 PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE *
230 PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE * 32];
231 } state;
232
233 uint64_t dirty; /**< dirty states */
234
235 /** This masks out unused shader resources. Only valid in draw calls. */
236 uint64_t active_states;
237
238 unsigned pin_thread_counter; /* for L3 thread pinning on AMD Zen */
239
240 /* If true, further analysis of states is required to know if something
241 * has changed. Used mainly for shaders.
242 */
243 bool gfx_shaders_may_be_dirty;
244 bool compute_shader_may_be_dirty;
245
246 GLboolean vertdata_edgeflags;
247 GLboolean edgeflag_culls_prims;
248
249 /**
250 * The number of currently active queries (excluding timer queries).
251 * This is used to know if we need to pause any queries for meta ops.
252 */
253 unsigned active_queries;
254
255 union {
256 struct {
257 struct st_program *vp; /**< Currently bound vertex program */
258 struct st_program *tcp; /**< Currently bound tess control program */
259 struct st_program *tep; /**< Currently bound tess eval program */
260 struct st_program *gp; /**< Currently bound geometry program */
261 struct st_program *fp; /**< Currently bound fragment program */
262 struct st_program *cp; /**< Currently bound compute program */
263 };
264 struct gl_program *current_program[MESA_SHADER_STAGES];
265 };
266
267 struct st_common_variant *vp_variant;
268
269 struct {
270 struct pipe_resource *pixelmap_texture;
271 struct pipe_sampler_view *pixelmap_sampler_view;
272 } pixel_xfer;
273
274 /** for glBitmap */
275 struct {
276 struct pipe_rasterizer_state rasterizer;
277 struct pipe_sampler_state sampler;
278 struct pipe_sampler_state atlas_sampler;
279 enum pipe_format tex_format;
280 struct st_bitmap_cache cache;
281 } bitmap;
282
283 /** for glDraw/CopyPixels */
284 struct {
285 void *zs_shaders[6];
286 } drawpix;
287
288 /** Cache of glDrawPixels images */
289 struct {
290 struct drawpix_cache_entry entries[NUM_DRAWPIX_CACHE_ENTRIES];
291 unsigned age;
292 } drawpix_cache;
293
294 /** for glReadPixels */
295 struct {
296 struct pipe_resource *src;
297 struct pipe_resource *cache;
298 enum pipe_format dst_format;
299 unsigned level;
300 unsigned layer;
301 unsigned hits;
302 } readpix_cache;
303
304 /** for glClear */
305 struct {
306 struct pipe_rasterizer_state raster;
307 struct pipe_viewport_state viewport;
308 void *vs;
309 void *fs;
310 void *vs_layered;
311 void *gs_layered;
312 } clear;
313
314 /* For gl(Compressed)Tex(Sub)Image */
315 struct {
316 struct pipe_rasterizer_state raster;
317 struct pipe_blend_state upload_blend;
318 void *vs;
319 void *gs;
320 void *upload_fs[3][2];
321 void *download_fs[3][PIPE_MAX_TEXTURE_TYPES][2];
322 bool upload_enabled;
323 bool download_enabled;
324 bool rgba_only;
325 bool layers;
326 bool use_gs;
327 } pbo;
328
329 /** for drawing with st_util_vertex */
330 struct cso_velems_state util_velems;
331
332 /** passthrough vertex shader matching the util_velem attributes */
333 void *passthrough_vs;
334
335 enum pipe_texture_target internal_target;
336
337 struct cso_context *cso_context;
338
339 void *winsys_drawable_handle;
340
341 /* The number of vertex buffers from the last call of validate_arrays. */
342 unsigned last_num_vbuffers;
343
344 unsigned last_used_atomic_bindings[PIPE_SHADER_TYPES];
345 unsigned last_num_ssbos[PIPE_SHADER_TYPES];
346
347 int32_t draw_stamp;
348 int32_t read_stamp;
349
350 struct st_config_options options;
351
352 struct st_perf_monitor_group *perfmon;
353
354 enum pipe_reset_status reset_status;
355
356 /* Array of bound texture/image handles which are resident in the context.
357 */
358 struct st_bound_handles bound_texture_handles[PIPE_SHADER_TYPES];
359 struct st_bound_handles bound_image_handles[PIPE_SHADER_TYPES];
360
361 /* Winsys buffers */
362 struct list_head winsys_buffers;
363
364 /* Throttling for texture uploads and similar operations to limit memory
365 * usage by limiting the number of in-flight operations based on
366 * the estimated allocated size needed to execute those operations.
367 */
368 struct util_throttle throttle;
369
370 struct {
371 struct st_zombie_sampler_view_node list;
372 simple_mtx_t mutex;
373 } zombie_sampler_views;
374
375 struct {
376 struct st_zombie_shader_node list;
377 simple_mtx_t mutex;
378 } zombie_shaders;
379
380 };
381
382
383 /*
384 * Get the state tracker context for the given Mesa context.
385 */
386 static inline struct st_context *
st_context(struct gl_context * ctx)387 st_context(struct gl_context *ctx)
388 {
389 return ctx->st;
390 }
391
392
393 extern struct st_context *
394 st_create_context(gl_api api, struct pipe_context *pipe,
395 const struct gl_config *visual,
396 struct st_context *share,
397 const struct st_config_options *options,
398 bool no_error);
399
400 extern void
401 st_destroy_context(struct st_context *st);
402
403
404 extern void
405 st_invalidate_buffers(struct st_context *st);
406
407
408 extern void
409 st_save_zombie_sampler_view(struct st_context *st,
410 struct pipe_sampler_view *view);
411
412 extern void
413 st_save_zombie_shader(struct st_context *st,
414 enum pipe_shader_type type,
415 struct pipe_shader_state *shader);
416
417
418 void
419 st_context_free_zombie_objects(struct st_context *st);
420
421 const struct nir_shader_compiler_options *
422 st_get_nir_compiler_options(struct st_context *st, gl_shader_stage stage);
423
424
425 /**
426 * Wrapper for struct gl_framebuffer.
427 * This is an opaque type to the outside world.
428 */
429 struct st_framebuffer
430 {
431 struct gl_framebuffer Base;
432
433 struct st_framebuffer_iface *iface;
434 enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
435 unsigned num_statts;
436 int32_t stamp;
437 int32_t iface_stamp;
438 uint32_t iface_ID;
439
440 /* list of framebuffer objects */
441 struct list_head head;
442 };
443
444
445 #ifdef __cplusplus
446 }
447 #endif
448
449 #endif
450