X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fintel%2Fcompiler%2Fbrw_fs_nir.cpp;h=1e7418d5484c8da15cd549ca8217c2b4de1057d1;hb=fe18a0fd45c79cdba7b63959657861488c775c0d;hp=b05421746a5e3895d3f0611f8bd4462ebcf5b136;hpb=e5899c1e8818f7cfdd23c06c504009e5659794b7;p=mesa.git diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index b05421746a5..1e7418d5484 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -752,6 +752,8 @@ fs_visitor::prepare_alu_destination_and_sources(const fs_builder &bld, case nir_op_vec2: case nir_op_vec3: case nir_op_vec4: + case nir_op_vec8: + case nir_op_vec16: return result; default: break; @@ -1002,14 +1004,16 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr, unsigned execution_mode = bld.shader->nir->info.float_controls_execution_mode; - fs_reg op[4]; + fs_reg op[NIR_MAX_VEC_COMPONENTS]; fs_reg result = prepare_alu_destination_and_sources(bld, instr, op, need_dest); switch (instr->op) { case nir_op_mov: case nir_op_vec2: case nir_op_vec3: - case nir_op_vec4: { + case nir_op_vec4: + case nir_op_vec8: + case nir_op_vec16: { fs_reg temp = result; bool need_extra_copy = false; for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) { @@ -1026,10 +1030,10 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr, continue; if (instr->op == nir_op_mov) { - inst = bld.MOV(offset(temp, bld, i), + bld.MOV(offset(temp, bld, i), offset(op[0], bld, instr->src[0].swizzle[i])); } else { - inst = bld.MOV(offset(temp, bld, i), + bld.MOV(offset(temp, bld, i), offset(op[i], bld, instr->src[i].swizzle[0])); } } @@ -3755,6 +3759,7 @@ fs_visitor::nir_emit_cs_intrinsic(const fs_builder &bld, } case nir_intrinsic_load_num_work_groups: { + assert(nir_dest_bit_size(instr->dest) == 32); const unsigned surface = cs_prog_data->binding_table.work_groups_start; @@ -3763,14 +3768,12 @@ fs_visitor::nir_emit_cs_intrinsic(const fs_builder &bld, fs_reg srcs[SURFACE_LOGICAL_NUM_SRCS]; srcs[SURFACE_LOGICAL_SRC_SURFACE] = brw_imm_ud(surface); srcs[SURFACE_LOGICAL_SRC_IMM_DIMS] = brw_imm_ud(1); - srcs[SURFACE_LOGICAL_SRC_IMM_ARG] = brw_imm_ud(1); /* num components */ - - /* Read the 3 GLuint components of gl_NumWorkGroups */ - for (unsigned i = 0; i < 3; i++) { - srcs[SURFACE_LOGICAL_SRC_ADDRESS] = brw_imm_ud(i << 2); + srcs[SURFACE_LOGICAL_SRC_IMM_ARG] = brw_imm_ud(3); /* num components */ + srcs[SURFACE_LOGICAL_SRC_ADDRESS] = brw_imm_ud(0); + fs_inst *inst = bld.emit(SHADER_OPCODE_UNTYPED_SURFACE_READ_LOGICAL, - offset(dest, bld, i), srcs, SURFACE_LOGICAL_NUM_SRCS); - } + dest, srcs, SURFACE_LOGICAL_NUM_SRCS); + inst->size_written = 3 * dispatch_width * 4; break; } @@ -4392,6 +4395,13 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr bld.MOV(retype(dest, BRW_REGISTER_TYPE_D), brw_imm_d(1)); break; + case nir_intrinsic_load_reloc_const_intel: { + uint32_t id = nir_intrinsic_param_idx(instr); + bld.emit(SHADER_OPCODE_MOV_RELOC_IMM, + dest, brw_imm_ud(id)); + break; + } + case nir_intrinsic_load_uniform: { /* Offsets are in bytes but they should always aligned to * the type size @@ -4550,7 +4560,8 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr break; } - case nir_intrinsic_load_global: { + case nir_intrinsic_load_global: + case nir_intrinsic_load_global_constant: { assert(devinfo->gen >= 8); assert(nir_dest_bit_size(instr->dest) <= 32); @@ -4818,7 +4829,7 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr /* Read the vector */ assert(nir_dest_num_components(instr->dest) == 1); assert(nir_dest_bit_size(instr->dest) <= 32); - assert(nir_intrinsic_align(instr) > 1); + assert(nir_intrinsic_align(instr) > 0); if (nir_dest_bit_size(instr->dest) >= 4 && nir_intrinsic_align(instr) >= 4) { /* The offset for a DWORD scattered message is in dwords. */