Skip to content
Snippets Groups Projects
Commit 989269f0 authored by Nicolas Pope's avatar Nicolas Pope
Browse files

Merge branch 'bug/vrperf' into 'master'

Resolve VR performance problems

See merge request nicolas.pope/ftl!266
parents 56e86a47 402f49c5
No related branches found
No related tags found
1 merge request!266Resolve VR performance problems
Pipeline #21572 passed
...@@ -78,6 +78,9 @@ ftl::gui::Camera::Camera(ftl::gui::Screen *screen, int fsmask, int fid, ftl::cod ...@@ -78,6 +78,9 @@ ftl::gui::Camera::Camera(ftl::gui::Screen *screen, int fsmask, int fid, ftl::cod
record_stream_ = nullptr; record_stream_ = nullptr;
transform_ix_ = -1; transform_ix_ = -1;
stereo_ = false; stereo_ = false;
rx_ = 0;
ry_ = 0;
framesets_ = nullptr;
colouriser_ = ftl::create<ftl::render::Colouriser>(screen->root(), "colouriser"); colouriser_ = ftl::create<ftl::render::Colouriser>(screen->root(), "colouriser");
...@@ -248,6 +251,14 @@ void ftl::gui::Camera::setStereo(bool v) { ...@@ -248,6 +251,14 @@ void ftl::gui::Camera::setStereo(bool v) {
} }
} }
static ftl::codecs::Channel mapToSecondChannel(ftl::codecs::Channel c) {
switch (c) {
case Channel::Depth : return Channel::Depth2;
case Channel::Normals : return Channel::Normals2;
default: return c;
}
}
void ftl::gui::Camera::_draw(std::vector<ftl::rgbd::FrameSet*> &fss) { void ftl::gui::Camera::_draw(std::vector<ftl::rgbd::FrameSet*> &fss) {
frame_.reset(); frame_.reset();
frame_.setOrigin(&state_); frame_.setOrigin(&state_);
...@@ -273,6 +284,9 @@ void ftl::gui::Camera::_draw(std::vector<ftl::rgbd::FrameSet*> &fss) { ...@@ -273,6 +284,9 @@ void ftl::gui::Camera::_draw(std::vector<ftl::rgbd::FrameSet*> &fss) {
if (channel_ != Channel::Left && channel_ != Channel::Right && channel_ != Channel::None) { if (channel_ != Channel::Left && channel_ != Channel::Right && channel_ != Channel::None) {
renderer_->blend(0.5f, channel_); renderer_->blend(0.5f, channel_);
if (isStereo()) {
renderer2_->blend(0.5f, mapToSecondChannel(channel_));
}
} }
renderer_->end(); renderer_->end();
...@@ -352,6 +366,8 @@ void ftl::gui::Camera::_downloadFrames(ftl::cuda::TextureObject<uchar4> &a, ftl: ...@@ -352,6 +366,8 @@ void ftl::gui::Camera::_downloadFrames(ftl::cuda::TextureObject<uchar4> &a, ftl:
if (im2_.cols != im1_.cols || im2_.rows != im1_.rows) { if (im2_.cols != im1_.cols || im2_.rows != im1_.rows) {
throw FTL_Error("Left and right images are different sizes"); throw FTL_Error("Left and right images are different sizes");
} }
new_frame_.clear();
} }
void ftl::gui::Camera::_downloadFrame(ftl::cuda::TextureObject<uchar4> &a) { void ftl::gui::Camera::_downloadFrame(ftl::cuda::TextureObject<uchar4> &a) {
...@@ -365,6 +381,8 @@ void ftl::gui::Camera::_downloadFrame(ftl::cuda::TextureObject<uchar4> &a) { ...@@ -365,6 +381,8 @@ void ftl::gui::Camera::_downloadFrame(ftl::cuda::TextureObject<uchar4> &a) {
height_ = im1_.rows; height_ = im1_.rows;
im2_ = cv::Mat(); im2_ = cv::Mat();
new_frame_.clear();
} }
void ftl::gui::Camera::update(int fsid, const ftl::codecs::Channels<0> &c) { void ftl::gui::Camera::update(int fsid, const ftl::codecs::Channels<0> &c) {
...@@ -379,6 +397,8 @@ void ftl::gui::Camera::update(int fsid, const ftl::codecs::Channels<0> &c) { ...@@ -379,6 +397,8 @@ void ftl::gui::Camera::update(int fsid, const ftl::codecs::Channels<0> &c) {
void ftl::gui::Camera::update(std::vector<ftl::rgbd::FrameSet*> &fss) { void ftl::gui::Camera::update(std::vector<ftl::rgbd::FrameSet*> &fss) {
UNIQUE_LOCK(mutex_, lk); UNIQUE_LOCK(mutex_, lk);
framesets_ = &fss;
//if (fss.size() <= fsid_) return; //if (fss.size() <= fsid_) return;
if (fid_ == 255) { if (fid_ == 255) {
name_ = "Virtual Camera"; name_ = "Virtual Camera";
...@@ -443,14 +463,17 @@ void ftl::gui::Camera::mouseMovement(int rx, int ry, int button) { ...@@ -443,14 +463,17 @@ void ftl::gui::Camera::mouseMovement(int rx, int ry, int button) {
//if (!src_->hasCapabilities(ftl::rgbd::kCapMovable)) return; //if (!src_->hasCapabilities(ftl::rgbd::kCapMovable)) return;
if (fid_ < 255) return; if (fid_ < 255) return;
if (button == 1) { if (button == 1) {
float rrx = ((float)ry * 0.2f * delta_); rx_ += rx;
ry_ += ry;
/*float rrx = ((float)ry * 0.2f * delta_);
//orientation_[2] += std::cos(orientation_[1])*((float)rel[1] * 0.2f * delta_); //orientation_[2] += std::cos(orientation_[1])*((float)rel[1] * 0.2f * delta_);
float rry = (float)rx * 0.2f * delta_; float rry = (float)rx * 0.2f * delta_;
float rrz = 0.0; float rrz = 0.0;
Eigen::Affine3d r = create_rotation_matrix(rrx, -rry, rrz); Eigen::Affine3d r = create_rotation_matrix(rrx, -rry, rrz);
rotmat_ = rotmat_ * r.matrix(); rotmat_ = rotmat_ * r.matrix();*/
} }
} }
...@@ -578,18 +601,21 @@ void ftl::gui::Camera::active(bool a) { ...@@ -578,18 +601,21 @@ void ftl::gui::Camera::active(bool a) {
} }
} }
const GLTexture &ftl::gui::Camera::captureFrame() { const void ftl::gui::Camera::captureFrame() {
float now = (float)glfwGetTime(); float now = (float)glfwGetTime();
if (!screen_->isVR() && (now - ftime_) < 0.04f) return;
delta_ = now - ftime_; delta_ = now - ftime_;
ftime_ = now; ftime_ = now;
LOG(INFO) << "Frame delta: " << delta_;
//if (src_ && src_->isReady()) { //if (src_ && src_->isReady()) {
if (width_ > 0 && height_ > 0) { if (width_ > 0 && height_ > 0) {
UNIQUE_LOCK(mutex_, lk);
if (screen_->isVR()) { if (screen_->isVR()) {
#ifdef HAVE_OPENVR #ifdef HAVE_OPENVR
vr::VRCompositor()->SetTrackingSpace(vr::TrackingUniverseStanding);
vr::VRCompositor()->WaitGetPoses(rTrackedDevicePose_, vr::k_unMaxTrackedDeviceCount, NULL, 0 ); vr::VRCompositor()->WaitGetPoses(rTrackedDevicePose_, vr::k_unMaxTrackedDeviceCount, NULL, 0 );
if (isStereo() && rTrackedDevicePose_[vr::k_unTrackedDeviceIndex_Hmd].bPoseIsValid ) if (isStereo() && rTrackedDevicePose_[vr::k_unTrackedDeviceIndex_Hmd].bPoseIsValid )
...@@ -627,6 +653,19 @@ const GLTexture &ftl::gui::Camera::captureFrame() { ...@@ -627,6 +653,19 @@ const GLTexture &ftl::gui::Camera::captureFrame() {
//LOG(ERROR) << "No VR Pose"; //LOG(ERROR) << "No VR Pose";
} }
#endif #endif
} else {
// Use mouse to move camera
float rrx = ((float)ry_ * 0.2f * delta_);
float rry = (float)rx_ * 0.2f * delta_;
float rrz = 0.0;
Eigen::Affine3d r = create_rotation_matrix(rrx, -rry, rrz);
rotmat_ = rotmat_ * r.matrix();
rx_ = 0;
ry_ = 0;
} }
eye_[0] += (neye_[0] - eye_[0]) * lerpSpeed_ * delta_; eye_[0] += (neye_[0] - eye_[0]) * lerpSpeed_ * delta_;
...@@ -637,25 +676,32 @@ const GLTexture &ftl::gui::Camera::captureFrame() { ...@@ -637,25 +676,32 @@ const GLTexture &ftl::gui::Camera::captureFrame() {
Eigen::Affine3d t(trans); Eigen::Affine3d t(trans);
Eigen::Matrix4d viewPose = t.matrix() * rotmat_; Eigen::Matrix4d viewPose = t.matrix() * rotmat_;
if (isVirtual()) { {
if (transform_ix_ == -1) { UNIQUE_LOCK(mutex_, lk);
state_.setPose(viewPose);
} else if (transform_ix_ >= 0) { if (isVirtual()) {
transforms_[transform_ix_] = viewPose; if (transform_ix_ == -1) {
state_.setPose(viewPose);
} else if (transform_ix_ >= 0) {
transforms_[transform_ix_] = viewPose;
}
} }
} }
cv::Mat tmp; if (framesets_) draw(*framesets_);
if (im1_.rows != 0) { {
texture1_.update(im1_); //UNIQUE_LOCK(mutex_, lk);
} if (im1_.rows != 0) {
if (isStereo() && im2_.rows != 0) { texture1_.update(im1_);
texture2_.update(im2_); }
if (isStereo() && im2_.rows != 0) {
texture2_.update(im2_);
}
} }
} }
return texture1_; //return texture1_;
} }
void ftl::gui::Camera::snapshot(const std::string &filename) { void ftl::gui::Camera::snapshot(const std::string &filename) {
......
...@@ -74,7 +74,7 @@ class Camera { ...@@ -74,7 +74,7 @@ class Camera {
*/ */
void active(bool); void active(bool);
const GLTexture &captureFrame(); const void captureFrame();
const GLTexture &getLeft() const { return texture1_; } const GLTexture &getLeft() const { return texture1_; }
const GLTexture &getRight() const { return texture2_; } const GLTexture &getRight() const { return texture2_; }
...@@ -129,6 +129,10 @@ class Camera { ...@@ -129,6 +129,10 @@ class Camera {
cv::Mat im1_; // first channel (left) cv::Mat im1_; // first channel (left)
cv::Mat im2_; // second channel ("right") cv::Mat im2_; // second channel ("right")
bool stereo_; bool stereo_;
std::atomic_flag new_frame_;
int rx_;
int ry_;
std::vector<ftl::rgbd::FrameSet*> *framesets_;
ftl::render::CUDARender *renderer_; ftl::render::CUDARender *renderer_;
ftl::render::CUDARender *renderer2_; ftl::render::CUDARender *renderer2_;
......
...@@ -40,7 +40,41 @@ int main(int argc, char **argv) { ...@@ -40,7 +40,41 @@ int main(int argc, char **argv) {
nanogui::ref<ftl::gui::Screen> app = new ftl::gui::Screen(root, net, controller); nanogui::ref<ftl::gui::Screen> app = new ftl::gui::Screen(root, net, controller);
app->drawAll(); app->drawAll();
app->setVisible(true); app->setVisible(true);
nanogui::mainloop(); //nanogui::mainloop(20);
float last_draw_time = 0.0f;
float last_vr_time = 0.0f;
while (ftl::running) {
nanogui::Screen *screen = app;
if (!app->visible()) {
ftl::running = false;
} else if (glfwWindowShouldClose(app->glfwWindow())) {
app->setVisible(false);
ftl::running = false;
} else {
float now = (float)glfwGetTime();
float delta = now - last_draw_time;
// Generate poses and render and virtual frame here
// at full FPS (25 without VR and 90 with VR currently)
app->drawFast();
last_vr_time = now;
// Only draw the GUI at 25fps
if (delta >= 0.04f) {
last_draw_time = now;
app->drawAll();
}
}
/* Wait for mouse/keyboard or empty refresh events */
//glfwWaitEvents();
glfwPollEvents();
}
/* Process events once more */
glfwPollEvents();
LOG(INFO) << "Stopping..."; LOG(INFO) << "Stopping...";
ftl::timer::stop(false); ftl::timer::stop(false);
......
...@@ -118,13 +118,13 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen, ftl::gui::SourceWindow *sourceW ...@@ -118,13 +118,13 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen, ftl::gui::SourceWindow *sourceW
if (!screen_->isVR()) { if (!screen_->isVR()) {
if (screen_->switchVR(true) == true) { if (screen_->switchVR(true) == true) {
button_vr->setTextColor(nanogui::Color(0.5f,0.5f,1.0f,1.0f)); button_vr->setTextColor(nanogui::Color(0.5f,0.5f,1.0f,1.0f));
this->button_channels_->setEnabled(false); //this->button_channels_->setEnabled(false);
} }
} }
else { else {
if (screen_->switchVR(false) == false) { if (screen_->switchVR(false) == false) {
button_vr->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f)); button_vr->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f));
this->button_channels_->setEnabled(true); //this->button_channels_->setEnabled(true);
} }
} }
}); });
......
...@@ -520,29 +520,12 @@ void ftl::gui::Screen::draw(NVGcontext *ctx) { ...@@ -520,29 +520,12 @@ void ftl::gui::Screen::draw(NVGcontext *ctx) {
if (camera_) { if (camera_) {
imageSize = {camera_->width(), camera_->height()}; imageSize = {camera_->width(), camera_->height()};
mImageID = camera_->captureFrame().texture(); mImageID = camera_->getLeft().texture();
leftEye_ = mImageID; leftEye_ = mImageID;
rightEye_ = camera_->getRight().texture(); rightEye_ = camera_->getRight().texture();
//if (camera_->getChannel() != ftl::codecs::Channel::Left) { mImageID = rightEye_; } //if (camera_->getChannel() != ftl::codecs::Channel::Left) { mImageID = rightEye_; }
#ifdef HAVE_OPENVR
if (isVR() && imageSize[0] > 0 && camera_->getLeft().isValid() && camera_->getRight().isValid()) {
glBindTexture(GL_TEXTURE_2D, leftEye_);
vr::Texture_t leftEyeTexture = {(void*)(uintptr_t)leftEye_, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
vr::VRCompositor()->Submit(vr::Eye_Left, &leftEyeTexture );
glBindTexture(GL_TEXTURE_2D, rightEye_);
vr::Texture_t rightEyeTexture = {(void*)(uintptr_t)rightEye_, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
vr::VRCompositor()->Submit(vr::Eye_Right, &rightEyeTexture );
glFlush();
mImageID = leftEye_;
}
#endif
if (mImageID < std::numeric_limits<unsigned int>::max() && imageSize[0] > 0) { if (mImageID < std::numeric_limits<unsigned int>::max() && imageSize[0] > 0) {
auto mScale = (screenSize.cwiseQuotient(imageSize).minCoeff()) * zoom_; auto mScale = (screenSize.cwiseQuotient(imageSize).minCoeff()) * zoom_;
Vector2f scaleFactor = mScale * imageSize.cwiseQuotient(screenSize); Vector2f scaleFactor = mScale * imageSize.cwiseQuotient(screenSize);
...@@ -577,3 +560,24 @@ void ftl::gui::Screen::draw(NVGcontext *ctx) { ...@@ -577,3 +560,24 @@ void ftl::gui::Screen::draw(NVGcontext *ctx) {
screen()->performLayout(ctx); screen()->performLayout(ctx);
nanogui::Screen::draw(ctx); nanogui::Screen::draw(ctx);
} }
void ftl::gui::Screen::drawFast() {
if (camera_) {
camera_->captureFrame();
#ifdef HAVE_OPENVR
if (isVR() && camera_->width() > 0 && camera_->getLeft().isValid() && camera_->getRight().isValid()) {
//glBindTexture(GL_TEXTURE_2D, leftEye_);
vr::Texture_t leftEyeTexture = {(void*)(uintptr_t)leftEye_, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
vr::VRCompositor()->Submit(vr::Eye_Left, &leftEyeTexture );
//glBindTexture(GL_TEXTURE_2D, rightEye_);
vr::Texture_t rightEyeTexture = {(void*)(uintptr_t)rightEye_, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
vr::VRCompositor()->Submit(vr::Eye_Right, &rightEyeTexture );
glFlush();
}
#endif
}
}
...@@ -37,6 +37,8 @@ class Screen : public nanogui::Screen { ...@@ -37,6 +37,8 @@ class Screen : public nanogui::Screen {
virtual void draw(NVGcontext *ctx); virtual void draw(NVGcontext *ctx);
void drawFast();
ftl::Configurable *root() { return root_; } ftl::Configurable *root() { return root_; }
ftl::net::Universe *net() { return net_; } ftl::net::Universe *net() { return net_; }
ftl::ctrl::Master *control() { return ctrl_; } ftl::ctrl::Master *control() { return ctrl_; }
......
...@@ -48,6 +48,8 @@ class SourceWindow : public nanogui::Window { ...@@ -48,6 +48,8 @@ class SourceWindow : public nanogui::Window {
void recordVideo(const std::string &filename); void recordVideo(const std::string &filename);
void stopRecordingVideo(); void stopRecordingVideo();
inline std::vector<ftl::rgbd::FrameSet*> &getFramesets() { return framesets_; }
inline void paused(bool p) { paused_ = p; } inline void paused(bool p) { paused_ = p; }
private: private:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment