pan/bi: Add intrinsic emits for builder

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8135>
This commit is contained in:
Alyssa Rosenzweig 2020-12-16 13:35:42 -05:00 committed by Marge Bot
parent 482cc273af
commit 9c7efc4510
1 changed files with 136 additions and 0 deletions

View File

@ -1234,6 +1234,142 @@ bi_emit_instance_id(bi_context *ctx, nir_intrinsic_instr *instr)
bi_emit(ctx, mov);
}
static void
bi_emit_intrinsic(bi_builder *b, nir_intrinsic_instr *instr)
{
bi_index dst = nir_intrinsic_infos[instr->intrinsic].has_dest ?
bi_dest_index(&instr->dest) : bi_null();
gl_shader_stage stage = b->shader->stage;
switch (instr->intrinsic) {
case nir_intrinsic_load_barycentric_pixel:
case nir_intrinsic_load_barycentric_centroid:
case nir_intrinsic_load_barycentric_sample:
/* handled later via load_vary */
break;
case nir_intrinsic_load_interpolated_input:
case nir_intrinsic_load_input:
if (b->shader->is_blend)
bi_emit_load_blend_input(b, instr);
else if (stage == MESA_SHADER_FRAGMENT)
bi_emit_load_vary(b, instr);
else if (stage == MESA_SHADER_VERTEX)
bi_emit_load_attr(b, instr);
else
unreachable("Unsupported shader stage");
break;
case nir_intrinsic_store_output:
if (stage == MESA_SHADER_FRAGMENT)
bi_emit_fragment_out(b, instr);
else if (stage == MESA_SHADER_VERTEX)
bi_emit_store_vary(b, instr);
else
unreachable("Unsupported shader stage");
break;
case nir_intrinsic_store_combined_output_pan:
assert(stage == MESA_SHADER_FRAGMENT);
bi_emit_fragment_out(b, instr);
break;
case nir_intrinsic_load_ubo:
bi_emit_load_ubo(b, instr);
break;
case nir_intrinsic_load_frag_coord:
bi_emit_load_frag_coord(b, instr);
break;
case nir_intrinsic_load_output:
bi_emit_ld_tile(b, instr);
break;
case nir_intrinsic_discard_if: {
bi_index src = bi_src_index(&instr->src[0]);
unsigned sz = nir_src_bit_size(instr->src[0]);
assert(sz == 16 || sz == 32);
if (sz == 16)
src = bi_half(src, false);
bi_discard_f32_to(b, bi_null(), src, bi_zero(), BI_CMPF_NE);
break;
}
case nir_intrinsic_discard:
bi_discard_f32_to(b, bi_null(), bi_zero(), bi_zero(),
BI_CMPF_EQ);
break;
case nir_intrinsic_load_ssbo_address:
bi_load_sysval(b, &instr->instr, 1, 0);
break;
case nir_intrinsic_get_ssbo_size:
bi_load_sysval(b, &instr->instr, 1, 8);
break;
case nir_intrinsic_load_viewport_scale:
case nir_intrinsic_load_viewport_offset:
case nir_intrinsic_load_num_work_groups:
case nir_intrinsic_load_sampler_lod_parameters_pan:
bi_load_sysval(b, &instr->instr, 3, 0);
break;
case nir_intrinsic_load_blend_const_color_r_float:
bi_mov_i32_to(b, dst,
bi_imm_f32(b->shader->blend_constants[0]));
break;
case nir_intrinsic_load_blend_const_color_g_float:
bi_mov_i32_to(b, dst,
bi_imm_f32(b->shader->blend_constants[1]));
break;
case nir_intrinsic_load_blend_const_color_b_float:
bi_mov_i32_to(b, dst,
bi_imm_f32(b->shader->blend_constants[2]));
break;
case nir_intrinsic_load_blend_const_color_a_float:
bi_mov_i32_to(b, dst,
bi_imm_f32(b->shader->blend_constants[3]));
break;
case nir_intrinsic_load_sample_id: {
/* r61[16:23] contains the sampleID, mask it out */
bi_rshift_and_i32_to(b, dst, bi_register(61), bi_imm_u32(0xff),
bi_imm_u8(16));
break;
}
case nir_intrinsic_load_front_face:
/* r58 == 0 means primitive is front facing */
bi_icmp_i32_to(b, dst, bi_register(58), bi_zero(), BI_CMPF_EQ,
BI_RESULT_TYPE_M1);
break;
case nir_intrinsic_load_point_coord:
bi_ld_var_special_to(b, dst, bi_zero(), BI_REGISTER_FORMAT_F32,
BI_SAMPLE_CENTER, BI_UPDATE_CLOBBER,
BI_VARYING_NAME_POINT, BI_VECSIZE_V2);
break;
case nir_intrinsic_load_vertex_id:
bi_mov_i32_to(b, dst, bi_register(61));
break;
case nir_intrinsic_load_instance_id:
bi_mov_i32_to(b, dst, bi_register(62));
break;
default:
unreachable("Unknown intrinsic");
}
}
static void
emit_intrinsic(bi_context *ctx, nir_intrinsic_instr *instr)
{