/* * © Copyright 2018 Alyssa Rosenzweig * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ #ifndef __BUILDER_H__ #define __BUILDER_H__ #define _LARGEFILE64_SOURCE 1 #define CACHE_LINE_SIZE 1024 /* TODO */ #include #include #include "pan_resource.h" #include "pan_job.h" #include "pan_blend.h" #include "pipe/p_compiler.h" #include "pipe/p_config.h" #include "pipe/p_context.h" #include "pipe/p_defines.h" #include "pipe/p_format.h" #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" /* Forward declare to avoid extra header dep */ struct prim_convert_context; #define MAX_VARYINGS 4096 //#define PAN_DIRTY_CLEAR (1 << 0) #define PAN_DIRTY_RASTERIZER (1 << 2) #define PAN_DIRTY_FS (1 << 3) #define PAN_DIRTY_FRAG_CORE (PAN_DIRTY_FS) /* Dirty writes are tied */ #define PAN_DIRTY_VS (1 << 4) #define PAN_DIRTY_VERTEX (1 << 5) #define PAN_DIRTY_VERT_BUF (1 << 6) //#define PAN_DIRTY_VIEWPORT (1 << 7) #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 { struct pipe_constant_buffer cb[PIPE_MAX_CONSTANT_BUFFERS]; uint32_t enabled_mask; uint32_t dirty_mask; }; struct panfrost_query { /* Passthrough from Gallium */ unsigned type; unsigned index; /* Memory for the GPU to writeback the value of the query */ struct panfrost_transfer transfer; }; struct panfrost_fence { struct pipe_reference reference; 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; /* 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; /* 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 tiler_polygon_list; struct panfrost_memory tiler_dummy; struct panfrost_memory depth_stencil_buffer; struct panfrost_query *occlusion_query; /* Each draw has corresponding vertex and tiler payloads */ struct midgard_payload_vertex_tiler payload_vertex; struct midgard_payload_vertex_tiler payload_tiler; /* The fragment shader binary itself is pointed here (for the tripipe) but * also everything else in the shader core, including blending, the * stencil/depth tests, etc. Refer to the presentations. */ struct mali_shader_meta fragment_shader_core; /* 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_single_framebuffer vt_framebuffer_sfbd; struct bifrost_framebuffer vt_framebuffer_mfbd; /* 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_vertex_state *vertex; 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]; struct panfrost_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS]; unsigned sampler_view_count[PIPE_SHADER_TYPES]; 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; struct pipe_scissor_state scissor; 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; /* If set, we'll require the use of single render-target framebuffer * descriptors (SFBD), for older hardware -- specifically,