diff options
author | Kenneth Graunke <[email protected]> | 2017-11-03 14:52:05 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2017-11-15 09:37:32 -0800 |
commit | ff964916dc5424495a3e884e02c3b2c8f285b78b (patch) | |
tree | 4dd36238871ef6891324e6dfaa3914c3cda056fe /src/intel/compiler/brw_fs_nir.cpp | |
parent | f48f52b0306e37d4d41dbf6a32970ee468298b2b (diff) |
i965: Use nir_lower_atomics_to_ssbos and delete ABO compiler code.
We use the same hardware mechanism for both atomic counters and SSBO
atomics, so there's really no benefit to maintaining separate code to
handle each case. Instead, we can just use Rob's shiny new NIR pass to
convert atomic_uints to SSBOs, and delete piles of code.
The ssbo_start section of the binding table becomes a combined ABO and
SSBO section, with ABOs first, then SSBOs.
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/intel/compiler/brw_fs_nir.cpp')
-rw-r--r-- | src/intel/compiler/brw_fs_nir.cpp | 47 |
1 files changed, 0 insertions, 47 deletions
diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index ca3707db90f..bed1cd3b492 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -3645,53 +3645,6 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr dest = get_nir_dest(instr->dest); switch (instr->intrinsic) { - case nir_intrinsic_atomic_counter_inc: - case nir_intrinsic_atomic_counter_dec: - case nir_intrinsic_atomic_counter_read: - case nir_intrinsic_atomic_counter_add: - case nir_intrinsic_atomic_counter_min: - case nir_intrinsic_atomic_counter_max: - case nir_intrinsic_atomic_counter_and: - case nir_intrinsic_atomic_counter_or: - case nir_intrinsic_atomic_counter_xor: - case nir_intrinsic_atomic_counter_exchange: - case nir_intrinsic_atomic_counter_comp_swap: { - if (stage == MESA_SHADER_FRAGMENT && - instr->intrinsic != nir_intrinsic_atomic_counter_read) - brw_wm_prog_data(prog_data)->has_side_effects = true; - - /* Get some metadata from the image intrinsic. */ - const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; - - /* Get the arguments of the atomic intrinsic. */ - const fs_reg offset = get_nir_src(instr->src[0]); - const unsigned surface = (stage_prog_data->binding_table.abo_start + - instr->const_index[0]); - const fs_reg src0 = (info->num_srcs >= 2 - ? get_nir_src(instr->src[1]) : fs_reg()); - const fs_reg src1 = (info->num_srcs >= 3 - ? get_nir_src(instr->src[2]) : fs_reg()); - fs_reg tmp; - - assert(info->num_srcs <= 3); - - /* Emit a surface read or atomic op. */ - if (instr->intrinsic == nir_intrinsic_atomic_counter_read) { - tmp = emit_untyped_read(bld, brw_imm_ud(surface), offset, 1, 1); - } else { - tmp = emit_untyped_atomic(bld, brw_imm_ud(surface), offset, src0, - src1, 1, 1, - get_atomic_counter_op(instr->intrinsic)); - } - - /* Assign the result. */ - bld.MOV(retype(dest, BRW_REGISTER_TYPE_UD), tmp); - - /* Mark the surface as used. */ - brw_mark_surface_used(stage_prog_data, surface); - break; - } - case nir_intrinsic_image_load: case nir_intrinsic_image_store: case nir_intrinsic_image_atomic_add: |