1 /* 2 * Copyright 2014 Broadcom 3 * Copyright (C) 2012 Rob Clark <robclark (at) freedesktop.org> 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22 * IN THE SOFTWARE. 23 */ 24 25 #ifndef VC4_CONTEXT_H 26 #define VC4_CONTEXT_H 27 28 #include <stdio.h> 29 30 #include "pipe/p_context.h" 31 #include "pipe/p_state.h" 32 #include "util/slab.h" 33 #include "xf86drm.h" 34 35 #define __user 36 #include "vc4_drm.h" 37 #include "vc4_bufmgr.h" 38 #include "vc4_resource.h" 39 #include "vc4_cl.h" 40 #include "vc4_qir.h" 41 42 #ifndef DRM_VC4_PARAM_SUPPORTS_ETC1 43 #define DRM_VC4_PARAM_SUPPORTS_ETC1 4 44 #endif 45 #ifndef DRM_VC4_PARAM_SUPPORTS_THREADED_FS 46 #define DRM_VC4_PARAM_SUPPORTS_THREADED_FS 5 47 #endif 48 49 #ifdef USE_VC4_SIMULATOR 50 #define using_vc4_simulator true 51 #else 52 #define using_vc4_simulator false 53 #endif 54 55 #define VC4_DIRTY_BLEND (1 << 0) 56 #define VC4_DIRTY_RASTERIZER (1 << 1) 57 #define VC4_DIRTY_ZSA (1 << 2) 58 #define VC4_DIRTY_FRAGTEX (1 << 3) 59 #define VC4_DIRTY_VERTTEX (1 << 4) 60 61 #define VC4_DIRTY_BLEND_COLOR (1 << 7) 62 #define VC4_DIRTY_STENCIL_REF (1 << 8) 63 #define VC4_DIRTY_SAMPLE_MASK (1 << 9) 64 #define VC4_DIRTY_FRAMEBUFFER (1 << 10) 65 #define VC4_DIRTY_STIPPLE (1 << 11) 66 #define VC4_DIRTY_VIEWPORT (1 << 12) 67 #define VC4_DIRTY_CONSTBUF (1 << 13) 68 #define VC4_DIRTY_VTXSTATE (1 << 14) 69 #define VC4_DIRTY_VTXBUF (1 << 15) 70 #define VC4_DIRTY_INDEXBUF (1 << 16) 71 #define VC4_DIRTY_SCISSOR (1 << 17) 72 #define VC4_DIRTY_FLAT_SHADE_FLAGS (1 << 18) 73 #define VC4_DIRTY_PRIM_MODE (1 << 19) 74 #define VC4_DIRTY_CLIP (1 << 20) 75 #define VC4_DIRTY_UNCOMPILED_VS (1 << 21) 76 #define VC4_DIRTY_UNCOMPILED_FS (1 << 22) 77 #define VC4_DIRTY_COMPILED_CS (1 << 23) 78 #define VC4_DIRTY_COMPILED_VS (1 << 24) 79 #define VC4_DIRTY_COMPILED_FS (1 << 25) 80 #define VC4_DIRTY_FS_INPUTS (1 << 26) 81 82 struct vc4_sampler_view { 83 struct pipe_sampler_view base; 84 uint32_t texture_p0; 85 uint32_t texture_p1; 86 bool force_first_level; 87 }; 88 89 struct vc4_sampler_state { 90 struct pipe_sampler_state base; 91 uint32_t texture_p1; 92 }; 93 94 struct vc4_texture_stateobj { 95 struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS]; 96 unsigned num_textures; 97 struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS]; 98 unsigned num_samplers; 99 }; 100 101 struct vc4_shader_uniform_info { 102 enum quniform_contents *contents; 103 uint32_t *data; 104 uint32_t count; 105 uint32_t num_texture_samples; 106 }; 107 108 struct vc4_uncompiled_shader { 109 /** A name for this program, so you can track it in shader-db output. */ 110 uint32_t program_id; 111 /** How many variants of this program were compiled, for shader-db. */ 112 uint32_t compiled_variant_count; 113 struct pipe_shader_state base; 114 }; 115 116 struct vc4_ubo_range { 117 /** 118 * offset in bytes from the start of the ubo where this range is 119 * uploaded. 120 * 121 * Only set once used is set. 122 */ 123 uint32_t dst_offset; 124 125 /** 126 * offset in bytes from the start of the gallium uniforms where the 127 * data comes from. 128 */ 129 uint32_t src_offset; 130 131 /** size in bytes of this ubo range */ 132 uint32_t size; 133 }; 134 135 struct vc4_fs_inputs { 136 /** 137 * Array of the meanings of the VPM inputs this shader needs. 138 * 139 * It doesn't include those that aren't part of the VPM, like 140 * point/line coordinates. 141 */ 142 struct vc4_varying_slot *input_slots; 143 uint32_t num_inputs; 144 }; 145 146 struct vc4_compiled_shader { 147 uint64_t program_id; 148 struct vc4_bo *bo; 149 150 struct vc4_shader_uniform_info uniforms; 151 152 struct vc4_ubo_range *ubo_ranges; 153 uint32_t num_ubo_ranges; 154 uint32_t ubo_size; 155 /** 156 * VC4_DIRTY_* flags that, when set in vc4->dirty, mean that the 157 * uniforms have to be rewritten (and therefore the shader state 158 * reemitted). 159 */ 160 uint32_t uniform_dirty_bits; 161 162 /** bitmask of which inputs are color inputs, for flat shade handling. */ 163 uint32_t color_inputs; 164 165 bool disable_early_z; 166 167 /* Set if the compile failed, likely due to register allocation 168 * failure. In this case, we have no shader to run and should not try 169 * to do any draws. 170 */ 171 bool failed; 172 173 bool fs_threaded; 174 175 uint8_t num_inputs; 176 177 /* Byte offsets for the start of the vertex attributes 0-7, and the 178 * total size as "attribute" 8. 179 */ 180 uint8_t vattr_offsets[9]; 181 uint8_t vattrs_live; 182 183 const struct vc4_fs_inputs *fs_inputs; 184 }; 185 186 struct vc4_program_stateobj { 187 struct vc4_uncompiled_shader *bind_vs, *bind_fs; 188 struct vc4_compiled_shader *cs, *vs, *fs; 189 }; 190 191 struct vc4_constbuf_stateobj { 192 struct pipe_constant_buffer cb[PIPE_MAX_CONSTANT_BUFFERS]; 193 uint32_t enabled_mask; 194 uint32_t dirty_mask; 195 }; 196 197 struct vc4_vertexbuf_stateobj { 198 struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS]; 199 unsigned count; 200 uint32_t enabled_mask; 201 uint32_t dirty_mask; 202 }; 203 204 struct vc4_vertex_stateobj { 205 struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS]; 206 unsigned num_elements; 207 }; 208 209 /* Hash table key for vc4->jobs */ 210 struct vc4_job_key { 211 struct pipe_surface *cbuf; 212 struct pipe_surface *zsbuf; 213 }; 214 215 /** 216 * A complete bin/render job. 217 * 218 * This is all of the state necessary to submit a bin/render to the kernel. 219 * We want to be able to have multiple in progress at a time, so that we don't 220 * need to flush an existing CL just to switch to rendering to a new render 221 * target (which would mean reading back from the old render target when 222 * starting to render to it again). 223 */ 224 struct vc4_job { 225 struct vc4_cl bcl; 226 struct vc4_cl shader_rec; 227 struct vc4_cl uniforms; 228 struct vc4_cl bo_handles; 229 struct vc4_cl bo_pointers; 230 uint32_t shader_rec_count; 231 /** 232 * Amount of memory used by the BOs in bo_pointers. 233 * 234 * Used for checking when we should flush the job early so we don't 235 * OOM. 236 */ 237 uint32_t bo_space; 238 239 /** @{ Surfaces to submit rendering for. */ 240 struct pipe_surface *color_read; 241 struct pipe_surface *color_write; 242 struct pipe_surface *zs_read; 243 struct pipe_surface *zs_write; 244 struct pipe_surface *msaa_color_write; 245 struct pipe_surface *msaa_zs_write; 246 /** @} */ 247 /** @{ 248 * Bounding box of the scissor across all queued drawing. 249 * 250 * Note that the max values are exclusive. 251 */ 252 uint32_t draw_min_x; 253 uint32_t draw_min_y; 254 uint32_t draw_max_x; 255 uint32_t draw_max_y; 256 /** @} */ 257 /** @{ 258 * Width/height of the color framebuffer being rendered to, 259 * for VC4_TILE_RENDERING_MODE_CONFIG. 260 */ 261 uint32_t draw_width; 262 uint32_t draw_height; 263 /** @} */ 264 /** @{ Tile information, depending on MSAA and float color buffer. */ 265 uint32_t draw_tiles_x; /** @< Number of tiles wide for framebuffer. */ 266 uint32_t draw_tiles_y; /** @< Number of tiles high for framebuffer. */ 267 268 uint32_t tile_width; /** @< Width of a tile. */ 269 uint32_t tile_height; /** @< Height of a tile. */ 270 /** Whether the current rendering is in a 4X MSAA tile buffer. */ 271 bool msaa; 272 /** @} */ 273 274 /* Bitmask of PIPE_CLEAR_* of buffers that were cleared before the 275 * first rendering. 276 */ 277 uint32_t cleared; 278 /* Bitmask of PIPE_CLEAR_* of buffers that have been rendered to 279 * (either clears or draws). 280 */ 281 uint32_t resolve; 282 uint32_t clear_color[2]; 283 uint32_t clear_depth; /**< 24-bit unorm depth */ 284 uint8_t clear_stencil; 285 286 /** 287 * Set if some drawing (triangles, blits, or just a glClear()) has 288 * been done to the FBO, meaning that we need to 289 * DRM_IOCTL_VC4_SUBMIT_CL. 290 */ 291 bool needs_flush; 292 293 /** 294 * Number of draw calls (not counting full buffer clears) queued in 295 * the current job. 296 */ 297 uint32_t draw_calls_queued; 298 299 struct vc4_job_key key; 300 }; 301 302 struct vc4_context { 303 struct pipe_context base; 304 305 int fd; 306 struct vc4_screen *screen; 307 308 /** The 3D rendering job for the currently bound FBO. */ 309 struct vc4_job *job; 310 311 /* Map from struct vc4_job_key to the job for that FBO. 312 */ 313 struct hash_table *jobs; 314 315 /** 316 * Map from vc4_resource to a job writing to that resource. 317 * 318 * Primarily for flushing jobs rendering to textures that are now 319 * being read from. 320 */ 321 struct hash_table *write_jobs; 322 323 struct slab_child_pool transfer_pool; 324 struct blitter_context *blitter; 325 326 /** bitfield of VC4_DIRTY_* */ 327 uint32_t dirty; 328 329 struct primconvert_context *primconvert; 330 331 struct hash_table *fs_cache, *vs_cache; 332 struct set *fs_inputs_set; 333 uint32_t next_uncompiled_program_id; 334 uint64_t next_compiled_program_id; 335 336 struct ra_regs *regs; 337 unsigned int reg_class_any[2]; 338 unsigned int reg_class_a_or_b[2]; 339 unsigned int reg_class_a_or_b_or_acc[2]; 340 unsigned int reg_class_r0_r3; 341 unsigned int reg_class_r4_or_a[2]; 342 unsigned int reg_class_a[2]; 343 344 uint8_t prim_mode; 345 346 /** Maximum index buffer valid for the current shader_rec. */ 347 uint32_t max_index; 348 /** Last index bias baked into the current shader_rec. */ 349 uint32_t last_index_bias; 350 351 /** Seqno of the last CL flush's job. */ 352 uint64_t last_emit_seqno; 353 354 struct u_upload_mgr *uploader; 355 356 /** @{ Current pipeline state objects */ 357 struct pipe_scissor_state scissor; 358 struct pipe_blend_state *blend; 359 struct vc4_rasterizer_state *rasterizer; 360 struct vc4_depth_stencil_alpha_state *zsa; 361 362 struct vc4_texture_stateobj verttex, fragtex; 363 364 struct vc4_program_stateobj prog; 365 366 struct vc4_vertex_stateobj *vtx; 367 368 struct { 369 struct pipe_blend_color f; 370 uint8_t ub[4]; 371 } blend_color; 372 struct pipe_stencil_ref stencil_ref; 373 unsigned sample_mask; 374 struct pipe_framebuffer_state framebuffer; 375 struct pipe_poly_stipple stipple; 376 struct pipe_clip_state clip; 377 struct pipe_viewport_state viewport; 378 struct vc4_constbuf_stateobj constbuf[PIPE_SHADER_TYPES]; 379 struct vc4_vertexbuf_stateobj vertexbuf; 380 struct pipe_index_buffer indexbuf; 381 /** @} */ 382 }; 383 384 struct vc4_rasterizer_state { 385 struct pipe_rasterizer_state base; 386 387 /* VC4_CONFIGURATION_BITS */ 388 uint8_t config_bits[3]; 389 390 float point_size; 391 392 /** 393 * Half-float (1/8/7 bits) value of polygon offset units for 394 * VC4_PACKET_DEPTH_OFFSET 395 */ 396 uint16_t offset_units; 397 /** 398 * Half-float (1/8/7 bits) value of polygon offset scale for 399 * VC4_PACKET_DEPTH_OFFSET 400 */ 401 uint16_t offset_factor; 402 }; 403 404 struct vc4_depth_stencil_alpha_state { 405 struct pipe_depth_stencil_alpha_state base; 406 407 /* VC4_CONFIGURATION_BITS */ 408 uint8_t config_bits[3]; 409 410 /** Uniforms for stencil state. 411 * 412 * Index 0 is either the front config, or the front-and-back config. 413 * Index 1 is the back config if doing separate back stencil. 414 * Index 2 is the writemask config if it's not a common mask value. 415 */ 416 uint32_t stencil_uniforms[3]; 417 }; 418 419 #define perf_debug(...) do { \ 420 if (unlikely(vc4_debug & VC4_DEBUG_PERF)) \ 421 fprintf(stderr, __VA_ARGS__); \ 422 } while (0) 423 424 static inline struct vc4_context * 425 vc4_context(struct pipe_context *pcontext) 426 { 427 return (struct vc4_context *)pcontext; 428 } 429 430 static inline struct vc4_sampler_view * 431 vc4_sampler_view(struct pipe_sampler_view *psview) 432 { 433 return (struct vc4_sampler_view *)psview; 434 } 435 436 static inline struct vc4_sampler_state * 437 vc4_sampler_state(struct pipe_sampler_state *psampler) 438 { 439 return (struct vc4_sampler_state *)psampler; 440 } 441 442 struct pipe_context *vc4_context_create(struct pipe_screen *pscreen, 443 void *priv, unsigned flags); 444 void vc4_draw_init(struct pipe_context *pctx); 445 void vc4_state_init(struct pipe_context *pctx); 446 void vc4_program_init(struct pipe_context *pctx); 447 void vc4_program_fini(struct pipe_context *pctx); 448 void vc4_query_init(struct pipe_context *pctx); 449 void vc4_simulator_init(struct vc4_screen *screen); 450 void vc4_simulator_destroy(struct vc4_screen *screen); 451 int vc4_simulator_flush(struct vc4_context *vc4, 452 struct drm_vc4_submit_cl *args, 453 struct vc4_job *job); 454 int vc4_simulator_ioctl(int fd, unsigned long request, void *arg); 455 void vc4_simulator_open_from_handle(int fd, uint32_t winsys_stride, 456 int handle, uint32_t size); 457 458 static inline int 459 vc4_ioctl(int fd, unsigned long request, void *arg) 460 { 461 if (using_vc4_simulator) 462 return vc4_simulator_ioctl(fd, request, arg); 463 else 464 return drmIoctl(fd, request, arg); 465 } 466 467 void vc4_set_shader_uniform_dirty_flags(struct vc4_compiled_shader *shader); 468 void vc4_write_uniforms(struct vc4_context *vc4, 469 struct vc4_compiled_shader *shader, 470 struct vc4_constbuf_stateobj *cb, 471 struct vc4_texture_stateobj *texstate); 472 473 void vc4_flush(struct pipe_context *pctx); 474 void vc4_job_init(struct vc4_context *vc4); 475 struct vc4_job *vc4_get_job(struct vc4_context *vc4, 476 struct pipe_surface *cbuf, 477 struct pipe_surface *zsbuf); 478 struct vc4_job *vc4_get_job_for_fbo(struct vc4_context *vc4); 479 480 void vc4_job_submit(struct vc4_context *vc4, struct vc4_job *job); 481 void vc4_flush_jobs_writing_resource(struct vc4_context *vc4, 482 struct pipe_resource *prsc); 483 void vc4_flush_jobs_reading_resource(struct vc4_context *vc4, 484 struct pipe_resource *prsc); 485 void vc4_emit_state(struct pipe_context *pctx); 486 void vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c); 487 struct qpu_reg *vc4_register_allocate(struct vc4_context *vc4, struct vc4_compile *c); 488 bool vc4_update_compiled_shaders(struct vc4_context *vc4, uint8_t prim_mode); 489 490 bool vc4_rt_format_supported(enum pipe_format f); 491 bool vc4_rt_format_is_565(enum pipe_format f); 492 bool vc4_tex_format_supported(enum pipe_format f); 493 uint8_t vc4_get_tex_format(enum pipe_format f); 494 const uint8_t *vc4_get_format_swizzle(enum pipe_format f); 495 void vc4_init_query_functions(struct vc4_context *vc4); 496 void vc4_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info); 497 void vc4_blitter_save(struct vc4_context *vc4); 498 #endif /* VC4_CONTEXT_H */ 499