237
236
load->src[0] = nir_src_for_ssa(nir_imm_int(b, ZINK_GFX_PUSHCONST_DRAW_MODE_IS_INDEXED));
238
237
nir_intrinsic_set_range(load, 4);
239
238
load->num_components = 1;
240
nir_ssa_dest_init(&load->instr, &load->dest, 1, 32, "draw_mode_is_indexed");
239
nir_ssa_dest_init(&load->instr, &load->dest, 1, 32);
241
240
nir_builder_instr_insert(b, &load->instr);
243
242
nir_ssa_def *composite = nir_build_alu(b, nir_op_bcsel,
278
277
load->src[0] = nir_src_for_ssa(nir_imm_int(b, ZINK_GFX_PUSHCONST_DRAW_ID));
279
278
nir_intrinsic_set_range(load, 4);
280
279
load->num_components = 1;
281
nir_ssa_dest_init(&load->instr, &load->dest, 1, 32, "draw_id");
280
nir_ssa_dest_init(&load->instr, &load->dest, 1, 32);
282
281
nir_builder_instr_insert(b, &load->instr);
284
283
nir_ssa_def_rewrite_uses(&instr->dest.ssa, &load->dest.ssa);
340
339
nir_ssa_def *w_delta = nir_fdiv(b, point_size, nir_channel(b, vp_scale, 0));
341
340
w_delta = nir_fmul(b, w_delta, nir_channel(b, point_pos, 3));
342
341
// halt_w_delta = w_delta / 2
343
nir_ssa_def *half_w_delta = nir_fmul(b, w_delta, nir_imm_float(b, 0.5));
342
nir_ssa_def *half_w_delta = nir_fmul_imm(b, w_delta, 0.5);
345
344
// h_delta = gl_point_size / height_viewport_size_scale * gl_Position.w
346
345
nir_ssa_def *h_delta = nir_fdiv(b, point_size, nir_channel(b, vp_scale, 1));
347
346
h_delta = nir_fmul(b, h_delta, nir_channel(b, point_pos, 3));
348
347
// halt_h_delta = h_delta / 2
349
nir_ssa_def *half_h_delta = nir_fmul(b, h_delta, nir_imm_float(b, 0.5));
348
nir_ssa_def *half_h_delta = nir_fmul_imm(b, h_delta, 0.5);
351
350
nir_ssa_def *point_dir[4][2] = {
352
351
{ nir_imm_float(b, -1), nir_imm_float(b, -1) },
398
396
if (!state.gl_pos_out || !state.gl_point_size)
401
nir_function_impl *entry = nir_shader_get_entrypoint(shader);
402
nir_builder_init(&b, entry);
403
b.cursor = nir_before_cf_list(&entry->body);
405
399
return nir_shader_instructions_pass(shader, lower_gl_point_gs_instr,
406
400
nir_metadata_dominance, &state);
422
416
nir_ssa_def *index)
424
418
nir_ssa_def *ring_offset = nir_load_var(b, state->ring_offset);
425
return nir_imod(b, nir_iadd(b, index, ring_offset),
426
nir_imm_int(b, state->ring_size));
419
return nir_imod_imm(b, nir_iadd(b, index, ring_offset),
429
423
/* Given the final deref of chain of derefs this function will walk up the chain
621
617
static unsigned int
622
lower_pv_mode_vertices_for_prim(enum shader_prim prim)
618
lower_pv_mode_vertices_for_prim(enum mesa_prim prim)
625
case SHADER_PRIM_POINTS:
621
case MESA_PRIM_POINTS:
627
case SHADER_PRIM_LINE_STRIP:
623
case MESA_PRIM_LINE_STRIP:
629
case SHADER_PRIM_TRIANGLE_STRIP:
625
case MESA_PRIM_TRIANGLE_STRIP:
632
628
unreachable("unsupported primitive for gs output");
641
637
memset(state.varyings, 0, sizeof(state.varyings));
643
639
nir_function_impl *entry = nir_shader_get_entrypoint(shader);
644
nir_builder_init(&b, entry);
645
b.cursor = nir_before_cf_list(&entry->body);
640
b = nir_builder_at(nir_before_cf_list(&entry->body));
647
642
state.primitive_vert_count =
648
643
lower_pv_mode_vertices_for_prim(shader->info.gs.output_primitive);
702
697
nir_ssa_def *scale)
704
699
nir_ssa_def *w_recip = nir_frcp(b, nir_channel(b, vert, 3));
705
nir_ssa_def *ndc_point = nir_fmul(b, nir_channels(b, vert, 0x3),
700
nir_ssa_def *ndc_point = nir_fmul(b, nir_trim_vector(b, vert, 2),
707
702
return nir_fmul(b, ndc_point, scale);
794
789
state.line_rectangular = line_rectangular;
795
790
// initialize pos_counter and stipple_counter
796
791
nir_function_impl *entry = nir_shader_get_entrypoint(shader);
797
nir_builder_init(&b, entry);
798
b.cursor = nir_before_cf_list(&entry->body);
792
b = nir_builder_at(nir_before_cf_list(&entry->body));
799
793
nir_store_var(&b, state.pos_counter, nir_imm_int(&b, 0), 1);
800
794
nir_store_var(&b, state.stipple_counter, nir_imm_float(&b, 0), 1);
1124
1116
// initialize pos_counter
1125
1117
nir_function_impl *entry = nir_shader_get_entrypoint(shader);
1126
nir_builder_init(&b, entry);
1127
b.cursor = nir_before_cf_list(&entry->body);
1118
b = nir_builder_at(nir_before_cf_list(&entry->body));
1128
1119
nir_store_var(&b, state.pos_counter, nir_imm_int(&b, 0), 1);
1130
1121
shader->info.gs.vertices_out = 8 * shader->info.gs.vertices_out;
1131
shader->info.gs.output_primitive = SHADER_PRIM_TRIANGLE_STRIP;
1122
shader->info.gs.output_primitive = MESA_PRIM_TRIANGLE_STRIP;
1133
1124
return nir_shader_instructions_pass(shader, lower_line_smooth_gs_instr,
1134
1125
nir_metadata_dominance, &state);
1158
1149
// initialize stipple_pattern
1159
1150
nir_function_impl *entry = nir_shader_get_entrypoint(shader);
1160
nir_builder_init(&b, entry);
1161
b.cursor = nir_before_cf_list(&entry->body);
1151
b = nir_builder_at(nir_before_cf_list(&entry->body));
1162
1152
nir_ssa_def *pattern = nir_load_push_constant(&b, 1, 32,
1163
1153
nir_imm_int(&b, ZINK_GFX_PUSHCONST_LINE_STIPPLE_PATTERN),
1221
1211
zink_create_quads_emulation_gs(const nir_shader_compiler_options *options,
1222
const nir_shader *prev_stage,
1223
int last_pv_vert_offset)
1212
const nir_shader *prev_stage)
1225
1214
nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_GEOMETRY,
1227
1216
"filled quad gs");
1229
1218
nir_shader *nir = b.shader;
1230
nir->info.gs.input_primitive = SHADER_PRIM_LINES_ADJACENCY;
1231
nir->info.gs.output_primitive = SHADER_PRIM_TRIANGLE_STRIP;
1219
nir->info.gs.input_primitive = MESA_PRIM_LINES_ADJACENCY;
1220
nir->info.gs.output_primitive = MESA_PRIM_TRIANGLE_STRIP;
1232
1221
nir->info.gs.vertices_in = 4;
1233
1222
nir->info.gs.vertices_out = 6;
1234
1223
nir->info.gs.invocations = 1;
1237
1226
nir->info.has_transform_feedback_varyings = prev_stage->info.has_transform_feedback_varyings;
1238
1227
memcpy(nir->info.xfb_stride, prev_stage->info.xfb_stride, sizeof(prev_stage->info.xfb_stride));
1239
1228
if (prev_stage->xfb_info) {
1240
nir->xfb_info = mem_dup(prev_stage->xfb_info, sizeof(nir_xfb_info));
1229
nir->xfb_info = mem_dup(prev_stage->xfb_info, nir_xfb_info_size(prev_stage->xfb_info->output_count));
1243
1232
nir_variable *in_vars[VARYING_SLOT_MAX];
1286
1275
int mapping_first[] = {0, 1, 2, 0, 2, 3};
1287
1276
int mapping_last[] = {0, 1, 3, 1, 2, 3};
1288
nir_ssa_def *last_pv_vert_def = nir_load_ubo(&b, 1, 32,
1289
nir_imm_int(&b, 0), nir_imm_int(&b, last_pv_vert_offset),
1290
.align_mul = 4, .align_offset = 0, .range_base = 0, .range = ~0);
1277
nir_ssa_def *last_pv_vert_def = nir_load_provoking_last(&b);
1291
1278
last_pv_vert_def = nir_ine_imm(&b, last_pv_vert_def, 0);
1292
1279
for (unsigned i = 0; i < 6; ++i) {
1293
1280
/* swap indices 2 and 3 */
1304
lower_system_values_to_inlined_uniforms_instr(nir_builder *b, nir_instr *instr, void *data)
1306
if (instr->type != nir_instr_type_intrinsic)
1309
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
1311
int inlined_uniform_offset;
1312
switch (intrin->intrinsic) {
1313
case nir_intrinsic_load_flat_mask:
1314
inlined_uniform_offset = ZINK_INLINE_VAL_FLAT_MASK * sizeof(uint32_t);
1316
case nir_intrinsic_load_provoking_last:
1317
inlined_uniform_offset = ZINK_INLINE_VAL_PV_LAST_VERT * sizeof(uint32_t);
1323
b->cursor = nir_before_instr(&intrin->instr);
1324
nir_ssa_def *new_dest_def = nir_load_ubo(b, 1, 32, nir_imm_int(b, 0),
1325
nir_imm_int(b, inlined_uniform_offset),
1326
.align_mul = 4, .align_offset = 0,
1327
.range_base = 0, .range = ~0);
1328
nir_ssa_def_rewrite_uses(&intrin->dest.ssa, new_dest_def);
1329
nir_instr_remove(instr);
1334
zink_lower_system_values_to_inlined_uniforms(nir_shader *nir)
1336
return nir_shader_instructions_pass(nir, lower_system_values_to_inlined_uniforms_instr,
1337
nir_metadata_dominance, NULL);
1317
1341
zink_screen_init_compiler(struct zink_screen *screen)
1629
1652
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
1630
1653
if (intr->intrinsic != nir_intrinsic_load_deref)
1632
nir_variable *var = nir_deref_instr_get_variable(nir_src_as_deref(intr->src[0]));
1655
nir_variable *var = nir_intrinsic_get_var(intr, 0);
1633
1656
if (!var->data.fb_fetch_output)
1635
1658
b->cursor = nir_after_instr(instr);
1711
1734
nir_src_copy(&levels->src[!!(offset_idx >= 0)].src, &txf->src[handle_idx].src, &levels->instr);
1713
1736
nir_ssa_dest_init(&levels->instr, &levels->dest,
1714
nir_tex_instr_dest_size(levels), 32, NULL);
1737
nir_tex_instr_dest_size(levels), 32);
1715
1738
nir_builder_instr_insert(b, &levels->instr);
1717
1740
nir_if *lod_oob_if = nir_push_if(b, nir_ilt(b, lod, &levels->dest.ssa));
2129
2154
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
2130
2155
b->cursor = nir_before_instr(instr);
2131
2156
switch (intr->intrinsic) {
2132
case nir_intrinsic_ssbo_atomic_fadd:
2133
case nir_intrinsic_ssbo_atomic_add:
2134
case nir_intrinsic_ssbo_atomic_umin:
2135
case nir_intrinsic_ssbo_atomic_imin:
2136
case nir_intrinsic_ssbo_atomic_umax:
2137
case nir_intrinsic_ssbo_atomic_imax:
2138
case nir_intrinsic_ssbo_atomic_and:
2139
case nir_intrinsic_ssbo_atomic_or:
2140
case nir_intrinsic_ssbo_atomic_xor:
2141
case nir_intrinsic_ssbo_atomic_exchange:
2142
case nir_intrinsic_ssbo_atomic_comp_swap: {
2157
case nir_intrinsic_ssbo_atomic:
2158
case nir_intrinsic_ssbo_atomic_swap: {
2143
2159
/* convert offset to uintN_t[idx] */
2144
2160
nir_ssa_def *offset = nir_udiv_imm(b, intr->src[1].ssa, nir_dest_bit_size(intr->dest) / 8);
2145
2161
nir_instr_rewrite_src_ssa(instr, &intr->src[1], offset);
2301
2317
nir_intrinsic_op op;
2302
2318
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
2303
switch (intr->intrinsic) {
2304
case nir_intrinsic_ssbo_atomic_fadd:
2305
op = nir_intrinsic_deref_atomic_fadd;
2307
case nir_intrinsic_ssbo_atomic_fmin:
2308
op = nir_intrinsic_deref_atomic_fmin;
2310
case nir_intrinsic_ssbo_atomic_fmax:
2311
op = nir_intrinsic_deref_atomic_fmax;
2313
case nir_intrinsic_ssbo_atomic_fcomp_swap:
2314
op = nir_intrinsic_deref_atomic_fcomp_swap;
2316
case nir_intrinsic_ssbo_atomic_add:
2317
op = nir_intrinsic_deref_atomic_add;
2319
case nir_intrinsic_ssbo_atomic_umin:
2320
op = nir_intrinsic_deref_atomic_umin;
2322
case nir_intrinsic_ssbo_atomic_imin:
2323
op = nir_intrinsic_deref_atomic_imin;
2325
case nir_intrinsic_ssbo_atomic_umax:
2326
op = nir_intrinsic_deref_atomic_umax;
2328
case nir_intrinsic_ssbo_atomic_imax:
2329
op = nir_intrinsic_deref_atomic_imax;
2331
case nir_intrinsic_ssbo_atomic_and:
2332
op = nir_intrinsic_deref_atomic_and;
2334
case nir_intrinsic_ssbo_atomic_or:
2335
op = nir_intrinsic_deref_atomic_or;
2337
case nir_intrinsic_ssbo_atomic_xor:
2338
op = nir_intrinsic_deref_atomic_xor;
2340
case nir_intrinsic_ssbo_atomic_exchange:
2341
op = nir_intrinsic_deref_atomic_exchange;
2343
case nir_intrinsic_ssbo_atomic_comp_swap:
2344
op = nir_intrinsic_deref_atomic_comp_swap;
2319
if (intr->intrinsic == nir_intrinsic_ssbo_atomic)
2320
op = nir_intrinsic_deref_atomic;
2321
else if (intr->intrinsic == nir_intrinsic_ssbo_atomic_swap)
2322
op = nir_intrinsic_deref_atomic_swap;
2347
2324
unreachable("unknown intrinsic");
2349
2325
nir_ssa_def *offset = intr->src[1].ssa;
2350
2326
nir_src *src = &intr->src[0];
2351
2327
nir_variable *var = get_bo_var(b->shader, bo, true, src, nir_dest_bit_size(intr->dest));
2362
2338
for (unsigned i = 0; i < num_components; i++) {
2363
2339
nir_deref_instr *deref_arr = nir_build_deref_array(b, deref_struct, offset);
2364
2340
nir_intrinsic_instr *new_instr = nir_intrinsic_instr_create(b->shader, op);
2365
nir_ssa_dest_init(&new_instr->instr, &new_instr->dest, 1, nir_dest_bit_size(intr->dest), "");
2341
nir_ssa_dest_init(&new_instr->instr, &new_instr->dest, 1,
2342
nir_dest_bit_size(intr->dest));
2343
nir_intrinsic_set_atomic_op(new_instr, nir_intrinsic_atomic_op(intr));
2366
2344
new_instr->src[0] = nir_src_for_ssa(&deref_arr->dest.ssa);
2367
2345
/* deref ops have no offset src, so copy the srcs after it */
2368
2346
for (unsigned i = 2; i < nir_intrinsic_infos[intr->intrinsic].num_srcs; i++)
2393
2371
bool ssbo = true;
2394
2372
switch (intr->intrinsic) {
2395
case nir_intrinsic_ssbo_atomic_fadd:
2396
case nir_intrinsic_ssbo_atomic_fmin:
2397
case nir_intrinsic_ssbo_atomic_fmax:
2398
case nir_intrinsic_ssbo_atomic_fcomp_swap:
2399
case nir_intrinsic_ssbo_atomic_add:
2400
case nir_intrinsic_ssbo_atomic_umin:
2401
case nir_intrinsic_ssbo_atomic_imin:
2402
case nir_intrinsic_ssbo_atomic_umax:
2403
case nir_intrinsic_ssbo_atomic_imax:
2404
case nir_intrinsic_ssbo_atomic_and:
2405
case nir_intrinsic_ssbo_atomic_or:
2406
case nir_intrinsic_ssbo_atomic_xor:
2407
case nir_intrinsic_ssbo_atomic_exchange:
2408
case nir_intrinsic_ssbo_atomic_comp_swap:
2373
case nir_intrinsic_ssbo_atomic:
2374
case nir_intrinsic_ssbo_atomic_swap:
2409
2375
rewrite_atomic_ssbo_instr(b, instr, bo);
2411
2377
case nir_intrinsic_store_ssbo:
2566
2532
nir_function_impl *impl = nir_shader_get_entrypoint(vs);
2567
nir_builder_init(&b, impl);
2533
b = nir_builder_at(nir_after_cf_list(&impl->body));
2568
2534
assert(impl->end_block->predecessors->entries == 1);
2569
b.cursor = nir_after_cf_list(&impl->body);
2570
2535
clamp_layer_output_emit(&b, &state);
2571
2536
nir_metadata_preserve(impl, nir_metadata_dominance);
2659
2622
var->data.driver_location = -1;
2625
/* patch variables may be read in the workgroup */
2662
2626
if (stage != MESA_SHADER_TESS_CTRL)
2665
/* patch variables may be read in the workgroup */
2666
slot_map[slot] = (*reserved)++;
2630
if (nir_is_arrayed_io(var, stage))
2631
num_slots = glsl_count_vec4_slots(glsl_get_array_element(var->type), false, false);
2633
num_slots = glsl_count_vec4_slots(var->type, false, false);
2634
assert(*reserved + num_slots <= MAX_VARYING);
2635
for (unsigned i = 0; i < num_slots; i++)
2636
slot_map[slot + i] = (*reserved)++;
2668
2638
var->data.driver_location = slot_map[slot];
3032
3001
for (unsigned i = 0; i < 2; i++, num_components -= 4) {
3033
3002
nir_deref_instr *strct = nir_build_deref_struct(&b, deref, i);
3034
3003
nir_ssa_def *load = nir_load_deref(&b, strct);
3035
comp[i * 2] = nir_pack_64_2x32(&b, nir_channels(&b, load, BITFIELD_MASK(2)));
3004
comp[i * 2] = nir_pack_64_2x32(&b,
3005
nir_trim_vector(&b, load, 2));
3036
3006
if (num_components > 2)
3037
3007
comp[i * 2 + 1] = nir_pack_64_2x32(&b, nir_channels(&b, load, BITFIELD_RANGE(2, 2)));
3170
zink_shader_dump(void *words, size_t size, const char *file)
3139
zink_shader_dump(const struct zink_shader *zs, void *words, size_t size, const char *file)
3172
3141
FILE *fp = fopen(file, "wb");
3174
3143
fwrite(words, 1, size, fp);
3176
fprintf(stderr, "wrote '%s'...\n", file);
3181
zink_shader_spirv_compile(struct zink_screen *screen, struct zink_shader *zs, struct spirv_shader *spirv)
3145
fprintf(stderr, "wrote %s shader '%s'...\n", _mesa_shader_stage_to_string(zs->info.stage), file);
3149
static VkShaderStageFlagBits
3150
zink_get_next_stage(gl_shader_stage stage)
3153
case MESA_SHADER_VERTEX:
3154
return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT |
3155
VK_SHADER_STAGE_GEOMETRY_BIT |
3156
VK_SHADER_STAGE_FRAGMENT_BIT;
3157
case MESA_SHADER_TESS_CTRL:
3158
return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
3159
case MESA_SHADER_TESS_EVAL:
3160
return VK_SHADER_STAGE_GEOMETRY_BIT |
3161
VK_SHADER_STAGE_FRAGMENT_BIT;
3162
case MESA_SHADER_GEOMETRY:
3163
return VK_SHADER_STAGE_FRAGMENT_BIT;
3164
case MESA_SHADER_FRAGMENT:
3165
case MESA_SHADER_COMPUTE:
3168
unreachable("invalid shader stage");
3172
struct zink_shader_object
3173
zink_shader_spirv_compile(struct zink_screen *screen, struct zink_shader *zs, struct spirv_shader *spirv, bool can_shobj, struct zink_program *pg)
3184
3175
VkShaderModuleCreateInfo smci = {0};
3176
VkShaderCreateInfoEXT sci = {0};
3187
3179
spirv = zs->spirv;
3192
3184
snprintf(buf, sizeof(buf), "dump%02d.spv", i++);
3193
zink_shader_dump(spirv->words, spirv->num_words * sizeof(uint32_t), buf);
3185
zink_shader_dump(zs, spirv->words, spirv->num_words * sizeof(uint32_t), buf);
3188
sci.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT;
3189
sci.stage = mesa_to_vk_shader_stage(zs->info.stage);
3190
sci.nextStage = zink_get_next_stage(zs->info.stage);
3191
sci.codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT;
3192
sci.codeSize = spirv->num_words * sizeof(uint32_t);
3193
sci.pCode = spirv->words;
3195
VkDescriptorSetLayout dsl[ZINK_GFX_SHADER_COUNT] = {0};
3197
sci.setLayoutCount = pg->num_dsl;
3198
sci.pSetLayouts = pg->dsl;
3200
sci.setLayoutCount = zs->info.stage + 1;
3201
dsl[zs->info.stage] = zs->precompile.dsl;;
3202
sci.pSetLayouts = dsl;
3204
VkPushConstantRange pcr;
3205
pcr.stageFlags = VK_SHADER_STAGE_ALL_GRAPHICS;
3207
pcr.size = sizeof(struct zink_gfx_push_constant);
3208
sci.pushConstantRangeCount = 1;
3209
sci.pPushConstantRanges = &pcr;
3196
3211
smci.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
3197
3212
smci.codeSize = spirv->num_words * sizeof(uint32_t);
3274
VkResult ret = VKSCR(CreateShaderModule)(screen->dev, &smci, NULL, &mod);
3290
struct zink_shader_object obj = {0};
3291
if (!can_shobj || !screen->info.have_EXT_shader_object)
3292
ret = VKSCR(CreateShaderModule)(screen->dev, &smci, NULL, &obj.mod);
3294
ret = VKSCR(CreateShadersEXT)(screen->dev, 1, &sci, NULL, &obj.obj);
3275
3295
bool success = zink_screen_handle_vkresult(screen, ret);
3276
3296
assert(success);
3277
return success ? mod : VK_NULL_HANDLE;
3315
3335
if (bit_size == dest_size && !rewrite_depth)
3317
3337
nir_ssa_def *dest = &tex->dest.ssa;
3318
if (rewrite_depth && data) {
3319
if (b->shader->info.stage == MESA_SHADER_FRAGMENT)
3320
flag_shadow_tex(var, data);
3322
mesa_loge("unhandled old-style shadow sampler in non-fragment stage!");
3338
if (rewrite_depth && zs) {
3339
/* If only .x is used in the NIR, then it's effectively not a legacy depth
3340
* sample anyway and we don't want to ask for shader recompiles. This is
3341
* the typical path, since GL_DEPTH_TEXTURE_MODE defaults to either RED or
3342
* LUMINANCE, so apps just use the first channel.
3344
if (nir_ssa_def_components_read(dest) & ~1) {
3345
if (b->shader->info.stage == MESA_SHADER_FRAGMENT)
3346
flag_shadow_tex(var, zs);
3348
mesa_loge("unhandled old-style shadow sampler in non-fragment stage!");
3325
3352
if (bit_size != dest_size) {
3477
/* Applies in-shader swizzles when necessary for depth/shadow sampling.
3479
* SPIRV only has new-style (scalar result) shadow sampling, so to emulate
3480
* !is_new_style_shadow (vec4 result) shadow sampling we lower to a
3481
* new-style-shadow sample, and apply GL_DEPTH_TEXTURE_MODE swizzles in the NIR
3482
* shader to expand out to vec4. Since this depends on sampler state, it's a
3483
* draw-time shader recompile to do so.
3485
* We may also need to apply shader swizzles for
3486
* driver_workarounds.needs_zs_shader_swizzle.
3451
3489
lower_zs_swizzle_tex(nir_shader *nir, const void *swizzle, bool shadow_only)
3491
/* We don't use nir_lower_tex to do our swizzling, because of this base_sampler_id. */
3453
3492
unsigned base_sampler_id = gl_shader_stage_is_compute(nir->info.stage) ? 0 : PIPE_MAX_SAMPLERS * nir->info.stage;
3454
3493
struct lower_zs_swizzle_state state = {shadow_only, base_sampler_id, swizzle};
3455
3494
return nir_shader_instructions_pass(nir, lower_zs_swizzle_tex_instr, nir_metadata_dominance | nir_metadata_block_index, (void*)&state);
3461
3500
if (instr->type != nir_instr_type_intrinsic)
3463
3502
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
3464
if (intr->intrinsic != nir_intrinsic_load_deref)
3466
nir_variable *deref_var = nir_intrinsic_get_var(intr, 0);
3467
if (deref_var->data.location != VARYING_SLOT_PNTC)
3503
if (intr->intrinsic != nir_intrinsic_load_point_coord)
3469
3505
b->cursor = nir_after_instr(instr);
3470
3506
nir_ssa_def *def = nir_vec2(b, nir_channel(b, &intr->dest.ssa, 0),
3471
nir_fsub(b, nir_imm_float(b, 1.0), nir_channel(b, &intr->dest.ssa, 1)));
3507
nir_fsub_imm(b, 1.0, nir_channel(b, &intr->dest.ssa, 1)));
3472
3508
nir_ssa_def_rewrite_uses_after(&intr->dest.ssa, def, def->parent_instr);
3477
3513
invert_point_coord(nir_shader *nir)
3479
if (!(nir->info.inputs_read & BITFIELD64_BIT(VARYING_SLOT_PNTC)))
3515
if (!BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_POINT_COORD))
3481
3517
return nir_shader_instructions_pass(nir, invert_point_coord_instr, nir_metadata_dominance, NULL);
3484
static VkShaderModule
3485
compile_module(struct zink_screen *screen, struct zink_shader *zs, nir_shader *nir)
3520
static struct zink_shader_object
3521
compile_module(struct zink_screen *screen, struct zink_shader *zs, nir_shader *nir, bool can_shobj, struct zink_program *pg)
3487
VkShaderModule mod = VK_NULL_HANDLE;
3488
3523
struct zink_shader_info *sinfo = &zs->sinfo;
3491
NIR_PASS_V(nir, nir_convert_from_ssa, true);
3526
NIR_PASS_V(nir, nir_convert_from_ssa, true, false);
3528
struct zink_shader_object obj;
3493
3529
struct spirv_shader *spirv = nir_to_spirv(nir, sinfo, screen->spirv_version);
3495
mod = zink_shader_spirv_compile(screen, zs, spirv);
3531
obj = zink_shader_spirv_compile(screen, zs, spirv, can_shobj, pg);
3497
3533
/* TODO: determine if there's any reason to cache spirv output? */
3498
3534
if (zs->info.stage == MESA_SHADER_TESS_CTRL && zs->non_fs.is_generated)
3499
3535
zs->spirv = spirv;
3506
zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs,
3507
nir_shader *nir, const struct zink_shader_key *key, const void *extra_data)
3541
struct zink_shader_object
3542
zink_shader_compile(struct zink_screen *screen, bool can_shobj, struct zink_shader *zs,
3543
nir_shader *nir, const struct zink_shader_key *key, const void *extra_data, struct zink_program *pg)
3509
VkShaderModule mod = VK_NULL_HANDLE;
3510
3545
struct zink_shader_info *sinfo = &zs->sinfo;
3511
3546
bool need_optimize = false;
3512
3547
bool inlined_uniforms = false;
3630
3665
NIR_PASS_V(nir, lower_dual_blend);
3632
3667
if (zink_fs_key_base(key)->coord_replace_bits)
3633
NIR_PASS_V(nir, nir_lower_texcoord_replace, zink_fs_key_base(key)->coord_replace_bits, false, false);
3668
NIR_PASS_V(nir, nir_lower_texcoord_replace, zink_fs_key_base(key)->coord_replace_bits, true, false);
3634
3669
if (zink_fs_key_base(key)->point_coord_yinvert)
3635
3670
NIR_PASS_V(nir, invert_point_coord);
3636
3671
if (zink_fs_key_base(key)->force_persample_interp || zink_fs_key_base(key)->fbfetch_ms) {
3694
3729
} else if (need_optimize)
3695
3730
optimize_nir(nir, zs);
3697
mod = compile_module(screen, zs, nir);
3732
struct zink_shader_object obj = compile_module(screen, zs, nir, can_shobj, pg);
3698
3733
ralloc_free(nir);
3737
struct zink_shader_object
3703
3738
zink_shader_compile_separate(struct zink_screen *screen, struct zink_shader *zs)
3705
3740
nir_shader *nir = zink_shader_deserialize(screen, zs);
3706
int set = nir->info.stage == MESA_SHADER_FRAGMENT;
3741
/* TODO: maybe compile multiple variants for different set counts for compact mode? */
3742
int set = zs->info.stage == MESA_SHADER_FRAGMENT;
3743
if (screen->info.have_EXT_shader_object)
3744
set = zs->info.stage;
3707
3745
unsigned offsets[4];
3708
3746
zink_descriptor_shader_get_binding_offsets(zs, offsets);
3709
3747
nir_foreach_variable_with_modes(var, nir, nir_var_mem_ubo | nir_var_mem_ssbo | nir_var_uniform | nir_var_image) {
3727
3765
default: break;
3768
if (screen->driconf.inline_uniforms) {
3769
NIR_PASS_V(nir, nir_lower_io_to_scalar, nir_var_mem_global | nir_var_mem_ubo | nir_var_mem_ssbo | nir_var_mem_shared);
3770
NIR_PASS_V(nir, rewrite_bo_access, screen);
3771
NIR_PASS_V(nir, remove_bo_access, zs);
3730
3773
optimize_nir(nir, zs);
3731
VkShaderModule mod = compile_module(screen, zs, nir);
3774
zink_descriptor_shader_init(screen, zs);
3775
zs->sinfo.last_vertex = zs->sinfo.have_xfb;
3776
nir_shader *nir_clone = NULL;
3777
if (screen->info.have_EXT_shader_object)
3778
nir_clone = nir_shader_clone(nir, nir);
3779
struct zink_shader_object obj = compile_module(screen, zs, nir, true, NULL);
3780
if (screen->info.have_EXT_shader_object && !zs->info.internal) {
3781
/* always try to pre-generate a tcs in case it's needed */
3782
if (zs->info.stage == MESA_SHADER_TESS_EVAL) {
3783
nir_shader *nir_tcs = NULL;
3784
/* use max pcp for compat */
3785
zs->non_fs.generated_tcs = zink_shader_tcs_create(screen, nir_clone, 32, &nir_tcs);
3786
nir_tcs->info.separate_shader = true;
3787
zs->non_fs.generated_tcs->precompile.obj = zink_shader_compile_separate(screen, zs->non_fs.generated_tcs);
3788
ralloc_free(nir_tcs);
3790
if (zs->info.stage == MESA_SHADER_VERTEX || zs->info.stage == MESA_SHADER_TESS_EVAL) {
3791
/* create a second variant with PSIZ removed:
3792
* this works around a bug in drivers using nir_assign_io_var_locations()
3793
* where builtins that aren't read by following stages get assigned
3794
* driver locations before varyings and break the i/o interface between shaders even
3795
* though zink has correctly assigned all locations
3797
nir_variable *var = nir_find_variable_with_location(nir_clone, nir_var_shader_out, VARYING_SLOT_PSIZ);
3798
if (var && !var->data.explicit_location) {
3799
var->data.mode = nir_var_shader_temp;
3800
nir_fixup_deref_modes(nir_clone);
3801
NIR_PASS_V(nir_clone, nir_remove_dead_variables, nir_var_shader_temp, NULL);
3802
optimize_nir(nir_clone, NULL);
3803
zs->precompile.no_psiz_obj = compile_module(screen, zs, nir_clone, true, NULL);
3804
spirv_shader_delete(zs->precompile.no_psiz_obj.spirv);
3805
zs->precompile.no_psiz_obj.spirv = NULL;
3732
3809
ralloc_free(nir);
3810
spirv_shader_delete(obj.spirv);
3909
case nir_intrinsic_ssbo_atomic_fadd:
3910
case nir_intrinsic_ssbo_atomic_add:
3911
case nir_intrinsic_ssbo_atomic_imin:
3912
case nir_intrinsic_ssbo_atomic_umin:
3913
case nir_intrinsic_ssbo_atomic_imax:
3914
case nir_intrinsic_ssbo_atomic_umax:
3915
case nir_intrinsic_ssbo_atomic_and:
3916
case nir_intrinsic_ssbo_atomic_or:
3917
case nir_intrinsic_ssbo_atomic_xor:
3918
case nir_intrinsic_ssbo_atomic_exchange:
3919
case nir_intrinsic_ssbo_atomic_comp_swap:
3920
case nir_intrinsic_ssbo_atomic_fmin:
3921
case nir_intrinsic_ssbo_atomic_fmax:
3922
case nir_intrinsic_ssbo_atomic_fcomp_swap:
3988
case nir_intrinsic_ssbo_atomic:
3989
case nir_intrinsic_ssbo_atomic_swap:
3923
3990
case nir_intrinsic_load_ssbo:
3924
3991
zs->ssbos_used |= get_src_mask_ssbo(shader->info.num_ssbos, intrin->src[0]);
4296
4350
if (intr->intrinsic == nir_intrinsic_image_deref_load ||
4297
4351
intr->intrinsic == nir_intrinsic_image_deref_sparse_load ||
4298
4352
intr->intrinsic == nir_intrinsic_image_deref_store ||
4299
intr->intrinsic == nir_intrinsic_image_deref_atomic_add ||
4300
intr->intrinsic == nir_intrinsic_image_deref_atomic_imin ||
4301
intr->intrinsic == nir_intrinsic_image_deref_atomic_umin ||
4302
intr->intrinsic == nir_intrinsic_image_deref_atomic_imax ||
4303
intr->intrinsic == nir_intrinsic_image_deref_atomic_umax ||
4304
intr->intrinsic == nir_intrinsic_image_deref_atomic_and ||
4305
intr->intrinsic == nir_intrinsic_image_deref_atomic_or ||
4306
intr->intrinsic == nir_intrinsic_image_deref_atomic_xor ||
4307
intr->intrinsic == nir_intrinsic_image_deref_atomic_exchange ||
4308
intr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap ||
4309
intr->intrinsic == nir_intrinsic_image_deref_atomic_fadd ||
4353
intr->intrinsic == nir_intrinsic_image_deref_atomic ||
4354
intr->intrinsic == nir_intrinsic_image_deref_atomic_swap ||
4310
4355
intr->intrinsic == nir_intrinsic_image_deref_size ||
4311
4356
intr->intrinsic == nir_intrinsic_image_deref_samples ||
4312
4357
intr->intrinsic == nir_intrinsic_image_deref_format ||
4313
4358
intr->intrinsic == nir_intrinsic_image_deref_order) {
4316
nir_deref_instr_get_variable(nir_src_as_deref(intr->src[0]));
4360
nir_variable *var = nir_intrinsic_get_var(intr, 0);
4318
4362
/* Structs have been lowered already, so get_aoa_size is sufficient. */
4319
4363
const unsigned size =
4328
4372
static bool warned = false;
4329
4373
if (!screen->info.have_EXT_shader_atomic_float && !screen->is_cpu && !warned) {
4330
4374
switch (intr->intrinsic) {
4331
case nir_intrinsic_image_deref_atomic_add: {
4375
case nir_intrinsic_image_deref_atomic: {
4332
4376
nir_variable *var = nir_intrinsic_get_var(intr, 0);
4333
if (util_format_is_float(var->data.image.format))
4377
if (nir_intrinsic_atomic_op(intr) == nir_atomic_op_iadd &&
4378
util_format_is_float(var->data.image.format))
4334
4379
fprintf(stderr, "zink: Vulkan driver missing VK_EXT_shader_atomic_float but attempting to do atomic ops!\n");
4547
4592
if (intr->intrinsic == nir_intrinsic_image_deref_load ||
4548
4593
intr->intrinsic == nir_intrinsic_image_deref_sparse_load ||
4549
4594
intr->intrinsic == nir_intrinsic_image_deref_store ||
4550
intr->intrinsic == nir_intrinsic_image_deref_atomic_add ||
4551
intr->intrinsic == nir_intrinsic_image_deref_atomic_imin ||
4552
intr->intrinsic == nir_intrinsic_image_deref_atomic_umin ||
4553
intr->intrinsic == nir_intrinsic_image_deref_atomic_imax ||
4554
intr->intrinsic == nir_intrinsic_image_deref_atomic_umax ||
4555
intr->intrinsic == nir_intrinsic_image_deref_atomic_and ||
4556
intr->intrinsic == nir_intrinsic_image_deref_atomic_or ||
4557
intr->intrinsic == nir_intrinsic_image_deref_atomic_xor ||
4558
intr->intrinsic == nir_intrinsic_image_deref_atomic_exchange ||
4559
intr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap ||
4560
intr->intrinsic == nir_intrinsic_image_deref_atomic_fadd ||
4595
intr->intrinsic == nir_intrinsic_image_deref_atomic ||
4596
intr->intrinsic == nir_intrinsic_image_deref_atomic_swap ||
4561
4597
intr->intrinsic == nir_intrinsic_image_deref_samples ||
4562
4598
intr->intrinsic == nir_intrinsic_image_deref_format ||
4563
4599
intr->intrinsic == nir_intrinsic_image_deref_order) {
4610
4646
var->data.mode = nir_var_shader_temp;
4613
static nir_variable *
4614
find_sampler_var(nir_shader *nir, unsigned texture_index)
4616
nir_foreach_variable_with_modes(var, nir, nir_var_uniform) {
4617
unsigned size = glsl_type_is_array(var->type) ? glsl_array_size(var->type) : 1;
4618
if ((glsl_type_is_texture(glsl_without_array(var->type)) || glsl_type_is_sampler(glsl_without_array(var->type))) &&
4619
(var->data.binding == texture_index || (var->data.binding < texture_index && var->data.binding + size > texture_index)))
4626
4650
type_sampler_vars(nir_shader *nir, unsigned *sampler_mask)
4720
4744
fixup_io_locations(nir_shader *nir)
4722
nir_variable_mode mode = nir->info.stage == MESA_SHADER_FRAGMENT ? nir_var_shader_in : nir_var_shader_out;
4723
/* i/o interface blocks are required to be EXACT matches between stages:
4724
* iterate over all locations and set locations incrementally
4727
for (unsigned i = 0; i < VARYING_SLOT_MAX; i++) {
4728
if (nir_slot_is_sysval_output(i))
4730
nir_variable *var = nir_find_variable_with_location(nir, mode, i);
4732
/* locations used between stages are not required to be contiguous */
4733
if (i >= VARYING_SLOT_VAR0)
4746
nir_variable_mode modes;
4747
if (nir->info.stage != MESA_SHADER_FRAGMENT && nir->info.stage != MESA_SHADER_VERTEX)
4748
modes = nir_var_shader_in | nir_var_shader_out;
4750
modes = nir->info.stage == MESA_SHADER_FRAGMENT ? nir_var_shader_in : nir_var_shader_out;
4751
u_foreach_bit(mode, modes) {
4752
/* i/o interface blocks are required to be EXACT matches between stages:
4753
* iterate over all locations and set locations incrementally
4756
for (unsigned i = 0; i < VARYING_SLOT_MAX; i++) {
4757
if (nir_slot_is_sysval_output(i, MESA_SHADER_NONE))
4761
nir_foreach_variable_with_modes(var, nir, 1<<mode) {
4762
if (var->data.location != i)
4764
/* only add slots for non-component vars or first-time component vars */
4765
if (!var->data.location_frac || !size) {
4766
/* ensure variable is given enough slots */
4767
if (nir_is_arrayed_io(var, nir->info.stage))
4768
size += glsl_count_vec4_slots(glsl_get_array_element(var->type), false, false);
4770
size += glsl_count_vec4_slots(var->type, false, false);
4772
var->data.driver_location = slot;
4777
/* ensure the consumed slots aren't double iterated */
4780
/* locations used between stages are not required to be contiguous */
4781
if (i >= VARYING_SLOT_VAR0)
4738
/* ensure variable is given enough slots */
4739
if (nir_is_arrayed_io(var, nir->info.stage))
4740
size = glsl_count_vec4_slots(glsl_get_array_element(var->type), false, false);
4742
size = glsl_count_vec4_slots(var->type, false, false);
4743
var->data.driver_location = slot;
4745
/* ensure the consumed slots aren't double iterated */
4804
4842
NIR_PASS_V(nir, fixup_io_locations);
4806
4844
NIR_PASS_V(nir, lower_basevertex);
4807
NIR_PASS_V(nir, nir_lower_regs_to_ssa);
4808
4845
NIR_PASS_V(nir, lower_baseinstance);
4809
4846
NIR_PASS_V(nir, lower_sparse);
4810
4847
NIR_PASS_V(nir, split_bitfields);
4843
4880
nir_lower_terminate_if_to_cf));
4844
4881
NIR_PASS_V(nir, nir_lower_fragcolor,
4845
4882
nir->info.fs.color_is_dual_source ? 1 : 8);
4846
4884
NIR_PASS_V(nir, lower_64bit_vertex_attribs);
4847
4885
bool needs_size = analyze_io(ret, nir);
4848
4886
NIR_PASS_V(nir, unbreak_bos, ret, needs_size);
4984
5021
if (!nir->info.internal)
4985
5022
nir_foreach_shader_out_variable(var, nir)
4986
5023
var->data.explicit_xfb_buffer = 0;
4987
if (so_info && so_info->num_outputs)
5024
if (so_info && so_info->num_outputs && nir->info.outputs_written)
4988
5025
update_so_info(ret, nir, so_info, nir->info.outputs_written, have_psiz);
4989
5026
else if (have_psiz) {
4990
5027
bool have_fake_psiz = false;
5044
5081
zink_shader_free(struct zink_screen *screen, struct zink_shader *shader)
5083
_mesa_set_destroy(shader->programs, NULL);
5084
util_queue_fence_wait(&shader->precompile.fence);
5085
util_queue_fence_destroy(&shader->precompile.fence);
5086
zink_descriptor_shader_deinit(screen, shader);
5087
if (screen->info.have_EXT_shader_object) {
5088
VKSCR(DestroyShaderEXT)(screen->dev, shader->precompile.obj.obj, NULL);
5089
VKSCR(DestroyShaderEXT)(screen->dev, shader->precompile.no_psiz_obj.obj, NULL);
5091
if (shader->precompile.obj.mod)
5092
VKSCR(DestroyShaderModule)(screen->dev, shader->precompile.obj.mod, NULL);
5093
if (shader->precompile.gpl)
5094
VKSCR(DestroyPipeline)(screen->dev, shader->precompile.gpl, NULL);
5096
blob_finish(&shader->blob);
5097
ralloc_free(shader->spirv);
5098
free(shader->precompile.bindings);
5099
ralloc_free(shader);
5103
zink_gfx_shader_free(struct zink_screen *screen, struct zink_shader *shader)
5046
5105
assert(shader->info.stage != MESA_SHADER_COMPUTE);
5106
util_queue_fence_wait(&shader->precompile.fence);
5047
5107
set_foreach(shader->programs, entry) {
5048
5108
struct zink_gfx_program *prog = (void*)entry->key;
5049
5109
gl_shader_stage stage = shader->info.stage;
5107
5167
if (shader->info.stage == MESA_SHADER_TESS_EVAL &&
5108
5168
shader->non_fs.generated_tcs) {
5109
5169
/* automatically destroy generated tcs shaders when tes is destroyed */
5110
zink_shader_free(screen, shader->non_fs.generated_tcs);
5170
zink_gfx_shader_free(screen, shader->non_fs.generated_tcs);
5111
5171
shader->non_fs.generated_tcs = NULL;
5113
5173
for (unsigned int i = 0; i < ARRAY_SIZE(shader->non_fs.generated_gs); i++) {
5115
5175
if (shader->info.stage != MESA_SHADER_FRAGMENT &&
5116
5176
shader->non_fs.generated_gs[i][j]) {
5117
5177
/* automatically destroy generated gs shaders when owner is destroyed */
5118
zink_shader_free(screen, shader->non_fs.generated_gs[i][j]);
5178
zink_gfx_shader_free(screen, shader->non_fs.generated_gs[i][j]);
5119
5179
shader->non_fs.generated_gs[i][j] = NULL;
5123
_mesa_set_destroy(shader->programs, NULL);
5124
util_queue_fence_wait(&shader->precompile.fence);
5125
util_queue_fence_destroy(&shader->precompile.fence);
5126
zink_descriptor_shader_deinit(screen, shader);
5127
if (shader->precompile.mod)
5128
VKSCR(DestroyShaderModule)(screen->dev, shader->precompile.mod, NULL);
5129
if (shader->precompile.gpl)
5130
VKSCR(DestroyPipeline)(screen->dev, shader->precompile.gpl, NULL);
5131
blob_finish(&shader->blob);
5132
ralloc_free(shader->spirv);
5133
free(shader->precompile.bindings);
5134
ralloc_free(shader);
5183
zink_shader_free(screen, shader);
5139
zink_shader_tcs_compile(struct zink_screen *screen, struct zink_shader *zs, unsigned patch_vertices)
5187
struct zink_shader_object
5188
zink_shader_tcs_compile(struct zink_screen *screen, struct zink_shader *zs, unsigned patch_vertices, bool can_shobj, struct zink_program *pg)
5141
5190
assert(zs->info.stage == MESA_SHADER_TESS_CTRL);
5142
5191
/* shortcut all the nir passes since we just have to change this one word */
5143
5192
zs->spirv->words[zs->spirv->tcs_vertices_out_word] = patch_vertices;
5144
return zink_shader_spirv_compile(screen, zs, NULL);
5193
return zink_shader_spirv_compile(screen, zs, NULL, can_shobj, pg);
5147
5196
/* creating a passthrough tcs shader that's roughly:
5168
5217
struct zink_shader *
5169
zink_shader_tcs_create(struct zink_screen *screen, nir_shader *vs, unsigned vertices_per_patch, nir_shader **nir_ret)
5218
zink_shader_tcs_create(struct zink_screen *screen, nir_shader *tes, unsigned vertices_per_patch, nir_shader **nir_ret)
5171
5220
struct zink_shader *ret = rzalloc(NULL, struct zink_shader);
5172
5221
util_queue_fence_init(&ret->precompile.fence);
5179
5228
fn->is_entrypoint = true;
5180
5229
nir_function_impl *impl = nir_function_impl_create(fn);
5183
nir_builder_init(&b, impl);
5184
b.cursor = nir_before_block(nir_start_block(impl));
5231
nir_builder b = nir_builder_at(nir_before_block(nir_start_block(impl)));
5186
5233
nir_ssa_def *invocation_id = nir_load_invocation_id(&b);
5188
nir_foreach_shader_out_variable(var, vs) {
5189
const struct glsl_type *type = var->type;
5235
nir_foreach_shader_in_variable(var, tes) {
5236
if (var->data.location == VARYING_SLOT_TESS_LEVEL_INNER || var->data.location == VARYING_SLOT_TESS_LEVEL_OUTER)
5190
5238
const struct glsl_type *in_type = var->type;
5191
5239
const struct glsl_type *out_type = var->type;
5192
5240
char buf[1024];
5193
5241
snprintf(buf, sizeof(buf), "%s_out", var->name);
5194
in_type = glsl_array_type(type, 32 /* MAX_PATCH_VERTICES */, 0);
5195
out_type = glsl_array_type(type, vertices_per_patch, 0);
5242
if (!nir_is_arrayed_io(var, MESA_SHADER_TESS_EVAL)) {
5243
const struct glsl_type *type = var->type;
5244
in_type = glsl_array_type(type, 32 /* MAX_PATCH_VERTICES */, 0);
5245
out_type = glsl_array_type(type, vertices_per_patch, 0);
5197
5248
nir_variable *in = nir_variable_create(nir, nir_var_shader_in, in_type, var->name);
5198
5249
nir_variable *out = nir_variable_create(nir, nir_var_shader_out, out_type, buf);
5239
5290
nir->info.tess.tcs_vertices_out = vertices_per_patch;
5240
5291
nir_validate_shader(nir, "created");
5242
NIR_PASS_V(nir, nir_lower_regs_to_ssa);
5243
5293
optimize_nir(nir, NULL);
5244
5294
NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_function_temp, NULL);
5245
NIR_PASS_V(nir, nir_convert_from_ssa, true);
5295
NIR_PASS_V(nir, nir_convert_from_ssa, true, false);
5247
5297
*nir_ret = nir;
5248
5298
zink_shader_serialize_blob(nir, &ret->blob);
5288
5338
nir_serialize(blob, nir, strip);
5342
zink_print_shader(struct zink_screen *screen, struct zink_shader *zs, FILE *fp)
5344
nir_shader *nir = zink_shader_deserialize(screen, zs);
5345
nir_print_shader(nir, fp);