From 528a0c5f5e91f42d0f1580998f225dcf2d9b3bc5 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 1 Apr 2020 17:38:44 +0100 Subject: [PATCH] Guard against integer division by zero * The SPIR-V spec doesn't state what will happen, only that it's undefined. For the sake of something sensible (and because it has a good chance of matching at least some hardware) we use D3D's behaviour and set the value to 0xFFFFFFFF --- renderdoc/driver/shaders/spirv/spirv_debug.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.cpp b/renderdoc/driver/shaders/spirv/spirv_debug.cpp index 78d644e67..869205aae 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug.cpp @@ -783,12 +783,22 @@ void ThreadState::StepNext(ShaderDebugState *state, else if(opdata.op == Op::SDiv) { for(uint8_t c = 0; c < var.columns; c++) - var.value.iv[c] /= b.value.iv[c]; + { + if(b.value.uv[c] == 0) + var.value.uv[c] = ~0U; + else + var.value.iv[c] /= b.value.iv[c]; + } } else if(opdata.op == Op::UDiv) { for(uint8_t c = 0; c < var.columns; c++) - var.value.uv[c] /= b.value.uv[c]; + { + if(b.value.uv[c] == 0) + var.value.uv[c] = ~0U; + else + var.value.uv[c] /= b.value.uv[c]; + } } else if(opdata.op == Op::IAdd) {