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 draw_context;
50 struct draw_stage;
51 struct gen_mipmap_state;
52 struct st_context;
53 struct st_program;
54 struct u_upload_mgr;
55
56 #define ST_L3_PINNING_DISABLED 0xffffffff
57
58 struct st_bitmap_cache
59 {
60 /** Window pos to render the cached image */
61 GLint xpos, ypos;
62 /** Bounds of region used in window coords */
63 GLint xmin, ymin, xmax, ymax;
64
65 GLfloat color[4];
66
67 /** Bitmap's Z position */
68 GLfloat zpos;
69
70 struct pipe_resource *texture;
71 struct pipe_transfer *trans;
72
73 GLboolean empty;
74
75 /** An I8 texture image: */
76 ubyte *buffer;
77 };
78
79 struct st_bound_handles
80 {
81 unsigned num_handles;
82 uint64_t *handles;
83 };
84
85
86 #define NUM_DRAWPIX_CACHE_ENTRIES 4
87
88 struct drawpix_cache_entry
89 {
90 GLsizei width, height;
91 GLenum format, type;
92 const void *user_pointer; /**< Last user 'pixels' pointer */
93 void *image; /**< Copy of the glDrawPixels image data */
94 struct pipe_resource *texture;
95 unsigned age;
96 };
97
98
99 /*
100 * Node for a linked list of dead sampler views.
101 */
102 struct st_zombie_sampler_view_node
103 {
104 struct pipe_sampler_view *view;
105 struct list_head node;
106 };
107
108
109 /*
110 * Node for a linked list of dead shaders.
111 */
112 struct st_zombie_shader_node
113 {
114 void *shader;
115 enum pipe_shader_type type;
116 struct list_head node;
117 };
118
119
120 struct st_context
121 {
122 struct st_context_iface iface;
123
124 struct gl_context *ctx;
125 struct pipe_screen *screen;
126 struct pipe_context *pipe;
127 struct cso_context *cso_context;
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
134 unsigned pin_thread_counter; /* for L3 thread pinning on AMD Zen */
135
136 GLboolean clamp_frag_color_in_shader;
137 GLboolean clamp_vert_color_in_shader;
138 boolean has_stencil_export; /**< can do shader stencil export? */
139 boolean has_time_elapsed;
140 boolean has_etc1;
141 boolean has_etc2;
142 boolean transcode_etc;
143 boolean transcode_astc;
144 boolean has_astc_2d_ldr;
145 boolean has_astc_5x5_ldr;
146 boolean prefer_blit_based_texture_transfer;
147 boolean allow_compute_based_texture_transfer;
148 boolean force_persample_in_shader;
149 boolean has_shareable_shaders;
150 boolean has_half_float_packing;
151 boolean has_multi_draw_indirect;
152 boolean has_indirect_partial_stride;
153 boolean has_single_pipe_stat;
154 boolean has_indep_blend_func;
155 boolean needs_rgb_dst_alpha_override;
156 boolean can_dither;
157 boolean can_bind_const_buffer_as_vertex;
158 boolean lower_flatshade;
159 boolean lower_alpha_test;
160 boolean lower_point_size;
161 boolean lower_two_sided_color;
162 boolean lower_ucp;
163 boolean prefer_real_buffer_in_constbuf0;
164 boolean has_conditional_render;
165 boolean lower_texcoord_replace;
166 boolean lower_rect_tex;
167
168 /* There are consequences for drivers wanting to call st_finalize_nir
169 * twice, once before shader caching and once after lowering for shader
170 * variants. If shader variants use lowering passes that are not ready
171 * for that, things can blow up.
172 *
173 * If this is true, st_finalize_nir and pipe_screen::finalize_nir will be
174 * called before the result is stored in the shader cache. If lowering for
175 * shader variants is invoked, the functions will be called again.
176 */
177 boolean allow_st_finalize_nir_twice;
178
179 /**
180 * If a shader can be created when we get its source.
181 * This means it has only 1 variant, not counting glBitmap and
182 * glDrawPixels.
183 */
184 boolean shader_has_one_variant[MESA_SHADER_STAGES];
185
186 boolean needs_texcoord_semantic;
187 boolean apply_texture_swizzle_to_border_color;
188 boolean use_format_with_border_color;
189 boolean emulate_gl_clamp;
190 boolean texture_buffer_sampler;
191
192 boolean draw_needs_minmax_index;
193 boolean has_hw_atomics;
194
195
196 /* driver supports scissored clears */
197 boolean can_scissor_clear;
198
199 /* Some state is contained in constant objects.
200 * Other state is just parameter values.
201 */
202 struct {
203 struct pipe_blend_state blend;
204 struct pipe_depth_stencil_alpha_state depth_stencil;
205 struct pipe_rasterizer_state rasterizer;
206 struct pipe_sampler_state vert_samplers[PIPE_MAX_SAMPLERS];
207 struct pipe_sampler_state frag_samplers[PIPE_MAX_SAMPLERS];
208 GLuint num_vert_samplers;
209 GLuint num_frag_samplers;
210 GLuint num_sampler_views[PIPE_SHADER_TYPES];
211 unsigned num_images[PIPE_SHADER_TYPES];
212 struct pipe_clip_state clip;
213 unsigned constbuf0_enabled_shader_mask;
214 unsigned fb_width;
215 unsigned fb_height;
216 unsigned fb_num_samples;
217 unsigned fb_num_layers;
218 unsigned fb_num_cb;
219 unsigned num_viewports;
220 struct pipe_scissor_state scissor[PIPE_MAX_VIEWPORTS];
221 struct pipe_viewport_state viewport[PIPE_MAX_VIEWPORTS];
222 struct {
223 unsigned num;
224 boolean include;
225 struct pipe_scissor_state rects[PIPE_MAX_WINDOW_RECTANGLES];
226 } window_rects;
227
228 GLuint poly_stipple[32]; /**< In OpenGL's bottom-to-top order */
229
230 GLuint fb_orientation;
231
232 bool enable_sample_locations;
233 unsigned sample_locations_samples;
234 uint8_t sample_locations[
235 PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE *
236 PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE * 32];
237 } state;
238
239 uint64_t dirty; /**< dirty states */
240
241 /** This masks out unused shader resources. Only valid in draw calls. */
242 uint64_t active_states;
243
244 /* If true, further analysis of states is required to know if something
245 * has changed. Used mainly for shaders.
246 */
247 bool gfx_shaders_may_be_dirty;
248 bool compute_shader_may_be_dirty;
249
250 GLboolean vertdata_edgeflags;
251 GLboolean edgeflag_culls_prims;
252
253 /**
254 * The number of currently active queries (excluding timer queries).
255 * This is used to know if we need to pause any queries for meta ops.
256 */
257 unsigned active_queries;
258
259 union {
260 struct {
261 struct gl_program *vp; /**< Currently bound vertex program */
262 struct gl_program *tcp; /**< Currently bound tess control program */
263 struct gl_program *tep; /**< Currently bound tess eval program */
264 struct gl_program *gp; /**< Currently bound geometry program */
265 struct gl_program *fp; /**< Currently bound fragment program */
266 struct gl_program *cp; /**< Currently bound compute program */
267 };
268 struct gl_program *current_program[MESA_SHADER_STAGES];
269 };
270
271 struct st_common_variant *vp_variant;
272
273 struct {
274 struct pipe_resource *pixelmap_texture;
275 struct pipe_sampler_view *pixelmap_sampler_view;
276 } pixel_xfer;
277
278 /** for glBitmap */
279 struct {
280 struct pipe_rasterizer_state rasterizer;
281 struct pipe_sampler_state sampler;
282 struct pipe_sampler_state atlas_sampler;
283 enum pipe_format tex_format;
284 struct st_bitmap_cache cache;
285 } bitmap;
286
287 /** for glDraw/CopyPixels */
288 struct {
289 void *zs_shaders[6];
290 } drawpix;
291
292 /** Cache of glDrawPixels images */
293 struct {
294 struct drawpix_cache_entry entries[NUM_DRAWPIX_CACHE_ENTRIES];
295 unsigned age;
296 } drawpix_cache;
297
298 /** for glReadPixels */
299 struct {
300 struct pipe_resource *src;
301 struct pipe_resource *cache;
302 enum pipe_format dst_format;
303 unsigned level;
304 unsigned layer;
305 unsigned hits;
306 } readpix_cache;
307
308 /** for glClear */
309 struct {
310 struct pipe_rasterizer_state raster;
311 struct pipe_viewport_state viewport;
312 void *vs;
313 void *fs;
314 void *vs_layered;
315 void *gs_layered;
316 } clear;
317
318 /* For gl(Compressed)Tex(Sub)Image */
319 struct {
320 struct pipe_rasterizer_state raster;
321 struct pipe_blend_state upload_blend;
322 void *vs;
323 void *gs;
324 void *upload_fs[5][2];
325 /**
326 * For drivers supporting formatless storing
327 * (PIPE_CAP_IMAGE_STORE_FORMATTED) it is a pointer to the download FS;
328 * for those not supporting it, it is a pointer to an array of
329 * PIPE_FORMAT_COUNT elements, where each element is a pointer to the
330 * download FS using that PIPE_FORMAT as the storing format.
331 */
332 void *download_fs[5][PIPE_MAX_TEXTURE_TYPES][2];
333 struct hash_table *shaders;
334 bool upload_enabled;
335 bool download_enabled;
336 bool rgba_only;
337 bool layers;
338 bool use_gs;
339 } pbo;
340
341 /** for drawing with st_util_vertex */
342 struct cso_velems_state util_velems;
343
344 /** passthrough vertex shader matching the util_velem attributes */
345 void *passthrough_vs;
346
347 enum pipe_texture_target internal_target;
348
349 void *winsys_drawable_handle;
350
351 /* The number of vertex buffers from the last call of validate_arrays. */
352 unsigned last_num_vbuffers;
353 bool uses_user_vertex_buffers;
354
355 unsigned last_used_atomic_bindings[PIPE_SHADER_TYPES];
356 unsigned last_num_ssbos[PIPE_SHADER_TYPES];
357
358 int32_t draw_stamp;
359 int32_t read_stamp;
360
361 struct st_config_options options;
362
363 enum pipe_reset_status reset_status;
364
365 /* Array of bound texture/image handles which are resident in the context.
366 */
367 struct st_bound_handles bound_texture_handles[PIPE_SHADER_TYPES];
368 struct st_bound_handles bound_image_handles[PIPE_SHADER_TYPES];
369
370 /* Winsys buffers */
371 struct list_head winsys_buffers;
372
373 /* Throttling for texture uploads and similar operations to limit memory
374 * usage by limiting the number of in-flight operations based on
375 * the estimated allocated size needed to execute those operations.
376 */
377 struct util_throttle throttle;
378
379 struct {
380 struct st_zombie_sampler_view_node list;
381 simple_mtx_t mutex;
382 } zombie_sampler_views;
383
384 struct {
385 struct st_zombie_shader_node list;
386 simple_mtx_t mutex;
387 } zombie_shaders;
388
389 struct hash_table *hw_select_shaders;
390 };
391
392
393 /*
394 * Get the state tracker context for the given Mesa context.
395 */
396 static inline struct st_context *
st_context(struct gl_context * ctx)397 st_context(struct gl_context *ctx)
398 {
399 return ctx->st;
400 }
401
402
403 extern struct st_context *
404 st_create_context(gl_api api, struct pipe_context *pipe,
405 const struct gl_config *visual,
406 struct st_context *share,
407 const struct st_config_options *options,
408 bool no_error, bool has_egl_image_validate);
409
410 extern void
411 st_destroy_context(struct st_context *st);
412
413
414 extern void
415 st_invalidate_buffers(struct st_context *st);
416
417
418 extern void
419 st_save_zombie_sampler_view(struct st_context *st,
420 struct pipe_sampler_view *view);
421
422 extern void
423 st_save_zombie_shader(struct st_context *st,
424 enum pipe_shader_type type,
425 struct pipe_shader_state *shader);
426
427
428 void
429 st_context_free_zombie_objects(struct st_context *st);
430
431 const struct nir_shader_compiler_options *
432 st_get_nir_compiler_options(struct st_context *st, gl_shader_stage stage);
433
434
435 void st_invalidate_state(struct gl_context *ctx);
436 void st_set_background_context(struct gl_context *ctx,
437 struct util_queue_monitoring *queue_info);
438 #ifdef __cplusplus
439 }
440 #endif
441
442 #endif
443