27
27
#include "util/u_memory.h"
29
29
static unsigned int
30
gs_in_prim_for_topology(enum shader_prim prim)
30
gs_in_prim_for_topology(enum mesa_prim prim)
33
case SHADER_PRIM_QUADS:
34
return SHADER_PRIM_LINES_ADJACENCY;
34
return MESA_PRIM_LINES_ADJACENCY;
40
static enum shader_prim
41
gs_out_prim_for_topology(enum shader_prim prim)
41
gs_out_prim_for_topology(enum mesa_prim prim)
44
case SHADER_PRIM_POINTS:
45
return SHADER_PRIM_POINTS;
46
case SHADER_PRIM_LINES:
47
case SHADER_PRIM_LINE_LOOP:
48
case SHADER_PRIM_LINES_ADJACENCY:
49
case SHADER_PRIM_LINE_STRIP_ADJACENCY:
50
case SHADER_PRIM_LINE_STRIP:
51
return SHADER_PRIM_LINE_STRIP;
52
case SHADER_PRIM_TRIANGLES:
53
case SHADER_PRIM_TRIANGLE_STRIP:
54
case SHADER_PRIM_TRIANGLE_FAN:
55
case SHADER_PRIM_TRIANGLES_ADJACENCY:
56
case SHADER_PRIM_TRIANGLE_STRIP_ADJACENCY:
57
case SHADER_PRIM_POLYGON:
58
return SHADER_PRIM_TRIANGLE_STRIP;
59
case SHADER_PRIM_QUADS:
60
case SHADER_PRIM_QUAD_STRIP:
61
case SHADER_PRIM_PATCHES:
44
case MESA_PRIM_POINTS:
45
return MESA_PRIM_POINTS;
47
case MESA_PRIM_LINE_LOOP:
48
case MESA_PRIM_LINES_ADJACENCY:
49
case MESA_PRIM_LINE_STRIP_ADJACENCY:
50
case MESA_PRIM_LINE_STRIP:
51
return MESA_PRIM_LINE_STRIP;
52
case MESA_PRIM_TRIANGLES:
53
case MESA_PRIM_TRIANGLE_STRIP:
54
case MESA_PRIM_TRIANGLE_FAN:
55
case MESA_PRIM_TRIANGLES_ADJACENCY:
56
case MESA_PRIM_TRIANGLE_STRIP_ADJACENCY:
57
case MESA_PRIM_POLYGON:
58
return MESA_PRIM_TRIANGLE_STRIP;
60
case MESA_PRIM_QUAD_STRIP:
61
case MESA_PRIM_PATCHES:
63
return SHADER_PRIM_QUADS;
63
return MESA_PRIM_QUADS;
67
67
static unsigned int
68
vertices_for_prim(enum shader_prim prim)
68
vertices_for_prim(enum mesa_prim prim)
71
case SHADER_PRIM_POINTS:
71
case MESA_PRIM_POINTS:
73
case SHADER_PRIM_LINES:
74
case SHADER_PRIM_LINE_LOOP:
75
case SHADER_PRIM_LINES_ADJACENCY:
76
case SHADER_PRIM_LINE_STRIP_ADJACENCY:
77
case SHADER_PRIM_LINE_STRIP:
74
case MESA_PRIM_LINE_LOOP:
75
case MESA_PRIM_LINES_ADJACENCY:
76
case MESA_PRIM_LINE_STRIP_ADJACENCY:
77
case MESA_PRIM_LINE_STRIP:
79
case SHADER_PRIM_TRIANGLES:
80
case SHADER_PRIM_TRIANGLE_STRIP:
81
case SHADER_PRIM_TRIANGLE_FAN:
82
case SHADER_PRIM_TRIANGLES_ADJACENCY:
83
case SHADER_PRIM_TRIANGLE_STRIP_ADJACENCY:
84
case SHADER_PRIM_POLYGON:
79
case MESA_PRIM_TRIANGLES:
80
case MESA_PRIM_TRIANGLE_STRIP:
81
case MESA_PRIM_TRIANGLE_FAN:
82
case MESA_PRIM_TRIANGLES_ADJACENCY:
83
case MESA_PRIM_TRIANGLE_STRIP_ADJACENCY:
84
case MESA_PRIM_POLYGON:
86
case SHADER_PRIM_QUADS:
87
case SHADER_PRIM_QUAD_STRIP:
87
case MESA_PRIM_QUAD_STRIP:
89
case SHADER_PRIM_PATCHES:
89
case MESA_PRIM_PATCHES:
91
91
unreachable("unsupported primitive for gs input");
95
95
static unsigned int
96
array_size_for_prim(enum shader_prim prim)
96
array_size_for_prim(enum mesa_prim prim)
99
case SHADER_PRIM_POINTS:
99
case MESA_PRIM_POINTS:
101
case SHADER_PRIM_LINES:
102
case SHADER_PRIM_LINE_LOOP:
103
case SHADER_PRIM_LINE_STRIP:
101
case MESA_PRIM_LINES:
102
case MESA_PRIM_LINE_LOOP:
103
case MESA_PRIM_LINE_STRIP:
105
case SHADER_PRIM_LINES_ADJACENCY:
106
case SHADER_PRIM_LINE_STRIP_ADJACENCY:
105
case MESA_PRIM_LINES_ADJACENCY:
106
case MESA_PRIM_LINE_STRIP_ADJACENCY:
108
case SHADER_PRIM_TRIANGLES:
109
case SHADER_PRIM_TRIANGLE_STRIP:
110
case SHADER_PRIM_TRIANGLE_FAN:
111
case SHADER_PRIM_POLYGON:
108
case MESA_PRIM_TRIANGLES:
109
case MESA_PRIM_TRIANGLE_STRIP:
110
case MESA_PRIM_TRIANGLE_FAN:
111
case MESA_PRIM_POLYGON:
113
case SHADER_PRIM_TRIANGLES_ADJACENCY:
114
case SHADER_PRIM_TRIANGLE_STRIP_ADJACENCY:
113
case MESA_PRIM_TRIANGLES_ADJACENCY:
114
case MESA_PRIM_TRIANGLE_STRIP_ADJACENCY:
116
case SHADER_PRIM_QUADS:
117
case SHADER_PRIM_QUAD_STRIP:
116
case MESA_PRIM_QUADS:
117
case MESA_PRIM_QUAD_STRIP:
119
case SHADER_PRIM_PATCHES:
119
case MESA_PRIM_PATCHES:
121
121
unreachable("unsupported primitive for gs input");
150
150
nir_create_passthrough_gs(const nir_shader_compiler_options *options,
151
151
const nir_shader *prev_stage,
152
enum shader_prim primitive_type,
153
int flat_interp_mask_offset,
154
int last_pv_vert_offset,
152
enum mesa_prim primitive_type,
155
153
bool emulate_edgeflags,
156
154
bool force_line_strip_out)
158
156
unsigned int vertices_out = vertices_for_prim(primitive_type);
159
157
emulate_edgeflags = emulate_edgeflags && (prev_stage->info.outputs_written & VARYING_BIT_EDGE);
160
158
bool needs_closing = (force_line_strip_out || emulate_edgeflags) && vertices_out >= 3;
161
enum shader_prim original_our_prim = gs_out_prim_for_topology(primitive_type);
159
enum mesa_prim original_our_prim = gs_out_prim_for_topology(primitive_type);
162
160
nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_GEOMETRY,
164
162
"gs passthrough");
250
248
nir_variable *edge_var = nir_find_variable_with_location(nir, nir_var_shader_in, VARYING_SLOT_EDGE);
251
nir_ssa_def *flat_interp_mask_def = nir_load_ubo(&b, 1, 32,
252
nir_imm_int(&b, 0), nir_imm_int(&b, flat_interp_mask_offset),
253
.align_mul = 4, .align_offset = 0, .range_base = 0, .range = ~0);
254
nir_ssa_def *last_pv_vert_def = nir_load_ubo(&b, 1, 32,
255
nir_imm_int(&b, 0), nir_imm_int(&b, last_pv_vert_offset),
256
.align_mul = 4, .align_offset = 0, .range_base = 0, .range = ~0);
249
nir_ssa_def *flat_interp_mask_def = nir_load_flat_mask(&b);
250
nir_ssa_def *last_pv_vert_def = nir_load_provoking_last(&b);
257
251
last_pv_vert_def = nir_ine_imm(&b, last_pv_vert_def, 0);
258
252
nir_ssa_def *start_vert_index = nir_imm_int(&b, start_vert);
259
253
nir_ssa_def *end_vert_index = nir_imm_int(&b, end_vert - 1);