From 4f93d400cb766fdbb9553173a4773e55221b1942 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Wed, 19 Aug 2020 21:41:04 +0300 Subject: [PATCH] Fix render from feed --- applications/vision/src/main.cpp | 1 + components/renderers/cpp/src/CUDARender.cpp | 5 +- .../streams/include/ftl/streams/feed.hpp | 1 + components/streams/src/feed.cpp | 85 ++++++++++--------- .../streams/src/renderers/openvr_render.cpp | 6 +- .../streams/src/renderers/screen_render.cpp | 3 +- 6 files changed, 56 insertions(+), 45 deletions(-) diff --git a/applications/vision/src/main.cpp b/applications/vision/src/main.cpp index b9f893300..7bff748fc 100644 --- a/applications/vision/src/main.cpp +++ b/applications/vision/src/main.cpp @@ -240,6 +240,7 @@ static void run(ftl::Configurable *root) { // Make sure upload has completed. cudaSafeCall(cudaEventSynchronize(fs->frames[0].uploadEvent())); + // TODO: Try depth pipeline again here if failed first time. fs->flush(ftl::codecs::Channel::Colour); const_cast<ftl::data::FrameSetPtr&>(fs).reset(); diff --git a/components/renderers/cpp/src/CUDARender.cpp b/components/renderers/cpp/src/CUDARender.cpp index 1ed37cca6..3b5a6adc4 100644 --- a/components/renderers/cpp/src/CUDARender.cpp +++ b/components/renderers/cpp/src/CUDARender.cpp @@ -99,7 +99,8 @@ CUDARender::CUDARender(nlohmann::json &config) : ftl::render::FSRenderer(config) } } - cudaSafeCall(cudaStreamCreate(&stream_)); + //cudaSafeCall(cudaStreamCreate(&stream_)); + stream_ = 0; last_frame_ = -1; temp_.store(); @@ -510,6 +511,8 @@ void CUDARender::begin(ftl::rgbd::Frame &out, ftl::codecs::Channel chan) { throw FTL_Error("Already rendering"); } + stream_ = out.stream(); + out_ = &out; const auto &camera = out.getLeftCamera(); cv::cuda::Stream cvstream = cv::cuda::StreamAccessor::wrapStream(stream_); diff --git a/components/streams/include/ftl/streams/feed.hpp b/components/streams/include/ftl/streams/feed.hpp index ac141a045..4aab46ca2 100644 --- a/components/streams/include/ftl/streams/feed.hpp +++ b/components/streams/include/ftl/streams/feed.hpp @@ -235,6 +235,7 @@ private: void _createPipeline(uint32_t fsid); ftl::operators::Graph* _addPipeline(uint32_t fsid); + void _dispatch(const ftl::data::FrameSetPtr &fs); void _beginRecord(Filter *f); void _stopRecording(); diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp index 54b35d200..4253b8026 100644 --- a/components/streams/src/feed.cpp +++ b/components/streams/src/feed.cpp @@ -179,55 +179,25 @@ Feed::Feed(nlohmann::json &config, ftl::net::Universe*net) : SHARED_LOCK(mtx_, lk); if (pre_pipelines_.count(fs->frameset()) == 1) { - pipeline = pre_pipelines_[fs->frameset()]; //->apply(*fs, *fs, 0); + pipeline = pre_pipelines_[fs->frameset()]; } lk.unlock(); bool did_pipe = false; - if (pipeline) did_pipe = pipeline->apply(*fs, *fs, [this,fs]() { - SHARED_LOCK(mtx_, lk); + if (pipeline) { + bool did_pipe = pipeline->apply(*fs, *fs, [this,fs]() { + _dispatch(fs); + }); - std::atomic_store(&latest_.at(fs->frameset()), fs); - - if (fs->hasAnyChanged(Channel::Thumbnail)) { - _saveThumbnail(fs); - } - - for (auto* filter : filters_) { - // TODO: smarter update (update only when changed) instead of - // filter->channels_available_ = fs->channels(); - - if (filter->sources().empty()) { - //filter->channels_available_ = fs->channels(); - filter->handler_.triggerParallel(fs); - } - else { - // TODO: process partial/complete sets here (drop), that is - // intersection filter->sources() and fs->sources() is - // same as filter->sources(). - - // TODO: reverse map source ids required here? - for (const auto& src : filter->sources()) { - //if (fs->hasFrame(src)) { - if (fs->frameset() == src) { - //filter->channels_available_ = fs->channels(); - filter->handler_.triggerParallel(fs); - break; - } - } - } + if (!did_pipe) { + LOG(WARNING) << "GUI Pipeline dropped"; } - }); - //cudaSafeCall(cudaStreamSynchronize(fs->frames[0].stream())); - - //lk.lock(); - - if (!did_pipe) { - LOG(WARNING) << "GUI Pipeline dropped"; + } else { + _dispatch(fs); } - + return true; }); @@ -279,6 +249,41 @@ Feed::~Feed() { } } +void Feed::_dispatch(const ftl::data::FrameSetPtr &fs) { + SHARED_LOCK(mtx_, lk); + + std::atomic_store(&latest_.at(fs->frameset()), fs); + + if (fs->hasAnyChanged(Channel::Thumbnail)) { + _saveThumbnail(fs); + } + + for (auto* filter : filters_) { + // TODO: smarter update (update only when changed) instead of + // filter->channels_available_ = fs->channels(); + + if (filter->sources().empty()) { + //filter->channels_available_ = fs->channels(); + filter->handler_.triggerParallel(fs); + } + else { + // TODO: process partial/complete sets here (drop), that is + // intersection filter->sources() and fs->sources() is + // same as filter->sources(). + + // TODO: reverse map source ids required here? + for (const auto& src : filter->sources()) { + //if (fs->hasFrame(src)) { + if (fs->frameset() == src) { + //filter->channels_available_ = fs->channels(); + filter->handler_.triggerParallel(fs); + break; + } + } + } + } +} + void Feed::_saveThumbnail(const ftl::data::FrameSetPtr& fs) { // TODO: Put thumb somewhere here... } diff --git a/components/streams/src/renderers/openvr_render.cpp b/components/streams/src/renderers/openvr_render.cpp index 6c76a6bd7..a448206e2 100644 --- a/components/streams/src/renderers/openvr_render.cpp +++ b/components/streams/src/renderers/openvr_render.cpp @@ -361,8 +361,8 @@ bool OpenVRRender::retrieve(ftl::data::Frame &frame_out) { texture1_.make(width, height, ftl::utility::GLTexture::Type::BGRA); texture2_.make(width, height, ftl::utility::GLTexture::Type::BGRA); - rgbdframe.create<cv::cuda::GpuMat>(Channel::Colour) = texture1_.map(renderer_->getCUDAStream()); - rgbdframe.create<cv::cuda::GpuMat>(Channel::Colour2) = texture2_.map(renderer_->getCUDAStream()); + rgbdframe.create<cv::cuda::GpuMat>(Channel::Colour) = texture1_.map(rgbdframe.stream()); + rgbdframe.create<cv::cuda::GpuMat>(Channel::Colour2) = texture2_.map(rgbdframe.stream()); rgbdframe.create<cv::cuda::GpuMat>(Channel::Depth).create(height, width, CV_32F); rgbdframe.createTexture<float>(Channel::Depth); @@ -521,7 +521,7 @@ bool OpenVRRender::retrieve(ftl::data::Frame &frame_out) { post_pipe_->append<ftl::operators::GTAnalysis>("gtanalyse"); } - post_pipe_->apply(rgbdframe, rgbdframe, nullptr, renderer_->getCUDAStream()); + post_pipe_->apply(rgbdframe, rgbdframe); if (host_->value("enable_touch", false)) { ftl::render::collision2touch(rgbdframe, renderer_->getCollisions(), sets, my_id_, host_->value("touch_min", 0.01f), host_->value("touch_max", 0.05f)); diff --git a/components/streams/src/renderers/screen_render.cpp b/components/streams/src/renderers/screen_render.cpp index 2e2d20532..4556cfaec 100644 --- a/components/streams/src/renderers/screen_render.cpp +++ b/components/streams/src/renderers/screen_render.cpp @@ -225,7 +225,8 @@ bool ScreenRender::retrieve(ftl::data::Frame &frame_out) { post_pipe_->append<ftl::operators::GTAnalysis>("gtanalyse"); } - post_pipe_->apply(rgbdframe, rgbdframe, 0); + post_pipe_->apply(rgbdframe, rgbdframe); + cudaSafeCall(cudaStreamSynchronize(rgbdframe.stream())); if (host_->value("enable_touch", false)) { ftl::render::collision2touch(rgbdframe, renderer_->getCollisions(), sets, my_id_, host_->value("touch_min", 0.01f), host_->value("touch_max", 0.05f)); -- GitLab