• 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 
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