diff options
author | Kenneth Graunke <[email protected]> | 2016-07-19 19:00:19 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2016-07-20 11:01:26 -0700 |
commit | 3dba8516d6468866f2534f517358a6243eb0995e (patch) | |
tree | 1d0b2c163ba1b2616b1ee2bb45138db483bd8d6a /src/mesa | |
parent | 160820995210e0b85fd25821f5ae785d6a539e08 (diff) |
i965: Move VS load_input handling to nir_emit_vs_intrinsic().
TCS/TES/GS and now FS all handle these in stage-specific functions.
CS don't have inputs, so VS was the only one left using this code.
Move it to the VS-specific function for clarity.
Signed-off-by: Kenneth Graunke <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp index 22cba8c32db..4d4c94a55bd 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp @@ -2358,6 +2358,36 @@ fs_visitor::nir_emit_vs_intrinsic(const fs_builder &bld, break; } + case nir_intrinsic_load_input: { + fs_reg src = fs_reg(ATTR, instr->const_index[0], dest.type); + unsigned num_components = instr->num_components; + enum brw_reg_type type = dest.type; + + nir_const_value *const_offset = nir_src_as_const_value(instr->src[0]); + assert(const_offset && "Indirect input loads not allowed"); + src = offset(src, bld, const_offset->u32[0]); + + for (unsigned j = 0; j < num_components; j++) { + bld.MOV(offset(dest, bld, j), offset(src, bld, j)); + } + + if (type == BRW_REGISTER_TYPE_DF) { + /* Once the double vector is read, set again its original register + * type to continue with normal execution. + */ + src = retype(src, type); + dest = retype(dest, type); + } + + if (type_sz(src.type) == 8) { + shuffle_32bit_load_result_to_64bit_data(bld, + dest, + retype(dest, BRW_REGISTER_TYPE_F), + instr->num_components); + } + break; + } + default: nir_emit_intrinsic(bld, instr); break; @@ -3968,37 +3998,6 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr break; } - case nir_intrinsic_load_input: { - fs_reg src = fs_reg(ATTR, instr->const_index[0], dest.type); - unsigned num_components = instr->num_components; - enum brw_reg_type type = dest.type; - - nir_const_value *const_offset = nir_src_as_const_value(instr->src[0]); - assert(const_offset && "Indirect input loads not allowed"); - src = offset(src, bld, const_offset->u32[0]); - - for (unsigned j = 0; j < num_components; j++) { - bld.MOV(offset(dest, bld, j), offset(src, bld, j)); - } - - if (type == BRW_REGISTER_TYPE_DF) { - /* Once the double vector is read, set again its original register - * type to continue with normal execution. - */ - src = retype(src, type); - dest = retype(dest, type); - } - - if (type_sz(src.type) == 8) { - shuffle_32bit_load_result_to_64bit_data(bld, - dest, - retype(dest, BRW_REGISTER_TYPE_F), - instr->num_components); - } - - break; - } - case nir_intrinsic_store_ssbo: { assert(devinfo->gen >= 7); |