summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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) {
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));
}
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:
/// 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...));