diff --git a/modules/gapi/src/api/gmat.cpp b/modules/gapi/src/api/gmat.cpp index d9f135222bb2..08bb170a8615 100644 --- a/modules/gapi/src/api/gmat.cpp +++ b/modules/gapi/src/api/gmat.cpp @@ -144,7 +144,7 @@ bool GMatDesc::canDescribe(const cv::Mat& mat) const bool GMatDesc::canDescribe(const cv::RMat& mat) const { - return *this == mat.desc(); + return canDescribeHelper(*this, mat); } }// namespace cv diff --git a/modules/gapi/src/backends/common/gbackend.hpp b/modules/gapi/src/backends/common/gbackend.hpp index e96d2b0776ba..8c1749377ecd 100644 --- a/modules/gapi/src/backends/common/gbackend.hpp +++ b/modules/gapi/src/backends/common/gbackend.hpp @@ -134,7 +134,7 @@ inline cv::util::optional getCompileArg(const cv::GCompileArgs &args) return cv::gapi::getCompileArg(args); } -void createMat(const cv::GMatDesc& desc, cv::Mat& mat); +void GAPI_EXPORTS createMat(const cv::GMatDesc& desc, cv::Mat& mat); }} // cv::gimpl diff --git a/modules/gapi/src/backends/common/serialization.cpp b/modules/gapi/src/backends/common/serialization.cpp index 2b23b33cc8fc..bb1864823fdf 100644 --- a/modules/gapi/src/backends/common/serialization.cpp +++ b/modules/gapi/src/backends/common/serialization.cpp @@ -94,13 +94,14 @@ void linkNodes(ade::Graph& g) { } void relinkProto(ade::Graph& g) { + using namespace cv::gimpl; // identify which node handles map to the protocol // input/output object in the reconstructed graph - using S = std::set; // FIXME: use ... - using M = std::map; // FIXME: unordered! + using S = std::set; // FIXME: use ... + using M = std::map; // FIXME: unordered! - cv::gimpl::GModel::Graph gm(g); - auto &proto = gm.metadata().get(); + GModel::Graph gm(g); + auto &proto = gm.metadata().get(); const S set_in(proto.inputs.begin(), proto.inputs.end()); const S set_out(proto.outputs.begin(), proto.outputs.end()); @@ -108,9 +109,9 @@ void relinkProto(ade::Graph& g) { // Associate the protocol node handles with their resource identifiers for (auto &&nh : gm.nodes()) { - if (gm.metadata(nh).get().t == cv::gimpl::NodeType::DATA) { - const auto &d = gm.metadata(nh).get(); - const auto rc = cv::gimpl::RcDesc{d.rc, d.shape, d.ctor}; + if (gm.metadata(nh).get().t == NodeType::DATA) { + const auto &d = gm.metadata(nh).get(); + const auto rc = RcDesc{d.rc, d.shape, d.ctor}; if (set_in.count(rc) > 0) { GAPI_DbgAssert(set_out.count(rc) == 0); map_in[rc] = nh; @@ -128,6 +129,12 @@ void relinkProto(ade::Graph& g) { proto.out_nhs.clear(); for (auto &rc : proto.inputs) { proto.in_nhs .push_back(map_in .at(rc)); } for (auto &rc : proto.outputs) { proto.out_nhs.push_back(map_out.at(rc)); } + + // If a subgraph is being serialized it's possible that + // some of its in/out nodes are INTERNAL in the full graph. + // Set their storage apporpriately + for (auto &nh : proto.in_nhs) { gm.metadata(nh).get().storage = Data::Storage::INPUT; } + for (auto &nh : proto.out_nhs) { gm.metadata(nh).get().storage = Data::Storage::OUTPUT; } } } // anonymous namespace