diff options
| author | 2020-03-11 18:15:31 +0700 | |
|---|---|---|
| committer | 2020-04-05 10:31:27 +0700 | |
| commit | 08db60392da9eb82fba39f99c1e650085a7d094b (patch) | |
| tree | c75c4ff000930c35de7c9f3b325dd62fed9a904b | |
| parent | shader: SULD.D import StoreType (diff) | |
| download | yuzu-08db60392da9eb82fba39f99c1e650085a7d094b.tar.gz yuzu-08db60392da9eb82fba39f99c1e650085a7d094b.tar.xz yuzu-08db60392da9eb82fba39f99c1e650085a7d094b.zip | |
shader: SULD.D bits32 implement more complexer method.
| -rw-r--r-- | src/video_core/shader/decode/image.cpp | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/src/video_core/shader/decode/image.cpp b/src/video_core/shader/decode/image.cpp index ae41e1149..077bad037 100644 --- a/src/video_core/shader/decode/image.cpp +++ b/src/video_core/shader/decode/image.cpp | |||
| @@ -80,10 +80,34 @@ u32 ShaderIR::DecodeImage(NodeBlock& bb, u32 pc) { | |||
| 80 | 80 | ||
| 81 | switch (instr.suldst.GetStoreDataLayout()) { | 81 | switch (instr.suldst.GetStoreDataLayout()) { |
| 82 | case StoreType::Bits32: { | 82 | case StoreType::Bits32: { |
| 83 | MetaImage meta{image, {}, {}}; | 83 | Node value{}; |
| 84 | Node value = Operation(OperationCode::ImageLoad, meta, GetCoordinates(type)); | 84 | for (s32 i = 3; i >= 0; i--) { |
| 85 | SetTemporary(bb, 0, std::move(value)); | 85 | MetaImage meta{image, {}, i}; |
| 86 | SetRegister(bb, instr.gpr0.Value(), GetTemporary(0)); | 86 | Node element_value = |
| 87 | Operation(OperationCode::ImageLoad, meta, GetCoordinates(type)); | ||
| 88 | |||
| 89 | const Node comp = GetPredicateComparisonFloat(PredCondition::GreaterEqual, | ||
| 90 | element_value, Immediate(1.0f)); | ||
| 91 | const Node mul = | ||
| 92 | Operation(OperationCode::Select, comp, Immediate(1.f), Immediate(255.f)); | ||
| 93 | |||
| 94 | Node element = Operation(OperationCode::FMul, NO_PRECISE, element_value, mul); | ||
| 95 | element = SignedOperation(OperationCode::ICastFloat, true, NO_PRECISE, | ||
| 96 | std::move(element)); | ||
| 97 | element = Operation(OperationCode::ULogicalShiftLeft, std::move(element), | ||
| 98 | Immediate(8 * i)); | ||
| 99 | if (i == 3) { | ||
| 100 | //(namkazt) for now i'm force it to 0 at alpha component if color is in | ||
| 101 | // range (0-255) | ||
| 102 | value = Operation(OperationCode::Select, comp, Immediate(0), | ||
| 103 | std::move(element)); | ||
| 104 | } else { | ||
| 105 | value = Operation(OperationCode::UBitwiseOr, value, | ||
| 106 | Operation(OperationCode::Select, comp, | ||
| 107 | std::move(element_value), std::move(element))); | ||
| 108 | } | ||
| 109 | } | ||
| 110 | SetRegister(bb, instr.gpr0.Value(), std::move(value)); | ||
| 87 | break; | 111 | break; |
| 88 | } | 112 | } |
| 89 | default: | 113 | default: |