static void PIPE_CDECL vsvg_run_elts( struct draw_vs_varient *varient, const unsigned *elts, unsigned count, void *output_buffer) { struct draw_vs_varient_generic *vsvg = (struct draw_vs_varient_generic *)varient; unsigned temp_vertex_stride = vsvg->temp_vertex_stride; void *temp_buffer = MALLOC( align(count,4) * temp_vertex_stride ); if (0) debug_printf("%s %d \n", __FUNCTION__, count); /* Want to do this in small batches for cache locality? */ vsvg->fetch->run_elts( vsvg->fetch, elts, count, temp_buffer ); vsvg->base.vs->run_linear( vsvg->base.vs, temp_buffer, temp_buffer, (const float (*)[4])vsvg->base.vs->draw->pt.user.constants, count, temp_vertex_stride, temp_vertex_stride); if (vsvg->base.key.clip) { /* not really handling clipping, just do the rhw so we can * see the results... */ do_rhw_viewport( vsvg, count, temp_buffer ); } else if (vsvg->base.key.viewport) { do_viewport( vsvg, count, temp_buffer ); } vsvg->emit->set_buffer( vsvg->emit, 0, temp_buffer, temp_vertex_stride ); vsvg->emit->set_buffer( vsvg->emit, 1, &vsvg->draw->rasterizer->point_size, 0); vsvg->emit->run( vsvg->emit, 0, count, output_buffer ); FREE(temp_buffer); }
static void PIPE_CDECL vsvg_run_linear( struct draw_vs_varient *varient, unsigned start, unsigned count, void *output_buffer ) { struct draw_vs_varient_generic *vsvg = (struct draw_vs_varient_generic *)varient; unsigned temp_vertex_stride = vsvg->temp_vertex_stride; void *temp_buffer = MALLOC( align(count,4) * temp_vertex_stride ); if (0) debug_printf("%s %d %d (sz %d, %d)\n", __FUNCTION__, start, count, vsvg->base.key.output_stride, temp_vertex_stride); vsvg->fetch->run( vsvg->fetch, start, count, vsvg->draw->instance_id, temp_buffer ); vsvg->base.vs->run_linear( vsvg->base.vs, temp_buffer, temp_buffer, vsvg->base.vs->draw->pt.user.vs_constants, vsvg->base.vs->draw->pt.user.vs_constants_size, count, temp_vertex_stride, temp_vertex_stride); if (vsvg->base.key.clip) { /* not really handling clipping, just do the rhw so we can * see the results... */ do_rhw_viewport( vsvg, count, temp_buffer ); } else if (vsvg->base.key.viewport) { do_viewport( vsvg, count, temp_buffer ); } vsvg->emit->set_buffer( vsvg->emit, 0, temp_buffer, temp_vertex_stride, ~0 ); vsvg->emit->set_buffer( vsvg->emit, 1, &vsvg->draw->rasterizer->point_size, 0, ~0 ); vsvg->emit->run( vsvg->emit, 0, count, vsvg->draw->instance_id, output_buffer ); FREE(temp_buffer); }