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