// SPDX-License-Identifier: LGPL-2.1-only // Copyright (C) 2021 James Hogan #include "FrameStore.h" #include #include using namespace osgXR; FrameStore::FrameStore() { } osg::ref_ptr FrameStore::getFrame(FrameStore::Stamp stamp) { OpenThreads::ScopedLock lock(_mutex); int index = lookupFrame(stamp); if (index < 0) return nullptr; return _store[index]; } osg::ref_ptr FrameStore::getFrame(FrameStore::Stamp stamp, OpenXR::Session *session) { OpenThreads::ScopedLock lock(_mutex); int index = lookupFrame(stamp); if (index < 0) { index = blankFrame(); // there surely shouldn't be more than 2 frames in parallel assert(index >= 0); if (index < 0) return nullptr; osg::ref_ptr frame = session->waitFrame(); if (frame.valid()) { frame->setOsgFrameNumber(stamp->getFrameNumber()); _store[index] = frame; } return frame; } return _store[index]; } bool FrameStore::endFrame(FrameStore::Stamp stamp) { OpenThreads::ScopedLock lock(_mutex); int index = lookupFrame(stamp); if (index < 0) return false; _store[index]->end(); _store[index] = nullptr; return true; } int FrameStore::lookupFrame(FrameStore::Stamp stamp) const { unsigned int frameNumber = stamp->getFrameNumber(); for (unsigned int i = 0; i < maxFrames; ++i) { if (_store[i].valid() && _store[i]->getOsgFrameNumber() == frameNumber) { return i; } } return -1; } int FrameStore::blankFrame() const { for (unsigned int i = 0; i < maxFrames; ++i) if (!_store[i].valid()) return i; return -1; }