Hash :
f0d10f89
Author :
Date :
2015-03-31T12:56:52
Replace non-copyable macro with a helper class. This class provides a simpler scheme for blocking default copy and assignment operators. It also reduces the amount of code needed since it's inherited to child classes. This also fixes the conflict between our macro and the same-named macro in Chromium code. BUG=angleproject:956 Change-Id: If0dc72aa3f63fbc7b8fa34907418821c64c39e2f Reviewed-on: https://chromium-review.googlesource.com/263257 Tested-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Brandon Jones <bajones@chromium.org>
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
//
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// RefCountObject.h: Defines the gl::RefCountObject base class that provides
// lifecycle support for GL objects using the traditional BindObject scheme, but
// that need to be reference counted for correct cross-context deletion.
// (Concretely, textures, buffers and renderbuffers.)
#ifndef LIBANGLE_REFCOUNTOBJECT_H_
#define LIBANGLE_REFCOUNTOBJECT_H_
#include "common/debug.h"
#include "angle_gl.h"
#include <cstddef>
class RefCountObject : angle::NonCopyable
{
public:
explicit RefCountObject(GLuint id);
virtual ~RefCountObject();
virtual void addRef() const;
virtual void release() const;
GLuint id() const { return mId; }
private:
GLuint mId;
mutable std::size_t mRefCount;
};
template <class ObjectType>
class BindingPointer
{
public:
BindingPointer()
: mObject(nullptr)
{
}
BindingPointer(const BindingPointer<ObjectType> &other)
: mObject(nullptr)
{
set(other.mObject);
}
void operator=(const BindingPointer<ObjectType> &other)
{
set(other.mObject);
}
virtual ~BindingPointer()
{
// Objects have to be released before the resource manager is destroyed, so they must be explicitly cleaned up.
ASSERT(mObject == nullptr);
}
virtual void set(ObjectType *newObject)
{
// addRef first in case newObject == mObject and this is the last reference to it.
if (newObject != nullptr) reinterpret_cast<const RefCountObject*>(newObject)->addRef();
if (mObject != nullptr) reinterpret_cast<const RefCountObject*>(mObject)->release();
mObject = newObject;
}
ObjectType *get() const { return mObject; }
ObjectType *operator->() const { return mObject; }
GLuint id() const { return (mObject != nullptr) ? mObject->id() : 0; }
bool operator!() const { return (mObject == nullptr); }
private:
ObjectType *mObject;
};
template <class ObjectType>
class OffsetBindingPointer : public BindingPointer<ObjectType>
{
public:
OffsetBindingPointer() : mOffset(0), mSize(0) { }
void set(ObjectType *newObject) override
{
BindingPointer<ObjectType>::set(newObject);
mOffset = 0;
mSize = 0;
}
void set(ObjectType *newObject, GLintptr offset, GLsizeiptr size)
{
BindingPointer<ObjectType>::set(newObject);
mOffset = offset;
mSize = size;
}
GLintptr getOffset() const { return mOffset; }
GLsizeiptr getSize() const { return mSize; }
private:
GLintptr mOffset;
GLsizeiptr mSize;
};
#endif // LIBANGLE_REFCOUNTOBJECT_H_