diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.cpp b/renderdoc/driver/shaders/spirv/spirv_debug.cpp index 2cc6e6c1a..5503abe1b 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug.cpp @@ -27,10 +27,6 @@ #include "common/formatting.h" #include "spirv_op_helpers.h" -#if defined(_MSC_VER) -#define finite _finite -#endif - static bool ContainsNaNInf(const ShaderVariable &val) { bool ret = false; @@ -1878,6 +1874,8 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray case Op::PtrCastToGeneric: case Op::GenericCastToPtr: case Op::GenericCastToPtrExplicit: + case Op::SizeOf: + case Op::CopyMemorySized: case Op::IsFinite: case Op::IsNormal: case Op::SignBitSet: diff --git a/renderdoc/driver/shaders/spirv/spirv_debug_glsl450.cpp b/renderdoc/driver/shaders/spirv/spirv_debug_glsl450.cpp index c927f2fbe..722984d23 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug_glsl450.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug_glsl450.cpp @@ -25,10 +25,6 @@ #include "spirv_debug.h" #include -#if defined(_MSC_VER) -#define finite _finite -#endif - namespace rdcspv { namespace glsl @@ -53,6 +49,18 @@ ShaderVariable FAbs(ThreadState &state, const rdcarray ¶ms) return var; } +ShaderVariable SAbs(ThreadState &state, const rdcarray ¶ms) +{ + CHECK_PARAMS(1); + + ShaderVariable var = state.GetSrc(params[0]); + + for(uint32_t c = 0; c < var.columns; c++) + var.value.iv[c] = abs(var.value.iv[c]); + + return var; +} + ShaderVariable Floor(ThreadState &state, const rdcarray ¶ms) { CHECK_PARAMS(1); @@ -266,6 +274,71 @@ ShaderVariable Cross(ThreadState &state, const rdcarray ¶ms) return var; } + +static float GLSLNMax(float x, float y) +{ + const bool xnan = isnan(x); + const bool ynan = isnan(y); + if(xnan && !ynan) + return y; + else if(!xnan && ynan) + return x; + else + return x < y ? y : x; +} + +static float GLSLNMin(float x, float y) +{ + const bool xnan = isnan(x); + const bool ynan = isnan(y); + if(xnan && !ynan) + return y; + else if(!xnan && ynan) + return x; + else + return y < x ? y : x; +} + +ShaderVariable NMin(ThreadState &state, const rdcarray ¶ms) +{ + CHECK_PARAMS(2); + + ShaderVariable var = state.GetSrc(params[0]); + ShaderVariable y = state.GetSrc(params[1]); + + for(uint32_t c = 0; c < var.columns; c++) + var.value.fv[c] = GLSLNMin(var.value.fv[c], y.value.fv[c]); + + return var; +} + +ShaderVariable NMax(ThreadState &state, const rdcarray ¶ms) +{ + CHECK_PARAMS(2); + + ShaderVariable var = state.GetSrc(params[0]); + ShaderVariable y = state.GetSrc(params[1]); + + for(uint32_t c = 0; c < var.columns; c++) + var.value.fv[c] = GLSLNMax(var.value.fv[c], y.value.fv[c]); + + return var; +} + +ShaderVariable NClamp(ThreadState &state, const rdcarray ¶ms) +{ + CHECK_PARAMS(3); + + ShaderVariable var = state.GetSrc(params[0]); + ShaderVariable minVal = state.GetSrc(params[1]); + ShaderVariable maxVal = state.GetSrc(params[2]); + + for(uint32_t c = 0; c < var.columns; c++) + var.value.fv[c] = GLSLNMin(GLSLNMax(var.value.fv[c], minVal.value.fv[c]), maxVal.value.fv[c]); + + return var; +} + }; // namespace glsl void ConfigureGLSLStd450(ExtInstDispatcher &extinst) @@ -278,6 +351,7 @@ void ConfigureGLSLStd450(ExtInstDispatcher &extinst) #define EXT(func) extinst.functions[(uint32_t)GLSLstd450::func] = &glsl::func; EXT(FAbs); + EXT(SAbs); EXT(Floor); EXT(Pow); EXT(FMin); @@ -292,5 +366,8 @@ void ConfigureGLSLStd450(ExtInstDispatcher &extinst) EXT(FMix); EXT(Cross); EXT(Normalize); + EXT(NMin); + EXT(NMax); + EXT(NClamp); } }; // namespace rdcspv diff --git a/util/test/demos/vk/vk_shader_debug_zoo.cpp b/util/test/demos/vk/vk_shader_debug_zoo.cpp index 90d01dffe..553da182d 100644 --- a/util/test/demos/vk/vk_shader_debug_zoo.cpp +++ b/util/test/demos/vk/vk_shader_debug_zoo.cpp @@ -441,6 +441,14 @@ void main() 1.0f); break; } + case 45: + { + Color = vec4(float(abs(zeroi+2)), + float(abs(zeroi)), + float(abs(zeroi-5)), + 1.0f); + break; + } default: break; } }