1 /* Originally written by Ben Skeggs for the nv50 driver*/
2 #include <pipe/p_defines.h>
4 struct util_split_prim
{
6 void (*emit
)(void *priv
, unsigned start
, unsigned count
);
7 void (*edge
)(void *priv
, boolean enabled
);
20 util_split_prim_init(struct util_split_prim
*s
,
21 unsigned mode
, unsigned start
, unsigned count
)
23 if (mode
== PIPE_PRIM_LINE_LOOP
) {
24 s
->mode
= PIPE_PRIM_LINE_STRIP
;
32 s
->p_end
= start
+ count
;
38 util_split_prim_next(struct util_split_prim
*s
, unsigned max_verts
)
42 if (s
->repeat_first
) {
43 s
->emit(s
->priv
, s
->start
, 1);
45 if (s
->edgeflag_off
) {
46 s
->edge(s
->priv
, TRUE
);
47 s
->edgeflag_off
= FALSE
;
51 if (s
->p_start
+ s
->close_first
+ max_verts
>= s
->p_end
) {
52 s
->emit(s
->priv
, s
->p_start
, s
->p_end
- s
->p_start
);
54 s
->emit(s
->priv
, s
->start
, 1);
62 case PIPE_PRIM_LINE_STRIP
:
65 case PIPE_PRIM_POLYGON
:
67 s
->emit(s
->priv
, s
->p_start
, max_verts
);
68 s
->edge(s
->priv
, FALSE
);
69 s
->emit(s
->priv
, s
->p_start
+ max_verts
, 1);
70 s
->p_start
+= max_verts
;
71 s
->repeat_first
= TRUE
;
72 s
->edgeflag_off
= TRUE
;
74 case PIPE_PRIM_TRIANGLES
:
75 max_verts
= max_verts
- (max_verts
% 3);
77 case PIPE_PRIM_TRIANGLE_STRIP
:
78 /* to ensure winding stays correct, always split
79 * on an even number of generated triangles
81 max_verts
= max_verts
& ~1;
84 case PIPE_PRIM_TRIANGLE_FAN
:
85 s
->repeat_first
= TRUE
;
91 case PIPE_PRIM_QUAD_STRIP
:
99 s
->emit (s
->priv
, s
->p_start
, max_verts
);
100 s
->p_start
+= (max_verts
- repeat
);