X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fpanfrost%2Fpan_context.h;h=4c1580b33931c21cdea558e12f9e393fdaafad13;hb=2c5ba2ee6ea68aa3062156d1a4abfc3b2556775d;hp=48cce72a30329293e418332e041268a8566f6656;hpb=97aa05470a7a95983e365ef57d7af9425f4642a8;p=mesa.git diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h index 48cce72a303..4c1580b3393 100644 --- a/src/gallium/drivers/panfrost/pan_context.h +++ b/src/gallium/drivers/panfrost/pan_context.h @@ -30,6 +30,9 @@ #include #include #include "pan_resource.h" +#include "pan_job.h" +#include "pan_blend.h" +#include "pan_encoder.h" #include "pipe/p_compiler.h" #include "pipe/p_config.h" @@ -39,11 +42,14 @@ #include "pipe/p_screen.h" #include "pipe/p_state.h" #include "util/u_blitter.h" +#include "util/hash_table.h" + +#include "midgard/midgard_compile.h" +#include "compiler/shader_enums.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) @@ -57,10 +63,16 @@ struct prim_convert_context; #define PAN_DIRTY_SAMPLERS (1 << 8) #define PAN_DIRTY_TEXTURES (1 << 9) +#define SET_BIT(lval, bit, cond) \ + if (cond) \ + lval |= (bit); \ + else \ + 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 { @@ -68,79 +80,65 @@ struct panfrost_query { unsigned type; unsigned index; - /* Memory for the GPU to writeback the value of the query */ - struct panfrost_transfer transfer; -}; - -#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; + union { + /* For computed queries. 64-bit to prevent overflow */ + struct { + uint64_t start; + uint64_t end; + }; - /* Current entry that we are writing to, zero-indexed, strictly less than entry_count */ - unsigned entry_index; + /* Memory for the GPU to writeback the value of the query */ + struct panfrost_transfer transfer; + }; +}; - /* Number of bytes into the current entry we are */ - off_t entry_offset; +struct panfrost_fence { + struct pipe_reference reference; + int fd; +}; - /* Entry size (all entries must be homogenous) */ - size_t entry_size; +struct panfrost_streamout { + struct pipe_stream_output_target *targets[PIPE_MAX_SO_BUFFERS]; + uint32_t offsets[PIPE_MAX_SO_BUFFERS]; + unsigned num_targets; }; struct panfrost_context { /* Gallium context */ struct pipe_context base; + /* Compiler context */ + struct midgard_screen compiler; + + /* Bound job and map of panfrost_job_key to jobs */ + struct panfrost_job *job; + struct hash_table *jobs; + + /* panfrost_resource -> panfrost_job */ + struct hash_table *write_jobs; + + /* Within a launch_grid call.. */ + const struct pipe_grid_info *compute_grid; + /* 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_streamout streamout; 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_dummy; struct panfrost_memory depth_stencil_buffer; - struct { - unsigned buffers; - const union pipe_color_union *color; - double depth; - unsigned stencil; - } last_clear; - + bool active_queries; + uint64_t prims_generated; + uint64_t tf_prims_generated; struct panfrost_query *occlusion_query; - /* Each render job has multiple framebuffer descriptors associated with - * it, used for various purposes with more or less the same format. The - * most obvious is the fragment framebuffer descriptor, which carries - * e.g. clearing information */ - - union { - struct mali_single_framebuffer fragment_sfbd; - struct { - struct bifrost_framebuffer fragment_mfbd; - struct bifrost_fb_extra fragment_extra; - struct bifrost_render_target fragment_rts[4]; - }; - }; - /* Each draw has corresponding vertex and tiler payloads */ - struct midgard_payload_vertex_tiler payload_vertex; - struct midgard_payload_vertex_tiler payload_tiler; + struct midgard_payload_vertex_tiler payloads[PIPE_SHADER_TYPES]; /* The fragment shader binary itself is pointed here (for the tripipe) but * also everything else in the shader core, including blending, the @@ -148,53 +146,32 @@ 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; - /* Per frame dirty flag - whether there was a clear. If not, we need to do a partial update, maybe */ - bool frame_cleared; - unsigned vertex_count; + unsigned instance_count; + enum pipe_prim_type active_prim; - union mali_attr attributes[PIPE_MAX_ATTRIBS]; - - unsigned varying_height; + /* If instancing is enabled, vertex count padded for instance; if + * it is disabled, just equal to plain vertex count */ + unsigned padded_count; - struct mali_viewport *viewport; - struct mali_single_framebuffer vt_framebuffer_sfbd; - struct bifrost_framebuffer vt_framebuffer_mfbd; + union mali_attr attributes[PIPE_MAX_ATTRIBS]; /* TODO: Multiple uniform buffers (index =/= 0), finer updates? */ struct panfrost_constant_buffer constant_buffer[PIPE_SHADER_TYPES]; - /* CSOs */ struct panfrost_rasterizer *rasterizer; - - struct panfrost_shader_variants *vs; - struct panfrost_shader_variants *fs; - + struct panfrost_shader_variants *shader[PIPE_SHADER_TYPES]; 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 pipe_shader_buffer ssbo[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_BUFFERS]; + uint32_t ssbo_mask[PIPE_SHADER_TYPES]; struct panfrost_sampler_state *samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; unsigned sampler_count[PIPE_SHADER_TYPES]; @@ -205,6 +182,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; @@ -212,6 +198,11 @@ struct panfrost_context { struct pipe_blend_color blend_color; struct pipe_depth_stencil_alpha_state *depth_stencil; struct pipe_stencil_ref stencil_ref; + + /* True for t6XX, false for t8xx. */ + bool is_t6xx; + + uint32_t out_sync; }; /* Corresponds to the CSO */ @@ -223,41 +214,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) */ @@ -265,28 +221,49 @@ struct panfrost_varyings { /* A shader state corresponds to the actual, current variant of the shader */ struct panfrost_shader_state { - struct pipe_shader_state *base; - /* Compiled, mapped descriptor, ready for the hardware */ bool compiled; struct mali_shader_meta *tripipe; - mali_ptr tripipe_gpu; /* Non-descript information */ int uniform_count; bool can_discard; bool writes_point_size; + bool reads_point_coord; + bool reads_face; + bool reads_frag_coord; + + struct mali_attr_meta varyings[PIPE_MAX_ATTRIBS]; + gl_varying_slot varyings_loc[PIPE_MAX_ATTRIBS]; + struct pipe_stream_output_info stream_output; + uint64_t so_mask; - /* 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; + + /* Should we enable helper invocations */ + bool helper_invocations; + + struct panfrost_bo *bo; }; /* A collection of varyings (the CSO) */ struct panfrost_shader_variants { - struct pipe_shader_state base; + /* A panfrost_shader_variants can represent a shader for + * either graphics or compute */ + + bool is_compute; + + union { + struct pipe_shader_state base; + struct pipe_compute_state cbase; + }; struct panfrost_shader_state variants[MAX_SHADER_VARIANTS]; unsigned variant_count; @@ -299,11 +276,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 { @@ -316,6 +289,7 @@ struct panfrost_sampler_state { struct panfrost_sampler_view { struct pipe_sampler_view base; struct mali_texture_descriptor hw; + bool manual_stride; }; static inline struct panfrost_context * @@ -324,12 +298,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); @@ -337,7 +305,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); @@ -348,10 +316,63 @@ panfrost_flush( struct pipe_fence_handle **fence, unsigned flags); +bool +panfrost_is_scanout(struct panfrost_context *ctx); + +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, unsigned vertex_count); + +struct mali_single_framebuffer +panfrost_emit_sfbd(struct panfrost_context *ctx, unsigned vertex_count); + +mali_ptr +panfrost_fragment_job(struct panfrost_context *ctx, bool has_draws); + +void +panfrost_shader_compile( + struct panfrost_context *ctx, + struct mali_shader_meta *meta, + enum pipe_shader_ir ir_type, + const void *ir, + gl_shader_stage stage, + struct panfrost_shader_state *state, + uint64_t *outputs_written); + +/* Instancing */ + mali_ptr -panfrost_fragment_job(struct panfrost_context *ctx); +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); + +/* Compute */ + +void +panfrost_compute_context_init(struct pipe_context *pctx); + +/* Varyings */ void -panfrost_shader_compile(struct panfrost_context *ctx, struct mali_shader_meta *meta, const char *src, int type, struct panfrost_shader_state *state); +panfrost_emit_varying_descriptor( + struct panfrost_context *ctx, + unsigned vertex_count); #endif