Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/softpipe/sp_quad_stipple.c
4570 views
1
2
/**
3
* quad polygon stipple stage
4
*/
5
6
#include "sp_context.h"
7
#include "sp_quad.h"
8
#include "sp_quad_pipe.h"
9
#include "pipe/p_defines.h"
10
#include "util/u_memory.h"
11
12
13
/**
14
* Apply polygon stipple to quads produced by triangle rasterization
15
*/
16
static void
17
stipple_quad(struct quad_stage *qs, struct quad_header *quads[], unsigned nr)
18
{
19
static const uint bit31 = 1u << 31;
20
static const uint bit30 = 1u << 30;
21
unsigned pass = nr;
22
23
struct softpipe_context *softpipe = qs->softpipe;
24
unsigned q;
25
26
pass = 0;
27
28
for (q = 0; q < nr; q++) {
29
struct quad_header *quad = quads[q];
30
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];
36
37
/* turn off quad mask bits that fail the stipple test */
38
if ((stipple0 & (bit31 >> col0)) == 0)
39
quad->inout.mask &= ~MASK_TOP_LEFT;
40
41
if ((stipple0 & (bit30 >> col0)) == 0)
42
quad->inout.mask &= ~MASK_TOP_RIGHT;
43
44
if ((stipple1 & (bit31 >> col0)) == 0)
45
quad->inout.mask &= ~MASK_BOTTOM_LEFT;
46
47
if ((stipple1 & (bit30 >> col0)) == 0)
48
quad->inout.mask &= ~MASK_BOTTOM_RIGHT;
49
50
if (quad->inout.mask)
51
quads[pass++] = quad;
52
}
53
54
qs->next->run(qs->next, quads, pass);
55
}
56
57
58
static void stipple_begin(struct quad_stage *qs)
59
{
60
qs->next->begin(qs->next);
61
}
62
63
64
static void stipple_destroy(struct quad_stage *qs)
65
{
66
FREE( qs );
67
}
68
69
70
struct quad_stage *
71
sp_quad_polygon_stipple_stage( struct softpipe_context *softpipe )
72
{
73
struct quad_stage *stage = CALLOC_STRUCT(quad_stage);
74
75
stage->softpipe = softpipe;
76
stage->begin = stipple_begin;
77
stage->run = stipple_quad;
78
stage->destroy = stipple_destroy;
79
80
return stage;
81
}
82
83