iris_program.c revision 9f464c52
1/* 2 * Copyright © 2017 Intel Corporation 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, sublicense, 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 shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20 * DEALINGS IN THE SOFTWARE. 21 */ 22 23/** 24 * @file iris_program.c 25 * 26 * This file contains the driver interface for compiling shaders. 27 * 28 * See iris_program_cache.c for the in-memory program cache where the 29 * compiled shaders are stored. 30 */ 31 32#include <stdio.h> 33#include <errno.h> 34#include "pipe/p_defines.h" 35#include "pipe/p_state.h" 36#include "pipe/p_context.h" 37#include "pipe/p_screen.h" 38#include "util/u_atomic.h" 39#include "compiler/nir/nir.h" 40#include "compiler/nir/nir_builder.h" 41#include "intel/compiler/brw_compiler.h" 42#include "intel/compiler/brw_nir.h" 43#include "iris_context.h" 44#include "nir/tgsi_to_nir.h" 45 46#define KEY_INIT_NO_ID(gen) \ 47 .tex.swizzles[0 ... MAX_SAMPLERS - 1] = 0x688, \ 48 .tex.compressed_multisample_layout_mask = ~0, \ 49 .tex.msaa_16 = (gen >= 9 ? ~0 : 0) 50#define KEY_INIT(gen) .program_string_id = ish->program_id, KEY_INIT_NO_ID(gen) 51 52static unsigned 53get_new_program_id(struct iris_screen *screen) 54{ 55 return p_atomic_inc_return(&screen->program_id); 56} 57 58/** 59 * An uncompiled, API-facing shader. This is the Gallium CSO for shaders. 60 * It primarily contains the NIR for the shader. 61 * 62 * Each API-facing shader can be compiled into multiple shader variants, 63 * based on non-orthogonal state dependencies, recorded in the shader key. 64 * 65 * See iris_compiled_shader, which represents a compiled shader variant. 66 */ 67struct iris_uncompiled_shader { 68 nir_shader *nir; 69 70 struct pipe_stream_output_info stream_output; 71 72 unsigned program_id; 73 74 /** Bitfield of (1 << IRIS_NOS_*) flags. */ 75 unsigned nos; 76 77 /** Have any shader variants been compiled yet? */ 78 bool compiled_once; 79}; 80 81static nir_ssa_def * 82get_aoa_deref_offset(nir_builder *b, 83 nir_deref_instr *deref, 84 unsigned elem_size) 85{ 86 unsigned array_size = elem_size; 87 nir_ssa_def *offset = nir_imm_int(b, 0); 88 89 while (deref->deref_type != nir_deref_type_var) { 90 assert(deref->deref_type == nir_deref_type_array); 91 92 /* This level's element size is the previous level's array size */ 93 nir_ssa_def *index = nir_ssa_for_src(b, deref->arr.index, 1); 94 assert(deref->arr.index.ssa); 95 offset = nir_iadd(b, offset, 96 nir_imul(b, index, nir_imm_int(b, array_size))); 97 98 deref = nir_deref_instr_parent(deref); 99 assert(glsl_type_is_array(deref->type)); 100 array_size *= glsl_get_length(deref->type); 101 } 102 103 /* Accessing an invalid surface index with the dataport can result in a 104 * hang. According to the spec "if the index used to select an individual 105 * element is negative or greater than or equal to the size of the array, 106 * the results of the operation are undefined but may not lead to 107 * termination" -- which is one of the possible outcomes of the hang. 108 * Clamp the index to prevent access outside of the array bounds. 109 */ 110 return nir_umin(b, offset, nir_imm_int(b, array_size - elem_size)); 111} 112 113static void 114iris_lower_storage_image_derefs(nir_shader *nir) 115{ 116 nir_function_impl *impl = nir_shader_get_entrypoint(nir); 117 118 nir_builder b; 119 nir_builder_init(&b, impl); 120 121 nir_foreach_block(block, impl) { 122 nir_foreach_instr_safe(instr, block) { 123 if (instr->type != nir_instr_type_intrinsic) 124 continue; 125 126 nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); 127 switch (intrin->intrinsic) { 128 case nir_intrinsic_image_deref_load: 129 case nir_intrinsic_image_deref_store: 130 case nir_intrinsic_image_deref_atomic_add: 131 case nir_intrinsic_image_deref_atomic_min: 132 case nir_intrinsic_image_deref_atomic_max: 133 case nir_intrinsic_image_deref_atomic_and: 134 case nir_intrinsic_image_deref_atomic_or: 135 case nir_intrinsic_image_deref_atomic_xor: 136 case nir_intrinsic_image_deref_atomic_exchange: 137 case nir_intrinsic_image_deref_atomic_comp_swap: 138 case nir_intrinsic_image_deref_size: 139 case nir_intrinsic_image_deref_samples: 140 case nir_intrinsic_image_deref_load_raw_intel: 141 case nir_intrinsic_image_deref_store_raw_intel: { 142 nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); 143 nir_variable *var = nir_deref_instr_get_variable(deref); 144 145 b.cursor = nir_before_instr(&intrin->instr); 146 nir_ssa_def *index = 147 nir_iadd(&b, nir_imm_int(&b, var->data.driver_location), 148 get_aoa_deref_offset(&b, deref, 1)); 149 nir_rewrite_image_intrinsic(intrin, index, false); 150 break; 151 } 152 153 default: 154 break; 155 } 156 } 157 } 158} 159 160// XXX: need unify_interfaces() at link time... 161 162/** 163 * Fix an uncompiled shader's stream output info. 164 * 165 * Core Gallium stores output->register_index as a "slot" number, where 166 * slots are assigned consecutively to all outputs in info->outputs_written. 167 * This naive packing of outputs doesn't work for us - we too have slots, 168 * but the layout is defined by the VUE map, which we won't have until we 169 * compile a specific shader variant. So, we remap these and simply store 170 * VARYING_SLOT_* in our copy's output->register_index fields. 171 * 172 * We also fix up VARYING_SLOT_{LAYER,VIEWPORT,PSIZ} to select the Y/Z/W 173 * components of our VUE header. See brw_vue_map.c for the layout. 174 */ 175static void 176update_so_info(struct pipe_stream_output_info *so_info, 177 uint64_t outputs_written) 178{ 179 uint8_t reverse_map[64] = {}; 180 unsigned slot = 0; 181 while (outputs_written) { 182 reverse_map[slot++] = u_bit_scan64(&outputs_written); 183 } 184 185 for (unsigned i = 0; i < so_info->num_outputs; i++) { 186 struct pipe_stream_output *output = &so_info->output[i]; 187 188 /* Map Gallium's condensed "slots" back to real VARYING_SLOT_* enums */ 189 output->register_index = reverse_map[output->register_index]; 190 191 /* The VUE header contains three scalar fields packed together: 192 * - gl_PointSize is stored in VARYING_SLOT_PSIZ.w 193 * - gl_Layer is stored in VARYING_SLOT_PSIZ.y 194 * - gl_ViewportIndex is stored in VARYING_SLOT_PSIZ.z 195 */ 196 switch (output->register_index) { 197 case VARYING_SLOT_LAYER: 198 assert(output->num_components == 1); 199 output->register_index = VARYING_SLOT_PSIZ; 200 output->start_component = 1; 201 break; 202 case VARYING_SLOT_VIEWPORT: 203 assert(output->num_components == 1); 204 output->register_index = VARYING_SLOT_PSIZ; 205 output->start_component = 2; 206 break; 207 case VARYING_SLOT_PSIZ: 208 assert(output->num_components == 1); 209 output->start_component = 3; 210 break; 211 } 212 213 //info->outputs_written |= 1ull << output->register_index; 214 } 215} 216 217/** 218 * Sets up the starting offsets for the groups of binding table entries 219 * common to all pipeline stages. 220 * 221 * Unused groups are initialized to 0xd0d0d0d0 to make it obvious that they're 222 * unused but also make sure that addition of small offsets to them will 223 * trigger some of our asserts that surface indices are < BRW_MAX_SURFACES. 224 */ 225static uint32_t 226assign_common_binding_table_offsets(const struct gen_device_info *devinfo, 227 const struct nir_shader *nir, 228 struct brw_stage_prog_data *prog_data, 229 uint32_t next_binding_table_offset, 230 unsigned num_system_values, 231 unsigned num_cbufs) 232{ 233 const struct shader_info *info = &nir->info; 234 235 unsigned num_textures = util_last_bit(info->textures_used); 236 237 if (num_textures) { 238 prog_data->binding_table.texture_start = next_binding_table_offset; 239 prog_data->binding_table.gather_texture_start = next_binding_table_offset; 240 next_binding_table_offset += num_textures; 241 } else { 242 prog_data->binding_table.texture_start = 0xd0d0d0d0; 243 prog_data->binding_table.gather_texture_start = 0xd0d0d0d0; 244 } 245 246 if (info->num_images) { 247 prog_data->binding_table.image_start = next_binding_table_offset; 248 next_binding_table_offset += info->num_images; 249 } else { 250 prog_data->binding_table.image_start = 0xd0d0d0d0; 251 } 252 253 if (num_cbufs) { 254 //assert(info->num_ubos <= BRW_MAX_UBO); 255 prog_data->binding_table.ubo_start = next_binding_table_offset; 256 next_binding_table_offset += num_cbufs; 257 } else { 258 prog_data->binding_table.ubo_start = 0xd0d0d0d0; 259 } 260 261 if (info->num_ssbos || info->num_abos) { 262 prog_data->binding_table.ssbo_start = next_binding_table_offset; 263 // XXX: see iris_state "wasting 16 binding table slots for ABOs" comment 264 next_binding_table_offset += IRIS_MAX_ABOS + info->num_ssbos; 265 } else { 266 prog_data->binding_table.ssbo_start = 0xd0d0d0d0; 267 } 268 269 prog_data->binding_table.shader_time_start = 0xd0d0d0d0; 270 271 /* Plane 0 is just the regular texture section */ 272 prog_data->binding_table.plane_start[0] = prog_data->binding_table.texture_start; 273 274 prog_data->binding_table.plane_start[1] = next_binding_table_offset; 275 next_binding_table_offset += num_textures; 276 277 prog_data->binding_table.plane_start[2] = next_binding_table_offset; 278 next_binding_table_offset += num_textures; 279 280 /* Set the binding table size */ 281 prog_data->binding_table.size_bytes = next_binding_table_offset * 4; 282 283 return next_binding_table_offset; 284} 285 286static void 287setup_vec4_image_sysval(uint32_t *sysvals, uint32_t idx, 288 unsigned offset, unsigned n) 289{ 290 assert(offset % sizeof(uint32_t) == 0); 291 292 for (unsigned i = 0; i < n; ++i) 293 sysvals[i] = BRW_PARAM_IMAGE(idx, offset / sizeof(uint32_t) + i); 294 295 for (unsigned i = n; i < 4; ++i) 296 sysvals[i] = BRW_PARAM_BUILTIN_ZERO; 297} 298 299/** 300 * Associate NIR uniform variables with the prog_data->param[] mechanism 301 * used by the backend. Also, decide which UBOs we'd like to push in an 302 * ideal situation (though the backend can reduce this). 303 */ 304static void 305iris_setup_uniforms(const struct brw_compiler *compiler, 306 void *mem_ctx, 307 nir_shader *nir, 308 struct brw_stage_prog_data *prog_data, 309 enum brw_param_builtin **out_system_values, 310 unsigned *out_num_system_values, 311 unsigned *out_num_cbufs) 312{ 313 UNUSED const struct gen_device_info *devinfo = compiler->devinfo; 314 315 /* The intel compiler assumes that num_uniforms is in bytes. For 316 * scalar that means 4 bytes per uniform slot. 317 * 318 * Ref: brw_nir_lower_uniforms, type_size_scalar_bytes. 319 */ 320 nir->num_uniforms *= 4; 321 322 const unsigned IRIS_MAX_SYSTEM_VALUES = 323 PIPE_MAX_SHADER_IMAGES * BRW_IMAGE_PARAM_SIZE; 324 enum brw_param_builtin *system_values = 325 rzalloc_array(mem_ctx, enum brw_param_builtin, IRIS_MAX_SYSTEM_VALUES); 326 unsigned num_system_values = 0; 327 328 unsigned patch_vert_idx = -1; 329 unsigned ucp_idx[IRIS_MAX_CLIP_PLANES]; 330 unsigned img_idx[PIPE_MAX_SHADER_IMAGES]; 331 memset(ucp_idx, -1, sizeof(ucp_idx)); 332 memset(img_idx, -1, sizeof(img_idx)); 333 334 nir_function_impl *impl = nir_shader_get_entrypoint(nir); 335 336 nir_builder b; 337 nir_builder_init(&b, impl); 338 339 b.cursor = nir_before_block(nir_start_block(impl)); 340 nir_ssa_def *temp_ubo_name = nir_ssa_undef(&b, 1, 32); 341 342 /* Turn system value intrinsics into uniforms */ 343 nir_foreach_block(block, impl) { 344 nir_foreach_instr_safe(instr, block) { 345 if (instr->type != nir_instr_type_intrinsic) 346 continue; 347 348 nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); 349 nir_ssa_def *offset; 350 351 switch (intrin->intrinsic) { 352 case nir_intrinsic_load_user_clip_plane: { 353 unsigned ucp = nir_intrinsic_ucp_id(intrin); 354 355 if (ucp_idx[ucp] == -1) { 356 ucp_idx[ucp] = num_system_values; 357 num_system_values += 4; 358 } 359 360 for (int i = 0; i < 4; i++) { 361 system_values[ucp_idx[ucp] + i] = 362 BRW_PARAM_BUILTIN_CLIP_PLANE(ucp, i); 363 } 364 365 b.cursor = nir_before_instr(instr); 366 offset = nir_imm_int(&b, ucp_idx[ucp] * sizeof(uint32_t)); 367 break; 368 } 369 case nir_intrinsic_load_patch_vertices_in: 370 if (patch_vert_idx == -1) 371 patch_vert_idx = num_system_values++; 372 373 system_values[patch_vert_idx] = 374 BRW_PARAM_BUILTIN_PATCH_VERTICES_IN; 375 376 b.cursor = nir_before_instr(instr); 377 offset = nir_imm_int(&b, patch_vert_idx * sizeof(uint32_t)); 378 break; 379 case nir_intrinsic_image_deref_load_param_intel: { 380 assert(devinfo->gen < 9); 381 nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); 382 nir_variable *var = nir_deref_instr_get_variable(deref); 383 384 /* XXX: var->data.binding is not set properly. We need to run 385 * some form of gl_nir_lower_samplers_as_deref() to get it. 386 * This breaks tests which use more than one image. 387 */ 388 if (img_idx[var->data.binding] == -1) { 389 /* GL only allows arrays of arrays of images. */ 390 assert(glsl_type_is_image(glsl_without_array(var->type))); 391 unsigned num_images = MAX2(1, glsl_get_aoa_size(var->type)); 392 393 for (int i = 0; i < num_images; i++) { 394 const unsigned img = var->data.binding + i; 395 396 img_idx[img] = num_system_values; 397 num_system_values += BRW_IMAGE_PARAM_SIZE; 398 399 uint32_t *img_sv = &system_values[img_idx[img]]; 400 401 setup_vec4_image_sysval( 402 img_sv + BRW_IMAGE_PARAM_OFFSET_OFFSET, img, 403 offsetof(struct brw_image_param, offset), 2); 404 setup_vec4_image_sysval( 405 img_sv + BRW_IMAGE_PARAM_SIZE_OFFSET, img, 406 offsetof(struct brw_image_param, size), 3); 407 setup_vec4_image_sysval( 408 img_sv + BRW_IMAGE_PARAM_STRIDE_OFFSET, img, 409 offsetof(struct brw_image_param, stride), 4); 410 setup_vec4_image_sysval( 411 img_sv + BRW_IMAGE_PARAM_TILING_OFFSET, img, 412 offsetof(struct brw_image_param, tiling), 3); 413 setup_vec4_image_sysval( 414 img_sv + BRW_IMAGE_PARAM_SWIZZLING_OFFSET, img, 415 offsetof(struct brw_image_param, swizzling), 2); 416 } 417 } 418 419 b.cursor = nir_before_instr(instr); 420 offset = nir_iadd(&b, 421 get_aoa_deref_offset(&b, deref, BRW_IMAGE_PARAM_SIZE * 4), 422 nir_imm_int(&b, img_idx[var->data.binding] * 4 + 423 nir_intrinsic_base(intrin) * 16)); 424 break; 425 } 426 default: 427 continue; 428 } 429 430 unsigned comps = nir_intrinsic_dest_components(intrin); 431 432 nir_intrinsic_instr *load = 433 nir_intrinsic_instr_create(nir, nir_intrinsic_load_ubo); 434 load->num_components = comps; 435 load->src[0] = nir_src_for_ssa(temp_ubo_name); 436 load->src[1] = nir_src_for_ssa(offset); 437 nir_ssa_dest_init(&load->instr, &load->dest, comps, 32, NULL); 438 nir_builder_instr_insert(&b, &load->instr); 439 nir_ssa_def_rewrite_uses(&intrin->dest.ssa, 440 nir_src_for_ssa(&load->dest.ssa)); 441 nir_instr_remove(instr); 442 } 443 } 444 445 nir_validate_shader(nir, "before remapping"); 446 447 /* Place the new params at the front of constant buffer 0. */ 448 if (num_system_values > 0) { 449 nir->num_uniforms += num_system_values * sizeof(uint32_t); 450 451 system_values = reralloc(mem_ctx, system_values, enum brw_param_builtin, 452 num_system_values); 453 454 nir_foreach_block(block, impl) { 455 nir_foreach_instr_safe(instr, block) { 456 if (instr->type != nir_instr_type_intrinsic) 457 continue; 458 459 nir_intrinsic_instr *load = nir_instr_as_intrinsic(instr); 460 461 if (load->intrinsic != nir_intrinsic_load_ubo) 462 continue; 463 464 b.cursor = nir_before_instr(instr); 465 466 assert(load->src[0].is_ssa); 467 468 if (load->src[0].ssa == temp_ubo_name) { 469 nir_instr_rewrite_src(instr, &load->src[0], 470 nir_src_for_ssa(nir_imm_int(&b, 0))); 471 } else if (nir_src_is_const(load->src[0]) && 472 nir_src_as_uint(load->src[0]) == 0) { 473 nir_ssa_def *offset = 474 nir_iadd(&b, load->src[1].ssa, 475 nir_imm_int(&b, 4 * num_system_values)); 476 nir_instr_rewrite_src(instr, &load->src[1], 477 nir_src_for_ssa(offset)); 478 } 479 } 480 } 481 482 /* We need to fold the new iadds for brw_nir_analyze_ubo_ranges */ 483 nir_opt_constant_folding(nir); 484 } else { 485 ralloc_free(system_values); 486 system_values = NULL; 487 } 488 489 nir_validate_shader(nir, "after remap"); 490 491 if (nir->info.stage != MESA_SHADER_COMPUTE) 492 brw_nir_analyze_ubo_ranges(compiler, nir, NULL, prog_data->ubo_ranges); 493 494 /* We don't use params[], but fs_visitor::nir_setup_uniforms() asserts 495 * about it for compute shaders, so go ahead and make some fake ones 496 * which the backend will dead code eliminate. 497 */ 498 prog_data->nr_params = nir->num_uniforms / 4; 499 prog_data->param = rzalloc_array(mem_ctx, uint32_t, prog_data->nr_params); 500 501 /* System values and uniforms are stored in constant buffer 0, the 502 * user-facing UBOs are indexed by one. So if any constant buffer is 503 * needed, the constant buffer 0 will be needed, so account for it. 504 */ 505 unsigned num_cbufs = nir->info.num_ubos; 506 if (num_cbufs || num_system_values || nir->num_uniforms) 507 num_cbufs++; 508 509 *out_system_values = system_values; 510 *out_num_system_values = num_system_values; 511 *out_num_cbufs = num_cbufs; 512} 513 514static void 515iris_debug_recompile(struct iris_context *ice, 516 struct shader_info *info, 517 unsigned program_string_id, 518 const void *key) 519{ 520 struct iris_screen *screen = (struct iris_screen *) ice->ctx.screen; 521 const struct brw_compiler *c = screen->compiler; 522 523 if (!info) 524 return; 525 526 c->shader_perf_log(&ice->dbg, "Recompiling %s shader for program %s: %s\n", 527 _mesa_shader_stage_to_string(info->stage), 528 info->name ? info->name : "(no identifier)", 529 info->label ? info->label : ""); 530 531 const void *old_key = 532 iris_find_previous_compile(ice, info->stage, program_string_id); 533 534 brw_debug_key_recompile(c, &ice->dbg, info->stage, old_key, key); 535} 536 537 538/** 539 * Compile a vertex shader, and upload the assembly. 540 */ 541static struct iris_compiled_shader * 542iris_compile_vs(struct iris_context *ice, 543 struct iris_uncompiled_shader *ish, 544 const struct brw_vs_prog_key *key) 545{ 546 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 547 const struct brw_compiler *compiler = screen->compiler; 548 const struct gen_device_info *devinfo = &screen->devinfo; 549 void *mem_ctx = ralloc_context(NULL); 550 struct brw_vs_prog_data *vs_prog_data = 551 rzalloc(mem_ctx, struct brw_vs_prog_data); 552 struct brw_vue_prog_data *vue_prog_data = &vs_prog_data->base; 553 struct brw_stage_prog_data *prog_data = &vue_prog_data->base; 554 enum brw_param_builtin *system_values; 555 unsigned num_system_values; 556 unsigned num_cbufs; 557 558 nir_shader *nir = nir_shader_clone(mem_ctx, ish->nir); 559 560 if (key->nr_userclip_plane_consts) { 561 nir_function_impl *impl = nir_shader_get_entrypoint(nir); 562 nir_lower_clip_vs(nir, (1 << key->nr_userclip_plane_consts) - 1, true); 563 nir_lower_io_to_temporaries(nir, impl, true, false); 564 nir_lower_global_vars_to_local(nir); 565 nir_lower_vars_to_ssa(nir); 566 nir_shader_gather_info(nir, impl); 567 } 568 569 if (nir->info.name && strncmp(nir->info.name, "ARB", 3) == 0) 570 prog_data->use_alt_mode = true; 571 572 iris_setup_uniforms(compiler, mem_ctx, nir, prog_data, &system_values, 573 &num_system_values, &num_cbufs); 574 575 assign_common_binding_table_offsets(devinfo, nir, prog_data, 0, 576 num_system_values, num_cbufs); 577 578 brw_compute_vue_map(devinfo, 579 &vue_prog_data->vue_map, nir->info.outputs_written, 580 nir->info.separate_shader); 581 582 /* Don't tell the backend about our clip plane constants, we've already 583 * lowered them in NIR and we don't want it doing it again. 584 */ 585 struct brw_vs_prog_key key_no_ucp = *key; 586 key_no_ucp.nr_userclip_plane_consts = 0; 587 588 char *error_str = NULL; 589 const unsigned *program = 590 brw_compile_vs(compiler, &ice->dbg, mem_ctx, &key_no_ucp, vs_prog_data, 591 nir, -1, &error_str); 592 if (program == NULL) { 593 dbg_printf("Failed to compile vertex shader: %s\n", error_str); 594 ralloc_free(mem_ctx); 595 return false; 596 } 597 598 if (ish->compiled_once) { 599 iris_debug_recompile(ice, &nir->info, key->program_string_id, key); 600 } else { 601 ish->compiled_once = true; 602 } 603 604 uint32_t *so_decls = 605 ice->vtbl.create_so_decl_list(&ish->stream_output, 606 &vue_prog_data->vue_map); 607 608 struct iris_compiled_shader *shader = 609 iris_upload_shader(ice, IRIS_CACHE_VS, sizeof(*key), key, program, 610 prog_data, so_decls, system_values, num_system_values, 611 num_cbufs); 612 613 ralloc_free(mem_ctx); 614 return shader; 615} 616 617/** 618 * Update the current vertex shader variant. 619 * 620 * Fill out the key, look in the cache, compile and bind if needed. 621 */ 622static void 623iris_update_compiled_vs(struct iris_context *ice) 624{ 625 struct iris_uncompiled_shader *ish = 626 ice->shaders.uncompiled[MESA_SHADER_VERTEX]; 627 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 628 const struct gen_device_info *devinfo = &screen->devinfo; 629 630 struct brw_vs_prog_key key = { KEY_INIT(devinfo->gen) }; 631 ice->vtbl.populate_vs_key(ice, &ish->nir->info, &key); 632 633 struct iris_compiled_shader *old = ice->shaders.prog[IRIS_CACHE_VS]; 634 struct iris_compiled_shader *shader = 635 iris_find_cached_shader(ice, IRIS_CACHE_VS, sizeof(key), &key); 636 637 if (!shader) 638 shader = iris_compile_vs(ice, ish, &key); 639 640 if (old != shader) { 641 ice->shaders.prog[IRIS_CACHE_VS] = shader; 642 ice->state.dirty |= IRIS_DIRTY_VS | 643 IRIS_DIRTY_BINDINGS_VS | 644 IRIS_DIRTY_CONSTANTS_VS | 645 IRIS_DIRTY_VF_SGVS; 646 const struct brw_vs_prog_data *vs_prog_data = 647 (void *) shader->prog_data; 648 const bool uses_draw_params = vs_prog_data->uses_firstvertex || 649 vs_prog_data->uses_baseinstance; 650 const bool uses_derived_draw_params = vs_prog_data->uses_drawid || 651 vs_prog_data->uses_is_indexed_draw; 652 const bool needs_sgvs_element = uses_draw_params || 653 vs_prog_data->uses_instanceid || 654 vs_prog_data->uses_vertexid; 655 bool needs_edge_flag = false; 656 nir_foreach_variable(var, &ish->nir->inputs) { 657 if (var->data.location == VERT_ATTRIB_EDGEFLAG) 658 needs_edge_flag = true; 659 } 660 661 if (ice->state.vs_uses_draw_params != uses_draw_params || 662 ice->state.vs_uses_derived_draw_params != uses_derived_draw_params || 663 ice->state.vs_needs_edge_flag != needs_edge_flag) { 664 ice->state.dirty |= IRIS_DIRTY_VERTEX_BUFFERS | 665 IRIS_DIRTY_VERTEX_ELEMENTS; 666 } 667 ice->state.vs_uses_draw_params = uses_draw_params; 668 ice->state.vs_uses_derived_draw_params = uses_derived_draw_params; 669 ice->state.vs_needs_sgvs_element = needs_sgvs_element; 670 ice->state.vs_needs_edge_flag = needs_edge_flag; 671 } 672} 673 674/** 675 * Get the shader_info for a given stage, or NULL if the stage is disabled. 676 */ 677const struct shader_info * 678iris_get_shader_info(const struct iris_context *ice, gl_shader_stage stage) 679{ 680 const struct iris_uncompiled_shader *ish = ice->shaders.uncompiled[stage]; 681 682 if (!ish) 683 return NULL; 684 685 const nir_shader *nir = ish->nir; 686 return &nir->info; 687} 688 689/** 690 * Get the union of TCS output and TES input slots. 691 * 692 * TCS and TES need to agree on a common URB entry layout. In particular, 693 * the data for all patch vertices is stored in a single URB entry (unlike 694 * GS which has one entry per input vertex). This means that per-vertex 695 * array indexing needs a stride. 696 * 697 * SSO requires locations to match, but doesn't require the number of 698 * outputs/inputs to match (in fact, the TCS often has extra outputs). 699 * So, we need to take the extra step of unifying these on the fly. 700 */ 701static void 702get_unified_tess_slots(const struct iris_context *ice, 703 uint64_t *per_vertex_slots, 704 uint32_t *per_patch_slots) 705{ 706 const struct shader_info *tcs = 707 iris_get_shader_info(ice, MESA_SHADER_TESS_CTRL); 708 const struct shader_info *tes = 709 iris_get_shader_info(ice, MESA_SHADER_TESS_EVAL); 710 711 *per_vertex_slots = tes->inputs_read; 712 *per_patch_slots = tes->patch_inputs_read; 713 714 if (tcs) { 715 *per_vertex_slots |= tcs->outputs_written; 716 *per_patch_slots |= tcs->patch_outputs_written; 717 } 718} 719 720/** 721 * Compile a tessellation control shader, and upload the assembly. 722 */ 723static struct iris_compiled_shader * 724iris_compile_tcs(struct iris_context *ice, 725 struct iris_uncompiled_shader *ish, 726 const struct brw_tcs_prog_key *key) 727{ 728 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 729 const struct brw_compiler *compiler = screen->compiler; 730 const struct nir_shader_compiler_options *options = 731 compiler->glsl_compiler_options[MESA_SHADER_TESS_CTRL].NirOptions; 732 const struct gen_device_info *devinfo = &screen->devinfo; 733 void *mem_ctx = ralloc_context(NULL); 734 struct brw_tcs_prog_data *tcs_prog_data = 735 rzalloc(mem_ctx, struct brw_tcs_prog_data); 736 struct brw_vue_prog_data *vue_prog_data = &tcs_prog_data->base; 737 struct brw_stage_prog_data *prog_data = &vue_prog_data->base; 738 enum brw_param_builtin *system_values = NULL; 739 unsigned num_system_values = 0; 740 unsigned num_cbufs = 0; 741 742 nir_shader *nir; 743 744 if (ish) { 745 nir = nir_shader_clone(mem_ctx, ish->nir); 746 747 iris_setup_uniforms(compiler, mem_ctx, nir, prog_data, &system_values, 748 &num_system_values, &num_cbufs); 749 assign_common_binding_table_offsets(devinfo, nir, prog_data, 0, 750 num_system_values, num_cbufs); 751 } else { 752 nir = brw_nir_create_passthrough_tcs(mem_ctx, compiler, options, key); 753 754 /* Reserve space for passing the default tess levels as constants. */ 755 num_system_values = 8; 756 system_values = 757 rzalloc_array(mem_ctx, enum brw_param_builtin, num_system_values); 758 prog_data->param = rzalloc_array(mem_ctx, uint32_t, num_system_values); 759 prog_data->nr_params = num_system_values; 760 761 if (key->tes_primitive_mode == GL_QUADS) { 762 for (int i = 0; i < 4; i++) 763 system_values[7 - i] = BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_X + i; 764 765 system_values[3] = BRW_PARAM_BUILTIN_TESS_LEVEL_INNER_X; 766 system_values[2] = BRW_PARAM_BUILTIN_TESS_LEVEL_INNER_Y; 767 } else if (key->tes_primitive_mode == GL_TRIANGLES) { 768 for (int i = 0; i < 3; i++) 769 system_values[7 - i] = BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_X + i; 770 771 system_values[4] = BRW_PARAM_BUILTIN_TESS_LEVEL_INNER_X; 772 } else { 773 assert(key->tes_primitive_mode == GL_ISOLINES); 774 system_values[7] = BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_Y; 775 system_values[6] = BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_X; 776 } 777 778 prog_data->ubo_ranges[0].length = 1; 779 } 780 781 char *error_str = NULL; 782 const unsigned *program = 783 brw_compile_tcs(compiler, &ice->dbg, mem_ctx, key, tcs_prog_data, nir, 784 -1, &error_str); 785 if (program == NULL) { 786 dbg_printf("Failed to compile control shader: %s\n", error_str); 787 ralloc_free(mem_ctx); 788 return false; 789 } 790 791 if (ish) { 792 if (ish->compiled_once) { 793 iris_debug_recompile(ice, &nir->info, key->program_string_id, key); 794 } else { 795 ish->compiled_once = true; 796 } 797 } 798 799 struct iris_compiled_shader *shader = 800 iris_upload_shader(ice, IRIS_CACHE_TCS, sizeof(*key), key, program, 801 prog_data, NULL, system_values, num_system_values, 802 num_cbufs); 803 804 ralloc_free(mem_ctx); 805 return shader; 806} 807 808/** 809 * Update the current tessellation control shader variant. 810 * 811 * Fill out the key, look in the cache, compile and bind if needed. 812 */ 813static void 814iris_update_compiled_tcs(struct iris_context *ice) 815{ 816 struct iris_uncompiled_shader *tcs = 817 ice->shaders.uncompiled[MESA_SHADER_TESS_CTRL]; 818 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 819 const struct gen_device_info *devinfo = &screen->devinfo; 820 821 const struct shader_info *tes_info = 822 iris_get_shader_info(ice, MESA_SHADER_TESS_EVAL); 823 struct brw_tcs_prog_key key = { 824 KEY_INIT_NO_ID(devinfo->gen), 825 .program_string_id = tcs ? tcs->program_id : 0, 826 .tes_primitive_mode = tes_info->tess.primitive_mode, 827 .input_vertices = ice->state.vertices_per_patch, 828 }; 829 get_unified_tess_slots(ice, &key.outputs_written, 830 &key.patch_outputs_written); 831 ice->vtbl.populate_tcs_key(ice, &key); 832 833 struct iris_compiled_shader *old = ice->shaders.prog[IRIS_CACHE_TCS]; 834 struct iris_compiled_shader *shader = 835 iris_find_cached_shader(ice, IRIS_CACHE_TCS, sizeof(key), &key); 836 837 if (!shader) 838 shader = iris_compile_tcs(ice, tcs, &key); 839 840 if (old != shader) { 841 ice->shaders.prog[IRIS_CACHE_TCS] = shader; 842 ice->state.dirty |= IRIS_DIRTY_TCS | 843 IRIS_DIRTY_BINDINGS_TCS | 844 IRIS_DIRTY_CONSTANTS_TCS; 845 } 846} 847 848/** 849 * Compile a tessellation evaluation shader, and upload the assembly. 850 */ 851static struct iris_compiled_shader * 852iris_compile_tes(struct iris_context *ice, 853 struct iris_uncompiled_shader *ish, 854 const struct brw_tes_prog_key *key) 855{ 856 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 857 const struct brw_compiler *compiler = screen->compiler; 858 const struct gen_device_info *devinfo = &screen->devinfo; 859 void *mem_ctx = ralloc_context(NULL); 860 struct brw_tes_prog_data *tes_prog_data = 861 rzalloc(mem_ctx, struct brw_tes_prog_data); 862 struct brw_vue_prog_data *vue_prog_data = &tes_prog_data->base; 863 struct brw_stage_prog_data *prog_data = &vue_prog_data->base; 864 enum brw_param_builtin *system_values; 865 unsigned num_system_values; 866 unsigned num_cbufs; 867 868 nir_shader *nir = nir_shader_clone(mem_ctx, ish->nir); 869 870 iris_setup_uniforms(compiler, mem_ctx, nir, prog_data, &system_values, 871 &num_system_values, &num_cbufs); 872 873 assign_common_binding_table_offsets(devinfo, nir, prog_data, 0, 874 num_system_values, num_cbufs); 875 876 struct brw_vue_map input_vue_map; 877 brw_compute_tess_vue_map(&input_vue_map, key->inputs_read, 878 key->patch_inputs_read); 879 880 char *error_str = NULL; 881 const unsigned *program = 882 brw_compile_tes(compiler, &ice->dbg, mem_ctx, key, &input_vue_map, 883 tes_prog_data, nir, NULL, -1, &error_str); 884 if (program == NULL) { 885 dbg_printf("Failed to compile evaluation shader: %s\n", error_str); 886 ralloc_free(mem_ctx); 887 return false; 888 } 889 890 if (ish->compiled_once) { 891 iris_debug_recompile(ice, &nir->info, key->program_string_id, key); 892 } else { 893 ish->compiled_once = true; 894 } 895 896 uint32_t *so_decls = 897 ice->vtbl.create_so_decl_list(&ish->stream_output, 898 &vue_prog_data->vue_map); 899 900 901 struct iris_compiled_shader *shader = 902 iris_upload_shader(ice, IRIS_CACHE_TES, sizeof(*key), key, program, 903 prog_data, so_decls, system_values, num_system_values, 904 num_cbufs); 905 906 ralloc_free(mem_ctx); 907 return shader; 908} 909 910/** 911 * Update the current tessellation evaluation shader variant. 912 * 913 * Fill out the key, look in the cache, compile and bind if needed. 914 */ 915static void 916iris_update_compiled_tes(struct iris_context *ice) 917{ 918 struct iris_uncompiled_shader *ish = 919 ice->shaders.uncompiled[MESA_SHADER_TESS_EVAL]; 920 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 921 const struct gen_device_info *devinfo = &screen->devinfo; 922 923 struct brw_tes_prog_key key = { KEY_INIT(devinfo->gen) }; 924 get_unified_tess_slots(ice, &key.inputs_read, &key.patch_inputs_read); 925 ice->vtbl.populate_tes_key(ice, &key); 926 927 struct iris_compiled_shader *old = ice->shaders.prog[IRIS_CACHE_TES]; 928 struct iris_compiled_shader *shader = 929 iris_find_cached_shader(ice, IRIS_CACHE_TES, sizeof(key), &key); 930 931 if (!shader) 932 shader = iris_compile_tes(ice, ish, &key); 933 934 if (old != shader) { 935 ice->shaders.prog[IRIS_CACHE_TES] = shader; 936 ice->state.dirty |= IRIS_DIRTY_TES | 937 IRIS_DIRTY_BINDINGS_TES | 938 IRIS_DIRTY_CONSTANTS_TES; 939 } 940 941 /* TODO: Could compare and avoid flagging this. */ 942 const struct shader_info *tes_info = &ish->nir->info; 943 if (tes_info->system_values_read & (1ull << SYSTEM_VALUE_VERTICES_IN)) { 944 ice->state.dirty |= IRIS_DIRTY_CONSTANTS_TES; 945 ice->state.shaders[MESA_SHADER_TESS_EVAL].cbuf0_needs_upload = true; 946 } 947} 948 949/** 950 * Compile a geometry shader, and upload the assembly. 951 */ 952static struct iris_compiled_shader * 953iris_compile_gs(struct iris_context *ice, 954 struct iris_uncompiled_shader *ish, 955 const struct brw_gs_prog_key *key) 956{ 957 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 958 const struct brw_compiler *compiler = screen->compiler; 959 const struct gen_device_info *devinfo = &screen->devinfo; 960 void *mem_ctx = ralloc_context(NULL); 961 struct brw_gs_prog_data *gs_prog_data = 962 rzalloc(mem_ctx, struct brw_gs_prog_data); 963 struct brw_vue_prog_data *vue_prog_data = &gs_prog_data->base; 964 struct brw_stage_prog_data *prog_data = &vue_prog_data->base; 965 enum brw_param_builtin *system_values; 966 unsigned num_system_values; 967 unsigned num_cbufs; 968 969 nir_shader *nir = nir_shader_clone(mem_ctx, ish->nir); 970 971 iris_setup_uniforms(compiler, mem_ctx, nir, prog_data, &system_values, 972 &num_system_values, &num_cbufs); 973 974 assign_common_binding_table_offsets(devinfo, nir, prog_data, 0, 975 num_system_values, num_cbufs); 976 977 brw_compute_vue_map(devinfo, 978 &vue_prog_data->vue_map, nir->info.outputs_written, 979 nir->info.separate_shader); 980 981 char *error_str = NULL; 982 const unsigned *program = 983 brw_compile_gs(compiler, &ice->dbg, mem_ctx, key, gs_prog_data, nir, 984 NULL, -1, &error_str); 985 if (program == NULL) { 986 dbg_printf("Failed to compile geometry shader: %s\n", error_str); 987 ralloc_free(mem_ctx); 988 return false; 989 } 990 991 if (ish->compiled_once) { 992 iris_debug_recompile(ice, &nir->info, key->program_string_id, key); 993 } else { 994 ish->compiled_once = true; 995 } 996 997 uint32_t *so_decls = 998 ice->vtbl.create_so_decl_list(&ish->stream_output, 999 &vue_prog_data->vue_map); 1000 1001 struct iris_compiled_shader *shader = 1002 iris_upload_shader(ice, IRIS_CACHE_GS, sizeof(*key), key, program, 1003 prog_data, so_decls, system_values, num_system_values, 1004 num_cbufs); 1005 1006 ralloc_free(mem_ctx); 1007 return shader; 1008} 1009 1010/** 1011 * Update the current geometry shader variant. 1012 * 1013 * Fill out the key, look in the cache, compile and bind if needed. 1014 */ 1015static void 1016iris_update_compiled_gs(struct iris_context *ice) 1017{ 1018 struct iris_uncompiled_shader *ish = 1019 ice->shaders.uncompiled[MESA_SHADER_GEOMETRY]; 1020 struct iris_compiled_shader *old = ice->shaders.prog[IRIS_CACHE_GS]; 1021 struct iris_compiled_shader *shader = NULL; 1022 1023 if (ish) { 1024 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 1025 const struct gen_device_info *devinfo = &screen->devinfo; 1026 struct brw_gs_prog_key key = { KEY_INIT(devinfo->gen) }; 1027 ice->vtbl.populate_gs_key(ice, &key); 1028 1029 shader = 1030 iris_find_cached_shader(ice, IRIS_CACHE_GS, sizeof(key), &key); 1031 1032 if (!shader) 1033 shader = iris_compile_gs(ice, ish, &key); 1034 } 1035 1036 if (old != shader) { 1037 ice->shaders.prog[IRIS_CACHE_GS] = shader; 1038 ice->state.dirty |= IRIS_DIRTY_GS | 1039 IRIS_DIRTY_BINDINGS_GS | 1040 IRIS_DIRTY_CONSTANTS_GS; 1041 } 1042} 1043 1044/** 1045 * Compile a fragment (pixel) shader, and upload the assembly. 1046 */ 1047static struct iris_compiled_shader * 1048iris_compile_fs(struct iris_context *ice, 1049 struct iris_uncompiled_shader *ish, 1050 const struct brw_wm_prog_key *key, 1051 struct brw_vue_map *vue_map) 1052{ 1053 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 1054 const struct brw_compiler *compiler = screen->compiler; 1055 const struct gen_device_info *devinfo = &screen->devinfo; 1056 void *mem_ctx = ralloc_context(NULL); 1057 struct brw_wm_prog_data *fs_prog_data = 1058 rzalloc(mem_ctx, struct brw_wm_prog_data); 1059 struct brw_stage_prog_data *prog_data = &fs_prog_data->base; 1060 enum brw_param_builtin *system_values; 1061 unsigned num_system_values; 1062 unsigned num_cbufs; 1063 1064 nir_shader *nir = nir_shader_clone(mem_ctx, ish->nir); 1065 1066 if (nir->info.name && strncmp(nir->info.name, "ARB", 3) == 0) 1067 prog_data->use_alt_mode = true; 1068 1069 iris_setup_uniforms(compiler, mem_ctx, nir, prog_data, &system_values, 1070 &num_system_values, &num_cbufs); 1071 1072 assign_common_binding_table_offsets(devinfo, nir, prog_data, 1073 MAX2(key->nr_color_regions, 1), 1074 num_system_values, num_cbufs); 1075 char *error_str = NULL; 1076 const unsigned *program = 1077 brw_compile_fs(compiler, &ice->dbg, mem_ctx, key, fs_prog_data, 1078 nir, NULL, -1, -1, -1, true, false, vue_map, &error_str); 1079 if (program == NULL) { 1080 dbg_printf("Failed to compile fragment shader: %s\n", error_str); 1081 ralloc_free(mem_ctx); 1082 return false; 1083 } 1084 1085 if (ish->compiled_once) { 1086 iris_debug_recompile(ice, &nir->info, key->program_string_id, key); 1087 } else { 1088 ish->compiled_once = true; 1089 } 1090 1091 struct iris_compiled_shader *shader = 1092 iris_upload_shader(ice, IRIS_CACHE_FS, sizeof(*key), key, program, 1093 prog_data, NULL, system_values, num_system_values, 1094 num_cbufs); 1095 1096 ralloc_free(mem_ctx); 1097 return shader; 1098} 1099 1100/** 1101 * Update the current fragment shader variant. 1102 * 1103 * Fill out the key, look in the cache, compile and bind if needed. 1104 */ 1105static void 1106iris_update_compiled_fs(struct iris_context *ice) 1107{ 1108 struct iris_uncompiled_shader *ish = 1109 ice->shaders.uncompiled[MESA_SHADER_FRAGMENT]; 1110 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 1111 const struct gen_device_info *devinfo = &screen->devinfo; 1112 struct brw_wm_prog_key key = { KEY_INIT(devinfo->gen) }; 1113 ice->vtbl.populate_fs_key(ice, &key); 1114 1115 if (ish->nos & (1ull << IRIS_NOS_LAST_VUE_MAP)) 1116 key.input_slots_valid = ice->shaders.last_vue_map->slots_valid; 1117 1118 struct iris_compiled_shader *old = ice->shaders.prog[IRIS_CACHE_FS]; 1119 struct iris_compiled_shader *shader = 1120 iris_find_cached_shader(ice, IRIS_CACHE_FS, sizeof(key), &key); 1121 1122 if (!shader) 1123 shader = iris_compile_fs(ice, ish, &key, ice->shaders.last_vue_map); 1124 1125 if (old != shader) { 1126 // XXX: only need to flag CLIP if barycentric has NONPERSPECTIVE 1127 // toggles. might be able to avoid flagging SBE too. 1128 ice->shaders.prog[IRIS_CACHE_FS] = shader; 1129 ice->state.dirty |= IRIS_DIRTY_FS | 1130 IRIS_DIRTY_BINDINGS_FS | 1131 IRIS_DIRTY_CONSTANTS_FS | 1132 IRIS_DIRTY_WM | 1133 IRIS_DIRTY_CLIP | 1134 IRIS_DIRTY_SBE; 1135 } 1136} 1137 1138/** 1139 * Get the compiled shader for the last enabled geometry stage. 1140 * 1141 * This stage is the one which will feed stream output and the rasterizer. 1142 */ 1143static gl_shader_stage 1144last_vue_stage(struct iris_context *ice) 1145{ 1146 if (ice->shaders.prog[MESA_SHADER_GEOMETRY]) 1147 return MESA_SHADER_GEOMETRY; 1148 1149 if (ice->shaders.prog[MESA_SHADER_TESS_EVAL]) 1150 return MESA_SHADER_TESS_EVAL; 1151 1152 return MESA_SHADER_VERTEX; 1153} 1154 1155/** 1156 * Update the last enabled stage's VUE map. 1157 * 1158 * When the shader feeding the rasterizer's output interface changes, we 1159 * need to re-emit various packets. 1160 */ 1161static void 1162update_last_vue_map(struct iris_context *ice, 1163 struct brw_stage_prog_data *prog_data) 1164{ 1165 struct brw_vue_prog_data *vue_prog_data = (void *) prog_data; 1166 struct brw_vue_map *vue_map = &vue_prog_data->vue_map; 1167 struct brw_vue_map *old_map = ice->shaders.last_vue_map; 1168 const uint64_t changed_slots = 1169 (old_map ? old_map->slots_valid : 0ull) ^ vue_map->slots_valid; 1170 1171 if (changed_slots & VARYING_BIT_VIEWPORT) { 1172 // XXX: could use ctx->Const.MaxViewports for old API efficiency 1173 ice->state.num_viewports = 1174 (vue_map->slots_valid & VARYING_BIT_VIEWPORT) ? IRIS_MAX_VIEWPORTS : 1; 1175 ice->state.dirty |= IRIS_DIRTY_CLIP | 1176 IRIS_DIRTY_SF_CL_VIEWPORT | 1177 IRIS_DIRTY_CC_VIEWPORT | 1178 IRIS_DIRTY_SCISSOR_RECT | 1179 IRIS_DIRTY_UNCOMPILED_FS | 1180 ice->state.dirty_for_nos[IRIS_NOS_LAST_VUE_MAP]; 1181 // XXX: CC_VIEWPORT? 1182 } 1183 1184 if (changed_slots || (old_map && old_map->separate != vue_map->separate)) { 1185 ice->state.dirty |= IRIS_DIRTY_SBE; 1186 } 1187 1188 ice->shaders.last_vue_map = &vue_prog_data->vue_map; 1189} 1190 1191/** 1192 * Get the prog_data for a given stage, or NULL if the stage is disabled. 1193 */ 1194static struct brw_vue_prog_data * 1195get_vue_prog_data(struct iris_context *ice, gl_shader_stage stage) 1196{ 1197 if (!ice->shaders.prog[stage]) 1198 return NULL; 1199 1200 return (void *) ice->shaders.prog[stage]->prog_data; 1201} 1202 1203// XXX: iris_compiled_shaders are space-leaking :( 1204// XXX: do remember to unbind them if deleting them. 1205 1206/** 1207 * Update the current shader variants for the given state. 1208 * 1209 * This should be called on every draw call to ensure that the correct 1210 * shaders are bound. It will also flag any dirty state triggered by 1211 * swapping out those shaders. 1212 */ 1213void 1214iris_update_compiled_shaders(struct iris_context *ice) 1215{ 1216 const uint64_t dirty = ice->state.dirty; 1217 1218 struct brw_vue_prog_data *old_prog_datas[4]; 1219 if (!(dirty & IRIS_DIRTY_URB)) { 1220 for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) 1221 old_prog_datas[i] = get_vue_prog_data(ice, i); 1222 } 1223 1224 if (dirty & (IRIS_DIRTY_UNCOMPILED_TCS | IRIS_DIRTY_UNCOMPILED_TES)) { 1225 struct iris_uncompiled_shader *tes = 1226 ice->shaders.uncompiled[MESA_SHADER_TESS_EVAL]; 1227 if (tes) { 1228 iris_update_compiled_tcs(ice); 1229 iris_update_compiled_tes(ice); 1230 } else { 1231 ice->shaders.prog[IRIS_CACHE_TCS] = NULL; 1232 ice->shaders.prog[IRIS_CACHE_TES] = NULL; 1233 ice->state.dirty |= 1234 IRIS_DIRTY_TCS | IRIS_DIRTY_TES | 1235 IRIS_DIRTY_BINDINGS_TCS | IRIS_DIRTY_BINDINGS_TES | 1236 IRIS_DIRTY_CONSTANTS_TCS | IRIS_DIRTY_CONSTANTS_TES; 1237 } 1238 } 1239 1240 if (dirty & IRIS_DIRTY_UNCOMPILED_VS) 1241 iris_update_compiled_vs(ice); 1242 if (dirty & IRIS_DIRTY_UNCOMPILED_GS) 1243 iris_update_compiled_gs(ice); 1244 1245 if (dirty & (IRIS_DIRTY_UNCOMPILED_GS | IRIS_DIRTY_UNCOMPILED_TES)) { 1246 const struct iris_compiled_shader *gs = 1247 ice->shaders.prog[MESA_SHADER_GEOMETRY]; 1248 const struct iris_compiled_shader *tes = 1249 ice->shaders.prog[MESA_SHADER_TESS_EVAL]; 1250 1251 bool points_or_lines = false; 1252 1253 if (gs) { 1254 const struct brw_gs_prog_data *gs_prog_data = (void *) gs->prog_data; 1255 points_or_lines = 1256 gs_prog_data->output_topology == _3DPRIM_POINTLIST || 1257 gs_prog_data->output_topology == _3DPRIM_LINESTRIP; 1258 } else if (tes) { 1259 const struct brw_tes_prog_data *tes_data = (void *) tes->prog_data; 1260 points_or_lines = 1261 tes_data->output_topology == BRW_TESS_OUTPUT_TOPOLOGY_LINE || 1262 tes_data->output_topology == BRW_TESS_OUTPUT_TOPOLOGY_POINT; 1263 } 1264 1265 if (ice->shaders.output_topology_is_points_or_lines != points_or_lines) { 1266 /* Outbound to XY Clip enables */ 1267 ice->shaders.output_topology_is_points_or_lines = points_or_lines; 1268 ice->state.dirty |= IRIS_DIRTY_CLIP; 1269 } 1270 } 1271 1272 gl_shader_stage last_stage = last_vue_stage(ice); 1273 struct iris_compiled_shader *shader = ice->shaders.prog[last_stage]; 1274 struct iris_uncompiled_shader *ish = ice->shaders.uncompiled[last_stage]; 1275 update_last_vue_map(ice, shader->prog_data); 1276 if (ice->state.streamout != shader->streamout) { 1277 ice->state.streamout = shader->streamout; 1278 ice->state.dirty |= IRIS_DIRTY_SO_DECL_LIST | IRIS_DIRTY_STREAMOUT; 1279 } 1280 1281 if (ice->state.streamout_active) { 1282 for (int i = 0; i < PIPE_MAX_SO_BUFFERS; i++) { 1283 struct iris_stream_output_target *so = 1284 (void *) ice->state.so_target[i]; 1285 if (so) 1286 so->stride = ish->stream_output.stride[i]; 1287 } 1288 } 1289 1290 if (dirty & IRIS_DIRTY_UNCOMPILED_FS) 1291 iris_update_compiled_fs(ice); 1292 1293 /* Changing shader interfaces may require a URB configuration. */ 1294 if (!(dirty & IRIS_DIRTY_URB)) { 1295 for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) { 1296 struct brw_vue_prog_data *old = old_prog_datas[i]; 1297 struct brw_vue_prog_data *new = get_vue_prog_data(ice, i); 1298 if (!!old != !!new || 1299 (new && new->urb_entry_size != old->urb_entry_size)) { 1300 ice->state.dirty |= IRIS_DIRTY_URB; 1301 break; 1302 } 1303 } 1304 } 1305} 1306 1307static struct iris_compiled_shader * 1308iris_compile_cs(struct iris_context *ice, 1309 struct iris_uncompiled_shader *ish, 1310 const struct brw_cs_prog_key *key) 1311{ 1312 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 1313 const struct brw_compiler *compiler = screen->compiler; 1314 const struct gen_device_info *devinfo = &screen->devinfo; 1315 void *mem_ctx = ralloc_context(NULL); 1316 struct brw_cs_prog_data *cs_prog_data = 1317 rzalloc(mem_ctx, struct brw_cs_prog_data); 1318 struct brw_stage_prog_data *prog_data = &cs_prog_data->base; 1319 enum brw_param_builtin *system_values; 1320 unsigned num_system_values; 1321 unsigned num_cbufs; 1322 1323 nir_shader *nir = nir_shader_clone(mem_ctx, ish->nir); 1324 1325 cs_prog_data->binding_table.work_groups_start = 0; 1326 1327 prog_data->total_shared = nir->info.cs.shared_size; 1328 1329 iris_setup_uniforms(compiler, mem_ctx, nir, prog_data, &system_values, 1330 &num_system_values, &num_cbufs); 1331 1332 assign_common_binding_table_offsets(devinfo, nir, prog_data, 1, 1333 num_system_values, num_cbufs); 1334 1335 char *error_str = NULL; 1336 const unsigned *program = 1337 brw_compile_cs(compiler, &ice->dbg, mem_ctx, key, cs_prog_data, 1338 nir, -1, &error_str); 1339 if (program == NULL) { 1340 dbg_printf("Failed to compile compute shader: %s\n", error_str); 1341 ralloc_free(mem_ctx); 1342 return false; 1343 } 1344 1345 if (ish->compiled_once) { 1346 iris_debug_recompile(ice, &nir->info, key->program_string_id, key); 1347 } else { 1348 ish->compiled_once = true; 1349 } 1350 1351 struct iris_compiled_shader *shader = 1352 iris_upload_shader(ice, IRIS_CACHE_CS, sizeof(*key), key, program, 1353 prog_data, NULL, system_values, num_system_values, 1354 num_cbufs); 1355 1356 ralloc_free(mem_ctx); 1357 return shader; 1358} 1359 1360void 1361iris_update_compiled_compute_shader(struct iris_context *ice) 1362{ 1363 struct iris_uncompiled_shader *ish = 1364 ice->shaders.uncompiled[MESA_SHADER_COMPUTE]; 1365 1366 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 1367 const struct gen_device_info *devinfo = &screen->devinfo; 1368 struct brw_cs_prog_key key = { KEY_INIT(devinfo->gen) }; 1369 ice->vtbl.populate_cs_key(ice, &key); 1370 1371 struct iris_compiled_shader *old = ice->shaders.prog[IRIS_CACHE_CS]; 1372 struct iris_compiled_shader *shader = 1373 iris_find_cached_shader(ice, IRIS_CACHE_CS, sizeof(key), &key); 1374 1375 if (!shader) 1376 shader = iris_compile_cs(ice, ish, &key); 1377 1378 if (old != shader) { 1379 ice->shaders.prog[IRIS_CACHE_CS] = shader; 1380 ice->state.dirty |= IRIS_DIRTY_CS | 1381 IRIS_DIRTY_BINDINGS_CS | 1382 IRIS_DIRTY_CONSTANTS_CS; 1383 } 1384} 1385 1386void 1387iris_fill_cs_push_const_buffer(struct brw_cs_prog_data *cs_prog_data, 1388 uint32_t *dst) 1389{ 1390 assert(cs_prog_data->push.total.size > 0); 1391 assert(cs_prog_data->push.cross_thread.size == 0); 1392 assert(cs_prog_data->push.per_thread.dwords == 1); 1393 assert(cs_prog_data->base.param[0] == BRW_PARAM_BUILTIN_SUBGROUP_ID); 1394 for (unsigned t = 0; t < cs_prog_data->threads; t++) 1395 dst[8 * t] = t; 1396} 1397 1398/** 1399 * Allocate scratch BOs as needed for the given per-thread size and stage. 1400 */ 1401struct iris_bo * 1402iris_get_scratch_space(struct iris_context *ice, 1403 unsigned per_thread_scratch, 1404 gl_shader_stage stage) 1405{ 1406 struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen; 1407 struct iris_bufmgr *bufmgr = screen->bufmgr; 1408 const struct gen_device_info *devinfo = &screen->devinfo; 1409 1410 unsigned encoded_size = ffs(per_thread_scratch) - 11; 1411 assert(encoded_size < (1 << 16)); 1412 1413 struct iris_bo **bop = &ice->shaders.scratch_bos[encoded_size][stage]; 1414 1415 /* The documentation for 3DSTATE_PS "Scratch Space Base Pointer" says: 1416 * 1417 * "Scratch Space per slice is computed based on 4 sub-slices. SW 1418 * must allocate scratch space enough so that each slice has 4 1419 * slices allowed." 1420 * 1421 * According to the other driver team, this applies to compute shaders 1422 * as well. This is not currently documented at all. 1423 * 1424 * This hack is no longer necessary on Gen11+. 1425 */ 1426 unsigned subslice_total = screen->subslice_total; 1427 if (devinfo->gen < 11) 1428 subslice_total = 4 * devinfo->num_slices; 1429 assert(subslice_total >= screen->subslice_total); 1430 1431 if (!*bop) { 1432 unsigned scratch_ids_per_subslice = devinfo->max_cs_threads; 1433 uint32_t max_threads[] = { 1434 [MESA_SHADER_VERTEX] = devinfo->max_vs_threads, 1435 [MESA_SHADER_TESS_CTRL] = devinfo->max_tcs_threads, 1436 [MESA_SHADER_TESS_EVAL] = devinfo->max_tes_threads, 1437 [MESA_SHADER_GEOMETRY] = devinfo->max_gs_threads, 1438 [MESA_SHADER_FRAGMENT] = devinfo->max_wm_threads, 1439 [MESA_SHADER_COMPUTE] = scratch_ids_per_subslice * subslice_total, 1440 }; 1441 1442 uint32_t size = per_thread_scratch * max_threads[stage]; 1443 1444 *bop = iris_bo_alloc(bufmgr, "scratch", size, IRIS_MEMZONE_SHADER); 1445 } 1446 1447 return *bop; 1448} 1449 1450/* ------------------------------------------------------------------- */ 1451 1452/** 1453 * The pipe->create_[stage]_state() driver hooks. 1454 * 1455 * Performs basic NIR preprocessing, records any state dependencies, and 1456 * returns an iris_uncompiled_shader as the Gallium CSO. 1457 * 1458 * Actual shader compilation to assembly happens later, at first use. 1459 */ 1460static void * 1461iris_create_uncompiled_shader(struct pipe_context *ctx, 1462 nir_shader *nir, 1463 const struct pipe_stream_output_info *so_info) 1464{ 1465 struct iris_screen *screen = (struct iris_screen *)ctx->screen; 1466 const struct gen_device_info *devinfo = &screen->devinfo; 1467 1468 struct iris_uncompiled_shader *ish = 1469 calloc(1, sizeof(struct iris_uncompiled_shader)); 1470 if (!ish) 1471 return NULL; 1472 1473 nir = brw_preprocess_nir(screen->compiler, nir, NULL); 1474 1475 NIR_PASS_V(nir, brw_nir_lower_image_load_store, devinfo); 1476 NIR_PASS_V(nir, iris_lower_storage_image_derefs); 1477 1478 ish->program_id = get_new_program_id(screen); 1479 ish->nir = nir; 1480 if (so_info) { 1481 memcpy(&ish->stream_output, so_info, sizeof(*so_info)); 1482 update_so_info(&ish->stream_output, nir->info.outputs_written); 1483 } 1484 1485 return ish; 1486} 1487 1488static struct iris_uncompiled_shader * 1489iris_create_shader_state(struct pipe_context *ctx, 1490 const struct pipe_shader_state *state) 1491{ 1492 struct nir_shader *nir; 1493 1494 if (state->type == PIPE_SHADER_IR_TGSI) 1495 nir = tgsi_to_nir(state->tokens, ctx->screen); 1496 else 1497 nir = state->ir.nir; 1498 1499 return iris_create_uncompiled_shader(ctx, nir, &state->stream_output); 1500} 1501 1502static void * 1503iris_create_vs_state(struct pipe_context *ctx, 1504 const struct pipe_shader_state *state) 1505{ 1506 struct iris_context *ice = (void *) ctx; 1507 struct iris_screen *screen = (void *) ctx->screen; 1508 struct iris_uncompiled_shader *ish = iris_create_shader_state(ctx, state); 1509 1510 /* User clip planes */ 1511 if (ish->nir->info.clip_distance_array_size == 0) 1512 ish->nos |= (1ull << IRIS_NOS_RASTERIZER); 1513 1514 if (screen->precompile) { 1515 const struct gen_device_info *devinfo = &screen->devinfo; 1516 struct brw_vs_prog_key key = { KEY_INIT(devinfo->gen) }; 1517 1518 iris_compile_vs(ice, ish, &key); 1519 } 1520 1521 return ish; 1522} 1523 1524static void * 1525iris_create_tcs_state(struct pipe_context *ctx, 1526 const struct pipe_shader_state *state) 1527{ 1528 struct iris_context *ice = (void *) ctx; 1529 struct iris_screen *screen = (void *) ctx->screen; 1530 struct iris_uncompiled_shader *ish = iris_create_shader_state(ctx, state); 1531 struct shader_info *info = &ish->nir->info; 1532 1533 // XXX: NOS? 1534 1535 if (screen->precompile) { 1536 const unsigned _GL_TRIANGLES = 0x0004; 1537 const struct gen_device_info *devinfo = &screen->devinfo; 1538 struct brw_tcs_prog_key key = { 1539 KEY_INIT(devinfo->gen), 1540 // XXX: make sure the linker fills this out from the TES... 1541 .tes_primitive_mode = 1542 info->tess.primitive_mode ? info->tess.primitive_mode 1543 : _GL_TRIANGLES, 1544 .outputs_written = info->outputs_written, 1545 .patch_outputs_written = info->patch_outputs_written, 1546 }; 1547 1548 iris_compile_tcs(ice, ish, &key); 1549 } 1550 1551 return ish; 1552} 1553 1554static void * 1555iris_create_tes_state(struct pipe_context *ctx, 1556 const struct pipe_shader_state *state) 1557{ 1558 struct iris_context *ice = (void *) ctx; 1559 struct iris_screen *screen = (void *) ctx->screen; 1560 struct iris_uncompiled_shader *ish = iris_create_shader_state(ctx, state); 1561 struct shader_info *info = &ish->nir->info; 1562 1563 // XXX: NOS? 1564 1565 if (screen->precompile) { 1566 const struct gen_device_info *devinfo = &screen->devinfo; 1567 struct brw_tes_prog_key key = { 1568 KEY_INIT(devinfo->gen), 1569 // XXX: not ideal, need TCS output/TES input unification 1570 .inputs_read = info->inputs_read, 1571 .patch_inputs_read = info->patch_inputs_read, 1572 }; 1573 1574 iris_compile_tes(ice, ish, &key); 1575 } 1576 1577 return ish; 1578} 1579 1580static void * 1581iris_create_gs_state(struct pipe_context *ctx, 1582 const struct pipe_shader_state *state) 1583{ 1584 struct iris_context *ice = (void *) ctx; 1585 struct iris_screen *screen = (void *) ctx->screen; 1586 struct iris_uncompiled_shader *ish = iris_create_shader_state(ctx, state); 1587 1588 // XXX: NOS? 1589 1590 if (screen->precompile) { 1591 const struct gen_device_info *devinfo = &screen->devinfo; 1592 struct brw_gs_prog_key key = { KEY_INIT(devinfo->gen) }; 1593 1594 iris_compile_gs(ice, ish, &key); 1595 } 1596 1597 return ish; 1598} 1599 1600static void * 1601iris_create_fs_state(struct pipe_context *ctx, 1602 const struct pipe_shader_state *state) 1603{ 1604 struct iris_context *ice = (void *) ctx; 1605 struct iris_screen *screen = (void *) ctx->screen; 1606 struct iris_uncompiled_shader *ish = iris_create_shader_state(ctx, state); 1607 struct shader_info *info = &ish->nir->info; 1608 1609 ish->nos |= (1ull << IRIS_NOS_FRAMEBUFFER) | 1610 (1ull << IRIS_NOS_DEPTH_STENCIL_ALPHA) | 1611 (1ull << IRIS_NOS_RASTERIZER) | 1612 (1ull << IRIS_NOS_BLEND); 1613 1614 /* The program key needs the VUE map if there are > 16 inputs */ 1615 if (util_bitcount64(ish->nir->info.inputs_read & 1616 BRW_FS_VARYING_INPUT_MASK) > 16) { 1617 ish->nos |= (1ull << IRIS_NOS_LAST_VUE_MAP); 1618 } 1619 1620 if (screen->precompile) { 1621 const uint64_t color_outputs = info->outputs_written & 1622 ~(BITFIELD64_BIT(FRAG_RESULT_DEPTH) | 1623 BITFIELD64_BIT(FRAG_RESULT_STENCIL) | 1624 BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)); 1625 1626 bool can_rearrange_varyings = 1627 util_bitcount64(info->inputs_read & BRW_FS_VARYING_INPUT_MASK) <= 16; 1628 1629 const struct gen_device_info *devinfo = &screen->devinfo; 1630 struct brw_wm_prog_key key = { 1631 KEY_INIT(devinfo->gen), 1632 .nr_color_regions = util_bitcount(color_outputs), 1633 .coherent_fb_fetch = true, 1634 .input_slots_valid = 1635 can_rearrange_varyings ? 0 : info->inputs_read | VARYING_BIT_POS, 1636 }; 1637 1638 iris_compile_fs(ice, ish, &key, NULL); 1639 } 1640 1641 return ish; 1642} 1643 1644static void * 1645iris_create_compute_state(struct pipe_context *ctx, 1646 const struct pipe_compute_state *state) 1647{ 1648 assert(state->ir_type == PIPE_SHADER_IR_NIR); 1649 1650 struct iris_context *ice = (void *) ctx; 1651 struct iris_screen *screen = (void *) ctx->screen; 1652 struct iris_uncompiled_shader *ish = 1653 iris_create_uncompiled_shader(ctx, (void *) state->prog, NULL); 1654 1655 // XXX: disallow more than 64KB of shared variables 1656 1657 if (screen->precompile) { 1658 const struct gen_device_info *devinfo = &screen->devinfo; 1659 struct brw_cs_prog_key key = { KEY_INIT(devinfo->gen) }; 1660 1661 iris_compile_cs(ice, ish, &key); 1662 } 1663 1664 return ish; 1665} 1666 1667/** 1668 * The pipe->delete_[stage]_state() driver hooks. 1669 * 1670 * Frees the iris_uncompiled_shader. 1671 */ 1672static void 1673iris_delete_shader_state(struct pipe_context *ctx, void *state, gl_shader_stage stage) 1674{ 1675 struct iris_uncompiled_shader *ish = state; 1676 struct iris_context *ice = (void *) ctx; 1677 1678 if (ice->shaders.uncompiled[stage] == ish) { 1679 ice->shaders.uncompiled[stage] = NULL; 1680 ice->state.dirty |= IRIS_DIRTY_UNCOMPILED_VS << stage; 1681 } 1682 1683 ralloc_free(ish->nir); 1684 free(ish); 1685} 1686 1687static void 1688iris_delete_vs_state(struct pipe_context *ctx, void *state) 1689{ 1690 iris_delete_shader_state(ctx, state, MESA_SHADER_VERTEX); 1691} 1692 1693static void 1694iris_delete_tcs_state(struct pipe_context *ctx, void *state) 1695{ 1696 iris_delete_shader_state(ctx, state, MESA_SHADER_TESS_CTRL); 1697} 1698 1699static void 1700iris_delete_tes_state(struct pipe_context *ctx, void *state) 1701{ 1702 iris_delete_shader_state(ctx, state, MESA_SHADER_TESS_EVAL); 1703} 1704 1705static void 1706iris_delete_gs_state(struct pipe_context *ctx, void *state) 1707{ 1708 iris_delete_shader_state(ctx, state, MESA_SHADER_GEOMETRY); 1709} 1710 1711static void 1712iris_delete_fs_state(struct pipe_context *ctx, void *state) 1713{ 1714 iris_delete_shader_state(ctx, state, MESA_SHADER_FRAGMENT); 1715} 1716 1717static void 1718iris_delete_cs_state(struct pipe_context *ctx, void *state) 1719{ 1720 iris_delete_shader_state(ctx, state, MESA_SHADER_COMPUTE); 1721} 1722 1723/** 1724 * The pipe->bind_[stage]_state() driver hook. 1725 * 1726 * Binds an uncompiled shader as the current one for a particular stage. 1727 * Updates dirty tracking to account for the shader's NOS. 1728 */ 1729static void 1730bind_state(struct iris_context *ice, 1731 struct iris_uncompiled_shader *ish, 1732 gl_shader_stage stage) 1733{ 1734 uint64_t dirty_bit = IRIS_DIRTY_UNCOMPILED_VS << stage; 1735 const uint64_t nos = ish ? ish->nos : 0; 1736 1737 const struct shader_info *old_info = iris_get_shader_info(ice, stage); 1738 const struct shader_info *new_info = ish ? &ish->nir->info : NULL; 1739 1740 if ((old_info ? util_last_bit(old_info->textures_used) : 0) != 1741 (new_info ? util_last_bit(new_info->textures_used) : 0)) { 1742 ice->state.dirty |= IRIS_DIRTY_SAMPLER_STATES_VS << stage; 1743 } 1744 1745 ice->shaders.uncompiled[stage] = ish; 1746 ice->state.dirty |= dirty_bit; 1747 1748 /* Record that CSOs need to mark IRIS_DIRTY_UNCOMPILED_XS when they change 1749 * (or that they no longer need to do so). 1750 */ 1751 for (int i = 0; i < IRIS_NOS_COUNT; i++) { 1752 if (nos & (1 << i)) 1753 ice->state.dirty_for_nos[i] |= dirty_bit; 1754 else 1755 ice->state.dirty_for_nos[i] &= ~dirty_bit; 1756 } 1757} 1758 1759static void 1760iris_bind_vs_state(struct pipe_context *ctx, void *state) 1761{ 1762 bind_state((void *) ctx, state, MESA_SHADER_VERTEX); 1763} 1764 1765static void 1766iris_bind_tcs_state(struct pipe_context *ctx, void *state) 1767{ 1768 bind_state((void *) ctx, state, MESA_SHADER_TESS_CTRL); 1769} 1770 1771static void 1772iris_bind_tes_state(struct pipe_context *ctx, void *state) 1773{ 1774 struct iris_context *ice = (struct iris_context *)ctx; 1775 1776 /* Enabling/disabling optional stages requires a URB reconfiguration. */ 1777 if (!!state != !!ice->shaders.uncompiled[MESA_SHADER_TESS_EVAL]) 1778 ice->state.dirty |= IRIS_DIRTY_URB; 1779 1780 bind_state((void *) ctx, state, MESA_SHADER_TESS_EVAL); 1781} 1782 1783static void 1784iris_bind_gs_state(struct pipe_context *ctx, void *state) 1785{ 1786 struct iris_context *ice = (struct iris_context *)ctx; 1787 1788 /* Enabling/disabling optional stages requires a URB reconfiguration. */ 1789 if (!!state != !!ice->shaders.uncompiled[MESA_SHADER_GEOMETRY]) 1790 ice->state.dirty |= IRIS_DIRTY_URB; 1791 1792 bind_state((void *) ctx, state, MESA_SHADER_GEOMETRY); 1793} 1794 1795static void 1796iris_bind_fs_state(struct pipe_context *ctx, void *state) 1797{ 1798 struct iris_context *ice = (struct iris_context *) ctx; 1799 struct iris_uncompiled_shader *old_ish = 1800 ice->shaders.uncompiled[MESA_SHADER_FRAGMENT]; 1801 struct iris_uncompiled_shader *new_ish = state; 1802 1803 const unsigned color_bits = 1804 BITFIELD64_BIT(FRAG_RESULT_COLOR) | 1805 BITFIELD64_RANGE(FRAG_RESULT_DATA0, BRW_MAX_DRAW_BUFFERS); 1806 1807 /* Fragment shader outputs influence HasWriteableRT */ 1808 if (!old_ish || !new_ish || 1809 (old_ish->nir->info.outputs_written & color_bits) != 1810 (new_ish->nir->info.outputs_written & color_bits)) 1811 ice->state.dirty |= IRIS_DIRTY_PS_BLEND; 1812 1813 bind_state((void *) ctx, state, MESA_SHADER_FRAGMENT); 1814} 1815 1816static void 1817iris_bind_cs_state(struct pipe_context *ctx, void *state) 1818{ 1819 bind_state((void *) ctx, state, MESA_SHADER_COMPUTE); 1820} 1821 1822void 1823iris_init_program_functions(struct pipe_context *ctx) 1824{ 1825 ctx->create_vs_state = iris_create_vs_state; 1826 ctx->create_tcs_state = iris_create_tcs_state; 1827 ctx->create_tes_state = iris_create_tes_state; 1828 ctx->create_gs_state = iris_create_gs_state; 1829 ctx->create_fs_state = iris_create_fs_state; 1830 ctx->create_compute_state = iris_create_compute_state; 1831 1832 ctx->delete_vs_state = iris_delete_vs_state; 1833 ctx->delete_tcs_state = iris_delete_tcs_state; 1834 ctx->delete_tes_state = iris_delete_tes_state; 1835 ctx->delete_gs_state = iris_delete_gs_state; 1836 ctx->delete_fs_state = iris_delete_fs_state; 1837 ctx->delete_compute_state = iris_delete_cs_state; 1838 1839 ctx->bind_vs_state = iris_bind_vs_state; 1840 ctx->bind_tcs_state = iris_bind_tcs_state; 1841 ctx->bind_tes_state = iris_bind_tes_state; 1842 ctx->bind_gs_state = iris_bind_gs_state; 1843 ctx->bind_fs_state = iris_bind_fs_state; 1844 ctx->bind_compute_state = iris_bind_cs_state; 1845} 1846