1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
#ifndef _REF_COUNTED_GL_SYNC_H
#define _REF_COUNTED_GL_SYNC_H 1
// A wrapper around GLsync (OpenGL fences) that is automatically refcounted.
// Useful since we sometimes want to use the same fence two entirely different
// places. (We could set two fences at the same time, but they are not an
// unlimited hardware resource, so it would be a bit wasteful.)
#include <epoxy/gl.h>
#include <memory>
#include <mutex>
typedef std::shared_ptr<__GLsync> RefCountedGLsyncBase;
class RefCountedGLsync : public RefCountedGLsyncBase {
public:
RefCountedGLsync() {}
RefCountedGLsync(GLenum condition, GLbitfield flags)
: RefCountedGLsyncBase(locked_glFenceSync(condition, flags), glDeleteSync) {}
private:
// These are to work around apitrace bug #446.
static GLsync locked_glFenceSync(GLenum condition, GLbitfield flags)
{
std::lock_guard<std::mutex> lock(fence_lock);
return glFenceSync(condition, flags);
}
static std::mutex fence_lock;
};
#endif // !defined(_REF_COUNTED_GL_SYNC_H)
|