diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.cpp b/renderdoc/driver/shaders/spirv/spirv_debug.cpp index 11775c8e4..381f11297 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug.cpp @@ -951,6 +951,10 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray // ////////////////////////////////////////////////////////////////////////////// + case Op::LogicalEqual: + case Op::LogicalNotEqual: + case Op::LogicalOr: + case Op::LogicalAnd: case Op::IEqual: case Op::INotEqual: case Op::UGreaterThan: @@ -979,16 +983,26 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray ShaderVariable var = GetSrc(comp.operand1); ShaderVariable b = GetSrc(comp.operand2); - if(opdata.op == Op::IEqual) + if(opdata.op == Op::IEqual || opdata.op == Op::LogicalEqual) { for(uint8_t c = 0; c < var.columns; c++) var.value.uv[c] = (var.value.uv[c] == b.value.uv[c]) ? 1 : 0; } - else if(opdata.op == Op::INotEqual) + else if(opdata.op == Op::INotEqual || opdata.op == Op::LogicalNotEqual) { for(uint8_t c = 0; c < var.columns; c++) var.value.uv[c] = (var.value.uv[c] != b.value.uv[c]) ? 1 : 0; } + else if(opdata.op == Op::LogicalAnd) + { + for(uint8_t c = 0; c < var.columns; c++) + var.value.uv[c] = var.value.uv[c] & b.value.uv[c]; + } + else if(opdata.op == Op::LogicalOr) + { + for(uint8_t c = 0; c < var.columns; c++) + var.value.uv[c] = var.value.uv[c] | b.value.uv[c]; + } else if(opdata.op == Op::UGreaterThan) { for(uint8_t c = 0; c < var.columns; c++) @@ -1111,6 +1125,38 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray SetDst(state, comp.result, var); break; } + case Op::LogicalNot: + { + OpLogicalNot negate(it); + + ShaderVariable var = GetSrc(negate.operand); + + for(uint8_t c = 0; c < var.columns; c++) + var.value.uv[c] = 1U - var.value.uv[c]; + + SetDst(state, negate.result, var); + break; + } + case Op::Any: + case Op::All: + { + OpAny any(it); + + ShaderVariable var = GetSrc(any.vector); + + for(uint8_t c = 1; c < var.columns; c++) + { + if(opdata.op == Op::Any) + var.value.uv[0] |= var.value.uv[c]; + else + var.value.uv[0] &= var.value.uv[c]; + } + + var.columns = 1; + + SetDst(state, any.result, var); + break; + } case Op::IsNan: { OpIsNan is(it); diff --git a/util/test/demos/vk/vk_shader_debug_zoo.cpp b/util/test/demos/vk/vk_shader_debug_zoo.cpp index ccda73db4..f7f7beed6 100644 --- a/util/test/demos/vk/vk_shader_debug_zoo.cpp +++ b/util/test/demos/vk/vk_shader_debug_zoo.cpp @@ -581,6 +581,74 @@ void main() Color = vec4(radians(negone*164.2f), radians(posone*164.2f), radians(zerof), radians(posone*3456.78f)); break; } + case 71: + { + vec4 a = vec4(posone*2.4f, posone*2.5f, posone*2.6f, posone*2.7f); + vec4 b = vec4(zerof+2.5f, zerof+2.5f, zerof+2.5f, zerof+2.5f); + Color = vec4(float(a.x < b.x), float(a.x <= b.x), float(a.x > b.x), float(a.x >= b.x)); + break; + } + case 72: + { + vec4 a = vec4(posone*2.4f, posone*2.5f, posone*2.6f, posone*2.7f); + vec4 b = vec4(zerof+2.5f, zerof+2.5f, zerof+2.5f, zerof+2.5f); + bvec4 c = lessThanEqual(a, b); + Color = vec4(float(a.x == b.x), float(a.x != b.x), 0.0f, 1.0f); + break; + } + case 73: + { + ivec4 a = ivec4(zeroi+2, zeroi+3, zeroi+4, zeroi+5); + ivec4 b = ivec4(zeroi+4, zeroi+4, zeroi+4, zeroi+4); + Color = vec4(float(a.x < b.x), float(a.x <= b.x), float(a.x > b.x), float(a.x >= b.x)); + break; + } + case 74: + { + ivec4 a = ivec4(zeroi+2, zeroi+3, zeroi+4, zeroi+5); + ivec4 b = ivec4(zeroi+4, zeroi+4, zeroi+4, zeroi+4); + Color = vec4(float(a.x == b.x), float(a.x != b.x), 0.0f, 1.0f); + break; + } + case 75: + { + uvec4 a = uvec4(zerou+2, zerou+3, zerou+4, zerou+5); + uvec4 b = uvec4(zerou+4, zerou+4, zerou+4, zerou+4); + Color = vec4(float(a.x < b.x), float(a.x <= b.x), float(a.x > b.x), float(a.x >= b.x)); + break; + } + case 76: + { + uvec4 a = uvec4(zerou+2, zerou+3, zerou+4, zerou+5); + uvec4 b = uvec4(zerou+4, zerou+4, zerou+4, zerou+4); + Color = vec4(float(a.x == b.x), float(a.x != b.x), 0.0f, 1.0f); + break; + } + case 77: + { + vec4 a = vec4(posone*2.4f, posone*2.5f, posone*2.6f, posone*2.7f); + vec4 b = vec4(zerof+2.5f, zerof+2.5f, zerof+2.5f, zerof+2.5f); + bvec4 c = lessThanEqual(a, b); + Color = vec4(float(any(c)), float(all(c)), float(c.x == c.z), float(c.x != c.w)); + break; + } + case 78: + { + vec4 a = vec4(posone*2.4f, posone*2.5f, posone*2.6f, posone*2.7f); + vec4 b = vec4(zerof+2.5f, zerof+2.5f, zerof+2.5f, zerof+2.5f); + bvec4 c = lessThanEqual(a, b); + Color = vec4(float(c.x || c.y), float(c.x && c.y), float(!c.x), 1.0f); + break; + } + case 79: + { + vec4 a = vec4(posone*2.4f, posone*2.5f, posone*2.6f, posone*2.7f); + vec4 b = vec4(zerof+2.5f, zerof+2.5f, zerof+2.5f, zerof+2.5f); + bvec4 c = lessThanEqual(a, b); + Color = mix(vec4(posone*9.0f, posone*8.0f, posone*7.0f, posone*6.0f), + vec4(posone*1.0f, posone*2.0f, posone*3.0f, posone*4.0f), c); + break; + } default: break; } }