X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_context.h;h=31539d9db7d5cf0da69e40958d736c608a005503;hb=651441c16fd2fa0eede876d70997cbfd646ef289;hp=ee27533912c151076833ce1adb8a779bf4eb1fff;hpb=9d6f9ccf6b7ca7c9d1ac40354d6ae47c130e2024;p=mesa.git diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index ee27533912c..31539d9db7d 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -28,10 +28,17 @@ #ifndef ST_CONTEXT_H #define ST_CONTEXT_H +#include "main/arrayobj.h" #include "main/mtypes.h" -#include "pipe/p_state.h" -#include "state_tracker/st_api.h" +#include "frontend/api.h" #include "main/fbobject.h" +#include "state_tracker/st_atom.h" +#include "util/u_helpers.h" +#include "util/u_inlines.h" +#include "util/list.h" +#include "vbo/vbo.h" +#include "util/list.h" +#include "cso_cache/cso_context.h" #ifdef __cplusplus @@ -39,44 +46,77 @@ extern "C" { #endif -struct bitmap_cache; struct dd_function_table; struct draw_context; struct draw_stage; struct gen_mipmap_state; struct st_context; -struct st_fragment_program; +struct st_program; struct st_perf_monitor_group; struct u_upload_mgr; -#define ST_NEW_MESA (1 << 0) /* Mesa state has changed */ -#define ST_NEW_FRAGMENT_PROGRAM (1 << 1) -#define ST_NEW_VERTEX_PROGRAM (1 << 2) -#define ST_NEW_FRAMEBUFFER (1 << 3) -#define ST_NEW_TESS_STATE (1 << 4) -#define ST_NEW_GEOMETRY_PROGRAM (1 << 5) -#define ST_NEW_VERTEX_ARRAYS (1 << 6) -#define ST_NEW_RASTERIZER (1 << 7) -#define ST_NEW_UNIFORM_BUFFER (1 << 8) -#define ST_NEW_TESSCTRL_PROGRAM (1 << 9) -#define ST_NEW_TESSEVAL_PROGRAM (1 << 10) -#define ST_NEW_SAMPLER_VIEWS (1 << 11) -#define ST_NEW_ATOMIC_BUFFER (1 << 12) - - -struct st_state_flags { - GLbitfield mesa; /**< Mask of _NEW_x flags */ - uint64_t st; /**< Mask of ST_NEW_x flags */ +struct st_bitmap_cache +{ + /** Window pos to render the cached image */ + GLint xpos, ypos; + /** Bounds of region used in window coords */ + GLint xmin, ymin, xmax, ymax; + + GLfloat color[4]; + + /** Bitmap's Z position */ + GLfloat zpos; + + struct pipe_resource *texture; + struct pipe_transfer *trans; + + GLboolean empty; + + /** An I8 texture image: */ + ubyte *buffer; }; -struct st_tracked_state { - const char *name; - struct st_state_flags dirty; - void (*update)( struct st_context *st ); +struct st_bound_handles +{ + unsigned num_handles; + uint64_t *handles; }; +#define NUM_DRAWPIX_CACHE_ENTRIES 4 + +struct drawpix_cache_entry +{ + GLsizei width, height; + GLenum format, type; + const void *user_pointer; /**< Last user 'pixels' pointer */ + void *image; /**< Copy of the glDrawPixels image data */ + struct pipe_resource *texture; + unsigned age; +}; + + +/* + * Node for a linked list of dead sampler views. + */ +struct st_zombie_sampler_view_node +{ + struct pipe_sampler_view *view; + struct list_head node; +}; + + +/* + * Node for a linked list of dead shaders. + */ +struct st_zombie_shader_node +{ + void *shader; + enum pipe_shader_type type; + struct list_head node; +}; + struct st_context { @@ -86,24 +126,44 @@ struct st_context struct pipe_context *pipe; - struct u_upload_mgr *uploader, *indexbuf_uploader, *constbuf_uploader; - struct draw_context *draw; /**< For selection/feedback/rastpos only */ struct draw_stage *feedback_stage; /**< For GL_FEEDBACK rendermode */ struct draw_stage *selection_stage; /**< For GL_SELECT rendermode */ struct draw_stage *rastpos_stage; /**< For glRasterPos */ GLboolean clamp_frag_color_in_shader; GLboolean clamp_vert_color_in_shader; + boolean clamp_frag_depth_in_shader; boolean has_stencil_export; /**< can do shader stencil export? */ boolean has_time_elapsed; - boolean has_shader_model3; boolean has_etc1; boolean has_etc2; + boolean has_astc_2d_ldr; + boolean has_astc_5x5_ldr; boolean prefer_blit_based_texture_transfer; boolean force_persample_in_shader; boolean has_shareable_shaders; boolean has_half_float_packing; boolean has_multi_draw_indirect; + boolean has_single_pipe_stat; + boolean has_indep_blend_func; + boolean needs_rgb_dst_alpha_override; + boolean can_bind_const_buffer_as_vertex; + boolean lower_flatshade; + boolean lower_alpha_test; + boolean lower_point_size; + boolean lower_two_sided_color; + boolean lower_ucp; + + /* There are consequences for drivers wanting to call st_finalize_nir + * twice, once before shader caching and once after lowering for shader + * variants. If shader variants use lowering passes that are not ready + * for that, things can blow up. + * + * If this is true, st_finalize_nir and pipe_screen::finalize_nir will be + * called before the result is stored in the shader cache. If lowering for + * shader variants is invoked, the functions will be called again. + */ + boolean allow_st_finalize_nir_twice; /** * If a shader can be created when we get its source. @@ -119,8 +179,12 @@ struct st_context * on glViewpport calls, this is set via a option. */ boolean invalidate_on_gl_viewport; + boolean draw_needs_minmax_index; + boolean has_hw_atomics; + - boolean vertex_array_out_of_memory; + /* driver supports scissored clears */ + boolean can_scissor_clear; /* Some state is contained in constant objects. * Other state is just parameter values. @@ -129,49 +193,78 @@ struct st_context struct pipe_blend_state blend; struct pipe_depth_stencil_alpha_state depth_stencil; struct pipe_rasterizer_state rasterizer; - struct pipe_sampler_state samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; - GLuint num_samplers[PIPE_SHADER_TYPES]; - struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; + struct pipe_sampler_state vert_samplers[PIPE_MAX_SAMPLERS]; + struct pipe_sampler_state frag_samplers[PIPE_MAX_SAMPLERS]; + GLuint num_vert_samplers; + GLuint num_frag_samplers; + struct pipe_sampler_view *vert_sampler_views[PIPE_MAX_SAMPLERS]; + struct pipe_sampler_view *frag_sampler_views[PIPE_MAX_SAMPLERS]; GLuint num_sampler_views[PIPE_SHADER_TYPES]; struct pipe_clip_state clip; struct { void *ptr; unsigned size; } constants[PIPE_SHADER_TYPES]; - struct pipe_framebuffer_state framebuffer; + unsigned fb_width; + unsigned fb_height; + unsigned fb_num_samples; + unsigned fb_num_layers; + unsigned fb_num_cb; + unsigned num_viewports; struct pipe_scissor_state scissor[PIPE_MAX_VIEWPORTS]; struct pipe_viewport_state viewport[PIPE_MAX_VIEWPORTS]; - unsigned sample_mask; + struct { + unsigned num; + boolean include; + struct pipe_scissor_state rects[PIPE_MAX_WINDOW_RECTANGLES]; + } window_rects; GLuint poly_stipple[32]; /**< In OpenGL's bottom-to-top order */ GLuint fb_orientation; + + bool enable_sample_locations; + unsigned sample_locations_samples; + uint8_t sample_locations[ + PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE * + PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE * 32]; } state; - char vendor[100]; - char renderer[100]; + uint64_t dirty; /**< dirty states */ - struct st_state_flags dirty; + /** This masks out unused shader resources. Only valid in draw calls. */ + uint64_t active_states; - GLboolean vertdata_edgeflags; - GLboolean edgeflag_culls_prims; + unsigned pin_thread_counter; /* for L3 thread pinning on AMD Zen */ - /** Mapping from VARYING_SLOT_x to post-transformed vertex slot */ - const GLuint *vertex_result_to_slot; + /* If true, further analysis of states is required to know if something + * has changed. Used mainly for shaders. + */ + bool gfx_shaders_may_be_dirty; + bool compute_shader_may_be_dirty; - struct st_vertex_program *vp; /**< Currently bound vertex program */ - struct st_fragment_program *fp; /**< Currently bound fragment program */ - struct st_geometry_program *gp; /**< Currently bound geometry program */ - struct st_tessctrl_program *tcp; /**< Currently bound tess control program */ - struct st_tesseval_program *tep; /**< Currently bound tess eval program */ + GLboolean vertdata_edgeflags; + GLboolean edgeflag_culls_prims; - struct st_vp_variant *vp_variant; - struct st_fp_variant *fp_variant; - struct st_gp_variant *gp_variant; - struct st_tcp_variant *tcp_variant; - struct st_tep_variant *tep_variant; + /** + * The number of currently active queries (excluding timer queries). + * This is used to know if we need to pause any queries for meta ops. + */ + unsigned active_queries; - struct gl_texture_object *default_texture; + union { + struct { + struct st_program *vp; /**< Currently bound vertex program */ + struct st_program *tcp; /**< Currently bound tess control program */ + struct st_program *tep; /**< Currently bound tess eval program */ + struct st_program *gp; /**< Currently bound geometry program */ + struct st_program *fp; /**< Currently bound fragment program */ + struct st_program *cp; /**< Currently bound compute program */ + }; + struct gl_program *current_program[MESA_SHADER_STAGES]; + }; + + struct st_common_variant *vp_variant; struct { struct pipe_resource *pixelmap_texture; @@ -181,18 +274,33 @@ struct st_context /** for glBitmap */ struct { struct pipe_rasterizer_state rasterizer; - struct pipe_sampler_state samplers[2]; + struct pipe_sampler_state sampler; + struct pipe_sampler_state atlas_sampler; enum pipe_format tex_format; - void *vs; - struct bitmap_cache *cache; + struct st_bitmap_cache cache; } bitmap; /** for glDraw/CopyPixels */ struct { void *zs_shaders[4]; - void *vert_shaders[2]; /**< ureg shaders */ } drawpix; + /** Cache of glDrawPixels images */ + struct { + struct drawpix_cache_entry entries[NUM_DRAWPIX_CACHE_ENTRIES]; + unsigned age; + } drawpix_cache; + + /** for glReadPixels */ + struct { + struct pipe_resource *src; + struct pipe_resource *cache; + enum pipe_format dst_format; + unsigned level; + unsigned layer; + unsigned hits; + } readpix_cache; + /** for glClear */ struct { struct pipe_rasterizer_state raster; @@ -203,10 +311,26 @@ struct st_context void *gs_layered; } clear; - /** used for anything using util_draw_vertex_buffer */ - struct pipe_vertex_element velems_util_draw[3]; - - void *passthrough_fs; /**< simple pass-through frag shader */ + /* For gl(Compressed)Tex(Sub)Image */ + struct { + struct pipe_rasterizer_state raster; + struct pipe_blend_state upload_blend; + void *vs; + void *gs; + void *upload_fs[3]; + void *download_fs[3][PIPE_MAX_TEXTURE_TYPES]; + bool upload_enabled; + bool download_enabled; + bool rgba_only; + bool layers; + bool use_gs; + } pbo; + + /** for drawing with st_util_vertex */ + struct cso_velems_state util_velems; + + /** passthrough vertex shader matching the util_velem attributes */ + void *passthrough_vs; enum pipe_texture_target internal_target; @@ -217,23 +341,85 @@ struct st_context /* The number of vertex buffers from the last call of validate_arrays. */ unsigned last_num_vbuffers; + unsigned last_used_atomic_bindings[PIPE_SHADER_TYPES]; + unsigned last_num_ssbos[PIPE_SHADER_TYPES]; + int32_t draw_stamp; int32_t read_stamp; struct st_config_options options; struct st_perf_monitor_group *perfmon; + + enum pipe_reset_status reset_status; + + /* Array of bound texture/image handles which are resident in the context. + */ + struct st_bound_handles bound_texture_handles[PIPE_SHADER_TYPES]; + struct st_bound_handles bound_image_handles[PIPE_SHADER_TYPES]; + + /* Winsys buffers */ + struct list_head winsys_buffers; + + /* Throttling for texture uploads and similar operations to limit memory + * usage by limiting the number of in-flight operations based on + * the estimated allocated size needed to execute those operations. + */ + struct util_throttle throttle; + + struct { + struct st_zombie_sampler_view_node list; + simple_mtx_t mutex; + } zombie_sampler_views; + + struct { + struct st_zombie_shader_node list; + simple_mtx_t mutex; + } zombie_shaders; + }; -/* Need this so that we can implement Mesa callbacks in this module. +/* + * Get the state tracker context for the given Mesa context. */ -static inline struct st_context *st_context(struct gl_context *ctx) +static inline struct st_context * +st_context(struct gl_context *ctx) { return ctx->st; } +extern struct st_context * +st_create_context(gl_api api, struct pipe_context *pipe, + const struct gl_config *visual, + struct st_context *share, + const struct st_config_options *options, + bool no_error); + +extern void +st_destroy_context(struct st_context *st); + + +extern void +st_invalidate_buffers(struct st_context *st); + + +extern void +st_save_zombie_sampler_view(struct st_context *st, + struct pipe_sampler_view *view); + +extern void +st_save_zombie_shader(struct st_context *st, + enum pipe_shader_type type, + struct pipe_shader_state *shader); + + +void +st_context_free_zombie_objects(struct st_context *st); + + + /** * Wrapper for struct gl_framebuffer. * This is an opaque type to the outside world. @@ -241,86 +427,17 @@ static inline struct st_context *st_context(struct gl_context *ctx) struct st_framebuffer { struct gl_framebuffer Base; - void *Private; struct st_framebuffer_iface *iface; enum st_attachment_type statts[ST_ATTACHMENT_COUNT]; unsigned num_statts; int32_t stamp; int32_t iface_stamp; -}; - - -extern void st_init_driver_functions(struct pipe_screen *screen, - struct dd_function_table *functions); - -void st_invalidate_state(struct gl_context * ctx, GLbitfield new_state); - - - -#define Y_0_TOP 1 -#define Y_0_BOTTOM 2 + uint32_t iface_ID; -static inline GLuint -st_fb_orientation(const struct gl_framebuffer *fb) -{ - if (fb && _mesa_is_winsys_fbo(fb)) { - /* Drawing into a window (on-screen buffer). - * - * Negate Y scale to flip image vertically. - * The NDC Y coords prior to viewport transformation are in the range - * [y=-1=bottom, y=1=top] - * Hardware window coords are in the range [y=0=top, y=H-1=bottom] where - * H is the window height. - * Use the viewport transformation to invert Y. - */ - return Y_0_TOP; - } - else { - /* Drawing into user-created FBO (very likely a texture). - * - * For textures, T=0=Bottom, so by extension Y=0=Bottom for rendering. - */ - return Y_0_BOTTOM; - } -} - - -static inline unsigned -st_shader_stage_to_ptarget(gl_shader_stage stage) -{ - switch (stage) { - case MESA_SHADER_VERTEX: - return PIPE_SHADER_VERTEX; - case MESA_SHADER_FRAGMENT: - return PIPE_SHADER_FRAGMENT; - case MESA_SHADER_GEOMETRY: - return PIPE_SHADER_GEOMETRY; - case MESA_SHADER_TESS_CTRL: - return PIPE_SHADER_TESS_CTRL; - case MESA_SHADER_TESS_EVAL: - return PIPE_SHADER_TESS_EVAL; - case MESA_SHADER_COMPUTE: - return PIPE_SHADER_COMPUTE; - } - - assert(!"should not be reached"); - return PIPE_SHADER_VERTEX; -} - - -/** clear-alloc a struct-sized object, with casting */ -#define ST_CALLOC_STRUCT(T) (struct T *) calloc(1, sizeof(struct T)) - - -extern struct st_context * -st_create_context(gl_api api, struct pipe_context *pipe, - const struct gl_config *visual, - struct st_context *share, - const struct st_config_options *options); - -extern void -st_destroy_context(struct st_context *st); + /* list of framebuffer objects */ + struct list_head head; +}; #ifdef __cplusplus