}
-static boolean
+static void
sp_vbuf_set_primitive(struct vbuf_render *vbr, unsigned prim)
{
struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr);
cvbr->softpipe->reduced_prim = u_reduced_prim(prim);
cvbr->prim = prim;
- return TRUE;
}
}
break;
+ case PIPE_PRIM_LINES_ADJACENCY:
+ for (i = 3; i < nr; i += 4) {
+ sp_setup_line( setup,
+ get_vert(vertex_buffer, i-2, stride),
+ get_vert(vertex_buffer, i-1, stride) );
+ }
+ break;
+
case PIPE_PRIM_LINE_STRIP:
for (i = 1; i < nr; i ++) {
sp_setup_line( setup,
}
break;
+ case PIPE_PRIM_LINE_STRIP_ADJACENCY:
+ for (i = 3; i < nr; i++) {
+ sp_setup_line( setup,
+ get_vert(vertex_buffer, i-2, stride),
+ get_vert(vertex_buffer, i-1, stride) );
+ }
+ break;
+
case PIPE_PRIM_LINE_LOOP:
for (i = 1; i < nr; i ++) {
sp_setup_line( setup,
}
break;
+ case PIPE_PRIM_TRIANGLES_ADJACENCY:
+ for (i = 5; i < nr; i += 6) {
+ sp_setup_tri( setup,
+ get_vert(vertex_buffer, i-5, stride),
+ get_vert(vertex_buffer, i-3, stride),
+ get_vert(vertex_buffer, i-1, stride) );
+ }
+ break;
+
case PIPE_PRIM_TRIANGLE_STRIP:
if (flatshade_first) {
for (i = 2; i < nr; i++) {
}
break;
+ case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
+ if (flatshade_first) {
+ for (i = 5; i < nr; i += 2) {
+ /* emit first triangle vertex as first triangle vertex */
+ sp_setup_tri( setup,
+ get_vert(vertex_buffer, i-5, stride),
+ get_vert(vertex_buffer, i+(i&1)*2-3, stride),
+ get_vert(vertex_buffer, i-(i&1)*2-1, stride) );
+ }
+ }
+ else {
+ for (i = 5; i < nr; i += 2) {
+ /* emit last triangle vertex as last triangle vertex */
+ sp_setup_tri( setup,
+ get_vert(vertex_buffer, i+(i&1)*2-5, stride),
+ get_vert(vertex_buffer, i-(i&1)*2-3, stride),
+ get_vert(vertex_buffer, i-1, stride) );
+ }
+ }
+ break;
+
case PIPE_PRIM_TRIANGLE_FAN:
if (flatshade_first) {
for (i = 2; i < nr; i += 1) {
}
static void
-sp_vbuf_so_info(struct vbuf_render *vbr, uint primitives, uint vertices)
+sp_vbuf_so_info(struct vbuf_render *vbr, uint primitives, uint vertices,
+ uint prim_generated)
{
struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr);
struct softpipe_context *softpipe = cvbr->softpipe;
- unsigned i;
- for (i = 0; i < softpipe->so_target.num_buffers; ++i) {
- softpipe->so_target.so_count[i] += vertices;
- }
-
- softpipe->so_stats.num_primitives_written = primitives;
+ softpipe->so_stats.num_primitives_written += primitives;
softpipe->so_stats.primitives_storage_needed =
vertices * 4 /*sizeof(float|int32)*/ * 4 /*x,y,z,w*/;
+ softpipe->num_primitives_generated += prim_generated;
+}
+
+static void
+sp_vbuf_pipeline_statistics(
+ struct vbuf_render *vbr,
+ const struct pipe_query_data_pipeline_statistics *stats)
+{
+ struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr);
+ struct softpipe_context *softpipe = cvbr->softpipe;
+
+ softpipe->pipeline_statistics.ia_vertices +=
+ stats->ia_vertices;
+ softpipe->pipeline_statistics.ia_primitives +=
+ stats->ia_primitives;
+ softpipe->pipeline_statistics.vs_invocations +=
+ stats->vs_invocations;
+ softpipe->pipeline_statistics.gs_invocations +=
+ stats->gs_invocations;
+ softpipe->pipeline_statistics.gs_primitives +=
+ stats->gs_primitives;
+ softpipe->pipeline_statistics.c_invocations +=
+ stats->c_invocations;
}
cvbr->base.draw_arrays = sp_vbuf_draw_arrays;
cvbr->base.release_vertices = sp_vbuf_release_vertices;
cvbr->base.set_stream_output_info = sp_vbuf_so_info;
+ cvbr->base.pipeline_statistics = sp_vbuf_pipeline_statistics;
cvbr->base.destroy = sp_vbuf_destroy;
cvbr->softpipe = sp;