Lines Matching defs:shader
71 draw_gs_should_flush(struct draw_geometry_shader *shader)
73 return (shader->fetched_prim_count == shader->vector_length || shader->num_invocations > 1);
78 tgsi_fetch_gs_outputs(struct draw_geometry_shader *shader,
83 struct tgsi_exec_machine *machine = shader->machine;
95 shader->stream[stream].primitive_lengths[prim_idx + shader->stream[stream].emitted_primitives] =
97 shader->stream[stream].emitted_vertices += num_verts_per_prim;
100 int idx = prim_offset + j * shader->info.num_outputs;
102 debug_printf("%d/%d) Output vert:\n", stream, idx / shader->info.num_outputs);
104 for (slot = 0; slot < shader->info.num_outputs; slot++) {
117 output = (float (*)[4])((char *)output + shader->vertex_size);
121 shader->stream[stream].emitted_primitives += num_primitives;
125 static void tgsi_fetch_gs_input(struct draw_geometry_shader *shader,
130 struct tgsi_exec_machine *machine = shader->machine;
133 unsigned input_vertex_stride = shader->input_vertex_stride;
139 machine->SystemValue[primid_sv].xyzw[0].i[j] = shader->in_prim_idx;
142 input_ptr = shader->input;
152 for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; ++slot) {
154 if (shader->info.input_semantic_name[slot] == TGSI_SEMANTIC_PRIMID) {
155 machine->Inputs[idx].xyzw[0].u[prim_idx] = shader->in_prim_idx;
156 machine->Inputs[idx].xyzw[1].u[prim_idx] = shader->in_prim_idx;
157 machine->Inputs[idx].xyzw[2].u[prim_idx] = shader->in_prim_idx;
158 machine->Inputs[idx].xyzw[3].u[prim_idx] = shader->in_prim_idx;
161 shader->info.input_semantic_name[slot],
162 shader->info.input_semantic_index[slot],
163 shader->input_info);
197 static void tgsi_gs_prepare(struct draw_geometry_shader *shader,
201 struct tgsi_exec_machine *machine = shader->machine;
206 static void tgsi_gs_run(struct draw_geometry_shader *shader,
210 struct tgsi_exec_machine *machine = shader->machine;
213 if (shader->info.uses_invocationid) {
216 machine->SystemValue[i].xyzw[0].i[j] = shader->invocation_id;
229 llvm_fetch_gs_input(struct draw_geometry_shader *shader,
236 unsigned input_vertex_stride = shader->input_vertex_stride;
238 float (*input_data)[6][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS][TGSI_NUM_CHANNELS] = &shader->gs_input->data;
240 shader->llvm_prim_ids[shader->fetched_prim_count] = shader->in_prim_idx;
242 input_ptr = shader->input;
252 for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; ++slot) {
253 if (shader->info.input_semantic_name[slot] == TGSI_SEMANTIC_PRIMID) {
262 shader->info.input_semantic_name[slot],
263 shader->info.input_semantic_index[slot],
264 shader->input_info);
299 llvm_fetch_gs_outputs(struct draw_geometry_shader *shader,
308 char *output_ptr = (char*)shader->gs_output[stream];
310 unsigned next_prim_boundary = shader->primitive_boundary;
312 for (i = 0; i < shader->vector_length; ++i) {
313 int prims = shader->llvm_emitted_primitives[i + (stream * shader->vector_length)];
317 for (i = 0; i < shader->vector_length; ++i) {
318 total_verts += shader->llvm_emitted_vertices[i + (stream * shader->vector_length)];
321 output_ptr += shader->stream[stream].emitted_vertices * shader->vertex_size;
322 for (i = 0; i < shader->vector_length - 1; ++i) {
323 int current_verts = shader->llvm_emitted_vertices[i + (stream * shader->vector_length)];
324 int next_verts = shader->llvm_emitted_vertices[i + 1 + (stream * shader->vector_length)];
329 (output_ptr + shader->vertex_size * (i * next_prim_boundary + j));
335 assert(current_verts <= shader->max_output_vertices);
336 assert(next_verts <= shader->max_output_vertices);
338 memmove(output_ptr + (vertex_count + current_verts) * shader->vertex_size,
339 output_ptr + ((i + 1) * next_prim_boundary) * shader->vertex_size,
340 shader->vertex_size * next_verts);
349 struct vertex_header *vh = (struct vertex_header *)(output_ptr + shader->vertex_size * i);
351 for (j = 0; j < shader->info.num_outputs; ++j) {
363 for (i = 0; i < shader->vector_length; ++i) {
364 int num_prims = shader->llvm_emitted_primitives[i + (stream * shader->vector_length)];
367 shader->llvm_prim_lengths[j * shader->num_vertex_streams + stream][i];
368 shader->stream[stream].primitive_lengths[shader->stream[stream].emitted_primitives + prim_idx] =
374 shader->stream[stream].emitted_primitives += total_prims;
375 shader->stream[stream].emitted_vertices += total_verts;
379 llvm_gs_prepare(struct draw_geometry_shader *shader,
386 llvm_gs_run(struct draw_geometry_shader *shader,
390 for (unsigned i = 0; i < shader->num_vertex_streams; i++) {
391 char *tmp = (char *)shader->gs_output[i];
392 tmp += shader->stream[i].emitted_vertices * shader->vertex_size;
396 shader->current_variant->jit_func(
397 shader->jit_context, shader->gs_input->data,
400 shader->draw->instance_id,
401 shader->llvm_prim_ids,
402 shader->invocation_id,
403 shader->draw->pt.user.viewid);
405 for (unsigned i = 0; i < shader->num_vertex_streams; i++) {
406 out_prims[i] = shader->jit_context->emitted_prims[i];
412 static void gs_flush(struct draw_geometry_shader *shader)
416 unsigned input_primitives = shader->fetched_prim_count;
418 if (shader->draw->collect_statistics) {
419 shader->draw->statistics.gs_invocations += input_primitives;
425 for (unsigned invocation = 0; invocation < shader->num_invocations; invocation++) {
426 shader->invocation_id = invocation;
427 shader->run(shader, input_primitives, out_prim_count);
428 for (i = 0; i < shader->num_vertex_streams; i++) {
429 shader->fetch_outputs(shader, i, out_prim_count[i],
430 &shader->stream[i].tmp_output);
435 for (i = 0; i < shader->num_vertex_streams; i++) {
438 shader->stream[i].emitted_primitives, shader->stream[i].emitted_vertices,
443 shader->fetched_prim_count = 0;
446 static void gs_point(struct draw_geometry_shader *shader,
453 shader->fetch_inputs(shader, indices, 1,
454 shader->fetched_prim_count);
455 ++shader->in_prim_idx;
456 ++shader->fetched_prim_count;
458 if (draw_gs_should_flush(shader))
459 gs_flush(shader);
462 static void gs_line(struct draw_geometry_shader *shader,
470 shader->fetch_inputs(shader, indices, 2,
471 shader->fetched_prim_count);
472 ++shader->in_prim_idx;
473 ++shader->fetched_prim_count;
475 if (draw_gs_should_flush(shader))
476 gs_flush(shader);
479 static void gs_line_adj(struct draw_geometry_shader *shader,
489 shader->fetch_inputs(shader, indices, 4,
490 shader->fetched_prim_count);
491 ++shader->in_prim_idx;
492 ++shader->fetched_prim_count;
494 if (draw_gs_should_flush(shader))
495 gs_flush(shader);
498 static void gs_tri(struct draw_geometry_shader *shader,
507 shader->fetch_inputs(shader, indices, 3,
508 shader->fetched_prim_count);
509 ++shader->in_prim_idx;
510 ++shader->fetched_prim_count;
512 if (draw_gs_should_flush(shader))
513 gs_flush(shader);
516 static void gs_tri_adj(struct draw_geometry_shader *shader,
529 shader->fetch_inputs(shader, indices, 6,
530 shader->fetched_prim_count);
531 ++shader->in_prim_idx;
532 ++shader->fetched_prim_count;
534 if (draw_gs_should_flush(shader))
535 gs_flush(shader);
550 * Execute geometry shader.
552 int draw_geometry_shader_run(struct draw_geometry_shader *shader,
563 unsigned num_outputs = draw_total_gs_outputs(shader->draw);
572 u_decomposed_prims_for_vertices(shader->input_primitive,
574 shader->vector_length);
576 u_decomposed_prims_for_vertices(shader->output_primitive,
577 shader->max_output_vertices)
581 unsigned total_verts_per_buffer = shader->primitive_boundary *
587 for (i = 0; i < shader->num_vertex_streams; i++) {
593 total_verts_per_buffer * shader->num_invocations +
601 shader->num_invocations, shader->num_vertex_streams);
604 debug_printf("\tprim pipe = %s, shader in = %s, shader out = %s\n",
606 u_prim_name(shader->input_primitive),
607 u_prim_name(shader->output_primitive));
610 shader->max_output_vertices, max_out_prims,
611 shader->primitive_boundary, output_verts->vertex_size,
615 for (i = 0; i < shader->num_vertex_streams; i++) {
616 shader->stream[i].emitted_vertices = 0;
617 shader->stream[i].emitted_primitives = 0;
618 FREE(shader->stream[i].primitive_lengths);
619 shader->stream[i].primitive_lengths = MALLOC(max_out_prims * sizeof(unsigned) * shader->num_invocations);
620 shader->stream[i].tmp_output = (float (*)[4])output_verts[i].verts->data;
622 shader->vertex_size = vertex_size;
623 shader->fetched_prim_count = 0;
624 shader->input_vertex_stride = input_stride;
625 shader->input = input;
626 shader->input_info = input_info;
629 if (shader->draw->llvm) {
630 for (i = 0; i < shader->num_vertex_streams; i++) {
631 shader->gs_output[i] = output_verts[i].verts;
633 if (max_out_prims > shader->max_out_prims) {
635 if (shader->llvm_prim_lengths) {
636 for (i = 0; i < shader->num_vertex_streams * shader->max_out_prims; ++i) {
637 align_free(shader->llvm_prim_lengths[i]);
639 FREE(shader->llvm_prim_lengths);
642 shader->llvm_prim_lengths = MALLOC(shader->num_vertex_streams * max_out_prims * sizeof(unsigned*));
643 for (i = 0; i < shader->num_vertex_streams * max_out_prims; ++i) {
644 int vector_size = shader->vector_length * sizeof(unsigned);
645 shader->llvm_prim_lengths[i] =
649 shader->max_out_prims = max_out_prims;
651 shader->jit_context->prim_lengths = shader->llvm_prim_lengths;
652 shader->jit_context->emitted_vertices = shader->llvm_emitted_vertices;
653 shader->jit_context->emitted_prims = shader->llvm_emitted_primitives;
657 shader->prepare(shader, constants, constants_size);
660 gs_run(shader, input_prim, input_verts,
663 gs_run_elts(shader, input_prim, input_verts,
669 if (shader->fetched_prim_count > 0) {
670 gs_flush(shader);
672 assert(shader->fetched_prim_count == 0);
676 for (i = 0; i < shader->num_vertex_streams; i++) {
680 output_prims[i].count = shader->stream[i].emitted_vertices;
681 output_prims[i].prim = shader->output_primitive;
683 output_prims[i].primitive_lengths = shader->stream[i].primitive_lengths;
684 output_prims[i].primitive_count = shader->stream[i].emitted_primitives;
685 output_verts[i].count = shader->stream[i].emitted_vertices;
687 if (shader->draw->collect_statistics) {
689 for (j = 0; j < shader->stream[i].emitted_primitives; ++j) {
690 shader->draw->statistics.gs_primitives +=
691 u_decomposed_prims_for_vertices(shader->output_primitive,
692 shader->stream[i].primitive_lengths[j]);
706 void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
710 if (!use_llvm && shader && shader->machine->Tokens != shader->state.tokens) {
711 tgsi_exec_machine_bind_shader(shader->machine,
712 shader->state.tokens,
835 * the specification says that the geometry shader should exit if the
933 struct llvm_geometry_shader *shader = llvm_geometry_shader(dgs);
936 LIST_FOR_EACH_ENTRY_SAFE(li, next, &shader->variants.list, list) {
940 assert(shader->variants_cached == 0);
971 void draw_gs_set_current_variant(struct draw_geometry_shader *shader,
974 shader->current_variant = variant;