diff options
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/shader/shader_ir.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/shader/shader_ir.h | 41 | ||||
| -rw-r--r-- | src/video_core/shader/track.cpp | 12 | 
3 files changed, 28 insertions, 32 deletions
| diff --git a/src/video_core/shader/shader_ir.cpp b/src/video_core/shader/shader_ir.cpp index e4eb0dfd9..196235e5d 100644 --- a/src/video_core/shader/shader_ir.cpp +++ b/src/video_core/shader/shader_ir.cpp @@ -21,6 +21,13 @@ using Tegra::Shader::PredCondition;  using Tegra::Shader::PredOperation;  using Tegra::Shader::Register; +ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset) +    : program_code{program_code}, main_offset{main_offset} { +    Decode(); +} + +ShaderIR::~ShaderIR() = default; +  Node ShaderIR::StoreNode(NodeData&& node_data) {      auto store = std::make_unique<NodeData>(node_data);      const Node node = store.get(); diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h index 65f1e1de9..e4253fdb3 100644 --- a/src/video_core/shader/shader_ir.h +++ b/src/video_core/shader/shader_ir.h @@ -328,40 +328,31 @@ struct MetaTexture {      u32 element{};  }; -inline constexpr MetaArithmetic PRECISE = {true}; -inline constexpr MetaArithmetic NO_PRECISE = {false}; +constexpr MetaArithmetic PRECISE = {true}; +constexpr MetaArithmetic NO_PRECISE = {false};  using Meta = std::variant<MetaArithmetic, MetaTexture, Tegra::Shader::HalfType>;  /// Holds any kind of operation that can be done in the IR  class OperationNode final {  public: -    template <typename... T> -    explicit constexpr OperationNode(OperationCode code) : code{code}, meta{} {} +    explicit OperationNode(OperationCode code) : code{code} {} -    template <typename... T> -    explicit constexpr OperationNode(OperationCode code, Meta&& meta) -        : code{code}, meta{std::move(meta)} {} +    explicit OperationNode(OperationCode code, Meta&& meta) : code{code}, meta{std::move(meta)} {}      template <typename... T> -    explicit constexpr OperationNode(OperationCode code, const T*... operands) +    explicit OperationNode(OperationCode code, const T*... operands)          : OperationNode(code, {}, operands...) {}      template <typename... T> -    explicit constexpr OperationNode(OperationCode code, Meta&& meta, const T*... operands_) -        : code{code}, meta{std::move(meta)} { - -        auto operands_list = {operands_...}; -        for (auto& operand : operands_list) { -            operands.push_back(operand); -        } -    } +    explicit OperationNode(OperationCode code, Meta&& meta, const T*... operands_) +        : code{code}, meta{std::move(meta)}, operands{operands_...} {}      explicit OperationNode(OperationCode code, Meta&& meta, std::vector<Node>&& operands)          : code{code}, meta{meta}, operands{std::move(operands)} {}      explicit OperationNode(OperationCode code, std::vector<Node>&& operands) -        : code{code}, meta{}, operands{std::move(operands)} {} +        : code{code}, operands{std::move(operands)} {}      OperationCode GetCode() const {          return code; @@ -567,11 +558,8 @@ private:  class ShaderIR final {  public: -    explicit ShaderIR(const ProgramCode& program_code, u32 main_offset) -        : program_code{program_code}, main_offset{main_offset} { - -        Decode(); -    } +    explicit ShaderIR(const ProgramCode& program_code, u32 main_offset); +    ~ShaderIR();      const std::map<u32, NodeBlock>& GetBasicBlocks() const {          return basic_blocks; @@ -814,11 +802,12 @@ private:      void WriteLop3Instruction(NodeBlock& bb, Tegra::Shader::Register dest, Node op_a, Node op_b,                                Node op_c, Node imm_lut, bool sets_cc); -    Node TrackCbuf(Node tracked, const NodeBlock& code, s64 cursor); +    Node TrackCbuf(Node tracked, const NodeBlock& code, s64 cursor) const; -    std::optional<u32> TrackImmediate(Node tracked, const NodeBlock& code, s64 cursor); +    std::optional<u32> TrackImmediate(Node tracked, const NodeBlock& code, s64 cursor) const; -    std::pair<Node, s64> TrackRegister(const GprNode* tracked, const NodeBlock& code, s64 cursor); +    std::pair<Node, s64> TrackRegister(const GprNode* tracked, const NodeBlock& code, +                                       s64 cursor) const;      std::tuple<Node, Node, GlobalMemoryBase> TrackAndGetGlobalMemory(NodeBlock& bb,                                                                       Node addr_register, @@ -835,12 +824,10 @@ private:          return StoreNode(OperationNode(code, std::move(meta), operands...));      } -    template <typename... T>      Node Operation(OperationCode code, std::vector<Node>&& operands) {          return StoreNode(OperationNode(code, std::move(operands)));      } -    template <typename... T>      Node Operation(OperationCode code, Meta&& meta, std::vector<Node>&& operands) {          return StoreNode(OperationNode(code, std::move(meta), std::move(operands)));      } diff --git a/src/video_core/shader/track.cpp b/src/video_core/shader/track.cpp index 4505667ff..19ede1eb9 100644 --- a/src/video_core/shader/track.cpp +++ b/src/video_core/shader/track.cpp @@ -17,22 +17,24 @@ std::pair<Node, s64> FindOperation(const NodeBlock& code, s64 cursor,      for (; cursor >= 0; --cursor) {          const Node node = code.at(cursor);          if (const auto operation = std::get_if<OperationNode>(node)) { -            if (operation->GetCode() == operation_code) +            if (operation->GetCode() == operation_code) {                  return {node, cursor}; +            }          }          if (const auto conditional = std::get_if<ConditionalNode>(node)) {              const auto& conditional_code = conditional->GetCode();              const auto [found, internal_cursor] = FindOperation(                  conditional_code, static_cast<s64>(conditional_code.size() - 1), operation_code); -            if (found) +            if (found) {                  return {found, cursor}; +            }          }      }      return {};  }  } // namespace -Node ShaderIR::TrackCbuf(Node tracked, const NodeBlock& code, s64 cursor) { +Node ShaderIR::TrackCbuf(Node tracked, const NodeBlock& code, s64 cursor) const {      if (const auto cbuf = std::get_if<CbufNode>(tracked)) {          // Cbuf found, but it has to be immediate          return std::holds_alternative<ImmediateNode>(*cbuf->GetOffset()) ? tracked : nullptr; @@ -65,7 +67,7 @@ Node ShaderIR::TrackCbuf(Node tracked, const NodeBlock& code, s64 cursor) {      return nullptr;  } -std::optional<u32> ShaderIR::TrackImmediate(Node tracked, const NodeBlock& code, s64 cursor) { +std::optional<u32> ShaderIR::TrackImmediate(Node tracked, const NodeBlock& code, s64 cursor) const {      // Reduce the cursor in one to avoid infinite loops when the instruction sets the same register      // that it uses as operand      const auto [found, found_cursor] = @@ -80,7 +82,7 @@ std::optional<u32> ShaderIR::TrackImmediate(Node tracked, const NodeBlock& code,  }  std::pair<Node, s64> ShaderIR::TrackRegister(const GprNode* tracked, const NodeBlock& code, -                                             s64 cursor) { +                                             s64 cursor) const {      for (; cursor >= 0; --cursor) {          const auto [found_node, new_cursor] = FindOperation(code, cursor, OperationCode::Assign);          if (!found_node) { | 
