diff --git a/src/graphics/shader/recompiler/backend/spirv/spirvEmitterFlow.cpp b/src/graphics/shader/recompiler/backend/spirv/spirvEmitterFlow.cpp index 5bd8a3bb3..7e7566158 100644 --- a/src/graphics/shader/recompiler/backend/spirv/spirvEmitterFlow.cpp +++ b/src/graphics/shader/recompiler/backend/spirv/spirvEmitterFlow.cpp @@ -843,27 +843,23 @@ uint32_t EmitWriteLane(ValueEmitContext& ctx, const IR::Inst& inst) { } uint32_t EmitPermlane16U32(ValueEmitContext& ctx, const IR::Inst& inst) { - auto& state = ctx.state; - const auto flags = inst.Flags(); - const auto subid = EmitSubgroupLocalInvocationId(state); - const auto row = state.builder.AllocateId(); - const auto row_value = state.builder.AllocateId(); - const auto lane = state.builder.AllocateId(); - const auto lane8 = state.builder.AllocateId(); - const auto shift = state.builder.AllocateId(); - const auto upper = state.builder.AllocateId(); - const auto selected = state.builder.AllocateId(); - const auto shifted = state.builder.AllocateId(); - const auto index = state.builder.AllocateId(); - const auto target = state.builder.AllocateId(); + auto& state = ctx.state; + const auto flags = inst.Flags(); + const auto subid = EmitSubgroupLocalInvocationId(state); + const auto row = state.builder.AllocateId(); + const auto lane = state.builder.AllocateId(); + const auto lane8 = state.builder.AllocateId(); + const auto shift = state.builder.AllocateId(); + const auto upper = state.builder.AllocateId(); + const auto selected = state.builder.AllocateId(); + const auto shifted = state.builder.AllocateId(); + const auto index = state.builder.AllocateId(); + const auto target = state.builder.AllocateId(); state.builder.AddFunction(spv::OpBitwiseAnd, TypeU32(state), row, subid, ConstantU32(state, 0xfffffff0u)); - if (flags.x16) { - state.builder.AddFunction(spv::OpBitwiseXor, TypeU32(state), row_value, row, - ConstantU32(state, 16)); - } else { - state.builder.AddFunction(spv::OpCopyObject, TypeU32(state), row_value, row); - } + const auto row_value = + flags.x16 ? Binary(state, spv::OpBitwiseXor, TypeU32(state), row, ConstantU32(state, 16)) + : row; state.builder.AddFunction(spv::OpBitwiseAnd, TypeU32(state), lane, subid, ConstantU32(state, 15)); state.builder.AddFunction(spv::OpBitwiseAnd, TypeU32(state), lane8, lane, diff --git a/tests/ShaderRecompilerComputeTests.cpp b/tests/ShaderRecompilerComputeTests.cpp index 5bbcadb87..98a184762 100644 --- a/tests/ShaderRecompilerComputeTests.cpp +++ b/tests/ShaderRecompilerComputeTests.cpp @@ -28061,6 +28061,7 @@ TestCase VectorPermlane16InactiveSource(u32 op_sel, u32 wave_size) { test.opcodes = {O::V_MOV_B32, O::V_ADD_NC_U32, O::S_MOV_B32, O::V_PERMLANE16_B32, O::V_LSHLREV_B32, O::BUFFER_STORE_DWORD, O::S_ENDPGM}; + test.forbidden_spirv = {"OpCopyObject"}; test.compute_info.wave_size = wave_size; test.compute_info.threads_num[0] = wave_size; test.compute_info.threads_num[1] = 1;