diff options
| author | 2018-12-20 22:56:08 -0300 | |
|---|---|---|
| committer | 2019-01-15 17:54:49 -0300 | |
| commit | 833d0806f92b893220cf43d63c223a7cd9af9022 (patch) | |
| tree | 523c7921c8fb055608c6aef633c0c6efbc54da14 /src | |
| parent | shader_ir: Add setters (diff) | |
| download | yuzu-833d0806f92b893220cf43d63c223a7cd9af9022.tar.gz yuzu-833d0806f92b893220cf43d63c223a7cd9af9022.tar.xz yuzu-833d0806f92b893220cf43d63c223a7cd9af9022.zip | |
shader_ir: Add float helpers
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/shader/shader_ir.cpp | 19 | ||||
| -rw-r--r-- | src/video_core/shader/shader_ir.h | 5 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/video_core/shader/shader_ir.cpp b/src/video_core/shader/shader_ir.cpp index 48046d967..af95e54ef 100644 --- a/src/video_core/shader/shader_ir.cpp +++ b/src/video_core/shader/shader_ir.cpp | |||
| @@ -121,6 +121,25 @@ Node ShaderIR::GetLocalMemory(Node address) { | |||
| 121 | return StoreNode(LmemNode(address)); | 121 | return StoreNode(LmemNode(address)); |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | Node ShaderIR::GetOperandAbsNegFloat(Node value, bool absolute, bool negate) { | ||
| 125 | if (absolute) { | ||
| 126 | value = Operation(OperationCode::FAbsolute, NO_PRECISE, value); | ||
| 127 | } | ||
| 128 | if (negate) { | ||
| 129 | value = Operation(OperationCode::FNegate, NO_PRECISE, value); | ||
| 130 | } | ||
| 131 | return value; | ||
| 132 | } | ||
| 133 | |||
| 134 | Node ShaderIR::GetSaturatedFloat(Node value, bool saturate) { | ||
| 135 | if (!saturate) { | ||
| 136 | return value; | ||
| 137 | } | ||
| 138 | const Node positive_zero = Immediate(std::copysignf(0, 1)); | ||
| 139 | const Node positive_one = Immediate(1.0f); | ||
| 140 | return Operation(OperationCode::FClamp, NO_PRECISE, value, positive_zero, positive_one); | ||
| 141 | } | ||
| 142 | |||
| 124 | void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) { | 143 | void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) { |
| 125 | bb.push_back(Operation(OperationCode::Assign, GetRegister(dest), src)); | 144 | bb.push_back(Operation(OperationCode::Assign, GetRegister(dest), src)); |
| 126 | } | 145 | } |
diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h index 192b18ac7..93455412f 100644 --- a/src/video_core/shader/shader_ir.h +++ b/src/video_core/shader/shader_ir.h | |||
| @@ -643,6 +643,11 @@ private: | |||
| 643 | /// Sets a local memory address. address and value must be a number-evaluated node | 643 | /// Sets a local memory address. address and value must be a number-evaluated node |
| 644 | void SetLocalMemory(BasicBlock& bb, Node address, Node value); | 644 | void SetLocalMemory(BasicBlock& bb, Node address, Node value); |
| 645 | 645 | ||
| 646 | /// Conditionally absolute/negated float. Absolute is applied first | ||
| 647 | Node GetOperandAbsNegFloat(Node value, bool absolute, bool negate); | ||
| 648 | /// Conditionally saturates a float | ||
| 649 | Node GetSaturatedFloat(Node value, bool saturate = true); | ||
| 650 | |||
| 646 | template <typename... T> | 651 | template <typename... T> |
| 647 | inline Node Operation(OperationCode code, const T*... operands) { | 652 | inline Node Operation(OperationCode code, const T*... operands) { |
| 648 | return StoreNode(OperationNode(code, operands...)); | 653 | return StoreNode(OperationNode(code, operands...)); |