|
|
|
@ -126,12 +126,12 @@ Id DefineMain(EmitContext& ctx, IR::Program& program) { |
|
|
|
return main; |
|
|
|
} |
|
|
|
|
|
|
|
void DefineEntryPoint(Environment& env, const IR::Program& program, EmitContext& ctx, Id main) { |
|
|
|
void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) { |
|
|
|
const std::span interfaces(ctx.interfaces.data(), ctx.interfaces.size()); |
|
|
|
spv::ExecutionModel execution_model{}; |
|
|
|
switch (program.stage) { |
|
|
|
case Shader::Stage::Compute: { |
|
|
|
const std::array<u32, 3> workgroup_size{env.WorkgroupSize()}; |
|
|
|
const std::array<u32, 3> workgroup_size{program.workgroup_size}; |
|
|
|
execution_model = spv::ExecutionModel::GLCompute; |
|
|
|
ctx.AddExecutionMode(main, spv::ExecutionMode::LocalSize, workgroup_size[0], |
|
|
|
workgroup_size[1], workgroup_size[2]); |
|
|
|
@ -148,7 +148,7 @@ void DefineEntryPoint(Environment& env, const IR::Program& program, EmitContext& |
|
|
|
} |
|
|
|
break; |
|
|
|
default: |
|
|
|
throw NotImplementedException("Stage {}", env.ShaderStage()); |
|
|
|
throw NotImplementedException("Stage {}", program.stage); |
|
|
|
} |
|
|
|
ctx.AddEntryPoint(execution_model, main, "main", interfaces); |
|
|
|
} |
|
|
|
@ -267,11 +267,10 @@ Id PhiArgDef(EmitContext& ctx, IR::Inst* inst, size_t index) { |
|
|
|
} |
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
std::vector<u32> EmitSPIRV(const Profile& profile, Environment& env, IR::Program& program, |
|
|
|
u32& binding) { |
|
|
|
std::vector<u32> EmitSPIRV(const Profile& profile, IR::Program& program, u32& binding) { |
|
|
|
EmitContext ctx{profile, program, binding}; |
|
|
|
const Id main{DefineMain(ctx, program)}; |
|
|
|
DefineEntryPoint(env, program, ctx, main); |
|
|
|
DefineEntryPoint(program, ctx, main); |
|
|
|
if (profile.support_float_controls) { |
|
|
|
ctx.AddExtension("SPV_KHR_float_controls"); |
|
|
|
SetupDenormControl(profile, program, ctx, main); |
|
|
|
|