/** * Do setup for triangle rasterization, then render the triangle. */ void sp_setup_tri(struct setup_context *setup, const float (*v0)[4], const float (*v1)[4], const float (*v2)[4]) { float det; uint layer = 0; unsigned viewport_index = 0; #if DEBUG_VERTS debug_printf("Setup triangle:\n"); print_vertex(setup, v0); print_vertex(setup, v1); print_vertex(setup, v2); #endif if (setup->softpipe->no_rast || setup->softpipe->rasterizer->rasterizer_discard) return; det = calc_det(v0, v1, v2); /* debug_printf("%s\n", __FUNCTION__ ); */ #if DEBUG_FRAGS setup->numFragsEmitted = 0; setup->numFragsWritten = 0; #endif if (!setup_sort_vertices( setup, det, v0, v1, v2 )) return; setup_tri_coefficients( setup ); setup_tri_edges( setup ); assert(setup->softpipe->reduced_prim == PIPE_PRIM_TRIANGLES); setup->span.y = 0; setup->span.right[0] = 0; setup->span.right[1] = 0; /* setup->span.z_mode = tri_z_mode( setup->ctx ); */ if (setup->softpipe->layer_slot > 0) { layer = *(unsigned *)setup->vprovoke[setup->softpipe->layer_slot]; layer = MIN2(layer, setup->max_layer); } setup->quad[0].input.layer = layer; if (setup->softpipe->viewport_index_slot > 0) { unsigned *udata = (unsigned*)v0[setup->softpipe->viewport_index_slot]; viewport_index = sp_clamp_viewport_idx(*udata); } setup->quad[0].input.viewport_index = viewport_index; /* init_constant_attribs( setup ); */ if (setup->oneoverarea < 0.0) { /* emaj on left: */ subtriangle(setup, &setup->emaj, &setup->ebot, setup->ebot.lines, viewport_index); subtriangle(setup, &setup->emaj, &setup->etop, setup->etop.lines, viewport_index); } else { /* emaj on right: */ subtriangle(setup, &setup->ebot, &setup->emaj, setup->ebot.lines, viewport_index); subtriangle(setup, &setup->etop, &setup->emaj, setup->etop.lines, viewport_index); } flush_spans( setup ); if (setup->softpipe->active_statistics_queries) { setup->softpipe->pipeline_statistics.c_primitives++; } #if DEBUG_FRAGS printf("Tri: %u frags emitted, %u written\n", setup->numFragsEmitted, setup->numFragsWritten); #endif }
/** * Do setup for triangle rasterization, then render the triangle. */ void sp_setup_tri( struct setup_context *setup, const float (*v0)[4], const float (*v1)[4], const float (*v2)[4] ) { float det; #if DEBUG_VERTS debug_printf("Setup triangle:\n"); print_vertex(setup, v0); print_vertex(setup, v1); print_vertex(setup, v2); #endif if (setup->softpipe->no_rast) return; det = calc_det(v0, v1, v2); /* debug_printf("%s\n", __FUNCTION__ ); */ #if DEBUG_FRAGS setup->numFragsEmitted = 0; setup->numFragsWritten = 0; #endif if (cull_tri( setup, det )) return; if (!setup_sort_vertices( setup, det, v0, v1, v2 )) return; setup_tri_coefficients( setup ); setup_tri_edges( setup ); assert(setup->softpipe->reduced_prim == PIPE_PRIM_TRIANGLES); setup->span.y = 0; setup->span.right[0] = 0; setup->span.right[1] = 0; /* setup->span.z_mode = tri_z_mode( setup->ctx ); */ /* init_constant_attribs( setup ); */ if (setup->oneoverarea < 0.0) { /* emaj on left: */ subtriangle( setup, &setup->emaj, &setup->ebot, setup->ebot.lines ); subtriangle( setup, &setup->emaj, &setup->etop, setup->etop.lines ); } else { /* emaj on right: */ subtriangle( setup, &setup->ebot, &setup->emaj, setup->ebot.lines ); subtriangle( setup, &setup->etop, &setup->emaj, setup->etop.lines ); } flush_spans( setup ); #if DEBUG_FRAGS printf("Tri: %u frags emitted, %u written\n", setup->numFragsEmitted, setup->numFragsWritten); #endif }