diff options
| author | 2018-12-20 22:57:16 -0300 | |
|---|---|---|
| committer | 2019-01-15 17:54:49 -0300 | |
| commit | e3c55e31d7d15066d565e6cd728d12526e91d8e2 (patch) | |
| tree | daebd7803451465e47d96c712f945312fcec75d7 /src | |
| parent | shader_ir: Add float helpers (diff) | |
| download | yuzu-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.cpp | 35 | ||||
| -rw-r--r-- | src/video_core/shader/shader_ir.h | 5 |
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 | ||
| 143 | Node 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 | |||
| 164 | Node 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 | |||
| 143 | void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) { | 178 | void 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...)); |