3 * quad polygon stipple stage
6 #include "sp_context.h"
8 #include "sp_quad_pipe.h"
9 #include "pipe/p_defines.h"
10 #include "util/u_memory.h"
14 * Apply polygon stipple to quads produced by triangle rasterization
17 stipple_quad(struct quad_stage
*qs
, struct quad_header
*quads
[], unsigned nr
)
19 static const uint bit31
= 1 << 31;
20 static const uint bit30
= 1 << 30;
23 struct softpipe_context
*softpipe
= qs
->softpipe
;
28 for (q
= 0; q
< nr
; q
++) {
29 struct quad_header
*quad
= quads
[q
];
31 const int col0
= quad
->input
.x0
% 32;
32 const int y0
= quad
->input
.y0
;
33 const int y1
= y0
+ 1;
34 const uint stipple0
= softpipe
->poly_stipple
.stipple
[y0
% 32];
35 const uint stipple1
= softpipe
->poly_stipple
.stipple
[y1
% 32];
37 /* turn off quad mask bits that fail the stipple test */
38 if ((stipple0
& (bit31
>> col0
)) == 0)
39 quad
->inout
.mask
&= ~MASK_TOP_LEFT
;
41 if ((stipple0
& (bit30
>> col0
)) == 0)
42 quad
->inout
.mask
&= ~MASK_TOP_RIGHT
;
44 if ((stipple1
& (bit31
>> col0
)) == 0)
45 quad
->inout
.mask
&= ~MASK_BOTTOM_LEFT
;
47 if ((stipple1
& (bit30
>> col0
)) == 0)
48 quad
->inout
.mask
&= ~MASK_BOTTOM_RIGHT
;
54 qs
->next
->run(qs
->next
, quads
, pass
);
58 static void stipple_begin(struct quad_stage
*qs
)
60 qs
->next
->begin(qs
->next
);
64 static void stipple_destroy(struct quad_stage
*qs
)
71 sp_quad_polygon_stipple_stage( struct softpipe_context
*softpipe
)
73 struct quad_stage
*stage
= CALLOC_STRUCT(quad_stage
);
75 stage
->softpipe
= softpipe
;
76 stage
->begin
= stipple_begin
;
77 stage
->run
= stipple_quad
;
78 stage
->destroy
= stipple_destroy
;