summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2018-12-20 22:57:16 -0300
committerGravatar ReinUsesLisp2019-01-15 17:54:49 -0300
commite3c55e31d7d15066d565e6cd728d12526e91d8e2 (patch)
treedaebd7803451465e47d96c712f945312fcec75d7 /src
parentshader_ir: Add float helpers (diff)
downloadyuzu-e3c55e31d7d15066d565e6cd728d12526e91d8e2.tar.gz
yuzu-e3c55e31d7d15066d565e6cd728d12526e91d8e2.tar.xz
yuzu-e3c55e31d7d15066d565e6cd728d12526e91d8e2.zip
shader_ir: Add integer helpers
Diffstat (limited to 'src')
-rw-r--r--src/video_core/shader/shader_ir.cpp35
-rw-r--r--src/video_core/shader/shader_ir.h5
2 files changed, 40 insertions, 0 deletions
diff --git a/src/video_core/shader/shader_ir.cpp b/src/video_core/shader/shader_ir.cpp
index af95e54ef..e4b81040d 100644
--- a/src/video_core/shader/shader_ir.cpp
+++ b/src/video_core/shader/shader_ir.cpp
@@ -140,6 +140,41 @@ Node ShaderIR::GetSaturatedFloat(Node value, bool saturate) {
140 return Operation(OperationCode::FClamp, NO_PRECISE, value, positive_zero, positive_one); 140 return Operation(OperationCode::FClamp, NO_PRECISE, value, positive_zero, positive_one);
141} 141}
142 142
143Node ShaderIR::ConvertIntegerSize(Node value, Tegra::Shader::Register::Size size, bool is_signed) {
144 switch (size) {
145 case Register::Size::Byte:
146 value = SignedOperation(OperationCode::ILogicalShiftLeft, is_signed, NO_PRECISE, value,
147 Immediate(24));
148 value = SignedOperation(OperationCode::IArithmeticShiftRight, is_signed, NO_PRECISE, value,
149 Immediate(24));
150 return value;
151 case Register::Size::Short:
152 value = SignedOperation(OperationCode::ILogicalShiftLeft, is_signed, NO_PRECISE, value,
153 Immediate(16));
154 value = SignedOperation(OperationCode::IArithmeticShiftRight, is_signed, NO_PRECISE, value,
155 Immediate(16));
156 case Register::Size::Word:
157 // Default - do nothing
158 return value;
159 default:
160 UNREACHABLE_MSG("Unimplemented conversion size: {}", static_cast<u32>(size));
161 }
162}
163
164Node ShaderIR::GetOperandAbsNegInteger(Node value, bool absolute, bool negate, bool is_signed) {
165 if (!is_signed) {
166 // Absolute or negate on an unsigned is pointless
167 return value;
168 }
169 if (absolute) {
170 value = Operation(OperationCode::IAbsolute, NO_PRECISE, value);
171 }
172 if (negate) {
173 value = Operation(OperationCode::INegate, NO_PRECISE, value);
174 }
175 return value;
176}
177
143void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) { 178void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) {
144 bb.push_back(Operation(OperationCode::Assign, GetRegister(dest), src)); 179 bb.push_back(Operation(OperationCode::Assign, GetRegister(dest), src));
145} 180}
diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h
index 93455412f..84c016da6 100644
--- a/src/video_core/shader/shader_ir.h
+++ b/src/video_core/shader/shader_ir.h
@@ -648,6 +648,11 @@ private:
648 /// Conditionally saturates a float 648 /// Conditionally saturates a float
649 Node GetSaturatedFloat(Node value, bool saturate = true); 649 Node GetSaturatedFloat(Node value, bool saturate = true);
650 650
651 /// Converts an integer to different sizes.
652 Node ConvertIntegerSize(Node value, Tegra::Shader::Register::Size size, bool is_signed);
653 /// Conditionally absolute/negated integer. Absolute is applied first
654 Node GetOperandAbsNegInteger(Node value, bool absolute, bool negate, bool is_signed);
655
651 template <typename... T> 656 template <typename... T>
652 inline Node Operation(OperationCode code, const T*... operands) { 657 inline Node Operation(OperationCode code, const T*... operands) {
653 return StoreNode(OperationNode(code, operands...)); 658 return StoreNode(OperationNode(code, operands...));