diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2022-09-07 18:00:11 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-07 18:00:11 +0300 |
commit | 6a5d6a99878ff420e0331436b7026fb924301595 (patch) | |
tree | f2abc1362097308b290b9731001df53a7c460b48 | |
parent | d051806b84d912d1095bea5858c139d4b8725161 (diff) | |
parent | 51a0ddcbedc49a8a1f931cd2f6d693374315cdb7 (diff) |
Merge pull request #129 from HansKristian-Work/dispatch-mesh-terminator
Treat OpEmitMeshTasksEXT as a terminator.
-rw-r--r-- | reference/shaders/stages/task-basic.invalid.task (renamed from reference/shaders/stages/task-basic.task) | 3 | ||||
-rw-r--r-- | shaders/stages/task-basic.invalid.task (renamed from shaders/stages/task-basic.task) | 0 | ||||
-rw-r--r-- | spirv_module.cpp | 10 |
3 files changed, 6 insertions, 7 deletions
diff --git a/reference/shaders/stages/task-basic.task b/reference/shaders/stages/task-basic.invalid.task index 9a42de6..db9e165 100644 --- a/reference/shaders/stages/task-basic.task +++ b/reference/shaders/stages/task-basic.invalid.task @@ -25,7 +25,7 @@ void main() ; SPIR-V ; Version: 1.4 ; Generator: Unknown(30017); 21022 -; Bound: 29 +; Bound: 28 ; Schema: 0 OpCapability Shader OpCapability MeshShadingEXT @@ -69,6 +69,5 @@ OpStore %23 %17 %25 = OpAccessChain %18 %13 %20 %16 %26 OpStore %25 %17 OpEmitMeshTasksEXT %24 %26 %7 %13 -OpReturn OpFunctionEnd #endif diff --git a/shaders/stages/task-basic.task b/shaders/stages/task-basic.invalid.task index 755bbdf..755bbdf 100644 --- a/shaders/stages/task-basic.task +++ b/shaders/stages/task-basic.invalid.task diff --git a/spirv_module.cpp b/spirv_module.cpp index 17ca7b5..06b9ddb 100644 --- a/spirv_module.cpp +++ b/spirv_module.cpp @@ -1052,10 +1052,12 @@ void SPIRVModule::Impl::emit_basic_block(CFGNode *node) builder.addExtension("SPV_EXT_demote_to_helper_invocation"); builder.addCapability(spv::CapabilityDemoteToHelperInvocationEXT); } - else if (op->op == spv::OpTerminateRayKHR || op->op == spv::OpIgnoreIntersectionKHR) + else if (op->op == spv::OpTerminateRayKHR || op->op == spv::OpIgnoreIntersectionKHR || + op->op == spv::OpEmitMeshTasksEXT) { // In DXIL, these must be by unreachable. // There is no [[noreturn]] qualifier used for these intrinsics apparently. + // EmitMeshTasksEXT is similar, but ret void comes after. implicit_terminator = true; } @@ -1088,13 +1090,11 @@ void SPIRVModule::Impl::emit_basic_block(CFGNode *node) { LOGE("Basic block has implicit terminator, but attempts to merge execution?\n"); mark_error = true; - return; } - else if (ir.terminator.type != Terminator::Type::Unreachable) + else if (ir.terminator.type != Terminator::Type::Unreachable && ir.terminator.type != Terminator::Type::Return) { - LOGE("Implicitly terminated blocks must terminate with Unreachable.\n"); + LOGE("Implicitly terminated blocks must terminate with Unreachable or Return.\n"); mark_error = true; - return; } return; |