diff --git a/modules/gapi/include/opencv2/gapi/fluid/gfluidbuffer.hpp b/modules/gapi/include/opencv2/gapi/fluid/gfluidbuffer.hpp index a5dd4a6f89..5c273c2041 100644 --- a/modules/gapi/include/opencv2/gapi/fluid/gfluidbuffer.hpp +++ b/modules/gapi/include/opencv2/gapi/fluid/gfluidbuffer.hpp @@ -115,6 +115,8 @@ public: BorderOpt border); // Constructor for in/out buffers (for tests) Buffer(const cv::gapi::own::Mat &data, bool is_input); + ~Buffer(); + Buffer& operator=(Buffer&&); inline uint8_t* OutLineB(int index = 0) { @@ -143,7 +145,7 @@ public: const Priv& priv() const; // internal use only private: - std::shared_ptr m_priv; + std::unique_ptr m_priv; const Cache* m_cache; }; diff --git a/modules/gapi/src/backends/fluid/gfluidbackend.cpp b/modules/gapi/src/backends/fluid/gfluidbackend.cpp index bdd4432c93..5fc9c4e211 100644 --- a/modules/gapi/src/backends/fluid/gfluidbackend.cpp +++ b/modules/gapi/src/backends/fluid/gfluidbackend.cpp @@ -833,7 +833,8 @@ cv::gimpl::GFluidExecutable::GFluidExecutable(const ade::Graph m_num_int_buffers (traverse_res.m_mat_count), m_scratch_users (traverse_res.m_scratch_users), m_id_map (traverse_res.m_id_map), - m_all_gmat_ids (traverse_res.m_all_gmat_ids) + m_all_gmat_ids (traverse_res.m_all_gmat_ids), + m_buffers(m_num_int_buffers + m_scratch_users.size()) { GConstFluidModel fg(m_g); @@ -857,9 +858,6 @@ cv::gimpl::GFluidExecutable::GFluidExecutable(const ade::Graph // Actually initialize Fluid buffers GAPI_LOG_INFO(NULL, "Initializing " << m_num_int_buffers << " fluid buffer(s)" << std::endl); - const std::size_t num_scratch = m_scratch_users.size(); - m_buffers.resize(m_num_int_buffers + num_scratch); - // After buffers are allocated, repack: ... for (auto &agent : m_agents) { @@ -905,6 +903,7 @@ cv::gimpl::GFluidExecutable::GFluidExecutable(const ade::Graph } // After parameters are there, initialize scratch buffers + const std::size_t num_scratch = m_scratch_users.size(); if (num_scratch) { GAPI_LOG_INFO(NULL, "Initializing " << num_scratch << " scratch buffer(s)" << std::endl); @@ -932,8 +931,8 @@ std::size_t cv::gimpl::GFluidExecutable::total_buffers_size() const for (const auto &i : ade::util::indexed(m_buffers)) { // Check that all internal and scratch buffers are allocated - const auto idx = ade::util::index(i); - const auto b = ade::util::value(i); + const auto idx = ade::util::index(i); + const auto& b = ade::util::value(i); if (idx >= m_num_int_buffers || fg.metadata(m_all_gmat_ids.at(idx)).get().internal == true) { diff --git a/modules/gapi/src/backends/fluid/gfluidbackend.hpp b/modules/gapi/src/backends/fluid/gfluidbackend.hpp index c8598d7da8..4aa9867dac 100644 --- a/modules/gapi/src/backends/fluid/gfluidbackend.hpp +++ b/modules/gapi/src/backends/fluid/gfluidbackend.hpp @@ -125,7 +125,6 @@ class GFluidExecutable final: public GIslandExecutable GModel::ConstGraph m_gm; std::vector> m_agents; - std::vector m_buffers; std::vector m_script; @@ -138,6 +137,8 @@ class GFluidExecutable final: public GIslandExecutable std::unordered_map m_id_map; // GMat id -> buffer idx map std::map m_all_gmat_ids; + std::vector m_buffers; + void bindInArg (const RcDesc &rc, const GRunArg &arg); void bindOutArg(const RcDesc &rc, const GRunArgP &arg); void packArg (GArg &in_arg, const GArg &op_arg); diff --git a/modules/gapi/src/backends/fluid/gfluidbuffer.cpp b/modules/gapi/src/backends/fluid/gfluidbuffer.cpp index e2a78078df..8ee2d98a14 100644 --- a/modules/gapi/src/backends/fluid/gfluidbuffer.cpp +++ b/modules/gapi/src/backends/fluid/gfluidbuffer.cpp @@ -680,6 +680,9 @@ fluid::Buffer::Buffer(const cv::gapi::own::Mat &data, bool is_input) m_priv->bindTo(data, is_input); } +fluid::Buffer::~Buffer() = default; +fluid::Buffer& fluid::Buffer::operator=(fluid::Buffer&&) = default; + int fluid::Buffer::linesReady() const { return m_priv->linesReady();