diff options
Diffstat (limited to 'src/video_core/engines')
| -rw-r--r-- | src/video_core/engines/fermi_2d.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/engines/fermi_2d.h | 9 | ||||
| -rw-r--r-- | src/video_core/engines/kepler_compute.cpp | 17 | ||||
| -rw-r--r-- | src/video_core/engines/kepler_compute.h | 16 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 35 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 21 | 
6 files changed, 63 insertions, 45 deletions
diff --git a/src/video_core/engines/fermi_2d.cpp b/src/video_core/engines/fermi_2d.cpp index ff10ff40d..6e50661a3 100644 --- a/src/video_core/engines/fermi_2d.cpp +++ b/src/video_core/engines/fermi_2d.cpp @@ -10,7 +10,13 @@  namespace Tegra::Engines { -Fermi2D::Fermi2D(VideoCore::RasterizerInterface& rasterizer) : rasterizer{rasterizer} {} +Fermi2D::Fermi2D() = default; + +Fermi2D::~Fermi2D() = default; + +void Fermi2D::BindRasterizer(VideoCore::RasterizerInterface& rasterizer_) { +    rasterizer = &rasterizer_; +}  void Fermi2D::CallMethod(u32 method, u32 method_argument, bool is_last_call) {      ASSERT_MSG(method < Regs::NUM_REGS, @@ -87,7 +93,7 @@ void Fermi2D::HandleSurfaceCopy() {      copy_config.src_rect = src_rect;      copy_config.dst_rect = dst_rect; -    if (!rasterizer.AccelerateSurfaceCopy(regs.src, regs.dst, copy_config)) { +    if (!rasterizer->AccelerateSurfaceCopy(regs.src, regs.dst, copy_config)) {          UNIMPLEMENTED();      }  } diff --git a/src/video_core/engines/fermi_2d.h b/src/video_core/engines/fermi_2d.h index 8f37d053f..213abfaae 100644 --- a/src/video_core/engines/fermi_2d.h +++ b/src/video_core/engines/fermi_2d.h @@ -34,8 +34,11 @@ namespace Tegra::Engines {  class Fermi2D final : public EngineInterface {  public: -    explicit Fermi2D(VideoCore::RasterizerInterface& rasterizer); -    ~Fermi2D() = default; +    explicit Fermi2D(); +    ~Fermi2D(); + +    /// Binds a rasterizer to this engine. +    void BindRasterizer(VideoCore::RasterizerInterface& rasterizer);      /// Write the value to the register identified by method.      void CallMethod(u32 method, u32 method_argument, bool is_last_call) override; @@ -149,7 +152,7 @@ public:      };  private: -    VideoCore::RasterizerInterface& rasterizer; +    VideoCore::RasterizerInterface* rasterizer;      /// Performs the copy from the source surface to the destination surface as configured in the      /// registers. diff --git a/src/video_core/engines/kepler_compute.cpp b/src/video_core/engines/kepler_compute.cpp index a82b06a38..898370739 100644 --- a/src/video_core/engines/kepler_compute.cpp +++ b/src/video_core/engines/kepler_compute.cpp @@ -16,14 +16,15 @@  namespace Tegra::Engines { -KeplerCompute::KeplerCompute(Core::System& system, VideoCore::RasterizerInterface& rasterizer, -                             MemoryManager& memory_manager) -    : system{system}, rasterizer{rasterizer}, memory_manager{memory_manager}, upload_state{ -                                                                                  memory_manager, -                                                                                  regs.upload} {} +KeplerCompute::KeplerCompute(Core::System& system_, MemoryManager& memory_manager_) +    : system{system_}, memory_manager{memory_manager_}, upload_state{memory_manager, regs.upload} {}  KeplerCompute::~KeplerCompute() = default; +void KeplerCompute::BindRasterizer(VideoCore::RasterizerInterface& rasterizer_) { +    rasterizer = &rasterizer_; +} +  void KeplerCompute::CallMethod(u32 method, u32 method_argument, bool is_last_call) {      ASSERT_MSG(method < Regs::NUM_REGS,                 "Invalid KeplerCompute register, increase the size of the Regs structure"); @@ -104,11 +105,11 @@ SamplerDescriptor KeplerCompute::AccessSampler(u32 handle) const {  }  VideoCore::GuestDriverProfile& KeplerCompute::AccessGuestDriverProfile() { -    return rasterizer.AccessGuestDriverProfile(); +    return rasterizer->AccessGuestDriverProfile();  }  const VideoCore::GuestDriverProfile& KeplerCompute::AccessGuestDriverProfile() const { -    return rasterizer.AccessGuestDriverProfile(); +    return rasterizer->AccessGuestDriverProfile();  }  void KeplerCompute::ProcessLaunch() { @@ -119,7 +120,7 @@ void KeplerCompute::ProcessLaunch() {      const GPUVAddr code_addr = regs.code_loc.Address() + launch_description.program_start;      LOG_TRACE(HW_GPU, "Compute invocation launched at address 0x{:016x}", code_addr); -    rasterizer.DispatchCompute(code_addr); +    rasterizer->DispatchCompute(code_addr);  }  Texture::TICEntry KeplerCompute::GetTICEntry(u32 tic_index) const { diff --git a/src/video_core/engines/kepler_compute.h b/src/video_core/engines/kepler_compute.h index b7f668d88..7f2500aab 100644 --- a/src/video_core/engines/kepler_compute.h +++ b/src/video_core/engines/kepler_compute.h @@ -42,10 +42,12 @@ namespace Tegra::Engines {  class KeplerCompute final : public ConstBufferEngineInterface, public EngineInterface {  public: -    explicit KeplerCompute(Core::System& system, VideoCore::RasterizerInterface& rasterizer, -                           MemoryManager& memory_manager); +    explicit KeplerCompute(Core::System& system, MemoryManager& memory_manager);      ~KeplerCompute(); +    /// Binds a rasterizer to this engine. +    void BindRasterizer(VideoCore::RasterizerInterface& rasterizer); +      static constexpr std::size_t NumConstBuffers = 8;      struct Regs { @@ -230,11 +232,6 @@ public:      const VideoCore::GuestDriverProfile& AccessGuestDriverProfile() const override;  private: -    Core::System& system; -    VideoCore::RasterizerInterface& rasterizer; -    MemoryManager& memory_manager; -    Upload::State upload_state; -      void ProcessLaunch();      /// Retrieves information about a specific TIC entry from the TIC buffer. @@ -242,6 +239,11 @@ private:      /// Retrieves information about a specific TSC entry from the TSC buffer.      Texture::TSCEntry GetTSCEntry(u32 tsc_index) const; + +    Core::System& system; +    MemoryManager& memory_manager; +    VideoCore::RasterizerInterface* rasterizer = nullptr; +    Upload::State upload_state;  };  #define ASSERT_REG_POSITION(field_name, position)                                                  \ diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index c01436295..33854445f 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -22,14 +22,19 @@ using VideoCore::QueryType;  /// First register id that is actually a Macro call.  constexpr u32 MacroRegistersStart = 0xE00; -Maxwell3D::Maxwell3D(Core::System& system, VideoCore::RasterizerInterface& rasterizer, -                     MemoryManager& memory_manager) -    : system{system}, rasterizer{rasterizer}, memory_manager{memory_manager}, -      macro_engine{GetMacroEngine(*this)}, upload_state{memory_manager, regs.upload} { +Maxwell3D::Maxwell3D(Core::System& system_, MemoryManager& memory_manager_) +    : system{system_}, memory_manager{memory_manager_}, macro_engine{GetMacroEngine(*this)}, +      upload_state{memory_manager, regs.upload} {      dirty.flags.flip();      InitializeRegisterDefaults();  } +Maxwell3D::~Maxwell3D() = default; + +void Maxwell3D::BindRasterizer(VideoCore::RasterizerInterface& rasterizer_) { +    rasterizer = &rasterizer_; +} +  void Maxwell3D::InitializeRegisterDefaults() {      // Initializes registers to their default values - what games expect them to be at boot. This is      // for certain registers that may not be explicitly set by games. @@ -192,7 +197,7 @@ void Maxwell3D::CallMethod(u32 method, u32 method_argument, bool is_last_call) {      switch (method) {      case MAXWELL3D_REG_INDEX(wait_for_idle): { -        rasterizer.WaitForIdle(); +        rasterizer->WaitForIdle();          break;      }      case MAXWELL3D_REG_INDEX(shadow_ram_control): { @@ -402,7 +407,7 @@ void Maxwell3D::FlushMMEInlineDraw() {      const bool is_indexed = mme_draw.current_mode == MMEDrawMode::Indexed;      if (ShouldExecute()) { -        rasterizer.Draw(is_indexed, true); +        rasterizer->Draw(is_indexed, true);      }      // TODO(bunnei): Below, we reset vertex count so that we can use these registers to determine if @@ -465,7 +470,7 @@ void Maxwell3D::ProcessQueryGet() {      switch (regs.query.query_get.operation) {      case Regs::QueryOperation::Release:          if (regs.query.query_get.fence == 1) { -            rasterizer.SignalSemaphore(regs.query.QueryAddress(), regs.query.query_sequence); +            rasterizer->SignalSemaphore(regs.query.QueryAddress(), regs.query.query_sequence);          } else {              StampQueryResult(regs.query.query_sequence, regs.query.query_get.short_query == 0);          } @@ -533,7 +538,7 @@ void Maxwell3D::ProcessQueryCondition() {  void Maxwell3D::ProcessCounterReset() {      switch (regs.counter_reset) {      case Regs::CounterReset::SampleCnt: -        rasterizer.ResetCounter(QueryType::SamplesPassed); +        rasterizer->ResetCounter(QueryType::SamplesPassed);          break;      default:          LOG_DEBUG(Render_OpenGL, "Unimplemented counter reset={}", @@ -547,7 +552,7 @@ void Maxwell3D::ProcessSyncPoint() {      const u32 increment = regs.sync_info.increment.Value();      [[maybe_unused]] const u32 cache_flush = regs.sync_info.unknown.Value();      if (increment) { -        rasterizer.SignalSyncPoint(sync_point); +        rasterizer->SignalSyncPoint(sync_point);      }  } @@ -570,7 +575,7 @@ void Maxwell3D::DrawArrays() {      const bool is_indexed{regs.index_array.count && !regs.vertex_buffer.count};      if (ShouldExecute()) { -        rasterizer.Draw(is_indexed, false); +        rasterizer->Draw(is_indexed, false);      }      // TODO(bunnei): Below, we reset vertex count so that we can use these registers to determine if @@ -590,8 +595,8 @@ std::optional<u64> Maxwell3D::GetQueryResult() {          return 0;      case Regs::QuerySelect::SamplesPassed:          // Deferred. -        rasterizer.Query(regs.query.QueryAddress(), VideoCore::QueryType::SamplesPassed, -                         system.GPU().GetTicks()); +        rasterizer->Query(regs.query.QueryAddress(), VideoCore::QueryType::SamplesPassed, +                          system.GPU().GetTicks());          return {};      default:          LOG_DEBUG(HW_GPU, "Unimplemented query select type {}", @@ -718,7 +723,7 @@ void Maxwell3D::ProcessClearBuffers() {             regs.clear_buffers.R == regs.clear_buffers.B &&             regs.clear_buffers.R == regs.clear_buffers.A); -    rasterizer.Clear(); +    rasterizer->Clear();  }  u32 Maxwell3D::AccessConstBuffer32(ShaderType stage, u64 const_buffer, u64 offset) const { @@ -752,11 +757,11 @@ SamplerDescriptor Maxwell3D::AccessSampler(u32 handle) const {  }  VideoCore::GuestDriverProfile& Maxwell3D::AccessGuestDriverProfile() { -    return rasterizer.AccessGuestDriverProfile(); +    return rasterizer->AccessGuestDriverProfile();  }  const VideoCore::GuestDriverProfile& Maxwell3D::AccessGuestDriverProfile() const { -    return rasterizer.AccessGuestDriverProfile(); +    return rasterizer->AccessGuestDriverProfile();  }  } // namespace Tegra::Engines diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index c97eeb792..bc289c55d 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -51,9 +51,11 @@ namespace Tegra::Engines {  class Maxwell3D final : public ConstBufferEngineInterface, public EngineInterface {  public: -    explicit Maxwell3D(Core::System& system, VideoCore::RasterizerInterface& rasterizer, -                       MemoryManager& memory_manager); -    ~Maxwell3D() = default; +    explicit Maxwell3D(Core::System& system, MemoryManager& memory_manager); +    ~Maxwell3D(); + +    /// Binds a rasterizer to this engine. +    void BindRasterizer(VideoCore::RasterizerInterface& rasterizer);      /// Register structure of the Maxwell3D engine.      /// TODO(Subv): This structure will need to be made bigger as more registers are discovered. @@ -1418,12 +1420,12 @@ public:          return execute_on;      } -    VideoCore::RasterizerInterface& GetRasterizer() { -        return rasterizer; +    VideoCore::RasterizerInterface& Rasterizer() { +        return *rasterizer;      } -    const VideoCore::RasterizerInterface& GetRasterizer() const { -        return rasterizer; +    const VideoCore::RasterizerInterface& Rasterizer() const { +        return *rasterizer;      }      /// Notify a memory write has happened. @@ -1460,11 +1462,10 @@ private:      void InitializeRegisterDefaults();      Core::System& system; - -    VideoCore::RasterizerInterface& rasterizer; -      MemoryManager& memory_manager; +    VideoCore::RasterizerInterface* rasterizer = nullptr; +      /// Start offsets of each macro in macro_memory      std::array<u32, 0x80> macro_positions = {};  | 
