summaryrefslogtreecommitdiff
path: root/src/video_core/shader/decode
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-11-12 13:43:08 -0400
committerGravatar FernandoS272019-11-14 11:15:27 -0400
commitcd0f5dfc17209eab146879faad51186b130c4951 (patch)
tree0185de18a433f22edb69260d3f54779419e2b807 /src/video_core/shader/decode
parentShader_IR: Implement FLO instruction. (diff)
downloadyuzu-cd0f5dfc17209eab146879faad51186b130c4951.tar.gz
yuzu-cd0f5dfc17209eab146879faad51186b130c4951.tar.xz
yuzu-cd0f5dfc17209eab146879faad51186b130c4951.zip
Shader_IR: Implement TXD instruction.
Diffstat (limited to 'src/video_core/shader/decode')
-rw-r--r--src/video_core/shader/decode/texture.cpp56
1 files changed, 49 insertions, 7 deletions
diff --git a/src/video_core/shader/decode/texture.cpp b/src/video_core/shader/decode/texture.cpp
index bb926a132..0e501919d 100644
--- a/src/video_core/shader/decode/texture.cpp
+++ b/src/video_core/shader/decode/texture.cpp
@@ -134,13 +134,55 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
134 Node4 values; 134 Node4 values;
135 for (u32 element = 0; element < values.size(); ++element) { 135 for (u32 element = 0; element < values.size(); ++element) {
136 auto coords_copy = coords; 136 auto coords_copy = coords;
137 MetaTexture meta{sampler, {}, {}, {}, {}, {}, component, element}; 137 MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, component, element};
138 values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy)); 138 values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy));
139 } 139 }
140 140
141 WriteTexsInstructionFloat(bb, instr, values, true); 141 WriteTexsInstructionFloat(bb, instr, values, true);
142 break; 142 break;
143 } 143 }
144 case OpCode::Id::TXD_B:
145 is_bindless = true;
146 [[fallthrough]];
147 case OpCode::Id::TXD: {
148 UNIMPLEMENTED_IF_MSG(instr.txd.UsesMiscMode(TextureMiscMode::AOFFI),
149 "AOFFI is not implemented");
150 const auto is_array = static_cast<bool>(instr.txd.is_array != 0);
151 UNIMPLEMENTED_IF_MSG(is_array, "TXD Array is not implemented");
152
153 u64 base_reg = instr.gpr8.Value();
154 const auto derivate_reg = instr.gpr20.Value();
155 const auto texture_type = instr.txd.texture_type.Value();
156 const auto coord_count = GetCoordCount(texture_type);
157
158 const auto& sampler = is_bindless
159 ? GetBindlessSampler(base_reg, {{texture_type, false, false}})
160 : GetSampler(instr.sampler, {{texture_type, false, false}});
161 if (is_bindless) {
162 base_reg++;
163 }
164
165 std::vector<Node> coords;
166 std::vector<Node> derivates;
167 for (std::size_t i = 0; i < coord_count; ++i) {
168 coords.push_back(GetRegister(base_reg + i));
169 const std::size_t derivate = i * 2;
170 derivates.push_back(GetRegister(derivate_reg + derivate));
171 derivates.push_back(GetRegister(derivate_reg + derivate + 1));
172 }
173
174 Node4 values;
175 for (u32 element = 0; element < values.size(); ++element) {
176 auto coords_copy = coords;
177 MetaTexture meta{sampler, {}, {}, {}, derivates, {}, {}, {}, element};
178 values[element] =
179 Operation(OperationCode::TextureGradient, meta, std::move(coords_copy));
180 }
181
182 WriteTexInstructionFloat(bb, instr, values);
183
184 break;
185 }
144 case OpCode::Id::TXQ_B: 186 case OpCode::Id::TXQ_B:
145 is_bindless = true; 187 is_bindless = true;
146 [[fallthrough]]; 188 [[fallthrough]];
@@ -158,7 +200,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
158 if (!instr.txq.IsComponentEnabled(element)) { 200 if (!instr.txq.IsComponentEnabled(element)) {
159 continue; 201 continue;
160 } 202 }
161 MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, element}; 203 MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, {}, element};
162 const Node value = 204 const Node value =
163 Operation(OperationCode::TextureQueryDimensions, meta, 205 Operation(OperationCode::TextureQueryDimensions, meta,
164 GetRegister(instr.gpr8.Value() + (is_bindless ? 1 : 0))); 206 GetRegister(instr.gpr8.Value() + (is_bindless ? 1 : 0)));
@@ -213,7 +255,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
213 continue; 255 continue;
214 } 256 }
215 auto params = coords; 257 auto params = coords;
216 MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, element}; 258 MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, {}, element};
217 const Node value = Operation(OperationCode::TextureQueryLod, meta, std::move(params)); 259 const Node value = Operation(OperationCode::TextureQueryLod, meta, std::move(params));
218 SetTemporary(bb, indexer++, value); 260 SetTemporary(bb, indexer++, value);
219 } 261 }
@@ -461,7 +503,7 @@ Node4 ShaderIR::GetTextureCode(Instruction instr, TextureType texture_type,
461 Node4 values; 503 Node4 values;
462 for (u32 element = 0; element < values.size(); ++element) { 504 for (u32 element = 0; element < values.size(); ++element) {
463 auto copy_coords = coords; 505 auto copy_coords = coords;
464 MetaTexture meta{sampler, array, depth_compare, aoffi, bias, lod, {}, element}; 506 MetaTexture meta{sampler, array, depth_compare, aoffi, {}, bias, lod, {}, element};
465 values[element] = Operation(read_method, meta, std::move(copy_coords)); 507 values[element] = Operation(read_method, meta, std::move(copy_coords));
466 } 508 }
467 509
@@ -594,7 +636,7 @@ Node4 ShaderIR::GetTld4Code(Instruction instr, TextureType texture_type, bool de
594 Node4 values; 636 Node4 values;
595 for (u32 element = 0; element < values.size(); ++element) { 637 for (u32 element = 0; element < values.size(); ++element) {
596 auto coords_copy = coords; 638 auto coords_copy = coords;
597 MetaTexture meta{sampler, GetRegister(array_register), dc, aoffi, {}, {}, component, 639 MetaTexture meta{sampler, GetRegister(array_register), dc, aoffi, {}, {}, {}, component,
598 element}; 640 element};
599 values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy)); 641 values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy));
600 } 642 }
@@ -628,7 +670,7 @@ Node4 ShaderIR::GetTldCode(Tegra::Shader::Instruction instr) {
628 Node4 values; 670 Node4 values;
629 for (u32 element = 0; element < values.size(); ++element) { 671 for (u32 element = 0; element < values.size(); ++element) {
630 auto coords_copy = coords; 672 auto coords_copy = coords;
631 MetaTexture meta{sampler, array_register, {}, {}, {}, lod, {}, element}; 673 MetaTexture meta{sampler, array_register, {}, {}, {}, {}, lod, {}, element};
632 values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy)); 674 values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy));
633 } 675 }
634 676
@@ -664,7 +706,7 @@ Node4 ShaderIR::GetTldsCode(Instruction instr, TextureType texture_type, bool is
664 Node4 values; 706 Node4 values;
665 for (u32 element = 0; element < values.size(); ++element) { 707 for (u32 element = 0; element < values.size(); ++element) {
666 auto coords_copy = coords; 708 auto coords_copy = coords;
667 MetaTexture meta{sampler, array, {}, {}, {}, lod, {}, element}; 709 MetaTexture meta{sampler, array, {}, {}, {}, {}, lod, {}, element};
668 values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy)); 710 values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy));
669 } 711 }
670 return values; 712 return values;