Home | History | Annotate | Download | only in shader

Lines Matching defs:gcc

150 gs_init_vars(struct gs_compile_context *gcc)
152 struct toy_compiler *tc = &gcc->tc;
156 dst = gcc->vars.urb_write_header;
158 gs_COPY8(tc, dst, gcc->payload.header);
160 gcc->vars.prim_start = true;
161 gcc->vars.prim_end = false;
162 switch (gcc->out_vue_min_count) {
164 gcc->vars.prim_type = GEN6_3DPRIM_POINTLIST;
167 gcc->vars.prim_type = GEN6_3DPRIM_LINESTRIP;
170 gcc->vars.prim_type = GEN6_3DPRIM_TRISTRIP;
174 if (gcc->write_so)
175 tc_MOV(tc, gcc->vars.so_written, tsrc_imm_d(0));
179 gs_save_output(struct gs_compile_context *gcc, const struct toy_src *outs)
181 struct toy_compiler *tc = &gcc->tc;
182 const struct toy_dst buf = gcc->vars.buffers[gcc->vars.buffer_cur];
185 for (i = 0; i < gcc->shader->out.count; i++)
189 gcc->vars.buffer_cur++;
190 gcc->vars.buffer_cur %= gcc->vars.buffer_needed;
194 gs_write_so(struct gs_compile_context *gcc,
200 struct toy_compiler *tc = &gcc->tc;
204 mrf_header = tdst_d(tdst(TOY_FILE_MRF, gcc->first_free_mrf, 0));
223 gs_write_vue(struct gs_compile_context *gcc,
228 struct toy_compiler *tc = &gcc->tc;
233 mrf_header = tdst_d(tdst(TOY_FILE_MRF, gcc->first_free_mrf, 0));
237 int mrf = gcc->first_free_mrf + 1;
238 const int mrf_avail = gcc->last_free_mrf - mrf + 1;
252 if (sent + i * 2 + 1 < gcc->shader->out.count) {
281 gs_ff_sync(struct gs_compile_context *gcc, struct toy_dst dst,
284 struct toy_compiler *tc = &gcc->tc;
286 tdst_d(tdst(TOY_FILE_MRF, gcc->first_free_mrf, 0));
290 gs_COPY8(tc, mrf_header, gcc->payload.header);
293 if (gcc->write_so) {
296 (num_prims.val32 * gcc->in_vue_count) << 16 | num_prims.val32;
301 struct toy_dst m0_0 = tdst_d(gcc->vars.tmp);
303 tc_MUL(tc, m0_0, num_prims, tsrc_imm_d(gcc->in_vue_count << 16));
311 if (gcc->write_vue)
332 gs_discard(struct gs_compile_context *gcc)
334 struct toy_compiler *tc = &gcc->tc;
338 mrf_header = tdst_d(tdst(TOY_FILE_MRF, gcc->first_free_mrf, 0));
340 gs_COPY8(tc, mrf_header, tsrc_from(gcc->vars.urb_write_header));
351 gs_lower_opcode_endprim(struct gs_compile_context *gcc, struct toy_inst *inst)
357 gs_lower_opcode_emit_vue_dynamic(struct gs_compile_context *gcc)
370 gs_lower_opcode_emit_so_dynamic(struct gs_compile_context *gcc)
372 struct toy_compiler *tc = &gcc->tc;
375 tsrc_from(gcc->dynamic_data.num_vertices_in_prim),
376 tsrc_imm_d(gcc->out_vue_min_count),
380 tc_ADD(tc, gcc->vars.tmp, tsrc_from(gcc->vars.so_index), tsrc_imm_d(0x03020100));
387 tc_ADD(tc, gcc->vars.so_index,
388 tsrc_from(gcc->vars.so_index), tsrc_imm_d(gcc->out_vue_min_count));
392 gs_lower_opcode_emit_vue_static(struct gs_compile_context *gcc)
394 struct toy_compiler *tc = &gcc->tc;
398 eot = (gcc->static_data.num_vertices == gcc->static_data.total_vertices);
400 gcc->vars.prim_end =
401 ((gcc->static_data.last_vertex[(gcc->static_data.num_vertices - 1) / 32] &
402 1 << ((gcc->static_data.num_vertices - 1) % 32)) != 0);
404 if (eot && gcc->write_so) {
405 inst2 = tc_OR(tc, tdst_offset(gcc->vars.urb_write_header, 0, 2),
406 tsrc_from(gcc->vars.so_written),
407 tsrc_imm_d(gcc->vars.prim_type << 2 |
408 gcc->vars.prim_start << 1 |
409 gcc->vars.prim_end));
415 gs_COPY1(tc, gcc->vars.urb_write_header, 2,
416 tsrc_imm_d(gcc->vars.prim_type << 2 |
417 gcc->vars.prim_start << 1 |
418 gcc->vars.prim_end), 0);
421 gs_write_vue(gcc, tdst_d(gcc->vars.tmp),
422 tsrc_from(gcc->vars.urb_write_header),
423 gcc->vars.tgsi_outs,
424 gcc->shader->out.count, eot);
427 gs_COPY1(tc, gcc->vars.urb_write_header, 0,
428 tsrc_from(tdst_d(gcc->vars.tmp)), 0);
431 gcc->vars.prim_start = gcc->vars.prim_end;
432 gcc->vars.prim_end = false;
436 gs_lower_opcode_emit_so_static(struct gs_compile_context *gcc)
438 struct toy_compiler *tc = &gcc->tc;
442 if (gcc->static_data.num_vertices_in_prim < gcc->out_vue_min_count)
445 inst = tc_MOV(tc, tdst_w(gcc->vars.tmp), tsrc_imm_v(0x03020100));
449 tc_ADD(tc, tdst_d(gcc->vars.tmp), tsrc_from(tdst_d(gcc->vars.tmp)),
450 tsrc_rect(tsrc_from(gcc->vars.so_index), TOY_RECT_010));
453 tsrc_rect(tsrc_offset(tsrc_from(tdst_d(gcc->vars.tmp)), 0, gcc->out_vue_min_count - 1), TOY_RECT_010),
454 tsrc_rect(tsrc_offset(gcc->payload.svbi, 0, 4), TOY_RECT_010),
457 for (i = 0; i < gcc->out_vue_min_count; i++) {
458 for (j = 0; j < gcc->so_info->num_outputs; j++) {
459 const int idx = gcc->so_info->output[j].register_index;
464 index = tsrc_d(tsrc_offset(tsrc_from(gcc->vars.tmp), 0, i));
466 if (i == gcc->out_vue_min_count - 1) {
467 out = gcc->vars.tgsi_outs[idx];
470 /* gcc->vars.buffer_cur also points to the first vertex */
472 (gcc->vars.buffer_cur + i) % gcc->vars.buffer_needed;
474 out = tsrc_offset(tsrc_from(gcc->vars.buffers[buf]), idx, 0);
477 out = tsrc_offset(out, 0, gcc->so_info->output[j].start_component);
486 (gcc->static_data.num_vertices == gcc->static_data.total_vertices &&
487 i == gcc->out_vue_min_count - 1 &&
488 j == gcc->so_info->num_outputs - 1);
491 binding_table_index = gcc->shader->bt.gen6_so_base + j;
493 gs_write_so(gcc, gcc->vars.tmp, index,
505 tc_MOV(tc, gcc->vars.tmp, tsrc_from(gcc->vars.tmp));
510 tc_ADD(tc, gcc->vars.so_written,
511 tsrc_from(gcc->vars.so_written), tsrc_imm_d(1 << 16));
512 tc_ADD(tc, gcc->vars.so_index,
513 tsrc_from(gcc->vars.so_index), tsrc_imm_d(gcc->out_vue_min_count));
519 gs_lower_opcode_emit_static(struct gs_compile_context *gcc,
522 gcc->static_data.num_vertices++;
523 gcc->static_data.num_vertices_in_prim++;
525 if (gcc->write_so) {
526 gs_lower_opcode_emit_so_static(gcc);
528 if (gcc->out_vue_min_count > 1 &&
529 gcc->static_data.num_vertices != gcc->static_data.total_vertices)
530 gs_save_output(gcc, gcc->vars.tgsi_outs);
533 if (gcc->write_vue)
534 gs_lower_opcode_emit_vue_static(gcc);
538 gs_lower_opcode_emit_dynamic(struct gs_compile_context *gcc,
541 struct toy_compiler *tc = &gcc->tc;
543 tc_ADD(tc, gcc->dynamic_data.num_vertices,
544 tsrc_from(gcc->dynamic_data.num_vertices), tsrc_imm_d(1));
545 tc_ADD(tc, gcc->dynamic_data.num_vertices_in_prim,
546 tsrc_from(gcc->dynamic_data.num_vertices_in_prim), tsrc_imm_d(1));
548 if (gcc->write_so) {
549 gs_lower_opcode_emit_so_dynamic(gcc);
551 if (gcc->out_vue_min_count > 1)
552 gs_save_output(gcc, gcc
555 if (gcc->write_vue)
556 gs_lower_opcode_emit_vue_dynamic(gcc);
560 gs_lower_opcode_emit(struct gs_compile_context *gcc, struct toy_inst *inst)
562 if (gcc->is_static)
563 gs_lower_opcode_emit_static(gcc, inst);
565 gs_lower_opcode_emit_dynamic(gcc, inst);
569 gs_lower_opcode_tgsi_in(struct gs_compile_context *gcc,
572 struct toy_compiler *tc = &gcc->tc;
576 slot = toy_tgsi_find_input(&gcc->tgsi, idx);
580 for (i = 0; i < gcc->variant->u.gs.num_inputs; i++) {
581 if (gcc->variant->u.gs.semantic_names[i] ==
582 gcc->tgsi.inputs[slot].semantic_name &&
583 gcc->variant->u.gs.semantic_indices[i] ==
584 gcc->tgsi.inputs[slot].semantic_index) {
598 if (gcc->in_vue_count == 3 && dim < 2) {
602 inst = tc_AND(tc, tdst_d(gcc->vars.tmp),
603 tsrc_offset(gcc->payload.header, 0, 2), tsrc_imm_d(0x1f));
608 inst = tc_CMP(tc, tdst_null(), tsrc_from(tdst_d(gcc->vars.tmp)),
612 attr = tsrc_offset(gcc->payload.vues[dim], reg, subreg);
619 attr = tsrc_offset(gcc->payload.vues[dim], reg, subreg);
625 attr = tsrc_offset(gcc->payload.vues[dim], reg, subreg);
633 gs_lower_opcode_tgsi_imm(struct gs_compile_context *gcc,
639 imm = toy_tgsi_get_imm(&gcc->tgsi, idx, NULL);
645 inst = tc_MOV(&gcc->tc,
653 gs_lower_opcode_tgsi_direct(struct gs_compile_context *gcc,
656 struct toy_compiler *tc = &gcc->tc;
667 gs_lower_opcode_tgsi_in(gcc, inst->dst, dim, idx);
672 for (i = 1; i < gcc->in_vue_count; i++) {
673 const int vrf = toy_tgsi_get_vrf(&gcc->tgsi, TGSI_FILE_INPUT, i, idx);
680 gs_lower_opcode_tgsi_in(gcc, dst, i, idx);
686 gs_lower_opcode_tgsi_imm(gcc, inst->dst, idx);
699 gs_lower_virtual_opcodes(struct gs_compile_context *gcc)
701 struct toy_compiler *tc = &gcc->tc;
711 gs_lower_opcode_tgsi_direct(gcc, inst);
747 gs_lower_opcode_emit(gcc, inst);
751 gs_lower_opcode_endprim(gcc, inst);
791 get_num_prims_static(struct gs_compile_context *gcc)
793 struct toy_compiler *tc = &gcc->tc;
818 gcc->static_data.total_vertices++;
821 if (num_vertices_in_prim >= gcc->out_vue_min_count)
822 gcc->static_data.total_prims++;
830 const int vertidx = gcc->static_data.total_vertices - 1;
834 gcc->static_data.last_vertex[idx] |= 1 << subidx;
846 gcc->is_static = is_static;
853 gs_compile(struct gs_compile_context *gcc)
855 struct toy_compiler *tc = &gcc->tc;
856 struct ilo_shader *sh = gcc->shader;
858 get_num_prims_static(gcc);
860 if (gcc->is_static) {
863 gs_init_vars(gcc);
864 gs_ff_sync(gcc, tdst_d(gcc->vars.tmp), tsrc_imm_d(gcc->static_data.total_prims));
865 gs_COPY1(tc, gcc->vars.urb_write_header, 0, tsrc_from(tdst_d(gcc->vars.tmp)), 0);
866 if (gcc->write_so)
867 gs_COPY4(tc, gcc->vars.so_index, 0, tsrc_from(tdst_d(gcc->vars.tmp)), 1);
876 if (!gcc->write_vue)
877 gs_discard(gcc);
879 gs_lower_virtual_opcodes(gcc);
883 gcc->first_free_grf,
884 gcc->last_free_grf,
913 gs_compile_passthrough(struct gs_compile_context *gcc)
915 struct toy_compiler *tc = &gcc->tc;
916 struct ilo_shader *sh = gcc->shader;
918 gcc->is_static = true;
919 gcc->static_data.total_vertices = gcc->in_vue_count;
920 gcc->static_data.total_prims = 1;
921 gcc->static_data.last_vertex[0] = 1 << (gcc->in_vue_count - 1);
923 gs_init_vars(gcc);
924 gs_ff_sync(gcc, tdst_d(gcc->vars.tmp), tsrc_imm_d(gcc->static_data.total_prims));
925 gs_COPY1(tc, gcc->vars.urb_write_header, 0, tsrc_from(tdst_d(gcc->vars.tmp)), 0);
926 if (gcc->write_so)
927 gs_COPY4(tc, gcc->vars.so_index, 0, tsrc_from(tdst_d(gcc->vars.tmp)), 1);
932 for (vert = 0; vert < gcc->out_vue_min_count; vert++) {
933 for (attr = 0; attr < gcc->shader->out.count; attr++) {
934 tc_MOV(tc, tdst_from(gcc->vars.tgsi_outs[attr]),
935 tsrc_offset(gcc->payload.vues[vert], attr / 2, (attr % 2) * 4));
938 gs_lower_opcode_emit(gcc, NULL);
941 gs_lower_opcode_endprim(gcc, NULL);
944 if (!gcc->write_vue)
945 gs_discard(gcc);
947 gs_lower_virtual_opcodes(gcc);
952 gcc->first_free_grf,
953 gcc->last_free_grf,
967 gcc->in_vue_count, gcc->in_vue_size);
969 (gcc->variant->u.gs.rasterizer_discard) ? "" : "no ");
971 for (i = 0; i < gcc->so_info->num_outputs; i++) {
973 gcc->so_info->output[i].register_index);
1166 gs_setup_vars(struct gs_compile_context *gcc)
1168 int grf = gcc->first_free_grf;
1171 gcc->vars.urb_write_header = tdst_d(tdst(TOY_FILE_GRF, grf, 0));
1174 gcc->vars.tmp = tdst(TOY_FILE_GRF, grf, 0);
1177 if (gcc->write_so) {
1178 gcc->vars.buffer_needed = gcc->out_vue_min_count - 1;
1179 for (i = 0; i < gcc->vars.buffer_needed; i++) {
1180 gcc->vars.buffers[i] = tdst(TOY_FILE_GRF, grf, 0);
1181 grf += gcc->shader->out.count;
1184 gcc->vars.so_written = tdst_d(tdst(TOY_FILE_GRF, grf, 0));
1187 gcc->vars.so_index = tdst_d(tdst(TOY_FILE_GRF, grf, 0));
1191 gcc->first_free_grf = grf;
1193 if (!gcc->tgsi.reg_mapping) {
1194 for (i = 0; i < gcc->shader->out.count; i++)
1195 gcc->vars.tgsi_outs[i] = tsrc(TOY_FILE_GRF, grf++, 0);
1197 gcc->first_free_grf = grf;
1201 for (i = 0; i < gcc->shader->out.count; i++) {
1202 const int slot = gcc->output_map[i];
1203 const int vrf = (slot >= 0) ? toy_tgsi_get_vrf(&gcc->tgsi,
1204 TGSI_FILE_OUTPUT, 0, gcc->tgsi.outputs[slot].index) : -1;
1207 gcc->vars.tgsi_outs[i] = tsrc(TOY_FILE_VRF, vrf, 0);
1209 gcc->vars.tgsi_outs[i] = (i == 0) ? tsrc_imm_d(0) : tsrc_imm_f(0.0f);
1214 gs_setup_payload(struct gs_compile_context *gcc)
1221 gcc->payload.header = tsrc_d(tsrc(TOY_FILE_GRF, grf, 0));
1225 if (gcc->write_so) {
1226 gcc->payload.svbi = tsrc_ud(tsrc(TOY_FILE_GRF, grf, 0));
1231 gcc->shader->in.start_grf = grf;
1236 for (i = 0; i < gcc->in_vue_count; i++) {
1237 gcc->payload.vues[i] = tsrc(TOY_FILE_GRF, grf, 0);
1238 grf += gcc->in_vue_size;
1241 gcc->first_free_grf = grf;
1242 gcc->last_free_grf = 127;
1249 gs_setup(struct gs_compile_context *gcc,
1254 memset(gcc, 0, sizeof(*gcc));
1256 gcc->shader = CALLOC_STRUCT(ilo_shader);
1257 if (!gcc->shader)
1260 gcc->variant = variant;
1261 gcc->so_info = &state->info.stream_output;
1263 toy_compiler_init(&gcc->tc, state->info.dev);
1265 gcc->write_so = (state->info.stream_output.num_outputs > 0);
1266 gcc->write_vue = !gcc->variant->u.gs.rasterizer_discard;
1268 gcc->tc.templ.access_mode = GEN6_ALIGN_16;
1269 gcc->tc.templ.exec_size = GEN6_EXECSIZE_4;
1270 gcc->tc.rect_linear_width = 4;
1273 if (!gs_setup_tgsi(&gcc->tc, state->info.tokens, &gcc->tgsi)) {
1274 toy_compiler_cleanup(&gcc->tc);
1275 FREE(gcc->shader);
1279 switch (gcc->tgsi.props.gs_input_prim) {
1281 gcc->in_vue_count = 1;
1284 gcc->in_vue_count = 2;
1285 gcc->shader->in.discard_adj = true;
1288 gcc->in_vue_count = 3;
1289 gcc->shader->in.discard_adj = true;
1292 gcc->in_vue_count = 4;
1295 gcc->in_vue_count = 6;
1298 tc_fail(&gcc->tc, "unsupported GS input type");
1299 gcc->in_vue_count = 0;
1303 switch (gcc->tgsi.props.gs_output_prim) {
1305 gcc->out_vue_min_count = 1;
1308 gcc->out_vue_min_count = 2;
1311 gcc->out_vue_min_count = 3;
1314 tc_fail(&gcc->tc, "unsupported GS output type");
1315 gcc->out_vue_min_count = 0;
1322 gcc->in_vue_count = num_verts;
1323 gcc->out_vue_min_count = num_verts;
1325 gcc->tgsi.num_outputs = gcc->variant->u.gs.num_inputs;
1326 for (i = 0; i < gcc->variant->u.gs.num_inputs; i++) {
1327 gcc->tgsi.outputs[i].semantic_name =
1328 gcc->variant->u.gs.semantic_names[i];
1329 gcc->tgsi.outputs[i].semantic_index =
1330 gcc->variant->u.gs.semantic_indices[i];
1334 gcc->tc.templ.access_mode = GEN6_ALIGN_1;
1336 gs_setup_shader_in(gcc->shader, gcc->variant);
1337 gs_setup_shader_out(gcc->shader, &gcc->tgsi, false, gcc->output_map);
1339 gcc->in_vue_size = (gcc->shader->in.count + 1) / 2;
1341 gcc->out_vue_size = (gcc->shader->out.count + 1) / 2;
1343 gs_setup_payload(gcc);
1344 gs_setup_vars(gcc);
1347 gcc->first_free_mrf = 1;
1348 gcc->last_free_mrf = 15;
1350 gcc->shader->bt.gen6_so_base = 0;
1351 gcc->shader->bt.gen6_so_count = gcc->so_info->num_outputs;
1353 gcc->shader->bt.total_count = gcc->shader->bt.gen6_so_count;
1365 struct gs_compile_context gcc;
1367 if (!gs_setup(&gcc, state, variant, 0))
1370 if (!gs_compile(&gcc)) {
1371 FREE(gcc.shader);
1372 gcc.shader = NULL;
1375 toy_tgsi_cleanup(&gcc.tgsi);
1376 toy_compiler_cleanup(&gcc.tc);
1378 return gcc.shader;
1418 struct gs_compile_context gcc;
1443 if (!gs_setup(&gcc, &state, &variant, num_verts))
1446 if (!gs_compile_passthrough(&gcc)) {
1447 FREE(gcc.shader);
1448 gcc.shader = NULL;
1452 toy_compiler_cleanup(&gcc.tc);
1454 return append_gs_to_vs(vs, gcc.shader, num_verts);