diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.cpp b/renderdoc/driver/shaders/spirv/spirv_debug.cpp index 83219deaf..7a40e300b 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug.cpp @@ -65,6 +65,7 @@ ThreadState::ThreadState(uint32_t workgroupIdx, Debugger &debug, const GlobalSta workgroupIndex = workgroupIdx; nextInstruction = 0; helperInvocation = false; + killed = false; } ThreadState::~ThreadState() @@ -76,7 +77,7 @@ ThreadState::~ThreadState() bool ThreadState::Finished() const { - return helperInvocation || callstack.empty(); + return helperInvocation || killed || callstack.empty(); } void ThreadState::FillCallstack(ShaderDebugState &state) @@ -1880,6 +1881,18 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray break; } + case Op::Kill: + { + killed = true; + + // destroy all stack frames + for(StackFrame *exitingFrame : callstack) + delete exitingFrame; + + callstack.clear(); + + break; + } case Op::Return: case Op::ReturnValue: { diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.h b/renderdoc/driver/shaders/spirv/spirv_debug.h index 6908c80ea..e765c6fbe 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.h +++ b/renderdoc/driver/shaders/spirv/spirv_debug.h @@ -198,6 +198,7 @@ struct ThreadState // index in the pixel quad uint32_t workgroupIndex; bool helperInvocation; + bool killed; const ShaderVariable &GetSrc(Id id) const; diff --git a/util/test/demos/vk/vk_shader_debug_zoo.cpp b/util/test/demos/vk/vk_shader_debug_zoo.cpp index 3403ef4fc..97bf2fe29 100644 --- a/util/test/demos/vk/vk_shader_debug_zoo.cpp +++ b/util/test/demos/vk/vk_shader_debug_zoo.cpp @@ -649,6 +649,10 @@ void main() vec4(posone*1.0f, posone*2.0f, posone*3.0f, posone*4.0f), c); break; } + case 80: + { + discard; + } default: break; } }