diff --git a/renderdoc/driver/shaders/dxil/dxil_debug.cpp b/renderdoc/driver/shaders/dxil/dxil_debug.cpp index 18b63cb22..8f0ac76b1 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debug.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_debug.cpp @@ -3254,8 +3254,36 @@ bool ThreadState::ExecuteInstruction(DebugAPIWrapper *apiWrapper, result.value.u32v[1] = sum > 0xffffffff ? 1 : 0; break; } - // Likely to implement when required case DXOp::USubb: + { + // a-b, borrow : USubb(a,b) + RDCASSERTEQUAL(inst.args[1]->type->type, Type::TypeKind::Scalar); + RDCASSERTEQUAL(inst.args[1]->type->scalarType, Type::Int); + RDCASSERTEQUAL(inst.args[2]->type->type, Type::TypeKind::Scalar); + RDCASSERTEQUAL(inst.args[2]->type->scalarType, Type::Int); + ShaderVariable a; + ShaderVariable b; + RDCASSERT(GetShaderVariable(inst.args[1], opCode, dxOpCode, a)); + RDCASSERT(GetShaderVariable(inst.args[2], opCode, dxOpCode, b)); + RDCASSERTEQUAL(a.type, b.type); + uint64_t src0; + uint64_t src1; + + // add on a 'borrow' bit + src0 = 0x100000000 | (uint64_t)a.value.u32v[0]; + src1 = (uint64_t)b.value.u32v[0]; + + // do the subtract + uint64_t sub = src0 - src1; + + // a-b : 32-bits + result.value.u32v[0] = (sub & 0xffffffff); + + // mark where the borrow bits was used + result.value.u32v[1] = (sub <= 0xffffffff) ? 1U : 0U; + break; + } + // Likely to implement when required case DXOp::Msad: case DXOp::Ibfe: case DXOp::Ubfe: diff --git a/renderdoc/driver/shaders/dxil/dxil_reflect.cpp b/renderdoc/driver/shaders/dxil/dxil_reflect.cpp index b0e140650..709202f34 100644 --- a/renderdoc/driver/shaders/dxil/dxil_reflect.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_reflect.cpp @@ -1816,7 +1816,6 @@ rdcstr Program::GetDebugStatus() case DXOp::TempRegStore: case DXOp::MinPrecXRegLoad: case DXOp::MinPrecXRegStore: - case DXOp::USubb: case DXOp::Msad: case DXOp::Ibfe: case DXOp::Ubfe: