Lines Matching defs:builder
212 get_draw_ctx_data(struct indirect_draw_shader_builder *builder,
215 nir_builder *b = &builder->b;
217 get_address_imm(b, builder->draw.draw_ctx, offset),
222 set_draw_ctx_data(struct indirect_draw_shader_builder *builder,
225 nir_builder *b = &builder->b;
227 get_address_imm(b, builder->draw.draw_ctx, offset),
231 #define get_draw_ctx_field(builder, name) \
232 get_draw_ctx_data(builder, \
236 #define set_draw_ctx_field(builder, name, val) \
237 set_draw_ctx_data(builder, \
243 get_min_max_ctx_data(struct indirect_draw_shader_builder *builder,
246 nir_builder *b = &builder->b;
248 get_address_imm(b, builder->draw.min_max_ctx, offset),
252 #define get_min_max_ctx_field(builder, name) \
253 get_min_max_ctx_data(builder, \
258 update_min(struct indirect_draw_shader_builder *builder, nir_ssa_def *val)
260 nir_builder *b = &builder->b;
263 builder->draw.min_max_ctx,
269 update_max(struct indirect_draw_shader_builder *builder, nir_ssa_def *val)
271 nir_builder *b = &builder->b;
274 builder->draw.min_max_ctx,
292 extract_inputs(struct indirect_draw_shader_builder *builder)
294 nir_builder *b = &builder->b;
296 builder->draw.draw_ctx = get_input_field(b, draw_ctx);
297 builder->draw.draw_buf = get_input_field(b, draw_buf);
298 builder->draw.draw_buf_stride = get_input_field(b, draw_buf_stride);
300 if (builder->index_size) {
301 builder->draw.index_buf = get_input_field(b, index_buf);
302 builder->draw.min_max_ctx = get_input_field(b, min_max_ctx);
303 if (builder->flags & PAN_INDIRECT_DRAW_PRIMITIVE_RESTART) {
304 builder->draw.restart_index =
309 if (builder->index_min_max_search)
312 builder->jobs.first_vertex_sysval = get_input_field(b, first_vertex_sysval);
313 builder->jobs.base_vertex_sysval = get_input_field(b, base_vertex_sysval);
314 builder->jobs.base_instance_sysval = get_input_field(b, base_instance_sysval);
315 builder->jobs.vertex_job = get_input_field(b, vertex_job);
316 builder->jobs.tiler_job = get_input_field(b, tiler_job);
317 builder->attribs.attrib_bufs = get_input_field(b, attrib_bufs);
318 builder->attribs.attribs = get_input_field(b, attribs);
319 builder->attribs.attrib_count = get_input_field(b, attrib_count);
320 builder->varyings.varying_bufs = get_input_field(b, varying_bufs);
321 builder->varyings.mem_ptr =
325 nir_store_var(b, builder->varyings.mem_ptr,
326 get_draw_ctx_field(builder, varying_mem), 3);
330 init_shader_builder(struct indirect_draw_shader_builder *builder,
335 memset(builder, 0, sizeof(*builder));
336 builder->dev = dev;
337 builder->flags = flags;
338 builder->index_size = index_size;
340 builder->index_min_max_search = index_min_max_search;
343 builder->b =
347 builder->index_size);
349 builder->b =
353 builder->index_size,
364 extract_inputs(builder);
368 update_dcd(struct indirect_draw_shader_builder *builder,
372 nir_builder *b = &builder->b;
380 nir_ult(b, builder->draw.instance_count, nir_imm_int(b, 2)),
381 nir_imm_int(b, 0), builder->instance_size.packed);
385 builder->jobs.offset_start);
391 update_job(struct indirect_draw_shader_builder *builder, enum mali_job_type type)
393 nir_builder *b = &builder->b;
396 builder->jobs.vertex_job : builder->jobs.tiler_job;
400 builder->jobs.invocation, 2);
408 unsigned index_size = builder->index_size;
414 builder->jobs.base_vertex_offset, 1);
417 nir_iadd_imm(b, builder->draw.vertex_count, -1), 1);
424 nir_imul_imm(b, builder->draw.vertex_start, index_size);
431 if ((builder->flags & PAN_INDIRECT_DRAW_HAS_PSIZ) &&
432 (builder->flags & PAN_INDIRECT_DRAW_UPDATE_PRIM_SIZE)) {
435 builder->varyings.psiz_ptr, 2);
440 builder->varyings.pos_ptr, 2);
443 update_dcd(builder, job_ptr, draw_offset);
445 if (builder->flags & PAN_INDIRECT_DRAW_IDVS) {
448 update_dcd(builder, job_ptr,
473 update_vertex_attrib_buf(struct indirect_draw_shader_builder *builder,
479 nir_builder *b = &builder->b;
507 zero_attrib_buf_stride(struct indirect_draw_shader_builder *builder,
511 nir_builder *b = &builder->b;
517 adjust_attrib_offset(struct indirect_draw_shader_builder *builder,
521 nir_builder *b = &builder->b;
525 nir_iand(b, nir_ine(b, builder->jobs.offset_start, zero),
526 nir_uge(b, builder->draw.instance_count, two));
529 nir_iand(b, nir_ine(b, builder->draw.start_instance, zero),
546 builder->draw.start_instance),
553 builder->jobs.offset_start));
572 update_vertex_attribs(struct indirect_draw_shader_builder *builder)
574 nir_builder *b = &builder->b;
582 nir_ult(b, builder->draw.instance_count, nir_imm_int(b, 2));
587 IF (nir_uge(b, attrib_idx, builder->attribs.attrib_count))
592 get_address(b, builder->attribs.attrib_bufs,
596 get_address(b, builder->attribs.attribs,
607 builder->instance_size.packed);
619 split_div(b, builder->instance_size.padded,
624 builder->instance_size.padded,
643 nir_ssa_def *div = nir_imul(b, instance_div, builder->instance_size.padded);
646 nir_uge(b, builder->draw.instance_count, nir_imm_int(b, 2));
654 update_vertex_attrib_buf(builder, attrib_buf_ptr,
659 update_vertex_attrib_buf(builder, attrib_buf_ptr,
666 zero_attrib_buf_stride(builder, attrib_buf_ptr);
669 adjust_attrib_offset(builder, attrib_ptr, attrib_buf_ptr, instance_div);
671 update_vertex_attrib_buf(builder, attrib_buf_ptr,
673 builder->instance_size.packed, NULL);
681 update_varying_buf(struct indirect_draw_shader_builder *builder,
685 nir_builder *b = &builder->b;
693 nir_load_var(b, builder->varyings.mem_ptr);
701 nir_store_var(b, builder->varyings.mem_ptr,
710 update_varyings(struct indirect_draw_shader_builder *builder)
712 nir_builder *b = &builder->b;
714 nir_imul(b, builder->instance_size.padded,
715 builder->draw.instance_count);
717 get_address_imm(b, builder->varyings.varying_bufs,
720 update_varying_buf(builder, buf_ptr, vertex_count);
722 buf_ptr = get_address_imm(b, builder->varyings.varying_bufs,
725 builder->varyings.pos_ptr =
726 update_varying_buf(builder, buf_ptr, vertex_count);
728 if (builder->flags & PAN_INDIRECT_DRAW_HAS_PSIZ) {
729 buf_ptr = get_address_imm(b, builder->varyings.varying_bufs,
732 builder->varyings.psiz_ptr =
733 update_varying_buf(builder, buf_ptr, vertex_count);
736 set_draw_ctx_field(builder, varying_mem,
737 nir_load_var(b, builder->varyings.mem_ptr));
743 get_invocation(struct indirect_draw_shader_builder *builder)
745 nir_builder *b = &builder->b;
748 nir_usub_sat(b, builder->instance_size.raw, one);
750 nir_usub_sat(b, builder->draw.instance_count, one);
756 builder->jobs.invocation =
803 update_jobs(struct indirect_draw_shader_builder *builder)
805 get_invocation(builder);
807 if (!(builder->flags & PAN_INDIRECT_DRAW_IDVS))
808 update_job(builder, MALI_JOB_TYPE_VERTEX);
810 update_job(builder, MALI_JOB_TYPE_TILER);
815 set_null_job(struct indirect_draw_shader_builder *builder,
818 nir_builder *b = &builder->b;
829 get_instance_size(struct indirect_draw_shader_builder *builder)
831 nir_builder *b = &builder->b;
833 if (!builder->index_size) {
834 builder->jobs.base_vertex_offset = nir_imm_int(b, 0);
835 builder->jobs.offset_start = builder->draw.vertex_start;
836 builder->instance_size.raw = builder->draw.vertex_count;
840 unsigned index_size = builder->index_size;
841 nir_ssa_def *min = get_min_max_ctx_field(builder, min);
842 nir_ssa_def *max = get_min_max_ctx_field(builder, max);
847 if (builder->index_size < 4) {
856 get_address(b, builder->draw.index_buf,
857 nir_imul_imm(b, builder->draw.vertex_start, index_size));
861 nir_imul_imm(b, builder->draw.vertex_count, index_size));
924 builder->jobs.base_vertex_offset = nir_ineg(b, min);
925 builder->jobs.offset_start = nir_iadd(b, min, builder->draw.index_bias);
926 builder->instance_size.raw = nir_iadd_imm(b, nir_usub_sat(b, max, min), 1);
932 patch(struct indirect_draw_shader_builder *builder)
934 unsigned index_size = builder->index_size;
935 nir_builder *b = &builder->b;
937 nir_ssa_def *draw_ptr = builder->draw.draw_buf;
940 builder->draw.vertex_count = get_indexed_draw_field(b, draw_ptr, count);
941 builder->draw.start_instance = get_indexed_draw_field(b, draw_ptr, start_instance);
942 builder->draw.instance_count =
944 builder->draw.vertex_start = get_indexed_draw_field(b, draw_ptr, start);
945 builder->draw.index_bias = get_indexed_draw_field(b, draw_ptr, index_bias);
947 builder->draw.vertex_count = get_draw_field(b, draw_ptr, count);
948 builder->draw.start_instance = get_draw_field(b, draw_ptr, start_instance);
949 builder->draw.instance_count = get_draw_field(b, draw_ptr, instance_count);
950 builder->draw.vertex_start = get_draw_field(b, draw_ptr, start);
953 assert(builder->draw.vertex_count->num_components);
956 nir_imul(b, builder->draw.vertex_count, builder->draw.instance_count);
962 if (!(builder->flags & PAN_INDIRECT_DRAW_IDVS))
963 set_null_job(builder, builder->jobs.vertex_job);
965 set_null_job(builder, builder->jobs.tiler_job);
967 get_instance_size(builder);
969 nir_ssa_def *count = builder->instance_size.raw;
972 if (builder->flags & PAN_INDIRECT_DRAW_IDVS)
975 builder->instance_size.padded =
977 &builder->instance_size.packed);
979 update_varyings(builder);
980 update_jobs(builder);
981 update_vertex_attribs(builder);
983 IF (nir_ine(b, builder->jobs.first_vertex_sysval, nir_imm_int64(b, 0))) {
984 store_global(b, builder->jobs.first_vertex_sysval,
985 builder->jobs.offset_start, 1);
988 IF (nir_ine(b, builder->jobs.base_vertex_sysval, nir_imm_int64(b, 0))) {
989 store_global(b, builder->jobs.base_vertex_sysval,
991 builder->draw.index_bias :
996 IF (nir_ine(b, builder->jobs.base_instance_sysval, nir_imm_int64(b, 0))) {
997 store_global(b, builder->jobs.base_instance_sysval,
998 builder->draw.start_instance, 1);
1006 get_index_min_max(struct indirect_draw_shader_builder *builder)
1008 nir_ssa_def *restart_index = builder->draw.restart_index;
1009 unsigned index_size = builder->index_size;
1010 nir_builder *b = &builder->b;
1012 nir_ssa_def *draw_ptr = builder->draw.draw_buf;
1014 builder->draw.vertex_count = get_draw_field(b, draw_ptr, count);
1015 builder->draw.vertex_start = get_draw_field(b, draw_ptr, start);
1026 get_address(b, builder->draw.index_buf,
1027 nir_imul_imm(b, builder->draw.vertex_start, index_size));
1032 nir_iadd(b, start, nir_imul_imm(b, builder->draw.vertex_count, index_size));
1080 update_min(builder, nir_load_var(b, min_var));
1081 update_max(builder, nir_load_var(b, max_var));
1108 struct indirect_draw_shader_builder builder;
1109 init_shader_builder(&builder, dev, flags, index_size, index_min_max_search);
1111 nir_builder *b = &builder.b;
1114 get_index_min_max(&builder);
1116 patch(&builder);