Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/HansKristian-Work/dxil-spirv.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2022-09-07 18:00:11 +0300
committerGitHub <noreply@github.com>2022-09-07 18:00:11 +0300
commit6a5d6a99878ff420e0331436b7026fb924301595 (patch)
treef2abc1362097308b290b9731001df53a7c460b48
parentd051806b84d912d1095bea5858c139d4b8725161 (diff)
parent51a0ddcbedc49a8a1f931cd2f6d693374315cdb7 (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.cpp10
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;