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

64 lines
1.4 KiB
C++

// SPDX-License-Identifier: LGPL-2.1-only
// Copyright (C) 2021 James Hogan <james@albanarts.com>
#ifndef OSGXR_FRAME_STORE
#define OSGXR_FRAME_STORE 1
#include "OpenXR/Session.h"
#include <osg/ref_ptr>
#include <OpenThreads/Mutex>
#include <vector>
namespace osg {
class FrameStamp;
}
namespace osgXR {
/**
* Manages concurrent frames.
* A FrameStore stores any concurrent OpenXR frames and allows them to be
* created and retrieved in a thread-safe way based on an osg::FrameStamp.
*/
class FrameStore
{
public:
typedef OpenXR::Session::Frame Frame;
typedef const osg::FrameStamp *Stamp;
FrameStore();
/// Get a frame by FrameStamp.
osg::ref_ptr<Frame> getFrame(Stamp stamp);
/// Get or wait for a frame by FrameStamp.
osg::ref_ptr<Frame> getFrame(Stamp stamp, OpenXR::Session *session);
/**
* End a frame by FrameStamp.
* @return true on success, false otherwise.
*/
bool endFrame(Stamp stamp);
protected:
// These return cache index or -1
int lookupFrame(Stamp stamp) const;
int blankFrame() const;
// 2 allows work to start on next frame before the prior one has ended
static constexpr unsigned int maxFrames = 2;
// Protected by _mutex
osg::ref_ptr<Frame> _store[maxFrames];
// For access to _store
OpenThreads::Mutex _mutex;
};
}
#endif