diff options
| author | Subv <subv2112@gmail.com> | 2018-04-23 20:01:29 -0500 | 
|---|---|---|
| committer | Subv <subv2112@gmail.com> | 2018-04-25 11:55:27 -0500 | 
| commit | a994446b6ec776c9383e8b13c45eeb461405adff (patch) | |
| tree | 1810023a79e3f511601d60051e15df2f869c01c3 | |
| parent | e2f2a49d2d0fd51ef83ef94fa2e93a2829d974e5 (diff) | |
GPU: Move the Maxwell3D macro uploading code to the inside of the Maxwell3D processor.
It doesn't belong in the PFIFO handler.
| -rw-r--r-- | src/video_core/command_processor.cpp | 25 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 17 | ||||
| -rw-r--r-- | src/video_core/gpu.h | 7 | 
4 files changed, 23 insertions, 40 deletions
| diff --git a/src/video_core/command_processor.cpp b/src/video_core/command_processor.cpp index 26792a2bf..2eaece298 100644 --- a/src/video_core/command_processor.cpp +++ b/src/video_core/command_processor.cpp @@ -24,9 +24,6 @@ namespace Tegra {  enum class BufferMethods {      BindObject = 0, -    SetGraphMacroCode = 0x45, -    SetGraphMacroCodeArg = 0x46, -    SetGraphMacroEntry = 0x47,      CountBufferMethods = 0x40,  }; @@ -36,28 +33,6 @@ void GPU::WriteReg(u32 method, u32 subchannel, u32 value, u32 remaining_params)                    "{:08X} remaining params {}",                    method, subchannel, value, remaining_params); -    if (method == static_cast<u32>(BufferMethods::SetGraphMacroEntry)) { -        // Prepare to upload a new macro, reset the upload counter. -        NGLOG_DEBUG(HW_GPU, "Uploading GPU macro {:08X}", value); -        current_macro_entry = value; -        current_macro_code.clear(); -        return; -    } - -    if (method == static_cast<u32>(BufferMethods::SetGraphMacroCodeArg)) { -        // Append a new code word to the current macro. -        current_macro_code.push_back(value); - -        // There are no more params remaining, submit the code to the 3D engine. -        if (remaining_params == 0) { -            maxwell_3d->SubmitMacroCode(current_macro_entry, std::move(current_macro_code)); -            current_macro_entry = InvalidGraphMacroEntry; -            current_macro_code.clear(); -        } - -        return; -    } -      if (method == static_cast<u32>(BufferMethods::BindObject)) {          // Bind the current subchannel to the desired engine id.          NGLOG_DEBUG(HW_GPU, "Binding subchannel {} to engine {}", subchannel, value); diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 2acbb9cd6..bc40f8d98 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -22,10 +22,6 @@ constexpr u32 MacroRegistersStart = 0xE00;  Maxwell3D::Maxwell3D(MemoryManager& memory_manager)      : memory_manager(memory_manager), macro_interpreter(*this) {} -void Maxwell3D::SubmitMacroCode(u32 entry, std::vector<u32> code) { -    uploaded_macros[entry * 2 + MacroRegistersStart] = std::move(code); -} -  void Maxwell3D::CallMacroMethod(u32 method, std::vector<u32> parameters) {      auto macro_code = uploaded_macros.find(method);      // The requested macro must have been uploaded already. @@ -75,6 +71,10 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) {      regs.reg_array[method] = value;      switch (method) { +    case MAXWELL3D_REG_INDEX(macros.data): { +        ProcessMacroUpload(value); +        break; +    }      case MAXWELL3D_REG_INDEX(code_address.code_address_high):      case MAXWELL3D_REG_INDEX(code_address.code_address_low): {          // Note: For some reason games (like Puyo Puyo Tetris) seem to write 0 to the CODE_ADDRESS @@ -141,6 +141,12 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) {      }  } +void Maxwell3D::ProcessMacroUpload(u32 data) { +    // Store the uploaded macro code to interpret them when they're called. +    auto& macro = uploaded_macros[regs.macros.entry * 2 + MacroRegistersStart]; +    macro.push_back(data); +} +  void Maxwell3D::ProcessQueryGet() {      GPUVAddr sequence_address = regs.query.QueryAddress();      // Since the sequence address is given as a GPU VAddr, we have to convert it to an application diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index a022665eb..8edc3cd38 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -322,7 +322,15 @@ public:          union {              struct { -                INSERT_PADDING_WORDS(0x200); +                INSERT_PADDING_WORDS(0x45); + +                struct { +                    INSERT_PADDING_WORDS(1); +                    u32 data; +                    u32 entry; +                } macros; + +                INSERT_PADDING_WORDS(0x1B8);                  struct {                      u32 address_high; @@ -637,9 +645,6 @@ public:      /// Write the value to the register identified by method.      void WriteReg(u32 method, u32 value, u32 remaining_params); -    /// Uploads the code for a GPU macro program associated with the specified entry. -    void SubmitMacroCode(u32 entry, std::vector<u32> code); -      /// Returns a list of enabled textures for the specified shader stage.      std::vector<Texture::FullTextureInfo> GetStageTextures(Regs::ShaderStage stage) const; @@ -670,6 +675,9 @@ private:       */      void CallMacroMethod(u32 method, std::vector<u32> parameters); +    /// Handles writes to the macro uploading registers. +    void ProcessMacroUpload(u32 data); +      /// Handles a write to the QUERY_GET register.      void ProcessQueryGet(); @@ -687,6 +695,7 @@ private:      static_assert(offsetof(Maxwell3D::Regs, field_name) == position * 4,                           \                    "Field " #field_name " has invalid position") +ASSERT_REG_POSITION(macros, 0x45);  ASSERT_REG_POSITION(rt, 0x200);  ASSERT_REG_POSITION(viewport_transform[0], 0x280);  ASSERT_REG_POSITION(viewport, 0x300); diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h index 2888daedc..7afa6aaef 100644 --- a/src/video_core/gpu.h +++ b/src/video_core/gpu.h @@ -86,8 +86,6 @@ public:      }  private: -    static constexpr u32 InvalidGraphMacroEntry = 0xFFFFFFFF; -      /// Writes a single register in the engine bound to the specified subchannel      void WriteReg(u32 method, u32 subchannel, u32 value, u32 remaining_params); @@ -100,11 +98,6 @@ private:      std::unique_ptr<Engines::Fermi2D> fermi_2d;      /// Compute engine      std::unique_ptr<Engines::MaxwellCompute> maxwell_compute; - -    /// Entry of the macro that is currently being uploaded -    u32 current_macro_entry = InvalidGraphMacroEntry; -    /// Code being uploaded for the current macro -    std::vector<u32> current_macro_code;  };  } // namespace Tegra | 
