1 /* 2 * Copyright (c) 2017-2019 Lima Project 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sub license, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the 12 * next paragraph) shall be included in all copies or substantial portions 13 * of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 * 23 */ 24 25 #ifndef H_LIMA_CONTEXT 26 #define H_LIMA_CONTEXT 27 28 #include "util/list.h" 29 #include "util/slab.h" 30 31 #include "pipe/p_context.h" 32 #include "pipe/p_state.h" 33 34 struct lima_context_framebuffer { 35 struct pipe_framebuffer_state base; 36 int tiled_w, tiled_h; 37 int shift_w, shift_h; 38 int block_w, block_h; 39 int shift_min; 40 }; 41 42 struct lima_depth_stencil_alpha_state { 43 struct pipe_depth_stencil_alpha_state base; 44 }; 45 46 struct lima_fs_compiled_shader { 47 struct lima_bo *bo; 48 void *shader; 49 struct { 50 int shader_size; 51 int stack_size; 52 bool uses_discard; 53 } state; 54 }; 55 56 struct lima_fs_uncompiled_shader { 57 struct pipe_shader_state base; 58 unsigned char nir_sha1[20]; 59 }; 60 61 struct lima_fs_key { 62 unsigned char nir_sha1[20]; 63 struct { 64 uint8_t swizzle[4]; 65 } tex[PIPE_MAX_SAMPLERS]; 66 }; 67 68 #define LIMA_MAX_VARYING_NUM 13 69 70 struct lima_varying_info { 71 int components; 72 int component_size; 73 int offset; 74 }; 75 76 struct lima_vs_compiled_shader { 77 struct lima_bo *bo; 78 void *shader; 79 void *constant; 80 struct { 81 int shader_size; 82 int prefetch; 83 int uniform_size; 84 int constant_size; 85 struct lima_varying_info varying[LIMA_MAX_VARYING_NUM]; 86 int varying_stride; 87 int num_outputs; 88 int num_varyings; 89 int gl_pos_idx; 90 int point_size_idx; 91 } state; 92 }; 93 94 struct lima_vs_uncompiled_shader { 95 struct pipe_shader_state base; 96 unsigned char nir_sha1[20]; 97 }; 98 99 struct lima_vs_key { 100 unsigned char nir_sha1[20]; 101 }; 102 103 struct lima_rasterizer_state { 104 struct pipe_rasterizer_state base; 105 }; 106 107 struct lima_blend_state { 108 struct pipe_blend_state base; 109 }; 110 111 struct lima_vertex_element_state { 112 struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS]; 113 unsigned num_elements; 114 }; 115 116 struct lima_context_vertex_buffer { 117 struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS]; 118 unsigned count; 119 uint32_t enabled_mask; 120 }; 121 122 struct lima_context_viewport_state { 123 struct pipe_viewport_state transform; 124 float left, right, bottom, top; 125 float near, far; 126 }; 127 128 struct lima_context_constant_buffer { 129 const void *buffer; 130 uint32_t size; 131 bool dirty; 132 }; 133 134 enum lima_ctx_buff { 135 lima_ctx_buff_gp_varying_info, 136 lima_ctx_buff_gp_attribute_info, 137 lima_ctx_buff_gp_uniform, 138 lima_ctx_buff_pp_plb_rsw, 139 lima_ctx_buff_pp_uniform_array, 140 lima_ctx_buff_pp_uniform, 141 lima_ctx_buff_pp_tex_desc, 142 lima_ctx_buff_num, 143 lima_ctx_buff_num_gp = lima_ctx_buff_pp_plb_rsw, 144 }; 145 146 struct lima_ctx_buff_state { 147 struct pipe_resource *res; 148 unsigned offset; 149 unsigned size; 150 }; 151 152 struct lima_texture_stateobj { 153 struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS]; 154 unsigned num_textures; 155 struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS]; 156 unsigned num_samplers; 157 }; 158 159 struct lima_ctx_plb_pp_stream_key { 160 uint16_t plb_index; 161 /* Coordinates are in tiles */ 162 uint16_t minx, miny, maxx, maxy; 163 /* FB params */ 164 uint16_t shift_w, shift_h; 165 uint16_t block_w, block_h; 166 }; 167 168 struct lima_ctx_plb_pp_stream { 169 struct list_head lru_list; 170 struct lima_ctx_plb_pp_stream_key key; 171 struct lima_bo *bo; 172 uint32_t offset[8]; 173 }; 174 175 struct lima_pp_stream_state { 176 void *map; 177 uint32_t va; 178 uint32_t offset[8]; 179 }; 180 181 struct lima_context { 182 struct pipe_context base; 183 184 enum { 185 LIMA_CONTEXT_DIRTY_FRAMEBUFFER = (1 << 0), 186 LIMA_CONTEXT_DIRTY_CLEAR = (1 << 1), 187 LIMA_CONTEXT_DIRTY_COMPILED_VS = (1 << 2), 188 LIMA_CONTEXT_DIRTY_COMPILED_FS = (1 << 3), 189 LIMA_CONTEXT_DIRTY_VERTEX_ELEM = (1 << 4), 190 LIMA_CONTEXT_DIRTY_VERTEX_BUFF = (1 << 5), 191 LIMA_CONTEXT_DIRTY_VIEWPORT = (1 << 6), 192 LIMA_CONTEXT_DIRTY_SCISSOR = (1 << 7), 193 LIMA_CONTEXT_DIRTY_RASTERIZER = (1 << 8), 194 LIMA_CONTEXT_DIRTY_ZSA = (1 << 9), 195 LIMA_CONTEXT_DIRTY_BLEND_COLOR = (1 << 10), 196 LIMA_CONTEXT_DIRTY_BLEND = (1 << 11), 197 LIMA_CONTEXT_DIRTY_STENCIL_REF = (1 << 12), 198 LIMA_CONTEXT_DIRTY_CONST_BUFF = (1 << 13), 199 LIMA_CONTEXT_DIRTY_TEXTURES = (1 << 14), 200 LIMA_CONTEXT_DIRTY_CLIP = (1 << 15), 201 LIMA_CONTEXT_DIRTY_UNCOMPILED_VS = (1 << 16), 202 LIMA_CONTEXT_DIRTY_UNCOMPILED_FS = (1 << 17), 203 } dirty; 204 205 struct u_upload_mgr *uploader; 206 struct blitter_context *blitter; 207 208 struct slab_child_pool transfer_pool; 209 210 struct lima_context_framebuffer framebuffer; 211 struct lima_context_viewport_state viewport; 212 struct pipe_scissor_state scissor; 213 struct pipe_scissor_state clipped_scissor; 214 struct lima_vs_compiled_shader *vs; 215 struct lima_fs_compiled_shader *fs; 216 struct lima_vs_uncompiled_shader *uncomp_vs; 217 struct lima_fs_uncompiled_shader *uncomp_fs; 218 struct lima_vertex_element_state *vertex_elements; 219 struct lima_context_vertex_buffer vertex_buffers; 220 struct lima_rasterizer_state *rasterizer; 221 struct lima_depth_stencil_alpha_state *zsa; 222 struct pipe_blend_color blend_color; 223 struct lima_blend_state *blend; 224 struct pipe_stencil_ref stencil_ref; 225 struct pipe_clip_state clip; 226 struct lima_context_constant_buffer const_buffer[PIPE_SHADER_TYPES]; 227 struct lima_texture_stateobj tex_stateobj; 228 struct lima_pp_stream_state pp_stream; 229 230 unsigned min_index; 231 unsigned max_index; 232 233 #define LIMA_CTX_PLB_MIN_NUM 1 234 #define LIMA_CTX_PLB_MAX_NUM 4 235 #define LIMA_CTX_PLB_DEF_NUM 2 236 #define LIMA_CTX_PLB_BLK_SIZE 512 237 unsigned plb_size; 238 unsigned plb_gp_size; 239 240 struct lima_bo *plb[LIMA_CTX_PLB_MAX_NUM]; 241 struct lima_bo *gp_tile_heap[LIMA_CTX_PLB_MAX_NUM]; 242 uint32_t gp_tile_heap_size; 243 struct lima_bo *plb_gp_stream; 244 struct lima_bo *gp_output; 245 uint32_t gp_output_varyings_offt; 246 uint32_t gp_output_point_size_offt; 247 248 struct hash_table *plb_pp_stream; 249 struct list_head plb_pp_stream_lru_list; 250 uint32_t plb_index; 251 size_t plb_stream_cache_size; 252 253 struct hash_table *fs_cache; 254 struct hash_table *vs_cache; 255 256 struct lima_ctx_buff_state buffer_state[lima_ctx_buff_num]; 257 258 /* current job */ 259 struct lima_job *job; 260 261 /* map from lima_job_key to lima_job */ 262 struct hash_table *jobs; 263 264 /* map from pipe_resource to lima_job which write to it */ 265 struct hash_table *write_jobs; 266 267 int in_sync_fd; 268 uint32_t in_sync[2]; 269 uint32_t out_sync[2]; 270 271 int id; 272 273 struct pipe_debug_callback debug; 274 275 unsigned index_offset; 276 struct lima_resource *index_res; 277 }; 278 279 static inline struct lima_context * 280 lima_context(struct pipe_context *pctx) 281 { 282 return (struct lima_context *)pctx; 283 } 284 285 struct lima_sampler_state { 286 struct pipe_sampler_state base; 287 }; 288 289 static inline struct lima_sampler_state * 290 lima_sampler_state(struct pipe_sampler_state *psstate) 291 { 292 return (struct lima_sampler_state *)psstate; 293 } 294 295 struct lima_sampler_view { 296 struct pipe_sampler_view base; 297 uint8_t swizzle[4]; 298 }; 299 300 static inline struct lima_sampler_view * 301 lima_sampler_view(struct pipe_sampler_view *psview) 302 { 303 return (struct lima_sampler_view *)psview; 304 } 305 306 uint32_t lima_ctx_buff_va(struct lima_context *ctx, enum lima_ctx_buff buff); 307 void *lima_ctx_buff_map(struct lima_context *ctx, enum lima_ctx_buff buff); 308 void *lima_ctx_buff_alloc(struct lima_context *ctx, enum lima_ctx_buff buff, 309 unsigned size); 310 311 void lima_state_init(struct lima_context *ctx); 312 void lima_state_fini(struct lima_context *ctx); 313 void lima_draw_init(struct lima_context *ctx); 314 void lima_program_init(struct lima_context *ctx); 315 void lima_program_fini(struct lima_context *ctx); 316 void lima_query_init(struct lima_context *ctx); 317 318 struct pipe_context * 319 lima_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags); 320 321 void lima_flush(struct lima_context *ctx); 322 void lima_flush_job_accessing_bo( 323 struct lima_context *ctx, struct lima_bo *bo, bool write); 324 void lima_flush_previous_job_writing_resource( 325 struct lima_context *ctx, struct pipe_resource *prsc); 326 327 #endif 328