Просмотр исходного кода

spirv: Move phi node patching to a separate function

ReinUsesLisp 5 лет назад
Родитель
Сommit
106764a6d5
1 измененных файлов с 16 добавлено и 13 удалено
  1. 16 13
      src/shader_recompiler/backend/spirv/emit_spirv.cpp

+ 16 - 13
src/shader_recompiler/backend/spirv/emit_spirv.cpp

@@ -246,21 +246,10 @@ void SetupCapabilities(const Profile& profile, const Info& info, EmitContext& ct
     ctx.AddCapability(spv::Capability::ImageQuery);
     ctx.AddCapability(spv::Capability::SampledBuffer);
 }
-} // Anonymous namespace
-
-std::vector<u32> EmitSPIRV(const Profile& profile, IR::Program& program, u32& binding) {
-    EmitContext ctx{profile, program, binding};
-    const Id main{DefineMain(ctx, program)};
-    DefineEntryPoint(program, ctx, main);
-    if (profile.support_float_controls) {
-        ctx.AddExtension("SPV_KHR_float_controls");
-        SetupDenormControl(profile, program, ctx, main);
-        SetupSignedNanCapabilities(profile, program, ctx, main);
-    }
-    SetupCapabilities(profile, program.info, ctx);
 
+void PatchPhiNodes(IR::Program& program, EmitContext& ctx) {
     auto inst{program.blocks.front()->begin()};
-    size_t block_index{};
+    size_t block_index{0};
     ctx.PatchDeferredPhi([&](size_t phi_arg) {
         if (phi_arg == 0) {
             ++inst;
@@ -274,6 +263,20 @@ std::vector<u32> EmitSPIRV(const Profile& profile, IR::Program& program, u32& bi
         }
         return ctx.Def(inst->Arg(phi_arg));
     });
+}
+} // Anonymous namespace
+
+std::vector<u32> EmitSPIRV(const Profile& profile, IR::Program& program, u32& binding) {
+    EmitContext ctx{profile, program, binding};
+    const Id main{DefineMain(ctx, program)};
+    DefineEntryPoint(program, ctx, main);
+    if (profile.support_float_controls) {
+        ctx.AddExtension("SPV_KHR_float_controls");
+        SetupDenormControl(profile, program, ctx, main);
+        SetupSignedNanCapabilities(profile, program, ctx, main);
+    }
+    SetupCapabilities(profile, program.info, ctx);
+    PatchPhiNodes(program, ctx);
     return ctx.Assemble();
 }