Lines Matching defs:shader
139 struct r600_pipe_shader *shader)
144 if (shader->bo == NULL) {
145 shader->bo = (struct r600_resource*)
146 pipe_buffer_create(ctx->screen, 0, PIPE_USAGE_IMMUTABLE, shader->shader.bc.ndw * 4);
147 if (shader->bo == NULL) {
151 &rctx->b, shader->bo,
154 for (i = 0; i < shader->shader.bc.ndw; ++i) {
155 ptr[i] = util_cpu_to_le32(shader->shader.bc.bytecode[i]);
158 memcpy(ptr, shader->shader.bc.bytecode, shader->shader.bc.ndw * sizeof(*ptr));
160 rctx->b.ws->buffer_unmap(rctx->b.ws, shader->bo->buf);
169 struct r600_pipe_shader *shader,
173 struct r600_pipe_shader_selector *sel = shader->selector;
187 shader->shader.bc.isa = rctx->isa;
191 r = r600_shader_from_tgsi(rctx, shader, key);
205 shader->shader.processor_type);
217 r = r600_shader_from_nir(rctx, shader, &key);
219 fprintf(stderr, "--Failed shader--------------------------------------------------\n");
247 if (shader->shader.processor_type == PIPE_SHADER_VERTEX) {
252 use_sb &= (shader->shader.processor_type != PIPE_SHADER_TESS_CTRL);
253 use_sb &= (shader->shader.processor_type != PIPE_SHADER_TESS_EVAL);
254 use_sb &= (shader->shader.processor_type != PIPE_SHADER_COMPUTE);
257 use_sb &= !shader->shader.uses_doubles;
259 use_sb &= !shader->shader.uses_atomics;
260 use_sb &= !shader->shader.uses_images;
261 use_sb &= !shader->shader.uses_helper_invocation;
264 use_sb &= !(shader->shader.needs_scratch_space && rscreen->b.gfx_level < R700);
270 use_sb &= !(shader->shader.indirect_files & (1 << TGSI_FILE_TEMPORARY));
271 use_sb &= !(shader->shader.indirect_files & (1 << TGSI_FILE_CONSTANT));
274 use_sb &= !shader->shader.uses_interpolate_at_sample;
277 if (!shader->shader.bc.bytecode) {
278 r = r600_bytecode_build(&shader->shader.bc);
288 r600_bytecode_disasm(&shader->shader.bc);
291 r = r600_sb_bytecode_process(rctx, &shader->shader.bc, &shader->shader,
300 print_shader_info(stderr, nshader++, &shader->shader);
304 if (shader->gs_copy_shader) {
306 // dump copy shader
307 r = r600_sb_bytecode_process(rctx, &shader->gs_copy_shader->shader.bc,
308 &shader->gs_copy_shader->shader, dump, 0);
313 if ((r = store_shader(ctx, shader->gs_copy_shader)))
317 /* Store the shader in a buffer. */
318 if ((r = store_shader(ctx, shader)))
322 switch (shader->shader.processor_type) {
324 evergreen_update_hs_state(ctx, shader);
328 evergreen_update_es_state(ctx, shader);
330 evergreen_update_vs_state(ctx, shader);
334 evergreen_update_gs_state(ctx, shader);
335 evergreen_update_vs_state(ctx, shader->gs_copy_shader);
337 r600_update_gs_state(ctx, shader);
338 r600_update_vs_state(ctx, shader->gs_copy_shader);
345 evergreen_update_ls_state(ctx, shader);
347 evergreen_update_es_state(ctx, shader);
349 evergreen_update_vs_state(ctx, shader);
352 r600_update_es_state(ctx, shader);
354 r600_update_vs_state(ctx, shader);
359 evergreen_update_ps_state(ctx, shader);
361 r600_update_ps_state(ctx, shader);
365 evergreen_update_ls_state(ctx, shader);
372 util_debug_message(&rctx->b.debug, SHADER_INFO, "%s shader: %d dw, %d gprs, %d alu_groups, %d loops, %d cf, %d stack",
374 shader->shader.bc.ndw,
375 shader->shader.bc.ngpr,
376 shader->shader.bc.nalu_groups,
377 shader->shader.num_loops,
378 shader->shader.bc.ncf,
379 shader->shader.bc.nstack);
384 r600_pipe_shader_destroy(ctx, shader);
388 void r600_pipe_shader_destroy(struct pipe_context *ctx UNUSED, struct r600_pipe_shader *shader)
390 r600_resource_reference(&shader->bo, NULL);
391 if (list_is_linked(&shader->shader.bc.cf))
392 r600_bytecode_clear(&shader->shader.bc);
393 r600_release_command_buffer(&shader->command_buffer);
397 * tgsi -> r600 shader
429 struct r600_shader *shader;
588 ctx->shader->input[input].interpolate,
589 ctx->shader->input[input].interpolate_location);
591 ctx->shader->input[input].ij_index = ctx->eg_interpolators[i].ij_index;
599 int ij_index = ctx->shader->input[input].ij_index;
614 alu.dst.sel = ctx->shader->input[input].gpr;
623 alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
645 alu.dst.sel = ctx->shader->input[input].gpr;
650 alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
665 * shader export ARRAY_BASE for EXPORT_POS:
681 * shader export ARRAY_BASE for EXPORT_PIXEL:
781 if (ctx->shader->input[index].spi_sid) {
782 ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
783 if (ctx->shader->input[index].interpolate > 0) {
797 int gpr_front = ctx->shader->input[front].gpr;
798 int gpr_back = ctx->shader->input[back].gpr;
952 i = ctx->shader->noutput++;
953 ctx->shader->output[i].name = TGSI_SEMANTIC_PRIMID;
954 ctx->shader->output[i].sid = 0;
955 ctx->shader->output[i].gpr = 0;
956 ctx->shader->output[i].interpolate = TGSI_INTERPOLATE_CONSTANT;
957 ctx->shader->output[i].write_mask = 0x4;
958 ctx->shader->output[i].spi_sid = prim_id_sid;
1086 i = ctx->shader->ninput + j;
1087 assert(i < ARRAY_SIZE(ctx->shader->input));
1088 ctx->shader->input[i].name = d->Semantic.Name;
1089 ctx->shader->input[i].sid = d->Semantic.Index + j;
1090 ctx->shader->input[i].interpolate = d->Interp.Interpolate;
1091 ctx->shader->input[i].interpolate_location = d->Interp.Location;
1092 ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First + j;
1094 ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
1095 switch (ctx->shader->input[i].name) {
1098 ctx->shader->input[i].gpr = ctx->face_gpr; /* already allocated by allocate_system_value_inputs */
1100 ctx->face_gpr = ctx->shader->input[i].gpr;
1110 ctx->shader->gs_prim_id_input = true;
1111 ctx->shader->ps_prim_id_input = i;
1120 ctx->shader->input[i].ring_offset = ctx->next_ring_offset;
1122 if (ctx->shader->input[i].name == TGSI_SEMANTIC_PRIMID)
1123 ctx->shader->gs_prim_id_input = true;
1126 ctx->shader->ninput += count;
1130 i = ctx->shader->noutput + j;
1131 assert(i < ARRAY_SIZE(ctx->shader->output));
1132 ctx->shader->output[i].name = d->Semantic.Name;
1133 ctx->shader->output[i].sid = d->Semantic.Index + j;
1134 ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First + j;
1135 ctx->shader->output[i].interpolate = d->Interp.Interpolate;
1136 ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
1140 ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
1145 ctx->shader->vs_out_misc_write = 1;
1146 ctx->shader->vs_out_point_size = 1;
1149 ctx->shader->vs_out_misc_write = 1;
1150 ctx->shader->vs_out_edgeflag = 1;
1154 ctx->shader->vs_out_misc_write = 1;
1155 ctx->shader->vs_out_viewport = 1;
1158 ctx->shader->vs_out_misc_write = 1;
1159 ctx->shader->vs_out_layer = 1;
1171 ctx->shader->noutput += count;
1182 r600_add_gpr_array(ctx->shader, idx,
1199 i = ctx->shader->nhwatomic_ranges;
1200 ctx->shader->atomics[i].start = d->Range.First;
1201 ctx->shader->atomics[i].end = d->Range.Last;
1202 ctx->shader->atomics[i].hw_idx = ctx->shader->atomic_base + ctx->shader->nhwatomic;
1203 ctx->shader->atomics[i].buffer_id = d->Dim.Index2D;
1204 ctx->shader->nhwatomic_ranges++;
1205 ctx->shader->nhwatomic += count;
1312 /* need to scan shader for system values and interpolateAtSample/Offset/Centroid */
1378 ctx->shader->nsys_inputs++;
1381 k = ctx->shader->ninput++;
1382 ctx->shader->input[k].name = name;
1383 ctx->shader->input[k].sid = 0;
1384 ctx->shader->input[k].interpolate = TGSI_INTERPOLATE_CONSTANT;
1385 ctx->shader->input[k].interpolate_location = TGSI_INTERPOLATE_LOC_CENTER;
1386 *reg = ctx->shader->input[k].gpr = gpr;
1394 * for evergreen we need to scan the shader to find the number of GPRs we need to
1407 * Could get this information from the shader info. But right now
1408 * we interpolate all declared inputs, whereas the shader info will
1916 r600_add_gpr_array(ctx->shader, treg[0], 3, 0x0F);
2003 if (ctx->shader->input[src->Register.Index].name == TGSI_SEMANTIC_PRIMID) {
2021 /* Tessellation shaders pass outputs to the next shader using LDS.
2408 int i, r, count = ctx->shader->ninput;
2411 if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
2412 r = select_twoside_color(ctx, i, ctx->shader->input[i].back_color_input);
2446 so_gpr[i] = ctx->shader->output[so->output[i].register_index].gpr;
2547 if (!ctx->shader->vs_out_edgeflag)
2550 reg = ctx->shader->output[ctx->edgeflag_output].gpr;
2576 struct r600_shader *gs_shader = &gs->shader;
2592 memcpy(cshader->shader.output, gs_shader->output, ocnt *
2595 cshader->shader.noutput = ocnt;
2597 ctx.shader = &cshader->shader;
2598 ctx.bc = &ctx.shader->bc;
2607 memset(cshader->shader.ring_item_sizes, 0, sizeof(cshader->shader.ring_item_sizes));
2629 struct r600_shader_io *out = &ctx.shader->output[i];
2666 cshader->shader.ring_item_sizes[ring] = 0;
2696 emit_streamout(&ctx, so, only_ring_0 ? -1 : ring, &cshader->shader.ring_item_sizes[ring]);
2697 cshader->shader.ring_item_sizes[ring] = ocnt * 16;
2713 struct r600_shader_io *out = &ctx.shader->output[i];
2752 ctx.shader->vs_out_misc_write = 1;
2753 ctx.shader->vs_out_point_size = 1;
2757 /* duplicate it as PARAM to pass to the pixel shader */
2770 ctx.shader->vs_out_misc_write = 1;
2771 ctx.shader->vs_out_layer = 1;
2775 /* duplicate it as PARAM to pass to the pixel shader */
2784 ctx.shader->vs_out_misc_write = 1;
2785 ctx.shader->vs_out_viewport = 1;
2794 ctx.shader->clip_dist_write = gs->shader.clip_dist_write;
2795 ctx.shader->cull_dist_write = gs->shader.cull_dist_write;
2796 ctx.shader->cc_dist_mask = gs->shader.cc_dist_mask;
2798 /* duplicate it as PARAM to pass to the pixel shader */
2911 for (i = 0; i < ctx->shader->noutput; i++) {
2919 struct r600_shader_io *out = &ctx->shader->output[i];
2931 if (stream > 0 && ctx->shader->output[i].name == TGSI_SEMANTIC_POSITION)
2939 output.gpr = ctx->shader->output[i].gpr;
3069 for (i = 0; i < ctx->shader->noutput; i++) {
3071 int param = r600_get_lds_unique_index(ctx->shader->output[i].name,
3072 ctx->shader->output[i].sid);
3097 alu.src[1].sel = ctx->shader->output[i].gpr;
3099 alu.src[2].sel = ctx->shader->output[i].gpr;
3202 unsigned name = ctx->shader->output[output_idx].name;
3203 int dreg = ctx->shader->output[output_idx].gpr;
3250 switch (ctx->shader->tcs_prim_mode) {
3276 for (j = 0; j < ctx->shader->noutput; j++) {
3277 if (ctx->shader->output[j].name == TGSI_SEMANTIC_TESSINNER)
3279 if (ctx->shader->output[j].name == TGSI_SEMANTIC_TESSOUTER)
3318 if (ctx->shader->tcs_prim_mode == PIPE_PRIM_LINES) {
3333 ctx->shader->output[out_idx].gpr, out_comp,
3374 * Then the shader engine ID is multiplied by 256,
3436 struct r600_shader *shader = &pipeshader->shader;
3441 struct r600_bytecode_output output[ARRAY_SIZE(shader->output)];
3454 ctx.bc = &shader->bc;
3455 ctx.shader = shader;
3461 shader->indirect_files = ctx.info.indirect_files;
3468 shader->uses_helper_invocation = false;
3469 shader->uses_doubles = ctx.info.uses_doubles;
3470 shader->uses_atomics = ctx.info.file_mask[TGSI_FILE_HW_ATOMIC];
3471 shader->num_loops = ctx.info.opcode_count[TGSI_OPCODE_BGNLOOP];
3472 shader->uses_interpolate_at_sample = ctx.info.opcode_count[TGSI_OPCODE_INTERP_SAMPLE] != 0;
3474 shader->nsys_inputs = 0;
3476 shader->uses_images = ctx.info.file_count[TGSI_FILE_IMAGE] > 0 ||
3481 shader->processor_type = ctx.type;
3482 ctx.bc->type = shader->processor_type;
3486 shader->vs_as_gs_a = key.vs.as_gs_a;
3487 shader->vs_as_es = key.vs.as_es;
3488 shader->vs_as_ls = key.vs.as_ls;
3489 shader->atomic_base = key.vs.first_atomic_counter;
3490 if (shader->vs_as_es)
3492 if (shader->vs_as_ls)
3497 shader->atomic_base = key.gs.first_atomic_counter;
3498 shader->gs_tri_strip_adj_fix = key.gs.tri_strip_adj_fix;
3501 shader->tcs_prim_mode = key.tcs.prim_mode;
3502 shader->atomic_base = key.tcs.first_atomic_counter;
3507 shader->tes_as_es = key.tes.as_es;
3508 shader->atomic_base = key.tes.first_atomic_counter;
3510 if (shader->tes_as_es)
3514 shader->two_side = key.ps.color_two_side;
3515 shader->atomic_base = key.ps.first_atomic_counter;
3516 shader->rat_base = key.ps.nr_cbufs;
3517 shader->image_size_const_offset = key.ps.image_size_const_offset;
3520 shader->rat_base = 0;
3521 shader->image_size_const_offset = ctx.info.file_count[TGSI_FILE_SAMPLER];
3527 if (shader->vs_as_es || shader->tes_as_es) {
3528 ctx.gs_for_vs = &rctx->gs_shader->current->shader;
3551 shader->nr_ps_color_exports = 0;
3594 shader->uses_helper_invocation = true;
3646 shader->indirect_files = ctx.info.indirect_files;
3648 shader->needs_scratch_space = pipeshader->scratch_space_needed != 0;
3665 if (ctx.shader->gs_tri_strip_adj_fix) {
3674 if (shader->uses_images) {
3679 shader->max_arrays = 0;
3680 shader->num_arrays = 0;
3684 r600_add_gpr_array(shader, ctx.file_offset[TGSI_FILE_INPUT],
3690 r600_add_gpr_array(shader, ctx.file_offset[TGSI_FILE_OUTPUT],
3701 shader->fs_write_all = ctx.info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS] &&
3703 shader->vs_position_window_space = ctx.info.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION];
3704 shader->ps_conservative_z = (uint8_t)ctx.info.properties[TGSI_PROPERTY_FS_DEPTH_LAYOUT];
3709 shader->cc_dist_mask = (1 << (ctx.info.properties[TGSI_PROPERTY_NUM_CULLDIST_ENABLED] +
3711 shader->clip_dist_write = (1 << ctx.info.properties[TGSI_PROPERTY_NUM_CLIPDIST_ENABLED]) - 1;
3712 shader->cull_dist_write = ((1 << ctx.info.properties[TGSI_PROPERTY_NUM_CULLDIST_ENABLED]) - 1) << ctx.info.properties[TGSI_PROPERTY_NUM_CLIPDIST_ENABLED];
3715 if (shader->vs_as_gs_a)
3758 shader->ring_item_sizes[0] = ctx.next_ring_offset;
3759 shader->ring_item_sizes[1] = 0;
3760 shader->ring_item_sizes[2] = 0;
3761 shader->ring_item_sizes[3] = 0;
3764 if (shader->two_side && ctx.colors_used) {
3765 int i, count = ctx.shader->ninput;
3766 unsigned next_lds_loc = ctx.shader->nlds;
3770 * reserve these gprs for the rest of the shader code and to adjust
3775 /* if two sided and neither face or sample mask is used by shader, ensure face_gpr is emitted */
3777 i = ctx.shader->ninput++;
3778 ctx.shader->input[i].name = TGSI_SEMANTIC_FACE;
3779 ctx.shader->input[i].spi_sid = 0;
3780 ctx.shader->input[i].gpr = gpr++;
3781 ctx.face_gpr = ctx.shader->input[i].gpr;
3785 if (ctx.shader->input[i].name == TGSI_SEMANTIC_COLOR) {
3786 int ni = ctx.shader->ninput++;
3787 memcpy(&ctx.shader->input[ni],&ctx.shader->input[i], sizeof(struct r600_shader_io));
3788 ctx.shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
3789 ctx.shader->input[ni].spi_sid = r600_spi_sid(&ctx.shader->input[ni]);
3790 ctx.shader->input[ni].gpr = gpr++;
3793 ctx.shader->input[ni].lds_pos = next_lds_loc++;
3794 ctx.shader->input[i].back_color_input = ni;
3803 if (ctx.shader->uses_helper_invocation) {
3814 * this shader should be executed per sample. Should be the case for now...
3820 * coverage for the shader invocation only.
3823 * For now, we can only do it if we know this shader is always
3824 * executed per sample (due to usage of bits in the shader
3867 alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
3870 alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
3881 alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
3884 alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
3914 if (ctx.shader->gs_tri_strip_adj_fix) {
3948 if (shader->two_side && ctx.colors_used) {
4004 noutput = shader->noutput;
4015 memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io));
4016 shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
4017 shader->output[noutput].gpr = clipdist_temp[0];
4019 shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
4020 shader->output[noutput].gpr = clipdist_temp[1];
4024 shader->output[ctx.cv_output].spi_sid = 0;
4026 shader->clip_dist_write = 0xFF;
4027 shader->cc_dist_mask = 0xFF;
4037 alu.src[0].sel = shader->output[ctx.cv_output].gpr;
4074 if (ctx.shader->noutput)
4078 if (shader->vs_as_es || shader->tes_as_es) {
4088 next_clip_base = shader->vs_out_misc_write ? 62 : 61;
4092 output[j].gpr = shader->output[i].gpr;
4104 switch (shader->output[i].name) {
4131 if (shader->output[i].spi_sid) {
4148 if (shader->output[i].spi_sid) {
4171 if (shader->output[i].spi_sid) {
4173 /* duplicate it as PARAM to pass to the pixel shader */
4194 if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
4196 if (shader->output[i].sid >= max_color_exports) {
4202 output[j].array_base = shader->output[i].sid;
4204 shader->nr_ps_color_exports++;
4205 shader->ps_color_export_mask |= (0xf << (shader->output[i].sid * 4));
4210 if (shader->output[i].sid > 0)
4211 for (unsigned x = 0; x < shader->output[i].sid; x++)
4212 shader->ps_color_export_mask |= (1 << (x*4));
4214 if (shader->output[i].sid > shader->ps_export_highest)
4215 shader->ps_export_highest = shader->output[i].sid;
4216 if (shader->fs_write_all && (rscreen->b.gfx_level >= EVERGREEN)) {
4220 output[j].gpr = shader->output[i].gpr;
4230 shader->nr_ps_color_exports++;
4231 if (k > shader->ps_export_highest)
4232 shader->ps_export_highest = k;
4233 shader->ps_color_export_mask |= (0xf << (j * 4));
4236 } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
4242 } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
4248 } else if (shader->output[i].name == TGSI_SEMANTIC_SAMPLEMASK) {
4256 R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
4291 /* add fake param output for vertex shader if no param is exported */
4308 if (ctx.type == PIPE_SHADER_FRAGMENT && shader->nr_ps_color_exports == 0) {
4321 shader->nr_ps_color_exports++;
4322 shader->ps_color_export_mask = 0xf;
4361 R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr);
5509 ctx->shader->uses_kill = TRUE;
7067 const int input = inst->Src[0].Register.Index + ctx->shader->nsys_inputs;
7078 ctx->shader->input[input].uses_interpolate_at_centroid = 1;
7081 k = eg_get_interpolator_index(ctx->shader->input[input].interpolate, location);
7192 alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
7587 ctx->shader->has_txq_cube_array_z_comp = true;
7608 ctx->shader->uses_tex_buffers = true;
7613 ctx->shader->uses_tex_buffers = true;
8361 /* does this shader want a num layers from TXQ for a cube array? */
8660 for (i = 0; i < ctx->shader->nhwatomic_ranges; i++) {
8661 if (ctx->shader->atomics[i].buffer_id != (unsigned)src->Dimension.Index)
8663 if (index > ctx->shader->atomics[i].end)
8665 if (index < ctx->shader->atomics[i].start)
8667 uint32_t offset = (index - ctx->shader->atomics[i].start);
8668 return ctx->shader->atomics[i].hw_idx + offset;
8939 cf->rat.id = ctx->shader->rat_base + inst->Src[0].Register.Index;
9082 cf->rat.id = ctx->shader->rat_base + inst->Dst[0].Register.Index + ctx->info.file_count[TGSI_FILE_IMAGE];
9146 cf->rat.id = ctx->shader->rat_base + inst->Dst[0].Register.Index;
9260 rat_base = ctx->shader->rat_base;
9596 ctx->shader->uses_tex_buffers = true;
9601 return r600_do_buffer_txq(ctx, 0, ctx->shader->image_size_const_offset, eg_buffer_base);
9606 ctx->shader->has_txq_cube_array_z_comp = true;
9615 /* does this shader want a num layers from TXQ for a cube array? */
9617 int id = tgsi_tex_get_src_gpr(ctx, 0) + ctx->shader->image_size_const_offset;
10489 * other cases, e.g. when we have 4 levels of PUSH_VPM in the shader,
10697 R600_ERR("if/endif unbalanced in shader\n");
10737 R600_ERR("loop/endloop in shader code are not paired.\n");
11407 /* this isn't a complete div it's just enough for qbo shader to work */