diff --git a/renderdoc/driver/shaders/spirv/spirv_debug_glsl450.cpp b/renderdoc/driver/shaders/spirv/spirv_debug_glsl450.cpp index 92fd6f1db..c927f2fbe 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug_glsl450.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug_glsl450.cpp @@ -78,6 +78,138 @@ ShaderVariable Pow(ThreadState &state, const rdcarray ¶ms) return var; } +template +static T GLSLMax(T x, T y) +{ + return x < y ? y : x; +} + +template +static T GLSLMin(T x, T y) +{ + return y < x ? y : x; +} + +ShaderVariable FMax(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] = GLSLMax(var.value.fv[c], y.value.fv[c]); + + return var; +} + +ShaderVariable UMax(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.uv[c] = GLSLMax(var.value.uv[c], y.value.uv[c]); + + return var; +} + +ShaderVariable SMax(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.iv[c] = GLSLMax(var.value.iv[c], y.value.iv[c]); + + return var; +} + +ShaderVariable FMin(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] = GLSLMin(var.value.fv[c], y.value.fv[c]); + + return var; +} + +ShaderVariable UMin(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.uv[c] = GLSLMin(var.value.uv[c], y.value.uv[c]); + + return var; +} + +ShaderVariable SMin(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.iv[c] = GLSLMin(var.value.iv[c], y.value.iv[c]); + + return var; +} + +ShaderVariable FClamp(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] = GLSLMin(GLSLMax(var.value.fv[c], minVal.value.fv[c]), maxVal.value.fv[c]); + + return var; +} + +ShaderVariable UClamp(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.uv[c] = GLSLMin(GLSLMax(var.value.uv[c], minVal.value.uv[c]), maxVal.value.uv[c]); + + return var; +} + +ShaderVariable SClamp(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.iv[c] = GLSLMin(GLSLMax(var.value.iv[c], minVal.value.iv[c]), maxVal.value.iv[c]); + + return var; +} + ShaderVariable FMix(ThreadState &state, const rdcarray ¶ms) { CHECK_PARAMS(3); @@ -148,6 +280,15 @@ void ConfigureGLSLStd450(ExtInstDispatcher &extinst) EXT(FAbs); EXT(Floor); EXT(Pow); + EXT(FMin); + EXT(UMin); + EXT(SMin); + EXT(FMax); + EXT(UMax); + EXT(SMax); + EXT(FClamp); + EXT(UClamp); + EXT(SClamp); EXT(FMix); EXT(Cross); EXT(Normalize); diff --git a/util/test/demos/vk/vk_shader_debug_zoo.cpp b/util/test/demos/vk/vk_shader_debug_zoo.cpp index 0ca1ff9e5..90d01dffe 100644 --- a/util/test/demos/vk/vk_shader_debug_zoo.cpp +++ b/util/test/demos/vk/vk_shader_debug_zoo.cpp @@ -359,6 +359,88 @@ void main() Color = texture(linearSampledImage, inpos); break; } + case 35: + { + Color = vec4(max(posone*3.3f, posone*4.4f), + max(posone*4.4f, posone*3.3f), + max(posone, posinf), + max(posone, neginf)); + break; + } + case 36: + { + Color = vec4(max(negone*3.3f, negone*4.4f), + max(negone*4.4f, negone*3.3f), + max(negone, posinf), + max(negone, neginf)); + break; + } + case 37: + { + Color = vec4(min(posone*3.3f, posone*4.4f), + min(posone*4.4f, posone*3.3f), + min(posone, posinf), + min(posone, neginf)); + break; + } + case 38: + { + Color = vec4(min(negone*3.3f, negone*4.4f), + min(negone*4.4f, negone*3.3f), + min(negone, posinf), + min(negone, neginf)); + break; + } + case 39: + { + Color = vec4(float(max(zeroi+5, zeroi+8)), + float(max(zeroi+8, zeroi+5)), + float(max(zeroi-8, zeroi-5)), + float(max(zeroi-5, zeroi-8))); + break; + } + case 40: + { + Color = vec4(float(min(zeroi+5, zeroi+8)), + float(min(zeroi+8, zeroi+5)), + float(min(zeroi-8, zeroi-5)), + float(min(zeroi-5, zeroi-8))); + break; + } + case 41: + { + Color = vec4(float(max(zerou+5, zerou+8)), + float(max(zerou+8, zerou+5)), + float(min(zerou+8, zerou+5)), + float(min(zerou+5, zerou+8))); + break; + } + case 42: + { + Color = vec4(clamp(posone*3.3f, posone, posone*5.0f), + clamp(posone*0.3f, posone, posone*5.0f), + clamp(posone*8.3f, posone, posone*5.0f), + 1.0f); + break; + } + case 43: + { + uint x = uint(posone); + Color = vec4(float(clamp(x*4, zerou+2, zerou+50)), + float(clamp(x, zerou+2, zerou+50)), + float(clamp(x*400, zerou+2, zerou+50)), + 1.0f); + break; + } + case 44: + { + int x = int(posone); + Color = vec4(float(clamp(x*4, zeroi+2, zeroi+50)), + float(clamp(x, zeroi+2, zeroi+50)), + float(clamp(x*400, zeroi+2, zeroi+50)), + 1.0f); + break; + } default: break; } }