diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.cpp b/renderdoc/driver/shaders/spirv/spirv_debug.cpp index 8ef8c10c4..acf8a15c5 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug.cpp @@ -1920,6 +1920,36 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray SetDst(bitwise.result, var); break; } + case Op::GroupNonUniformBitwiseOr: + { + OpGroupNonUniformBitwiseOr group(it); + + ShaderVariable var; + + for(size_t i = 0; i < workgroup.size(); i++) + { + if(i == 0) + { + var = workgroup[i].GetSrc(group.value); + } + else + { + ShaderVariable b = workgroup[i].GetSrc(group.value); + + for(uint8_t c = 0; c < var.columns; c++) + { +#undef _IMPL +#define _IMPL(I, S, U) comp(var, c) = comp(var, c) | comp(b, c) + + IMPL_FOR_INT_TYPES(_IMPL); + } + } + } + + SetDst(group.result, var); + + break; + } case Op::Not: { OpNot bitwise(it); @@ -3484,7 +3514,6 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray case Op::GroupNonUniformUMax: case Op::GroupNonUniformFMax: case Op::GroupNonUniformBitwiseAnd: - case Op::GroupNonUniformBitwiseOr: case Op::GroupNonUniformBitwiseXor: case Op::GroupNonUniformLogicalAnd: case Op::GroupNonUniformLogicalOr: diff --git a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp index 27aceb1e1..06882993b 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp @@ -32,6 +32,10 @@ RDOC_CONFIG(bool, Vulkan_Debug_UseDebugColumnInformation, false, "Control whether column information should be read from vulkan debug info."); +RDOC_CONFIG(bool, Vulkan_Hack_AllowNonUniformSubgroups, false, + "Allow shaders to be debugged with subgroup ops. Most subgroup ops will break, this " + "will only work for a limited set and not with the 'real' subgroup."); + // this could be cleaner if ShaderVariable wasn't a very public struct, but it's not worth it so // we just reserve value slots that we know won't be used in opaque variables static const uint32_t PointerVariableSlot = 0; @@ -376,6 +380,19 @@ void Reflector::CheckDebuggable(bool &debuggable, rdcstr &debugStatus) const break; } + case Capability::GroupNonUniformArithmetic: + { + if(Vulkan_Hack_AllowNonUniformSubgroups()) + { + supported = true; + } + else + { + supported = false; + } + break; + } + // we plan to support these but needs additional testing/proving // physical pointers @@ -398,7 +415,6 @@ void Reflector::CheckDebuggable(bool &debuggable, rdcstr &debugStatus) const case Capability::Groups: case Capability::GroupNonUniform: case Capability::GroupNonUniformVote: - case Capability::GroupNonUniformArithmetic: case Capability::GroupNonUniformBallot: case Capability::GroupNonUniformShuffle: case Capability::GroupNonUniformShuffleRelative: