X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fpanfrost%2Fpan_context.h;h=cd9a034975d3499b7f9ce46a75dc1f7eaff246be;hb=b68778e6de2da1921cf1c19cff8f54cff46eb37d;hp=15b9819484fc99788d4803cbccbbd1484d2875f9;hpb=c119c282af2fd9ae7f6e4039af684a72470639a0;p=mesa.git diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h index 15b9819484f..cd9a034975d 100644 --- a/src/gallium/drivers/panfrost/pan_context.h +++ b/src/gallium/drivers/panfrost/pan_context.h @@ -31,6 +31,7 @@ #include #include "pan_resource.h" #include "pan_job.h" +#include "pan_blend.h" #include "pipe/p_compiler.h" #include "pipe/p_config.h" @@ -42,10 +43,11 @@ #include "util/u_blitter.h" #include "util/hash_table.h" +#include "midgard/midgard_compile.h" + /* Forward declare to avoid extra header dep */ struct prim_convert_context; -#define MAX_DRAW_CALLS 4096 #define MAX_VARYINGS 4096 //#define PAN_DIRTY_CLEAR (1 << 0) @@ -66,9 +68,9 @@ struct prim_convert_context; lval &= ~(bit); struct panfrost_constant_buffer { - bool dirty; - size_t size; - void *buffer; + struct pipe_constant_buffer cb[PIPE_MAX_CONSTANT_BUFFERS]; + uint32_t enabled_mask; + uint32_t dirty_mask; }; struct panfrost_query { @@ -85,25 +87,6 @@ struct panfrost_fence { int fd; }; -#define PANFROST_MAX_TRANSIENT_ENTRIES 64 - -struct panfrost_transient_pool { - /* Memory blocks in the pool */ - struct panfrost_memory_entry *entries[PANFROST_MAX_TRANSIENT_ENTRIES]; - - /* Number of entries we own */ - unsigned entry_count; - - /* Current entry that we are writing to, zero-indexed, strictly less than entry_count */ - unsigned entry_index; - - /* Number of bytes into the current entry we are */ - off_t entry_offset; - - /* Entry size (all entries must be homogenous) */ - size_t entry_size; -}; - struct panfrost_context { /* Gallium context */ struct pipe_context base; @@ -112,24 +95,21 @@ struct panfrost_context { struct panfrost_job *job; struct hash_table *jobs; + /* panfrost_resource -> panfrost_job */ + struct hash_table *write_jobs; + /* Bit mask for supported PIPE_DRAW for this hardware */ unsigned draw_modes; struct pipe_framebuffer_state pipe_framebuffer; - /* The number of concurrent FBOs allowed depends on the number of pools - * used; pools are ringed for parallelism opportunities */ - - struct panfrost_transient_pool transient_pools[2]; - int cmdstream_i; - struct panfrost_memory cmdstream_persistent; struct panfrost_memory shaders; struct panfrost_memory scratchpad; struct panfrost_memory tiler_heap; struct panfrost_memory varying_mem; - struct panfrost_memory misc_0; - struct panfrost_memory misc_1; + struct panfrost_memory tiler_polygon_list; + struct panfrost_memory tiler_dummy; struct panfrost_memory depth_stencil_buffer; struct panfrost_query *occlusion_query; @@ -144,33 +124,20 @@ struct panfrost_context { struct mali_shader_meta fragment_shader_core; - /* A frame is composed of a starting set value job, a number of vertex - * and tiler jobs, linked to the fragment job at the end. See the - * presentations for more information how this works */ - - unsigned draw_count; - - mali_ptr set_value_job; - mali_ptr vertex_jobs[MAX_DRAW_CALLS]; - mali_ptr tiler_jobs[MAX_DRAW_CALLS]; - - struct mali_job_descriptor_header *u_set_value_job; - struct mali_job_descriptor_header *u_vertex_jobs[MAX_DRAW_CALLS]; - struct mali_job_descriptor_header *u_tiler_jobs[MAX_DRAW_CALLS]; - - unsigned vertex_job_count; - unsigned tiler_job_count; - /* Per-draw Dirty flags are setup like any other driver */ int dirty; unsigned vertex_count; + unsigned instance_count; + + /* If instancing is enabled, vertex count padded for instance; if + * it is disabled, just equal to plain vertex count */ + unsigned padded_count; union mali_attr attributes[PIPE_MAX_ATTRIBS]; unsigned varying_height; - struct mali_viewport *viewport; struct mali_single_framebuffer vt_framebuffer_sfbd; struct bifrost_framebuffer vt_framebuffer_mfbd; @@ -186,8 +153,8 @@ struct panfrost_context { struct panfrost_vertex_state *vertex; - struct pipe_vertex_buffer *vertex_buffers; - unsigned vertex_buffer_count; + struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS]; + uint32_t vb_mask; struct panfrost_sampler_state *samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; unsigned sampler_count[PIPE_SHADER_TYPES]; @@ -198,6 +165,15 @@ struct panfrost_context { struct primconvert_context *primconvert; struct blitter_context *blitter; + /* Blitting the wallpaper (the old contents of the framebuffer back to + * itself) uses a dedicated u_blitter instance versus general blit() + * callbacks from Gallium, as the blit() callback can trigger + * wallpapering without Gallium realising, which in turns u_blitter + * errors due to unsupported reucrsion */ + + struct blitter_context *blitter_wallpaper; + struct panfrost_job *wallpaper_batch; + struct panfrost_blend_state *blend; struct pipe_viewport_state pipe_viewport; @@ -216,7 +192,7 @@ struct panfrost_context { * there's no real advantage to doing so */ bool require_sfbd; - uint32_t out_sync; + uint32_t out_sync; }; /* Corresponds to the CSO */ @@ -228,41 +204,6 @@ struct panfrost_rasterizer { unsigned tiler_gl_enables; }; -struct panfrost_blend_state { - struct pipe_blend_state base; - - /* Whether a blend shader is in use */ - bool has_blend_shader; - - /* Compiled fixed function command */ - struct mali_blend_equation equation; - - /* Compiled blend shader */ - mali_ptr blend_shader; - int blend_work_count; -}; - -/* Internal varyings descriptor */ -struct panfrost_varyings { - /* Varyings information: stride of each chunk of memory used for - * varyings (similar structure with attributes). Count is just the - * number of vec4's. Buffer count is the number of varying chunks (<= - * count). Height is used to calculate gl_Position's position ("it's - * not a pun, Alyssa!"). Vertex-only varyings == descriptor for - * gl_Position and something else apparently occupying the same space. - * Varyings == main varyings descriptors following typical mali_attr - * conventions. */ - - unsigned varyings_stride[MAX_VARYINGS]; - unsigned varying_count; - unsigned varying_buffer_count; - - /* Map of the actual varyings buffer */ - uint8_t *varyings_buffer_cpu; - mali_ptr varyings_descriptor; - mali_ptr varyings_descriptor_fragment; -}; - /* Variants bundle together to form the backing CSO, bundling multiple * shaders with varying emulated features baked in (alpha test * parameters, etc) */ @@ -281,12 +222,19 @@ struct panfrost_shader_state { int uniform_count; bool can_discard; bool writes_point_size; + bool reads_point_coord; + + struct mali_attr_meta varyings[PIPE_MAX_ATTRIBS]; + gl_varying_slot varyings_loc[PIPE_MAX_ATTRIBS]; - /* Valid for vertex shaders only due to when this is calculated */ - struct panfrost_varyings varyings; + unsigned sysval_count; + unsigned sysval[MAX_SYSVAL_COUNT]; /* Information on this particular shader variant */ struct pipe_alpha_state alpha_state; + + uint16_t point_sprite_mask; + unsigned point_sprite_upper_left : 1; }; /* A collection of varyings (the CSO) */ @@ -304,11 +252,7 @@ struct panfrost_vertex_state { unsigned num_elements; struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS]; - int nr_components[PIPE_MAX_ATTRIBS]; - - /* The actual attribute meta, prebaked and GPU mapped. TODO: Free memory */ - struct mali_attr_meta *hw; - mali_ptr descriptor_ptr; + struct mali_attr_meta hw[PIPE_MAX_ATTRIBS]; }; struct panfrost_sampler_state { @@ -329,12 +273,6 @@ pan_context(struct pipe_context *pcontext) return (struct panfrost_context *) pcontext; } -static inline struct panfrost_screen * -pan_screen(struct pipe_screen *p) -{ - return (struct panfrost_screen *)p; -} - struct pipe_context * panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags); @@ -342,7 +280,7 @@ void panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data); struct panfrost_transfer -panfrost_vertex_tiler_job(struct panfrost_context *ctx, bool is_tiler, bool is_elided_tiler); +panfrost_vertex_tiler_job(struct panfrost_context *ctx, bool is_tiler); unsigned panfrost_get_default_swizzle(unsigned components); @@ -356,22 +294,63 @@ panfrost_flush( bool panfrost_is_scanout(struct panfrost_context *ctx); -mali_ptr -panfrost_sfbd_fragment(struct panfrost_context *ctx, bool flip_y); - -mali_ptr -panfrost_mfbd_fragment(struct panfrost_context *ctx, bool flip_y); +mali_ptr panfrost_sfbd_fragment(struct panfrost_context *ctx, bool has_draws); +mali_ptr panfrost_mfbd_fragment(struct panfrost_context *ctx, bool has_draws); struct bifrost_framebuffer -panfrost_emit_mfbd(struct panfrost_context *ctx); +panfrost_emit_mfbd(struct panfrost_context *ctx, unsigned vertex_count); struct mali_single_framebuffer -panfrost_emit_sfbd(struct panfrost_context *ctx); +panfrost_emit_sfbd(struct panfrost_context *ctx, unsigned vertex_count); mali_ptr -panfrost_fragment_job(struct panfrost_context *ctx); +panfrost_fragment_job(struct panfrost_context *ctx, bool has_draws); void panfrost_shader_compile(struct panfrost_context *ctx, struct mali_shader_meta *meta, const char *src, int type, struct panfrost_shader_state *state); +void +panfrost_pack_work_groups_compute( + struct mali_vertex_tiler_prefix *out, + unsigned num_x, + unsigned num_y, + unsigned num_z, + unsigned size_x, + unsigned size_y, + unsigned size_z); + +void +panfrost_pack_work_groups_fused( + struct mali_vertex_tiler_prefix *vertex, + struct mali_vertex_tiler_prefix *tiler, + unsigned num_x, + unsigned num_y, + unsigned num_z, + unsigned size_x, + unsigned size_y, + unsigned size_z); + +/* Instancing */ + +mali_ptr +panfrost_vertex_buffer_address(struct panfrost_context *ctx, unsigned i); + +void +panfrost_emit_vertex_data(struct panfrost_job *batch); + +struct pan_shift_odd { + unsigned shift; + unsigned odd; +}; + +struct pan_shift_odd +panfrost_padded_vertex_count( + unsigned vertex_count, + bool primitive_pot); + + +unsigned +pan_expand_shift_odd(struct pan_shift_odd o); + + #endif