Files
flightgear/3rdparty/osgXR/src/FrameStore.cpp
2022-10-20 20:29:11 +08:00

88 lines
1.9 KiB
C++

// SPDX-License-Identifier: LGPL-2.1-only
// Copyright (C) 2021 James Hogan <james@albanarts.com>
#include "FrameStore.h"
#include <osg/FrameStamp>
#include <cassert>
using namespace osgXR;
FrameStore::FrameStore()
{
}
osg::ref_ptr<FrameStore::Frame> FrameStore::getFrame(FrameStore::Stamp stamp)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
int index = lookupFrame(stamp);
if (index < 0)
return nullptr;
return _store[index];
}
osg::ref_ptr<FrameStore::Frame> FrameStore::getFrame(FrameStore::Stamp stamp,
OpenXR::Session *session)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> 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<OpenXR::Session::Frame> 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<OpenThreads::Mutex> 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;
}