Lines Matching full:shader
70 draw_gs_should_flush(struct draw_geometry_shader *shader)
72 return (shader->fetched_prim_count == shader->vector_length);
77 tgsi_fetch_gs_outputs(struct draw_geometry_shader *shader,
81 struct tgsi_exec_machine *machine = shader->machine;
93 shader->primitive_lengths[prim_idx + shader->emitted_primitives] =
95 shader->emitted_vertices += num_verts_per_prim;
97 int idx = current_idx * shader->info.num_outputs;
99 debug_printf("%d) Output vert:\n", idx / shader->info.num_outputs);
101 for (slot = 0; slot < shader->info.num_outputs; slot++) {
114 output = (float (*)[4])((char *)output + shader->vertex_size);
118 shader->emitted_primitives += num_primitives;
122 static void tgsi_fetch_gs_input(struct draw_geometry_shader *shader,
127 struct tgsi_exec_machine *machine = shader->machine;
130 unsigned input_vertex_stride = shader->input_vertex_stride;
133 input_ptr = shader->input;
143 for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; ++slot) {
145 if (shader->info.input_semantic_name[slot] == TGSI_SEMANTIC_PRIMID) {
146 machine->Inputs[idx].xyzw[0].u[prim_idx] = shader->in_prim_idx;
147 machine->Inputs[idx].xyzw[1].u[prim_idx] = shader->in_prim_idx;
148 machine->Inputs[idx].xyzw[2].u[prim_idx] = shader->in_prim_idx;
149 machine->Inputs[idx].xyzw[3].u[prim_idx] = shader->in_prim_idx;
152 shader->info.input_semantic_name[slot],
153 shader->info.input_semantic_index[slot],
154 shader->input_info);
188 static void tgsi_gs_prepare(struct draw_geometry_shader *shader,
192 struct tgsi_exec_machine *machine = shader->machine;
197 if (shader->info.uses_invocationid) {
200 machine->SystemValue[i].xyzw[0].i[j] = shader->invocation_id;
204 static unsigned tgsi_gs_run(struct draw_geometry_shader *shader,
207 struct tgsi_exec_machine *machine = shader->machine;
219 llvm_fetch_gs_input(struct draw_geometry_shader *shader,
226 unsigned input_vertex_stride = shader->input_vertex_stride;
228 float (*input_data)[6][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS][TGSI_NUM_CHANNELS] = &shader->gs_input->data;
230 shader->llvm_prim_ids[shader->fetched_prim_count] = shader->in_prim_idx;
232 input_ptr = shader->input;
242 for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; ++slot) {
243 if (shader->info.input_semantic_name[slot] == TGSI_SEMANTIC_PRIMID) {
252 shader->info.input_semantic_name[slot],
253 shader->info.input_semantic_index[slot],
254 shader->input_info);
289 llvm_fetch_gs_outputs(struct draw_geometry_shader *shader,
297 char *output_ptr = (char*)shader->gs_output;
299 unsigned next_prim_boundary = shader->primitive_boundary;
301 for (i = 0; i < shader->vector_length; ++i) {
302 int prims = shader->llvm_emitted_primitives[i];
306 for (i = 0; i < shader->vector_length; ++i) {
307 total_verts += shader->llvm_emitted_vertices[i];
310 output_ptr += shader->emitted_vertices * shader->vertex_size;
311 for (i = 0; i < shader->vector_length - 1; ++i) {
312 int current_verts = shader->llvm_emitted_vertices[i];
313 int next_verts = shader->llvm_emitted_vertices[i + 1];
318 (output_ptr + shader->vertex_size * (i * next_prim_boundary + j));
324 debug_assert(current_verts <= shader->max_output_vertices);
325 debug_assert(next_verts <= shader->max_output_vertices);
327 memmove(output_ptr + (vertex_count + current_verts) * shader->vertex_size,
328 output_ptr + ((i + 1) * next_prim_boundary) * shader->vertex_size,
329 shader->vertex_size * next_verts);
338 struct vertex_header *vh = (struct vertex_header *)(output_ptr + shader->vertex_size * i);
340 for (j = 0; j < shader->info.num_outputs; ++j) {
352 for (i = 0; i < shader->vector_length; ++i) {
353 int num_prims = shader->llvm_emitted_primitives[i];
356 shader->llvm_prim_lengths[j][i];
357 shader->primitive_lengths[shader->emitted_primitives + prim_idx] =
363 shader->emitted_primitives += total_prims;
364 shader->emitted_vertices += total_verts;
368 llvm_gs_prepare(struct draw_geometry_shader *shader,
375 llvm_gs_run(struct draw_geometry_shader *shader,
379 char *input = (char*)shader->gs_output;
381 input += (shader->emitted_vertices * shader->vertex_size);
383 ret = shader->current_variant->jit_func(
384 shader->jit_context, shader->gs_input->data,
387 shader->draw->instance_id,
388 shader->llvm_prim_ids,
389 shader->invocation_id);
396 static void gs_flush(struct draw_geometry_shader *shader)
400 unsigned input_primitives = shader->fetched_prim_count;
402 if (shader->draw->collect_statistics) {
403 shader->draw->statistics.gs_invocations += input_primitives;
409 out_prim_count = shader->run(shader, input_primitives);
410 shader->fetch_outputs(shader, out_prim_count,
411 &shader->tmp_output);
415 shader->emitted_primitives, shader->emitted_vertices,
419 shader->fetched_prim_count = 0;
422 static void gs_point(struct draw_geometry_shader *shader,
429 shader->fetch_inputs(shader, indices, 1,
430 shader->fetched_prim_count);
431 ++shader->in_prim_idx;
432 ++shader->fetched_prim_count;
434 if (draw_gs_should_flush(shader))
435 gs_flush(shader);
438 static void gs_line(struct draw_geometry_shader *shader,
446 shader->fetch_inputs(shader, indices, 2,
447 shader->fetched_prim_count);
448 ++shader->in_prim_idx;
449 ++shader->fetched_prim_count;
451 if (draw_gs_should_flush(shader))
452 gs_flush(shader);
455 shader,
465 shader->fetch_inputs(shader, indices, 4,
466 shader->fetched_prim_count);
467 ++shader->in_prim_idx;
468 ++shader->fetched_prim_count;
470 if (draw_gs_should_flush(shader))
471 gs_flush(shader);
474 static void gs_tri(struct draw_geometry_shader *shader,
483 shader->fetch_inputs(shader, indices, 3,
484 shader->fetched_prim_count);
485 ++shader->in_prim_idx;
486 ++shader->fetched_prim_count;
488 if (draw_gs_should_flush(shader))
489 gs_flush(shader);
492 static void gs_tri_adj(struct draw_geometry_shader *shader,
505 shader->fetch_inputs(shader, indices, 6,
506 shader->fetched_prim_count);
507 ++shader->in_prim_idx;
508 ++shader->fetched_prim_count;
510 if (draw_gs_should_flush(shader))
511 gs_flush(shader);
526 * Execute geometry shader.
528 int draw_geometry_shader_run(struct draw_geometry_shader *shader,
539 unsigned num_outputs = draw_total_gs_outputs(shader->draw);
548 u_decomposed_prims_for_vertices(shader->input_primitive,
550 shader->vector_length);
552 u_decomposed_prims_for_vertices(shader->output_primitive,
553 shader->max_output_vertices)
557 unsigned total_verts_per_buffer = shader->primitive_boundary *
568 total_verts_per_buffer * shader->num_invocations);
576 debug_printf("\tprim pipe = %s, shader in = %s, shader out = %s\n"
578 u_prim_name(shader->input_primitive),
579 u_prim_name(shader->output_primitive));
582 shader->max_output_vertices, max_out_prims,
583 shader->primitive_boundary, output_verts->vertex_size,
587 shader->emitted_vertices = 0;
588 shader->emitted_primitives = 0;
589 shader->vertex_size = vertex_size;
590 shader->tmp_output = (float (*)[4])output_verts->verts->data;
591 shader->fetched_prim_count = 0;
592 shader->input_vertex_stride = input_stride;
593 shader->input = input;
594 shader->input_info = input_info;
595 FREE(shader->primitive_lengths);
596 shader->primitive_lengths = MALLOC(max_out_prims * sizeof(unsigned) * shader->num_invocations);
600 if (shader->draw->llvm) {
601 shader->gs_output = output_verts->verts;
602 if (max_out_prims > shader->max_out_prims) {
604 if (shader->llvm_prim_lengths) {
605 for (i = 0; i < shader->max_out_prims; ++i) {
606 align_free(shader->llvm_prim_lengths[i]);
608 FREE(shader->llvm_prim_lengths);
611 shader->llvm_prim_lengths = MALLOC(max_out_prims * sizeof(unsigned*));
613 int vector_size = shader->vector_length * sizeof(unsigned);
614 shader->llvm_prim_lengths[i] =
618 shader->max_out_prims = max_out_prims;
620 shader->jit_context->prim_lengths = shader->llvm_prim_lengths;
621 shader->jit_context->emitted_vertices = shader->llvm_emitted_vertices;
622 shader->jit_context->emitted_prims = shader->llvm_emitted_primitives;
626 for (invocation = 0; invocation < shader->num_invocations; invocation++) {
627 shader->invocation_id = invocation;
629 shader->prepare(shader, constants, constants_size);
632 gs_run(shader, input_prim, input_verts,
635 gs_run_elts(shader, input_prim, input_verts,
641 if (shader->fetched_prim_count > 0) {
642 gs_flush(shader);
644 debug_assert(shader->fetched_prim_count == 0);
652 output_prims->count = shader->emitted_vertices;
653 output_prims->prim = shader->output_primitive;
655 output_prims->primitive_lengths = shader->primitive_lengths;
656 output_prims->primitive_count = shader->emitted_primitives;
657 output_verts->count = shader->emitted_vertices;
659 if (shader->draw->collect_statistics) {
661 for (i = 0; i < shader->emitted_primitives; ++i) {
662 shader->draw->statistics.gs_primitives +=
663 u_decomposed_prims_for_vertices(shader->output_primitive,
664 shader->primitive_lengths[i]);
674 return shader->emitted_vertices;
677 void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
681 if (!use_llvm && shader && shader->machine->Tokens != shader->state.tokens) {
682 tgsi_exec_machine_bind_shader(shader->machine,
683 shader->state.tokens,
786 * the specification says that the geometry shader should exit if the
872 struct llvm_geometry_shader *shader = llvm_geometry_shader(dgs);
875 li = first_elem(&shader->variants);
876 while(!at_end(&shader->variants, li)) {
882 assert(shader->variants_cached == 0);
906 void draw_gs_set_current_variant(struct draw_geometry_shader *shader,
909 shader->current_variant = variant;