summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Nguyen Dac Nam2020-03-11 18:15:31 +0700
committerGravatar namkazy2020-04-05 10:31:27 +0700
commit08db60392da9eb82fba39f99c1e650085a7d094b (patch)
treec75c4ff000930c35de7c9f3b325dd62fed9a904b
parentshader: SULD.D import StoreType (diff)
downloadyuzu-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.cpp32
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: