summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2018-12-20 22:56:08 -0300
committerGravatar ReinUsesLisp2019-01-15 17:54:49 -0300
commit833d0806f92b893220cf43d63c223a7cd9af9022 (patch)
tree523c7921c8fb055608c6aef633c0c6efbc54da14 /src
parentshader_ir: Add setters (diff)
downloadyuzu-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.cpp19
-rw-r--r--src/video_core/shader/shader_ir.h5
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
124Node 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
134Node 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
124void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) { 143void 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...));