From fff2383c5e3111d73baefdd5e74335df503c52a8 Mon Sep 17 00:00:00 2001 From: Lander Gallastegi Date: Thu, 27 Mar 2025 11:54:58 +0100 Subject: [PATCH] Flattening pass adjustments --- .../backend/spirv/emit_spirv_context_get_set.cpp | 1 + .../ir/passes/flatten_extended_userdata_pass.cpp | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index 721148e85..5b4f3c3c5 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -164,6 +164,7 @@ using BufferAlias = EmitContext::BufferAlias; Id EmitReadConst(EmitContext& ctx, IR::Inst* inst) { const auto& srt_flatbuf = ctx.buffers.back(); + ASSERT_MSG(inst->Flags() == 1, "ReadConst was not processed by the flattening pass"); ASSERT(srt_flatbuf.binding >= 0 && srt_flatbuf.buffer_type == BufferType::ReadConstUbo); const auto [id, pointer_type] = srt_flatbuf[BufferAlias::U32]; const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, ctx.Def(inst->Arg(1)))}; diff --git a/src/shader_recompiler/ir/passes/flatten_extended_userdata_pass.cpp b/src/shader_recompiler/ir/passes/flatten_extended_userdata_pass.cpp index 7aa8283eb..10e651e1c 100644 --- a/src/shader_recompiler/ir/passes/flatten_extended_userdata_pass.cpp +++ b/src/shader_recompiler/ir/passes/flatten_extended_userdata_pass.cpp @@ -159,14 +159,17 @@ static void GenerateSrtReadConsts(IR::Program& program, PassInfo& pass_info, Poo ++IR::Block::InstructionList::s_iterator_to(*inst)); ir.StoreFlatbuf(IR::U32(inst), save_offset); } + data.original_inst->SetFlags(1); + IR::IREmitter ir(*data.original_inst); + data.original_inst->SetArg(0, ir.Imm32(0)); if (data.count_dw > 1) { IR::U32 counter = WrapInstWithCounter(data.original_inst, data.offset_dw, original_first_block); data.original_inst->SetArg(1, counter); } else { - IR::IREmitter ir(*data.original_inst); data.original_inst->SetArg(1, ir.Imm32(data.offset_dw)); } + } DeadCodeEliminationPass(sub_program); IR::DumpProgram(sub_program, sub_program.info, "srt");