mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	shader_ir: Add integer helpers
This commit is contained in:
		
							parent
							
								
									833d0806f9
								
							
						
					
					
						commit
						e3c55e31d7
					
				@ -140,6 +140,41 @@ Node ShaderIR::GetSaturatedFloat(Node value, bool saturate) {
 | 
			
		||||
    return Operation(OperationCode::FClamp, NO_PRECISE, value, positive_zero, positive_one);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Node ShaderIR::ConvertIntegerSize(Node value, Tegra::Shader::Register::Size size, bool is_signed) {
 | 
			
		||||
    switch (size) {
 | 
			
		||||
    case Register::Size::Byte:
 | 
			
		||||
        value = SignedOperation(OperationCode::ILogicalShiftLeft, is_signed, NO_PRECISE, value,
 | 
			
		||||
                                Immediate(24));
 | 
			
		||||
        value = SignedOperation(OperationCode::IArithmeticShiftRight, is_signed, NO_PRECISE, value,
 | 
			
		||||
                                Immediate(24));
 | 
			
		||||
        return value;
 | 
			
		||||
    case Register::Size::Short:
 | 
			
		||||
        value = SignedOperation(OperationCode::ILogicalShiftLeft, is_signed, NO_PRECISE, value,
 | 
			
		||||
                                Immediate(16));
 | 
			
		||||
        value = SignedOperation(OperationCode::IArithmeticShiftRight, is_signed, NO_PRECISE, value,
 | 
			
		||||
                                Immediate(16));
 | 
			
		||||
    case Register::Size::Word:
 | 
			
		||||
        // Default - do nothing
 | 
			
		||||
        return value;
 | 
			
		||||
    default:
 | 
			
		||||
        UNREACHABLE_MSG("Unimplemented conversion size: {}", static_cast<u32>(size));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Node ShaderIR::GetOperandAbsNegInteger(Node value, bool absolute, bool negate, bool is_signed) {
 | 
			
		||||
    if (!is_signed) {
 | 
			
		||||
        // Absolute or negate on an unsigned is pointless
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
    if (absolute) {
 | 
			
		||||
        value = Operation(OperationCode::IAbsolute, NO_PRECISE, value);
 | 
			
		||||
    }
 | 
			
		||||
    if (negate) {
 | 
			
		||||
        value = Operation(OperationCode::INegate, NO_PRECISE, value);
 | 
			
		||||
    }
 | 
			
		||||
    return value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) {
 | 
			
		||||
    bb.push_back(Operation(OperationCode::Assign, GetRegister(dest), src));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -648,6 +648,11 @@ private:
 | 
			
		||||
    /// Conditionally saturates a float
 | 
			
		||||
    Node GetSaturatedFloat(Node value, bool saturate = true);
 | 
			
		||||
 | 
			
		||||
    /// Converts an integer to different sizes.
 | 
			
		||||
    Node ConvertIntegerSize(Node value, Tegra::Shader::Register::Size size, bool is_signed);
 | 
			
		||||
    /// Conditionally absolute/negated integer. Absolute is applied first
 | 
			
		||||
    Node GetOperandAbsNegInteger(Node value, bool absolute, bool negate, bool is_signed);
 | 
			
		||||
 | 
			
		||||
    template <typename... T>
 | 
			
		||||
    inline Node Operation(OperationCode code, const T*... operands) {
 | 
			
		||||
        return StoreNode(OperationNode(code, operands...));
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user