first commit
This commit is contained in:
87
3rdparty/osgXR/src/FrameStore.cpp
vendored
Normal file
87
3rdparty/osgXR/src/FrameStore.cpp
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user