mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-11-04 12:34:39 +08:00 
			
		
		
		
	shader_ir: Add float helpers
This commit is contained in:
		
							parent
							
								
									6b9eea3fe5
								
							
						
					
					
						commit
						833d0806f9
					
				@ -121,6 +121,25 @@ Node ShaderIR::GetLocalMemory(Node address) {
 | 
			
		||||
    return StoreNode(LmemNode(address));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Node ShaderIR::GetOperandAbsNegFloat(Node value, bool absolute, bool negate) {
 | 
			
		||||
    if (absolute) {
 | 
			
		||||
        value = Operation(OperationCode::FAbsolute, NO_PRECISE, value);
 | 
			
		||||
    }
 | 
			
		||||
    if (negate) {
 | 
			
		||||
        value = Operation(OperationCode::FNegate, NO_PRECISE, value);
 | 
			
		||||
    }
 | 
			
		||||
    return value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Node ShaderIR::GetSaturatedFloat(Node value, bool saturate) {
 | 
			
		||||
    if (!saturate) {
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
    const Node positive_zero = Immediate(std::copysignf(0, 1));
 | 
			
		||||
    const Node positive_one = Immediate(1.0f);
 | 
			
		||||
    return Operation(OperationCode::FClamp, NO_PRECISE, value, positive_zero, positive_one);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) {
 | 
			
		||||
    bb.push_back(Operation(OperationCode::Assign, GetRegister(dest), src));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -643,6 +643,11 @@ private:
 | 
			
		||||
    /// Sets a local memory address. address and value must be a number-evaluated node
 | 
			
		||||
    void SetLocalMemory(BasicBlock& bb, Node address, Node value);
 | 
			
		||||
 | 
			
		||||
    /// Conditionally absolute/negated float. Absolute is applied first
 | 
			
		||||
    Node GetOperandAbsNegFloat(Node value, bool absolute, bool negate);
 | 
			
		||||
    /// Conditionally saturates a float
 | 
			
		||||
    Node GetSaturatedFloat(Node value, bool saturate = true);
 | 
			
		||||
 | 
			
		||||
    template <typename... T>
 | 
			
		||||
    inline Node Operation(OperationCode code, const T*... operands) {
 | 
			
		||||
        return StoreNode(OperationNode(code, operands...));
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user