Просмотр исходного кода

Merge pull request #2082 from FernandoS27/txq-stl

Fix TXQ not using the component mask.
bunnei 7 лет назад
Родитель
Сommit
bb4549a73d
2 измененных файлов с 13 добавлено и 6 удалено
  1. 4 0
      src/video_core/engines/shader_bytecode.h
  2. 9 6
      src/video_core/shader/decode/memory.cpp

+ 4 - 0
src/video_core/engines/shader_bytecode.h

@@ -981,6 +981,10 @@ union Instruction {
             }
             return false;
         }
+
+        bool IsComponentEnabled(std::size_t component) const {
+            return ((1ULL << component) & component_mask) != 0;
+        }
     } txq;
 
     union {

+ 9 - 6
src/video_core/shader/decode/memory.cpp

@@ -324,15 +324,18 @@ u32 ShaderIR::DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc) {
         const auto& sampler =
             GetSampler(instr.sampler, Tegra::Shader::TextureType::Texture2D, false, false);
 
+        u32 indexer = 0;
         switch (instr.txq.query_type) {
         case Tegra::Shader::TextureQueryType::Dimension: {
             for (u32 element = 0; element < 4; ++element) {
-                MetaTexture meta{sampler, element};
-                const Node value = Operation(OperationCode::F4TextureQueryDimensions,
-                                             std::move(meta), GetRegister(instr.gpr8));
-                SetTemporal(bb, element, value);
+                if (instr.txq.IsComponentEnabled(element)) {
+                    MetaTexture meta{sampler, element};
+                    const Node value = Operation(OperationCode::F4TextureQueryDimensions,
+                                                 std::move(meta), GetRegister(instr.gpr8));
+                    SetTemporal(bb, indexer++, value);
+                }
             }
-            for (u32 i = 0; i < 4; ++i) {
+            for (u32 i = 0; i < indexer; ++i) {
                 SetRegister(bb, instr.gpr0.Value() + i, GetTemporal(i));
             }
             break;
@@ -734,4 +737,4 @@ std::tuple<std::size_t, std::size_t> ShaderIR::ValidateAndGetCoordinateElement(
     return {coord_count, total_coord_count};
 }
 
-} // namespace VideoCommon::Shader
+} // namespace VideoCommon::Shader