main internal changes to glw and some public interface changes that affect naming. CHANGES ARE NOT BACKWARD COMPATIBLE.

This commit is contained in:
Marco Di Benedetto 2012-05-07 13:18:05 +00:00
parent cb3fc0dbe2
commit d8897e798e
17 changed files with 2930 additions and 1215 deletions

View File

@ -6,29 +6,85 @@
namespace glw namespace glw
{ {
class Context;
namespace detail namespace detail
{ {
template <typename TObject> struct NoBase { };
class SharedObjectBase template <typename T> struct DefaultDeleter { void operator () (T * t) { delete t; } };
{
friend class Context;
template <typename T> struct BaseOf { typedef NoBase Type; };
template <typename T, typename B> struct RootOfType { typedef typename RootOfType<B, typename BaseOf<B>::Type>::Type Type; };
template <typename T> struct RootOfType<T, NoBase> { typedef T Type; };
template <typename T> struct RootOf { typedef typename RootOfType<T, typename BaseOf<T>::Type>::Type Type; };
template <typename T, typename B> struct DeleterOfType { typedef typename DeleterOfType<B, typename BaseOf<B>::Type>::Type Type; };
template <typename T> struct DeleterOfType<T, NoBase> { typedef DefaultDeleter<T> Type; };
template <typename T> struct DeleterOf { typedef typename DeleterOfType<T, typename BaseOf<T>::Type>::Type Type; };
template <typename TObject, typename TDeleter, typename TBaseObject>
class RefCountedObject : public RefCountedObject<TBaseObject, TDeleter, typename BaseOf<TBaseObject>::Type>
{
public: public:
typedef void BaseType; typedef RefCountedObject<TBaseObject, TDeleter, typename BaseOf<TBaseObject>::Type> BaseType;
typedef SharedObjectBase<TObject> ThisType; typedef RefCountedObject<TObject, TDeleter, TBaseObject> ThisType;
typedef TObject ObjectType; typedef TObject ObjectType;
typedef TDeleter DeleterType;
typedef TBaseObject BaseObjectType;
RefCountedObject(ObjectType * object, const DeleterType & deleter)
: BaseType(object, deleter)
{
;
}
const ObjectType * object(void) const
{
return static_cast<const ObjectType *>(BaseType::object());
}
ObjectType * object(void)
{
return static_cast<ObjectType *>(BaseType::object());
}
};
template <typename TObject, typename TDeleter>
class RefCountedObject<TObject, TDeleter, NoBase>
{
public:
typedef void BaseType;
typedef RefCountedObject<TObject, TDeleter, NoBase> ThisType;
typedef TObject ObjectType;
typedef TDeleter DeleterType;
typedef NoBase BaseObjectType;
RefCountedObject(ObjectType * object, const DeleterType & deleter)
: m_object (object)
, m_refCount (0)
, m_deleter (deleter)
{
GLW_ASSERT(this->m_object != 0);
}
~RefCountedObject(void)
{
this->destroyObject();
}
bool isNull(void) const bool isNull(void) const
{ {
return (this->m_object == 0); return (this->m_object == 0);
} }
void setNull(void) void setNull(bool deleteObject)
{ {
if (deleteObject)
{
this->destroyObject();
}
this->m_object = 0; this->m_object = 0;
} }
@ -42,6 +98,16 @@ class SharedObjectBase
return this->m_object; return this->m_object;
} }
const DeleterType & deleter(void) const
{
return this->m_deleter;
}
DeleterType & deleter(void)
{
return this->m_deleter;
}
void ref(void) void ref(void)
{ {
this->m_refCount++; this->m_refCount++;
@ -53,400 +119,86 @@ class SharedObjectBase
this->m_refCount--; this->m_refCount--;
if (this->m_refCount == 0) if (this->m_refCount == 0)
{ {
if (this->m_object != 0)
{
this->signalDestruction();
}
delete this; delete this;
} }
} }
protected: int refCount(void) const
{
return this->m_refCount;
}
private:
Context * m_context;
ObjectType * m_object; ObjectType * m_object;
int m_refCount; int m_refCount;
DeleterType m_deleter;
SharedObjectBase(Context * Context, ObjectType * Object) RefCountedObject(const ThisType & other);
: m_context (Context)
, m_object (Object)
, m_refCount (0)
{
GLW_ASSERT(this->m_context != 0);
GLW_ASSERT(this->m_object != 0);
}
private:
SharedObjectBase(const ThisType & other);
ThisType & operator = (const ThisType & other); ThisType & operator = (const ThisType & other);
inline void signalDestruction(void); void destroyObject(void)
};
template <typename TObject>
class SharedObject;
template <typename TObject, typename TObjectBase>
class SharedObjectTraits
{
public:
typedef void BaseType;
typedef SharedObjectTraits<TObject, TObjectBase> ThisType;
typedef TObject ObjectType;
typedef TObjectBase ObjectBaseType;
typedef SharedObject<ObjectBaseType> SharedObjectBaseType;
};
template <typename TObject>
class SharedObjectTraits<TObject, void>
{
public:
typedef void BaseType;
typedef SharedObjectTraits<TObject, void> ThisType;
typedef TObject ObjectType;
typedef void ObjectBaseType;
typedef SharedObjectBase<ObjectType> SharedObjectBaseType;
};
template <typename TObject>
class SharedObject : public SharedObjectTraits<TObject, typename TObject::BaseType>::SharedObjectBaseType
{
friend class Context;
public:
typedef typename SharedObjectTraits<TObject, typename TObject::BaseType>::SharedObjectBaseType BaseType;
typedef SharedObject<TObject> ThisType;
typedef TObject ObjectType;
const ObjectType * object(void) const
{ {
return static_cast<const ObjectType *>(BaseType::object()); if (this->m_object == 0) return;
} this->m_deleter(this->m_object);
this->m_object = 0;
ObjectType * object(void)
{
return static_cast<ObjectType *>(BaseType::object());
}
protected:
SharedObject(Context * Context, ObjectType * Object)
: BaseType(Context, Object)
{
;
}
private:
SharedObject(const ThisType & other);
ThisType & operator = (const ThisType & other);
};
template <typename TObject>
class SharedObjectBinding
{
friend class Context;
public:
typedef void BaseType;
typedef SharedObjectBinding<TObject> ThisType;
typedef TObject ObjectType;
typedef ObjectType UnsafeType;
~SharedObjectBinding(void)
{
this->detach();
}
bool isNull(void) const
{
if (this->m_shared == 0) return true;
return this->m_shared->isNull();
}
void setNull(void)
{
this->m_shared = 0;
}
const ObjectType * object(void) const
{
GLW_ASSERT(!this->isNull());
const ObjectType * obj = this->m_shared->object();
obj->setBinding(this->m_target, this->m_unit);
return obj;
}
ObjectType * object(void)
{
GLW_ASSERT(!this->isNull());
ObjectType * obj = this->m_shared->object();
obj->setBinding(this->m_target, this->m_unit);
return obj;
}
GLenum target(void) const
{
return this->m_target;
}
GLint unit(void) const
{
return this->m_unit;
}
void ref(void)
{
this->m_refCount++;
}
void unref(void)
{
GLW_ASSERT(this->m_refCount > 0);
this->m_refCount--;
if (this->m_refCount == 0)
{
delete this;
}
}
protected:
typedef SharedObject<ObjectType> SharedObjectType;
SharedObjectBinding(SharedObjectType * shared, GLenum target, GLint unit)
: m_shared (0)
, m_refCount (0)
, m_target (target)
, m_unit (unit)
{
this->attach(shared);
}
private:
SharedObjectType * m_shared;
int m_refCount;
GLenum m_target;
GLint m_unit;
SharedObjectBinding(const ThisType & other);
ThisType & operator = (const ThisType & other);
void attach(SharedObjectType * shared)
{
this->detach();
this->m_shared = shared;
if (this->m_shared != 0)
{
this->m_shared->ref();
}
}
void detach(void)
{
if (this->m_shared == 0) return;
this->m_shared->unref();
this->m_shared = 0;
} }
}; };
template <typename TObject> template <typename T> struct RefCountedObjectTraits { typedef RefCountedObject<T, typename DeleterOf<T>::Type, typename BaseOf<T>::Type> Type; };
class SafeHandleBase
{
friend class Context;
public: template <typename TObject, typename TDeleter, typename TBaseObject>
class ObjectSharedPointer : public ObjectSharedPointer<TBaseObject, TDeleter, typename BaseOf<TBaseObject>::Type>
typedef void BaseType;
typedef SafeHandleBase<TObject> ThisType;
typedef TObject ObjectType;
typedef typename ObjectType::SafeType SafeType;
SafeHandleBase(void)
: m_shared(0)
{
;
}
SafeHandleBase(const ThisType & other)
: m_shared(0)
{
this->attach(other.shared());
}
~SafeHandleBase(void)
{
this->detach();
}
bool isNull(void) const
{
if (this->m_shared == 0) return true;
return this->m_shared->isNull();
}
void setNull(void)
{
this->detach();
}
const SafeType * operator -> (void) const
{
GLW_ASSERT(!this->isNull());
return this->m_shared->object();
}
SafeType * operator -> (void)
{
GLW_ASSERT(!this->isNull());
return this->m_shared->object();
}
ThisType & operator = (const ThisType & other)
{
this->attach(other.shared());
return (*this);
}
protected:
typedef SharedObject<ObjectType> SharedObjectType;
SafeHandleBase(SharedObjectType * shared)
: m_shared(0)
{
this->attach(shared);
}
const ObjectType * object(void) const
{
if (this->m_shared == 0) return 0;
return this->m_shared->object();
}
ObjectType * object(void)
{
if (this->m_shared == 0) return 0;
return this->m_shared->object();
}
SharedObjectType * shared(void) const
{
return this->m_shared;
}
private:
SharedObjectType * m_shared;
void attach(SharedObjectType * shared)
{
this->detach();
this->m_shared = shared;
if (this->m_shared != 0)
{
this->m_shared->ref();
}
}
void detach(void)
{
if (this->m_shared == 0) return;
this->m_shared->unref();
this->m_shared = 0;
}
};
template <typename TObject>
class SafeHandle;
template <typename TObject, typename TObjectBase>
class SafeHandleTraits
{ {
public: public:
typedef void BaseType; typedef ObjectSharedPointer<TBaseObject, TDeleter, typename BaseOf<TBaseObject>::Type> BaseType;
typedef SafeHandleTraits<TObject, TObjectBase> ThisType; typedef ObjectSharedPointer<TObject, TDeleter, TBaseObject> ThisType;
typedef TObject ObjectType; typedef TObject ObjectType;
typedef TObjectBase ObjectBaseType; typedef TDeleter DeleterType;
typedef SafeHandle<ObjectBaseType> SafeHandleBaseType; typedef TBaseObject BaseObjectType;
}; typedef RefCountedObject<ObjectType, DeleterType, BaseObjectType> RefCountedObjectType;
template <typename TObject> ObjectSharedPointer(void)
class SafeHandleTraits<TObject, void>
{
public:
typedef void BaseType;
typedef SafeHandleTraits<TObject, void> ThisType;
typedef TObject ObjectType;
typedef void ObjectBaseType;
typedef SafeHandleBase<ObjectType> SafeHandleBaseType;
};
template <typename TObject>
class SafeHandle : public SafeHandleTraits<TObject, typename TObject::BaseType>::SafeHandleBaseType
{
friend class Context;
public:
typedef typename SafeHandleTraits<TObject, typename TObject::BaseType>::SafeHandleBaseType BaseType;
typedef SafeHandle<TObject> ThisType;
typedef TObject ObjectType;
typedef typename ObjectType::SafeType SafeType;
SafeHandle(void)
: BaseType() : BaseType()
{ {
; ;
} }
SafeHandle(const ThisType & other) ObjectSharedPointer(const ThisType & other)
: BaseType(other) : BaseType(other)
{ {
; ;
} }
const SafeType * operator -> (void) const ObjectSharedPointer(RefCountedObjectType * refObject)
{ : BaseType(refObject)
return dynamic_cast<const SafeType *>(BaseType:: operator ->());
}
SafeType * operator -> (void)
{
return dynamic_cast<SafeType *>(BaseType:: operator ->());
}
/*
ThisType & operator = (const ThisType & other)
{
this->attach(other.shared());
return (*this);
}
*/
operator bool (void) const
{
return !this->isNull();
}
protected:
typedef SharedObject<ObjectType> SharedObjectType;
SafeHandle(SharedObjectType * shared)
: BaseType(shared)
{ {
; ;
} }
const ObjectType & operator * (void) const
{
return (*(this->object()));
}
ObjectType & operator * (void)
{
return (*(this->object()));
}
const ObjectType * operator -> (void) const
{
return this->object();
}
ObjectType * operator -> (void)
{
return this->object();
}
protected:
const ObjectType * object(void) const const ObjectType * object(void) const
{ {
return static_cast<const ObjectType *>(BaseType::object()); return static_cast<const ObjectType *>(BaseType::object());
@ -457,45 +209,51 @@ class SafeHandle : public SafeHandleTraits<TObject, typename TObject::BaseType>:
return static_cast<ObjectType *>(BaseType::object()); return static_cast<ObjectType *>(BaseType::object());
} }
SharedObjectType * shared(void) const RefCountedObjectType * refObject(void) const
{ {
return static_cast<SharedObjectType *>(BaseType::shared()); return static_cast<RefCountedObjectType *>(BaseType::refObject());
} }
}; };
template <typename TObject> template <typename TObject, typename TDeleter>
class UnsafeHandle class ObjectSharedPointer<TObject, TDeleter, NoBase>
{ {
friend class Context;
public: public:
typedef void BaseType; typedef void BaseType;
typedef UnsafeHandle<TObject> ThisType; typedef ObjectSharedPointer<TObject, TDeleter, NoBase> ThisType;
typedef TObject ObjectType; typedef TObject ObjectType;
typedef ObjectType UnsafeType; typedef TDeleter DeleterType;
typedef NoBase BaseObjectType;
typedef RefCountedObject<ObjectType, DeleterType, NoBase> RefCountedObjectType;
UnsafeHandle(void) ObjectSharedPointer(void)
: m_shared(0) : m_refObject(0)
{ {
; ;
} }
UnsafeHandle(const ThisType & other) ObjectSharedPointer(const ThisType & other)
: m_shared(0) : m_refObject(0)
{ {
this->attach(other.shared()); this->attach(other.refObject());
} }
~UnsafeHandle(void) ObjectSharedPointer(RefCountedObjectType * refObject)
: m_refObject(0)
{
this->attach(refObject);
}
~ObjectSharedPointer(void)
{ {
this->detach(); this->detach();
} }
bool isNull(void) const bool isNull(void) const
{ {
if (this->m_shared == 0) return true; if (this->m_refObject == 0) return true;
return this->m_shared->isNull(); return this->m_refObject->isNull();
} }
void setNull(void) void setNull(void)
@ -503,78 +261,80 @@ class UnsafeHandle
this->detach(); this->detach();
} }
const UnsafeType * operator -> (void) const const ObjectType & operator * (void) const
{ {
GLW_ASSERT(!this->isNull()); return (*(this->object()));
return this->m_shared->object();
} }
UnsafeType * operator -> (void) ObjectType & operator * (void)
{ {
GLW_ASSERT(!this->isNull()); return (*(this->object()));
return this->m_shared->object();
} }
ThisType & operator = (const ThisType & other) const ObjectType * operator -> (void) const
{ {
this->attach(other.shared()); return this->object();
return (*this); }
ObjectType * operator -> (void)
{
return this->object();
} }
operator bool (void) const operator bool (void) const
{ {
return !this->isNull(); return (!this->isNull());
}
ThisType & operator = (const ThisType & other)
{
this->attach(other.refObject());
return (*this);
} }
protected: protected:
typedef SharedObjectBinding<ObjectType> SharedObjectBindingType; const ObjectType * object(void) const
UnsafeHandle(SharedObjectBindingType * shared)
: m_shared(0)
{ {
this->attach(shared); GLW_ASSERT(!this->isNull());
return this->m_refObject->object();
} }
const ObjectType * Object(void) const ObjectType * object(void)
{ {
if (this->m_shared == 0) return true; GLW_ASSERT(!this->isNull());
return this->m_shared->object(); return this->m_refObject->object();
} }
ObjectType * Object(void) RefCountedObjectType * refObject(void) const
{ {
if (this->m_shared == 0) return true; return this->m_refObject;
return this->m_shared->object();
} }
private: private:
SharedObjectBindingType * m_shared; RefCountedObjectType * m_refObject;
void attach(SharedObjectBindingType * shared) void attach(RefCountedObjectType * reObject)
{ {
this->detach(); this->detach();
this->m_shared = shared; this->m_refObject = reObject;
if (this->m_shared != 0) if (this->m_refObject != 0)
{ {
this->m_shared->ref(); this->m_refObject->ref();
} }
} }
void detach(void) void detach(void)
{ {
if (this->m_shared == 0) return; if (this->m_refObject == 0) return;
this->m_shared->unref(); this->m_refObject->unref();
this->m_shared = 0; this->m_refObject = 0;
}
SharedObjectBindingType * shared(void) const
{
return this->m_shared;
} }
}; };
template <typename T> struct ObjectSharedPointerTraits { typedef ObjectSharedPointer<T, typename DeleterOf<typename RootOf<T>::Type>::Type, typename BaseOf<T>::Type> Type; };
}; };
}; };

View File

@ -18,27 +18,52 @@ class BufferArguments : public ObjectArguments
const void * data; const void * data;
BufferArguments(void) BufferArguments(void)
: BaseType ()
, size (0)
, usage (GL_STATIC_DRAW)
, data (0)
{ {
this->clear(); this->clear();
} }
BufferArguments(GLsizeiptr aSize, GLenum aUsage = GL_STATIC_DRAW, const void * aData = 0)
: BaseType ()
, size (aSize)
, usage (aUsage)
, data (aData)
{
;
}
void clear(void) void clear(void)
{ {
BaseType::clear(); BaseType::clear();
this->size = 0; this->size = 0;
this->usage = GL_NONE; this->usage = GL_STATIC_DRAW;
this->data = 0; this->data = 0;
} }
}; };
class SafeBuffer : public virtual SafeObject class Buffer : public Object
{ {
friend class Context;
public: public:
typedef SafeObject BaseType; typedef Object BaseType;
typedef SafeBuffer ThisType; typedef Buffer ThisType;
GLsizei size(void) const virtual ~Buffer(void)
{
this->destroy();
}
virtual Type type(void) const
{
return BufferType;
}
GLsizeiptr size(void) const
{ {
return this->m_size; return this->m_size;
} }
@ -48,163 +73,631 @@ class SafeBuffer : public virtual SafeObject
return this->m_usage; return this->m_usage;
} }
protected: void setData(GLenum target, GLint unit, const GLsizeiptr size, GLenum usage, const GLvoid * data)
GLsizeiptr m_size;
GLenum m_usage;
SafeBuffer(Context * ctx)
: BaseType (ctx)
, m_size (0)
, m_usage (GL_NONE)
{
;
}
};
class Buffer : public Object, public SafeBuffer
{
friend class Context;
friend class detail::SharedObjectBinding<Buffer>;
public:
typedef Object BaseType;
typedef SafeBuffer SafeType;
typedef Buffer ThisType;
virtual Type type(void) const
{
return BufferType;
}
void setData(const GLsizeiptr size, GLenum usage, const void * data)
{ {
(void)unit;
GLW_ASSERT(this->isValid()); GLW_ASSERT(this->isValid());
glBufferData(this->m_target, size, data, usage); glBufferData(target, size, data, usage);
this->m_size = size; this->m_size = size;
this->m_usage = usage; this->m_usage = usage;
} }
void setSubData(GLintptr offset, GLsizeiptr size, const void * data) void setSubData(GLenum target, GLint unit, GLintptr offset, GLsizeiptr size, const GLvoid * data)
{ {
(void)unit;
GLW_ASSERT(this->isValid()); GLW_ASSERT(this->isValid());
glBufferSubData(this->m_target, offset, size, data); glBufferSubData(target, offset, size, data);
} }
void getSubData(GLintptr offset, GLsizeiptr size, void * data) void getSubData(GLenum target, GLint unit, GLintptr offset, GLsizeiptr size, GLvoid * data)
{ {
(void)unit;
GLW_ASSERT(this->isValid()); GLW_ASSERT(this->isValid());
glGetBufferSubData(this->m_target, offset, size, data); glGetBufferSubData(target, offset, size, data);
} }
void * map(GLenum access) void * map(GLenum target, GLint unit, GLenum access)
{ {
(void)unit;
GLW_ASSERT(this->isValid()); GLW_ASSERT(this->isValid());
GLW_ASSERT(!this->isMapped()); GLW_ASSERT(!this->isMapped(target, unit));
void * ptr = glMapBuffer(this->m_target, access); void * ptr = glMapBuffer(target, access);
if (ptr == 0) return 0; if (ptr == 0) return 0;
this->m_mapAccess = access; this->m_mapAccess = access;
this->m_mapPtr = ptr; this->m_mapPointer = ptr;
return ptr; return ptr;
} }
void unmap(void) void unmap(GLenum target, GLint unit)
{ {
(void)unit;
GLW_ASSERT(this->isValid()); GLW_ASSERT(this->isValid());
GLW_ASSERT(this->isMapped()); GLW_ASSERT(this->isMapped(target, unit));
glUnmapBuffer(this->m_target); glUnmapBuffer(target);
this->m_mapAccess = GL_NONE; this->m_mapAccess = GL_NONE;
this->m_mapPtr = 0; this->m_mapPointer = 0;
} }
GLenum mapAccess(void) const GLenum mapAccess(GLenum target, GLint unit) const
{ {
(void)target;
(void)unit;
return this->m_mapAccess; return this->m_mapAccess;
} }
bool isMapped(void) const bool isMapped(GLenum target, GLint unit) const
{ {
(void)target;
(void)unit;
return (this->m_mapAccess != GL_NONE); return (this->m_mapAccess != GL_NONE);
} }
void * mapPointer(void) const void * mapPointer(GLenum target, GLint unit) const
{ {
return this->m_mapPtr; (void)target;
(void)unit;
return this->m_mapPointer;
} }
void vertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * offset) void vertexAttribPointer(GLenum target, GLint unit, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * offset)
{ {
(void)target;
(void)unit;
GLW_ASSERT(this->isValid()); GLW_ASSERT(this->isValid());
GLW_ASSERT(this->m_target == GL_ARRAY_BUFFER);
glVertexAttribPointer(index, size, type, normalized, stride, offset); glVertexAttribPointer(index, size, type, normalized, stride, offset);
} }
void drawElements(GLenum target, GLint unit, GLenum mode, GLsizei count, GLenum type, const GLvoid * indices)
{
(void)target;
(void)unit;
GLW_ASSERT(this->isValid());
glDrawElements(mode, count, type, indices);
}
protected: protected:
GLsizeiptr m_size;
GLenum m_usage;
GLenum m_mapAccess;
void * m_mapPointer;
Buffer(Context * ctx) Buffer(Context * ctx)
: SafeObject (ctx) : BaseType (ctx)
, BaseType (ctx) , m_size (0)
, SafeType (ctx) , m_usage (GL_NONE)
, m_mapAccess (GL_NONE) , m_mapAccess (GL_NONE)
, m_mapPtr (0) , m_mapPointer (0)
{ {
; ;
} }
virtual ~Buffer(void)
{
this->destroy();
}
bool create(const BufferArguments & args) bool create(const BufferArguments & args)
{ {
this->destroy(); this->destroy();
GLint boundName = 0; GLint boundName = 0;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &boundName); glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &boundName);
glGenBuffers(1, &(this->m_name)); glGenBuffers(1, &(this->m_name));
this->setBinding(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, this->m_name);
this->bind(); glBufferData(GL_ARRAY_BUFFER, args.size, args.data, args.usage);
this->setData(args.size, args.usage, args.data);
glBindBuffer(GL_ARRAY_BUFFER, boundName); glBindBuffer(GL_ARRAY_BUFFER, boundName);
this->m_size = args.size;
this->m_usage = args.usage;
return true; return true;
} }
virtual void doDestroy(Context * ctx, GLuint name) virtual void doDestroy(void)
{ {
(void)ctx; glDeleteBuffers(1, &(this->m_name));
if (name == 0) return; this->m_size = 0;
if (this->isMapped()) this->unmap(); this->m_usage = GL_NONE;
this->m_size = 0; this->m_mapAccess = GL_NONE;
this->m_usage = GL_NONE; this->m_mapPointer = 0;
this->m_mapAccess = GL_NONE;
this->m_mapPtr = 0;
glDeleteBuffers(1, &name);
} }
virtual void doBind(void) virtual bool doIsValid(void) const
{ {
glBindBuffer(this->m_target, this->m_name); return (this->m_size > 0);
}
};
namespace detail { template <> struct BaseOf <Buffer> { typedef Object Type; }; };
typedef detail::ObjectSharedPointerTraits <Buffer> ::Type BufferPtr;
class SafeBuffer : public SafeObject
{
friend class Context;
friend class BoundBuffer;
public:
typedef SafeObject BaseType;
typedef SafeBuffer ThisType;
SafeBuffer(void)
: BaseType()
{
;
} }
virtual void doUnbind(void) GLsizeiptr size(void) const
{
return this->object()->size();
}
GLenum usage(void) const
{
return this->object()->usage();
}
protected:
SafeBuffer(const BufferPtr & buffer)
: BaseType(buffer)
{
;
}
const BufferPtr & object(void) const
{
return static_cast<const BufferPtr &>(BaseType::object());
}
BufferPtr & object(void)
{
return static_cast<BufferPtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeBuffer> { typedef SafeObject Type; }; };
namespace detail { template <> struct ObjectBase <SafeBuffer> { typedef Buffer Type; }; };
namespace detail { template <> struct ObjectSafe <Buffer > { typedef SafeBuffer Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeBuffer> ::Type BufferHandle;
class BufferBindingParams : public ObjectBindingParams
{
public:
typedef ObjectBindingParams BaseType;
typedef BufferBindingParams ThisType;
BufferBindingParams(void)
: BaseType()
{
;
}
BufferBindingParams(GLenum aTarget, GLenum aUnit)
: BaseType(aTarget, aUnit)
{
;
}
};
class BoundBuffer : public BoundObject
{
friend class Context;
public:
typedef BoundObject BaseType;
typedef BoundBuffer ThisType;
BoundBuffer(void)
: BaseType()
{
;
}
const BufferHandle & handle(void) const
{
return static_cast<const BufferHandle &>(BaseType::handle());
}
BufferHandle & handle(void)
{
return static_cast<BufferHandle &>(BaseType::handle());
}
void setData(const GLsizeiptr size, GLenum usage, const GLvoid * data)
{
this->object()->setData(this->m_target, this->m_unit, size, usage, data);
}
void setSubData(GLintptr offset, GLsizeiptr size, const GLvoid * data)
{
this->object()->setSubData(this->m_target, this->m_unit, offset, size, data);
}
void getSubData(GLintptr offset, GLsizeiptr size, GLvoid * data)
{
this->object()->getSubData(this->m_target, this->m_unit, offset, size, data);
}
void * map(GLenum access)
{
return this->object()->map(this->m_target, this->m_unit, access);
}
void unmap(void)
{
this->object()->unmap(this->m_target, this->m_unit);
}
GLenum mapAccess(void) const
{
return this->object()->mapAccess(this->m_target, this->m_unit);
}
bool isMapped(void) const
{
return this->object()->isMapped(this->m_target, this->m_unit);
}
void * mapPointer(void) const
{
return this->object()->mapPointer(this->m_target, this->m_unit);
}
protected:
BoundBuffer(const BufferHandle & handle, const BufferBindingParams & params)
: BaseType(handle, params)
{
;
}
const BufferPtr & object(void) const
{
return this->handle()->object();
}
BufferPtr & object(void)
{
return this->handle()->object();
}
virtual void bind(void)
{
glBindBuffer(this->m_target, this->object()->name());
}
virtual void unbind(void)
{ {
glBindBuffer(this->m_target, 0); glBindBuffer(this->m_target, 0);
} }
};
namespace detail { template <> struct ParamsOf <BoundBuffer> { typedef BufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundBuffer> { typedef BoundObject Type; }; };
namespace detail { template <> struct ObjectBase <BoundBuffer> { typedef Buffer Type; }; };
namespace detail { template <> struct ObjectBound <Buffer > { typedef BoundBuffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundBuffer> ::Type BoundBufferHandle;
class VertexBufferBindingParams : public BufferBindingParams
{
public:
typedef BufferBindingParams BaseType;
typedef VertexBufferBindingParams ThisType;
VertexBufferBindingParams(void)
: BaseType(GL_ARRAY_BUFFER, 0)
{
;
}
};
class BoundVertexBuffer : public BoundBuffer
{
friend class Context;
public:
typedef BoundBuffer BaseType;
typedef BoundVertexBuffer ThisType;
BoundVertexBuffer(void)
: BaseType()
{
;
}
void vertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * offset)
{
this->object()->vertexAttribPointer(this->m_target, this->m_unit, index, size, type, normalized, stride, offset);
}
protected:
BoundVertexBuffer(const BufferHandle & handle, const VertexBufferBindingParams & params)
: BaseType(handle, params)
{
;
}
};
namespace detail { template <> struct ParamsOf <BoundVertexBuffer> { typedef VertexBufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundVertexBuffer> { typedef BoundBuffer Type; }; };
namespace detail { template <> struct ObjectBase <BoundVertexBuffer> { typedef Buffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundVertexBuffer> ::Type BoundVertexBufferHandle;
class IndexBufferBindingParams : public BufferBindingParams
{
public:
typedef BufferBindingParams BaseType;
typedef IndexBufferBindingParams ThisType;
IndexBufferBindingParams(void)
: BaseType(GL_ELEMENT_ARRAY_BUFFER, 0)
{
;
}
};
class BoundIndexBuffer : public BoundBuffer
{
friend class Context;
public:
typedef BoundBuffer BaseType;
typedef BoundIndexBuffer ThisType;
BoundIndexBuffer(void)
: BaseType()
{
;
}
void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices)
{
this->object()->drawElements(this->m_target, this->m_unit, mode, count, type, indices);
}
protected:
BoundIndexBuffer(const BufferHandle & handle, const IndexBufferBindingParams & params)
: BaseType(handle, params)
{
;
}
};
namespace detail { template <> struct ParamsOf <BoundIndexBuffer> { typedef IndexBufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundIndexBuffer> { typedef BoundBuffer Type; }; };
namespace detail { template <> struct ObjectBase <BoundIndexBuffer> { typedef Buffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundIndexBuffer> ::Type BoundIndexBufferHandle;
class PixelPackBufferBindingParams : public BufferBindingParams
{
public:
typedef BufferBindingParams BaseType;
typedef PixelPackBufferBindingParams ThisType;
PixelPackBufferBindingParams(void)
: BaseType(GL_PIXEL_PACK_BUFFER, 0)
{
;
}
};
class BoundPixelPackBuffer : public BoundBuffer
{
friend class Context;
public:
typedef BoundBuffer BaseType;
typedef BoundPixelPackBuffer ThisType;
BoundPixelPackBuffer(void)
: BaseType()
{
;
}
protected:
BoundPixelPackBuffer(const BufferHandle & handle, const PixelPackBufferBindingParams & params)
: BaseType(handle, params)
{
;
}
};
namespace detail { template <> struct ParamsOf <BoundPixelPackBuffer> { typedef PixelPackBufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundPixelPackBuffer> { typedef BoundBuffer Type; }; };
namespace detail { template <> struct ObjectBase <BoundPixelPackBuffer> { typedef Buffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundPixelPackBuffer> ::Type BoundPixelPackBufferHandle;
class PixelUnpackBufferBindingParams : public BufferBindingParams
{
public:
typedef BufferBindingParams BaseType;
typedef PixelUnpackBufferBindingParams ThisType;
PixelUnpackBufferBindingParams(void)
: BaseType(GL_PIXEL_UNPACK_BUFFER, 0)
{
;
}
};
class BoundPixelUnpackBuffer : public BoundBuffer
{
friend class Context;
public:
typedef BoundBuffer BaseType;
typedef BoundPixelUnpackBuffer ThisType;
BoundPixelUnpackBuffer(void)
: BaseType()
{
;
}
protected:
BoundPixelUnpackBuffer(const BufferHandle & handle, const PixelUnpackBufferBindingParams & params)
: BaseType(handle, params)
{
;
}
};
namespace detail { template <> struct ParamsOf <BoundPixelUnpackBuffer> { typedef PixelUnpackBufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundPixelUnpackBuffer> { typedef BoundBuffer Type; }; };
namespace detail { template <> struct ObjectBase <BoundPixelUnpackBuffer> { typedef Buffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundPixelUnpackBuffer> ::Type BoundPixelUnpackBufferHandle;
class UniformBufferBindingParams : public BufferBindingParams
{
public:
typedef BufferBindingParams BaseType;
typedef UniformBufferBindingParams ThisType;
GLintptr offset;
GLsizeiptr size;
UniformBufferBindingParams(void)
: BaseType (GL_UNIFORM_BUFFER, 0)
, offset (0)
, size (0)
{
;
}
UniformBufferBindingParams(GLuint aIndex, GLintptr aOffset, GLsizeiptr aSize)
: BaseType (GL_UNIFORM_BUFFER, GLint(aIndex))
, offset (aOffset)
, size (aSize)
{
;
}
};
class BoundUniformBuffer : public BoundBuffer
{
friend class Context;
public:
typedef BoundBuffer BaseType;
typedef BoundUniformBuffer ThisType;
BoundUniformBuffer(void)
: BaseType()
{
;
}
protected:
BoundUniformBuffer(const BufferHandle & handle, const UniformBufferBindingParams & params)
: BaseType(handle, params)
{
;
}
virtual void bind(void)
{
glBindBufferRange(this->m_target, GLuint(this->m_unit), this->object()->name(), this->m_offset, this->m_size);
}
virtual void unbind(void)
{
glBindBufferRange(this->m_target, GLuint(this->m_unit), 0, 0, 0);
}
private: private:
GLenum m_mapAccess; GLintptr m_offset;
void * m_mapPtr; GLsizeiptr m_size;
}; };
typedef detail::SafeHandle <Buffer> BufferHandle; namespace detail { template <> struct ParamsOf <BoundUniformBuffer> { typedef UniformBufferBindingParams Type; }; };
typedef detail::UnsafeHandle <Buffer> BoundBuffer; namespace detail { template <> struct BaseOf <BoundUniformBuffer> { typedef BoundBuffer Type; }; };
namespace detail { template <> struct ObjectBase <BoundUniformBuffer> { typedef Buffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundUniformBuffer> ::Type BoundUniformBufferHandle;
} // end namespace glw class FeedbackBufferBindingParams : public BufferBindingParams
{
public:
typedef BufferBindingParams BaseType;
typedef FeedbackBufferBindingParams ThisType;
GLintptr offset;
GLsizeiptr size;
FeedbackBufferBindingParams(void)
: BaseType (GL_TRANSFORM_FEEDBACK_BUFFER, 0)
, offset (0)
, size (0)
{
;
}
FeedbackBufferBindingParams(GLuint aIndex, GLintptr aOffset, GLsizeiptr aSize)
: BaseType (GL_TRANSFORM_FEEDBACK_BUFFER, GLint(aIndex))
, offset (aOffset)
, size (aSize)
{
;
}
};
class BoundFeedbackBuffer : public BoundBuffer
{
friend class Context;
public:
typedef BoundBuffer BaseType;
typedef BoundFeedbackBuffer ThisType;
BoundFeedbackBuffer(void)
: BaseType()
{
;
}
protected:
BoundFeedbackBuffer(const BufferHandle & handle, const FeedbackBufferBindingParams & params)
: BaseType(handle, params)
{
;
}
virtual void bind(void)
{
glBindBufferRange(this->m_target, GLuint(this->m_unit), this->object()->name(), this->m_offset, this->m_size);
}
virtual void unbind(void)
{
glBindBufferRange(this->m_target, GLuint(this->m_unit), 0, 0, 0);
}
private:
GLintptr m_offset;
GLsizeiptr m_size;
};
namespace detail { template <> struct ParamsOf <BoundFeedbackBuffer> { typedef FeedbackBufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundFeedbackBuffer> { typedef BoundBuffer Type; }; };
namespace detail { template <> struct ObjectBase <BoundFeedbackBuffer> { typedef Buffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundFeedbackBuffer> ::Type BoundFeedbackBufferHandle;
};
#endif // GLW_BUFFER_H #endif // GLW_BUFFER_H

View File

@ -5,13 +5,13 @@
#include "./config.h" #include "./config.h"
#define GLW_DONT_CARE (0xFFFFFFFF) #define GLW_DONT_CARE (0xFFFFFFFF)
#define GLW_CARE_OF(X) ((X) != GLW_DONT_CARE) #define GLW_CARE_OF(X) ((X) != GLW_DONT_CARE)
#define GLW_CHECK_GL_ERROR GLW_ASSERT(glGetError() == GL_NO_ERROR) #define GLW_CHECK_GL_ERROR GLW_ASSERT(glGetError() == GL_NO_ERROR)
#define GLW_CHECK_GL_READ_FRAMEBUFFER_STATUS GLW_ASSERT(glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) #define GLW_CHECK_GL_READ_FRAMEBUFFER_STATUS GLW_ASSERT(glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
#define GLW_CHECK_GL_DRAW_FRAMEBUFFER_STATUS GLW_ASSERT(glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) #define GLW_CHECK_GL_DRAW_FRAMEBUFFER_STATUS GLW_ASSERT(glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
#define GLW_CHECK_GL_FRAMEBUFFER_STATUS GLW_ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) #define GLW_CHECK_GL_READ_DRAW_FRAMEBUFFER_STATUS GLW_ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
namespace glw namespace glw
{ {

View File

@ -2,12 +2,13 @@
#define GLW_CONTEXT_H #define GLW_CONTEXT_H
#include "./noncopyable.h" #include "./noncopyable.h"
#include "./objectdeleter.h"
#include "./buffer.h" #include "./buffer.h"
#include "./renderbuffer.h"
#include "./vertexshader.h" #include "./vertexshader.h"
#include "./geometryshader.h" #include "./geometryshader.h"
#include "./fragmentshader.h" #include "./fragmentshader.h"
#include "./program.h" #include "./program.h"
#include "./renderbuffer.h"
#include "./texture2d.h" #include "./texture2d.h"
#include "./framebuffer.h" #include "./framebuffer.h"
@ -20,7 +21,7 @@ namespace glw
class Context : public detail::NonCopyable class Context : public detail::NonCopyable
{ {
friend class detail::SharedObjectBase<Object>; friend class detail::ObjectDeleter;
public: public:
@ -52,7 +53,7 @@ class Context : public detail::NonCopyable
if (!this->isAcquired()) return; if (!this->isAcquired()) return;
this->m_acquired = false; this->m_acquired = false;
this->terminateTargets(); this->terminateTargets();
this->destroyAllObjects(); this->invalidateReferencesToAllObjects();
} }
bool isAcquired(void) const bool isAcquired(void) const
@ -68,13 +69,13 @@ class Context : public detail::NonCopyable
BufferHandle createBuffer(const BufferArguments & args) BufferHandle createBuffer(const BufferArguments & args)
{ {
BufferHandle handle = this->createHandle<Buffer>(); BufferHandle handle = this->createHandle<Buffer>();
handle.object()->create(args); handle->object()->create(args);
return handle; return handle;
} }
BoundBuffer bindVertexBuffer(BufferHandle & handle) BoundVertexBufferHandle bindVertexBuffer(BufferHandle & handle)
{ {
return this->bind(BindingTarget(GL_ARRAY_BUFFER, 0), handle); return this->bind<BoundVertexBuffer>(handle);
} }
void unbindVertexBuffer(void) void unbindVertexBuffer(void)
@ -83,9 +84,9 @@ class Context : public detail::NonCopyable
this->bindVertexBuffer(nullHandle); this->bindVertexBuffer(nullHandle);
} }
BoundBuffer bindIndexBuffer(BufferHandle & handle) BoundIndexBufferHandle bindIndexBuffer(BufferHandle & handle)
{ {
return this->bind(BindingTarget(GL_ELEMENT_ARRAY_BUFFER, 0), handle); return this->bind<BoundIndexBuffer>(handle);
} }
void unbindIndexBuffer(void) void unbindIndexBuffer(void)
@ -94,16 +95,60 @@ class Context : public detail::NonCopyable
this->bindIndexBuffer(nullHandle); this->bindIndexBuffer(nullHandle);
} }
BoundPixelPackBufferHandle bindPixelPackBuffer(BufferHandle & handle)
{
return this->bind<BoundPixelPackBuffer>(handle);
}
void unbindPixelPackBuffer(void)
{
BufferHandle nullHandle;
this->bindPixelPackBuffer(nullHandle);
}
BoundPixelUnpackBufferHandle bindPixelUnpackBuffer(BufferHandle & handle)
{
return this->bind<BoundPixelUnpackBuffer>(handle);
}
void unbindPixelUnpackBuffer(void)
{
BufferHandle nullHandle;
this->bindPixelUnpackBuffer(nullHandle);
}
BoundUniformBufferHandle bindUniformBuffer(BufferHandle & handle, GLuint index, GLintptr offset, GLsizeiptr size)
{
return this->bind<BoundUniformBuffer>(handle, UniformBufferBindingParams(index, offset, size));
}
void unbindUniformBuffer(GLuint index)
{
BufferHandle nullHandle;
this->bindUniformBuffer(nullHandle, index, 0, 0);
}
BoundFeedbackBufferHandle bindFeedbackBuffer(BufferHandle & handle, GLuint index, GLintptr offset, GLsizeiptr size)
{
return this->bind<BoundFeedbackBuffer>(handle, FeedbackBufferBindingParams(index, offset, size));
}
void unbindFeedbackBuffer(GLuint index)
{
BufferHandle nullHandle;
this->bindFeedbackBuffer(nullHandle, index, 0, 0);
}
RenderbufferHandle createRenderbuffer(const RenderbufferArguments & args) RenderbufferHandle createRenderbuffer(const RenderbufferArguments & args)
{ {
RenderbufferHandle handle = this->createHandle<Renderbuffer>(); RenderbufferHandle handle = this->createHandle<Renderbuffer>();
handle.object()->create(args); handle->object()->create(args);
return handle; return handle;
} }
BoundRenderbuffer bindRenderbuffer(RenderbufferHandle & handle) BoundRenderbufferHandle bindRenderbuffer(RenderbufferHandle & handle)
{ {
return this->bind(BindingTarget(GL_RENDERBUFFER, 0), handle); return this->bind<BoundRenderbuffer>(handle);
} }
void unbindRenderbuffer(void) void unbindRenderbuffer(void)
@ -115,13 +160,13 @@ class Context : public detail::NonCopyable
VertexShaderHandle createVertexShader(const VertexShaderArguments & args) VertexShaderHandle createVertexShader(const VertexShaderArguments & args)
{ {
VertexShaderHandle handle = this->createHandle<VertexShader>(); VertexShaderHandle handle = this->createHandle<VertexShader>();
handle.object()->create(args); handle->object()->create(args);
return handle; return handle;
} }
BoundVertexShader bindVertexShader(VertexShaderHandle & handle) BoundVertexShaderHandle bindVertexShader(VertexShaderHandle & handle)
{ {
return this->bind(BindingTarget(GL_VERTEX_SHADER, 0), handle); return this->bind<BoundVertexShader>(handle, VertexShaderBindingParams());
} }
void unbindVertexShader(void) void unbindVertexShader(void)
@ -133,13 +178,13 @@ class Context : public detail::NonCopyable
GeometryShaderHandle createGeometryShader(const GeometryShaderArguments & args) GeometryShaderHandle createGeometryShader(const GeometryShaderArguments & args)
{ {
GeometryShaderHandle handle = this->createHandle<GeometryShader>(); GeometryShaderHandle handle = this->createHandle<GeometryShader>();
handle.object()->create(args); handle->object()->create(args);
return handle; return handle;
} }
BoundGeometryShader bindGeometryShader(GeometryShaderHandle & handle) BoundGeometryShaderHandle bindGeometryShader(GeometryShaderHandle & handle)
{ {
return this->bind(BindingTarget(GL_GEOMETRY_SHADER, 0), handle); return this->bind<BoundGeometryShader>(handle, GeometryShaderBindingParams());
} }
void unbindGeometryShader(void) void unbindGeometryShader(void)
@ -151,13 +196,13 @@ class Context : public detail::NonCopyable
FragmentShaderHandle createFragmentShader(const FragmentShaderArguments & args) FragmentShaderHandle createFragmentShader(const FragmentShaderArguments & args)
{ {
FragmentShaderHandle handle = this->createHandle<FragmentShader>(); FragmentShaderHandle handle = this->createHandle<FragmentShader>();
handle.object()->create(args); handle->object()->create(args);
return handle; return handle;
} }
BoundFragmentShader bindFragmentShader(FragmentShaderHandle & handle) BoundFragmentShaderHandle bindFragmentShader(FragmentShaderHandle & handle)
{ {
return this->bind(BindingTarget(GL_FRAGMENT_SHADER, 0), handle); return this->bind<BoundFragmentShader>(handle, FragmentShaderBindingParams());
} }
void unbindFragmentShader(void) void unbindFragmentShader(void)
@ -169,13 +214,13 @@ class Context : public detail::NonCopyable
ProgramHandle createProgram(const ProgramArguments & args) ProgramHandle createProgram(const ProgramArguments & args)
{ {
ProgramHandle handle = this->createHandle<Program>(); ProgramHandle handle = this->createHandle<Program>();
handle.object()->create(args); handle->object()->create(args);
return handle; return handle;
} }
BoundProgram bindProgram(ProgramHandle & handle) BoundProgramHandle bindProgram(ProgramHandle & handle)
{ {
return this->bind(BindingTarget(GL_CURRENT_PROGRAM, 0), handle); return this->bind<BoundProgram>(handle, ProgramBindingParams());
} }
void unbindProgram(void) void unbindProgram(void)
@ -187,34 +232,33 @@ class Context : public detail::NonCopyable
Texture2DHandle createTexture2D(const Texture2DArguments & args) Texture2DHandle createTexture2D(const Texture2DArguments & args)
{ {
Texture2DHandle handle = this->createHandle<Texture2D>(); Texture2DHandle handle = this->createHandle<Texture2D>();
handle.object()->create(args); handle->object()->create(args);
return handle; return handle;
} }
BoundTexture2D bindTexture2D(GLint unit, Texture2DHandle & handle) BoundTexture2DHandle bindTexture2D(Texture2DHandle & handle, GLint unit)
{ {
glActiveTexture(GL_TEXTURE0 + unit); return this->bind<BoundTexture2D>(handle, Texture2DBindingParams(unit));
return this->bind(BindingTarget(GL_TEXTURE_2D, unit), handle);
} }
void unbindTexture2D(GLint unit) void unbindTexture2D(GLint unit)
{ {
Texture2DHandle nullHandle; Texture2DHandle nullHandle;
this->bindTexture2D(unit, nullHandle); this->bindTexture2D(nullHandle, unit);
} }
FramebufferHandle createFramebuffer(const FramebufferArguments & args) FramebufferHandle createFramebuffer(const FramebufferArguments & args)
{ {
FramebufferHandle handle = this->createHandle<Framebuffer>(); FramebufferHandle handle = this->createHandle<Framebuffer>();
handle.object()->create(args); handle->object()->create(args);
return handle; return handle;
} }
BoundFramebuffer bindReadFramebuffer(FramebufferHandle & handle) BoundReadFramebufferHandle bindReadFramebuffer(FramebufferHandle & handle)
{ {
FramebufferHandle nullHandle; FramebufferHandle nullHandle;
this->bind(BindingTarget(GL_FRAMEBUFFER, 0), nullHandle); this->bind<BoundReadDrawFramebuffer>(nullHandle, ReadDrawFramebufferBindingParams());
return this->bind(BindingTarget(GL_READ_FRAMEBUFFER, 0), handle); return this->bind<BoundReadFramebuffer>(handle, ReadFramebufferBindingParams());
} }
void unbindReadFramebuffer(void) void unbindReadFramebuffer(void)
@ -223,11 +267,11 @@ class Context : public detail::NonCopyable
this->bindReadFramebuffer(nullHandle); this->bindReadFramebuffer(nullHandle);
} }
BoundFramebuffer bindDrawFramebuffer(FramebufferHandle & handle) BoundDrawFramebufferHandle bindDrawFramebuffer(FramebufferHandle & handle)
{ {
FramebufferHandle nullHandle; FramebufferHandle nullHandle;
this->bind(BindingTarget(GL_FRAMEBUFFER, 0), nullHandle); this->bind<BoundReadDrawFramebuffer>(nullHandle, ReadDrawFramebufferBindingParams());
return this->bind(BindingTarget(GL_DRAW_FRAMEBUFFER, 0), handle); return this->bind<BoundDrawFramebuffer>(handle, DrawFramebufferBindingParams());
} }
void unbindDrawFramebuffer(void) void unbindDrawFramebuffer(void)
@ -236,199 +280,296 @@ class Context : public detail::NonCopyable
this->bindDrawFramebuffer(nullHandle); this->bindDrawFramebuffer(nullHandle);
} }
BoundFramebuffer bindFramebuffer(FramebufferHandle & handle) BoundReadDrawFramebufferHandle bindReadDrawFramebuffer(FramebufferHandle & handle)
{ {
FramebufferHandle nullHandle; FramebufferHandle nullHandle;
this->bind(BindingTarget(GL_READ_FRAMEBUFFER, 0), nullHandle); this->bind<BoundReadFramebuffer>(nullHandle, ReadFramebufferBindingParams());
this->bind(BindingTarget(GL_DRAW_FRAMEBUFFER, 0), nullHandle); this->bind<BoundDrawFramebuffer>(nullHandle, DrawFramebufferBindingParams());
return this->bind(BindingTarget(GL_FRAMEBUFFER, 0), handle); return this->bind<BoundReadDrawFramebuffer>(handle, ReadDrawFramebufferBindingParams());
} }
void unbindFramebuffer(void) void unbindReadDrawFramebuffer(void)
{ {
FramebufferHandle nullHandle; FramebufferHandle nullHandle;
this->bindFramebuffer(nullHandle); this->bindReadDrawFramebuffer(nullHandle);
} }
private: private:
typedef detail::SharedObjectBase<Object> SharedObjectType; template <typename TObject>
struct ObjectSafeFromObject
typedef void * GenericPtr; {
typedef std::pair<GLenum, GLint> BindingTarget; typedef typename detail::ObjectSafe<TObject>::Type Type;
};
typedef std::set<SharedObjectType *> ShaderObjecPtrSet;
typedef ShaderObjecPtrSet::const_iterator ShaderObjecPtrSetConstIterator;
typedef ShaderObjecPtrSet::iterator ShaderObjecPtrSetIterator;
typedef std::map<BindingTarget, GenericPtr> SharedObjectBindingPtrMap;
typedef SharedObjectBindingPtrMap::const_iterator SharedObjectBindingPtrConstIterator;
typedef SharedObjectBindingPtrMap::iterator SharedObjectBindingPtrIterator;
typedef SharedObjectBindingPtrMap::value_type SharedObjectBindingPtrValue;
bool m_acquired;
int m_textureUnits;
ShaderObjecPtrSet m_shareds;
SharedObjectBindingPtrMap m_bindings;
template <typename TObject> template <typename TObject>
void initializeTarget(BindingTarget bt) struct ObjectBoundFromObject
{ {
typedef TObject ObjectType; typedef typename detail::ObjectBound<TObject>::Type Type;
typedef detail::UnsafeHandle<ObjectType> UnsafeObjectType; };
UnsafeObjectType * unsafeObject = 0; template <typename TBinding>
this->m_bindings.insert(SharedObjectBindingPtrValue(bt, unsafeObject)); struct ObjectFromBinding
{
typedef typename detail::ObjectBase<TBinding>::Type Type;
};
template <typename TObject>
struct RefCountedPtrFromObject
{
typedef detail::RefCountedObject<TObject, typename detail::DeleterOf<typename detail::RootOf<TObject>::Type>::Type, typename detail::BaseOf<TObject>::Type> Type;
};
template <typename TObject>
struct RefCountedSafeHandleFromObject
{
typedef typename ObjectSafeFromObject<TObject>::Type ObjectSafeType;
typedef detail::RefCountedObject<ObjectSafeType, typename detail::DeleterOf<typename detail::RootOf<ObjectSafeType>::Type>::Type, typename detail::BaseOf<ObjectSafeType>::Type> Type;
};
template <typename TObject>
struct RefCountedBindingHandleFromObject
{
typedef typename ObjectBoundFromObject<TObject>::Type ObjectBoundType;
typedef detail::RefCountedObject<ObjectBoundType, typename detail::DeleterOf<typename detail::RootOf<ObjectBoundType>::Type>::Type, typename detail::BaseOf<ObjectBoundType>::Type> Type;
};
template <typename TBinding>
struct RefCountedBindingHandleFromBinding
{
typedef detail::RefCountedObject<TBinding, typename detail::DeleterOf<typename detail::RootOf<TBinding>::Type>::Type, typename detail::BaseOf<TBinding>::Type> Type;
};
template <typename TObject>
struct PtrFromObject
{
typedef detail::ObjectSharedPointer<TObject, typename detail::DeleterOf<typename detail::RootOf<TObject>::Type>::Type, typename detail::BaseOf<TObject>::Type> Type;
};
template <typename TObject>
struct SafeHandleFromObject
{
typedef typename ObjectSafeFromObject<TObject>::Type ObjectSafeType;
typedef detail::ObjectSharedPointer<ObjectSafeType, typename detail::DeleterOf<typename detail::RootOf<ObjectSafeType>::Type>::Type, typename detail::BaseOf<ObjectSafeType>::Type> Type;
};
template <typename TObject>
struct BindingHandleFromObject
{
typedef typename ObjectBoundFromObject<TObject>::Type ObjectBoundType;
typedef detail::ObjectSharedPointer<ObjectBoundType, typename detail::DeleterOf<typename detail::RootOf<ObjectBoundType>::Type>::Type, typename detail::BaseOf<ObjectBoundType>::Type> Type;
};
template <typename TBinding>
struct SafeHandleFromBinding
{
typedef typename SafeHandleFromObject<typename ObjectFromBinding<TBinding>::Type>::Type Type;
};
template <typename TBinding>
struct BindingHandleFromBinding
{
typedef detail::ObjectSharedPointer<TBinding, typename detail::DeleterOf<typename detail::RootOf<TBinding>::Type>::Type, typename detail::BaseOf<TBinding>::Type> Type;
};
typedef Object ObjectType;
typedef RefCountedPtrFromObject<ObjectType>::Type RefCountedPtrType;
typedef std::map<Object *, RefCountedPtrType *> RefCountedPtrPtrMap;
typedef RefCountedPtrPtrMap::const_iterator RefCountedPtrPtrMapConstIterator;
typedef RefCountedPtrPtrMap::iterator RefCountedPtrPtrMapIterator;
typedef RefCountedPtrPtrMap::value_type RefCountedPtrPtrMapValue;
typedef std::pair<GLenum, GLint> BindingTarget;
typedef BoundObjectHandle::RefCountedObjectType RefCountedBindingType;
typedef std::map<BindingTarget, RefCountedBindingType *> RefCountedBindingPtrMap;
typedef RefCountedBindingPtrMap::const_iterator RefCountedBindingPtrMapConstIterator;
typedef RefCountedBindingPtrMap::iterator RefCountedBindingPtrMapIterator;
typedef RefCountedBindingPtrMap::value_type RefCountedBindingPtrMapValue;
bool m_acquired;
int m_textureUnits;
RefCountedPtrPtrMap m_objects;
RefCountedBindingPtrMap m_bindings;
template <typename TBinding, typename TBindingParams>
void initializeTarget(const TBindingParams & params)
{
typedef TBinding BindingType;
typedef typename RefCountedBindingHandleFromBinding<BindingType>::Type RefCountedBindingHandleType;
const BindingTarget bt = BindingTarget(params.target, params.unit);
RefCountedBindingHandleType * binding = 0;
this->m_bindings.insert(RefCountedBindingPtrMapValue(bt, binding));
} }
template <typename TObject> template <typename TBinding, typename TBindingParams>
void terminateTarget(BindingTarget bt) void terminateTarget(const TBindingParams & params)
{ {
typedef TObject ObjectType; typedef TBinding BindingType;
typedef detail::SafeHandle<ObjectType> SafeObjectType; typedef typename SafeHandleFromBinding<BindingType>::Type SafeHandleType;
SafeObjectType nullHandle; SafeHandleType nullHandle;
this->bind<ObjectType>(bt, nullHandle); this->bind<BindingType>(nullHandle, params);
} }
void initializeTargets(void) void initializeTargets(void)
{ {
this->initializeTarget<BoundVertexBuffer, VertexBufferBindingParams >(VertexBufferBindingParams () );
this->initializeTarget<BoundIndexBuffer, IndexBufferBindingParams >(IndexBufferBindingParams () );
this->initializeTarget<BoundPixelPackBuffer, PixelPackBufferBindingParams >(PixelPackBufferBindingParams () );
this->initializeTarget<BoundPixelUnpackBuffer, PixelUnpackBufferBindingParams >(PixelUnpackBufferBindingParams () );
this->initializeTarget<BoundUniformBuffer, UniformBufferBindingParams >(UniformBufferBindingParams (0, 0, 0));
this->initializeTarget<BoundFeedbackBuffer, FeedbackBufferBindingParams >(FeedbackBufferBindingParams (0, 0, 0));
this->initializeTarget<BoundRenderbuffer, RenderbufferBindingParams >(RenderbufferBindingParams () );
this->initializeTarget<BoundVertexShader, VertexShaderBindingParams >(VertexShaderBindingParams () );
this->initializeTarget<BoundGeometryShader, GeometryShaderBindingParams >(GeometryShaderBindingParams () );
this->initializeTarget<BoundFragmentShader, FragmentShaderBindingParams >(FragmentShaderBindingParams () );
this->initializeTarget<BoundProgram, ProgramBindingParams >(ProgramBindingParams () );
this->initializeTarget<BoundReadFramebuffer, ReadFramebufferBindingParams >(ReadFramebufferBindingParams () );
this->initializeTarget<BoundDrawFramebuffer, DrawFramebufferBindingParams >(DrawFramebufferBindingParams () );
this->initializeTarget<BoundReadDrawFramebuffer, ReadDrawFramebufferBindingParams >(ReadDrawFramebufferBindingParams () );
{ {
GLint texUnits = 0; GLint texUnits = 0;
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &texUnits); glGetIntegerv(GL_MAX_TEXTURE_UNITS, &texUnits);
this->m_textureUnits = int(texUnits); this->m_textureUnits = int(texUnits);
} }
this->initializeTarget<Buffer >(BindingTarget(GL_ARRAY_BUFFER, 0));
this->initializeTarget<Buffer >(BindingTarget(GL_ELEMENT_ARRAY_BUFFER, 0));
this->initializeTarget<Renderbuffer >(BindingTarget(GL_RENDERBUFFER, 0));
this->initializeTarget<VertexShader >(BindingTarget(GL_VERTEX_SHADER, 0));
this->initializeTarget<GeometryShader>(BindingTarget(GL_GEOMETRY_SHADER, 0));
this->initializeTarget<FragmentShader>(BindingTarget(GL_FRAGMENT_SHADER, 0));
this->initializeTarget<Program >(BindingTarget(GL_CURRENT_PROGRAM, 0));
for (int i=0; i<this->m_textureUnits; ++i) for (int i=0; i<this->m_textureUnits; ++i)
{ {
this->initializeTarget<Texture2D>(BindingTarget(GL_TEXTURE_2D, GLint(i))); this->initializeTarget<BoundTexture2D>(Texture2DBindingParams(GLint(i)));
} }
this->initializeTarget<Framebuffer >(BindingTarget(GL_READ_FRAMEBUFFER, 0));
this->initializeTarget<Framebuffer >(BindingTarget(GL_DRAW_FRAMEBUFFER, 0));
this->initializeTarget<Framebuffer >(BindingTarget(GL_FRAMEBUFFER, 0));
} }
void terminateTargets(void) void terminateTargets(void)
{ {
this->terminateTarget<Buffer >(BindingTarget(GL_ARRAY_BUFFER, 0)); this->terminateTarget<BoundVertexBuffer, VertexBufferBindingParams >(VertexBufferBindingParams () );
this->terminateTarget<Buffer >(BindingTarget(GL_ELEMENT_ARRAY_BUFFER, 0)); this->terminateTarget<BoundIndexBuffer, IndexBufferBindingParams >(IndexBufferBindingParams () );
this->terminateTarget<Renderbuffer >(BindingTarget(GL_RENDERBUFFER, 0)); this->terminateTarget<BoundPixelPackBuffer, PixelPackBufferBindingParams >(PixelPackBufferBindingParams () );
this->terminateTarget<VertexShader >(BindingTarget(GL_VERTEX_SHADER, 0)); this->terminateTarget<BoundPixelUnpackBuffer, PixelUnpackBufferBindingParams >(PixelUnpackBufferBindingParams () );
this->terminateTarget<GeometryShader>(BindingTarget(GL_GEOMETRY_SHADER, 0)); this->terminateTarget<BoundUniformBuffer, UniformBufferBindingParams >(UniformBufferBindingParams (0, 0, 0));
this->terminateTarget<FragmentShader>(BindingTarget(GL_FRAGMENT_SHADER, 0)); this->terminateTarget<BoundFeedbackBuffer, FeedbackBufferBindingParams >(FeedbackBufferBindingParams (0, 0, 0));
this->terminateTarget<Program >(BindingTarget(GL_CURRENT_PROGRAM, 0)); this->terminateTarget<BoundRenderbuffer, RenderbufferBindingParams >(RenderbufferBindingParams () );
this->terminateTarget<BoundVertexShader, VertexShaderBindingParams >(VertexShaderBindingParams () );
this->terminateTarget<BoundGeometryShader, GeometryShaderBindingParams >(GeometryShaderBindingParams () );
this->terminateTarget<BoundFragmentShader, FragmentShaderBindingParams >(FragmentShaderBindingParams () );
this->terminateTarget<BoundProgram, ProgramBindingParams >(ProgramBindingParams () );
this->terminateTarget<BoundReadFramebuffer, ReadFramebufferBindingParams >(ReadFramebufferBindingParams () );
this->terminateTarget<BoundDrawFramebuffer, DrawFramebufferBindingParams >(DrawFramebufferBindingParams () );
this->terminateTarget<BoundReadDrawFramebuffer, ReadDrawFramebufferBindingParams >(ReadDrawFramebufferBindingParams () );
for (int i=0; i<this->m_textureUnits; ++i) for (int i=0; i<this->m_textureUnits; ++i)
{ {
this->terminateTarget<Texture2D>(BindingTarget(GL_TEXTURE_2D, GLint(i))); this->terminateTarget<BoundTexture2D>(Texture2DBindingParams(GLint(i)));
} }
this->terminateTarget<Framebuffer >(BindingTarget(GL_READ_FRAMEBUFFER, 0));
this->terminateTarget<Framebuffer >(BindingTarget(GL_DRAW_FRAMEBUFFER, 0));
this->terminateTarget<Framebuffer >(BindingTarget(GL_FRAMEBUFFER, 0));
this->m_textureUnits = 0; this->m_textureUnits = 0;
} }
template <typename TObject>
detail::UnsafeHandle<TObject> bind(BindingTarget bt, detail::SafeHandle<TObject> & h)
{
typedef TObject ObjectType;
typedef detail::SharedObjectBinding<ObjectType> SharedObjectBindingType;
typedef detail::UnsafeHandle<ObjectType> UnsafeObjectType;
SharedObjectBindingPtrIterator it = this->m_bindings.find(bt);
GLW_ASSERT(it != this->m_bindings.end());
ObjectType * Object = h.object();
SharedObjectBindingType * currentBinding = static_cast<SharedObjectBindingType *>(it->second);
if (currentBinding != 0)
{
GLW_ASSERT(!currentBinding->isNull());
// WARNING: as state could have been changed outside GLW, uncommenting the following line may prevent correct binding.
//if (currentBinding->object() == Object) return UnsafeObjectType(currentBinding);
if (h.isNull()) currentBinding->object()->unbind();
currentBinding->setNull();
currentBinding->unref();
currentBinding = 0;
it->second = 0;
}
if (h.isNull()) return UnsafeObjectType();
SharedObjectBindingType * newBinding = new SharedObjectBindingType(h.shared(), bt.first, bt.second);
newBinding->ref();
it->second = newBinding;
Object->setBinding(bt.first, bt.second);
Object->bind();
return UnsafeObjectType(newBinding);
}
template <typename TObject> template <typename TObject>
TObject * createObject(void) TObject * createObject(void)
{ {
typedef TObject ObjectType; typedef TObject ObjectType;
ObjectType * Object = new ObjectType(this); ObjectType * object = new ObjectType(this);
return Object; return object;
} }
void destroyObject(Object * Object) void destroyObject(Object * object)
{ {
GLW_ASSERT(Object != 0); GLW_ASSERT(object != 0);
Object->destroy(); object->destroy();
delete Object; delete object;
}
void removeShared(SharedObjectType * shared)
{
GLW_ASSERT(shared != 0);
GLW_ASSERT(this->m_shareds.count(shared) > 0);
this->m_shareds.erase(shared);
this->destroyObject(shared->object());
}
void destroyAllObjects(void)
{
for (ShaderObjecPtrSetIterator it=this->m_shareds.begin(); it!=this->m_shareds.end(); ++it)
{
SharedObjectType * shared = *it;
Object * Object = shared->object();
shared->setNull();
this->destroyObject(Object);
}
} }
template <typename TObject> template <typename TObject>
detail::SafeHandle<TObject> createHandle(void) typename SafeHandleFromObject<TObject>::Type createHandle(void)
{ {
typedef TObject ObjectType; typedef TObject ObjectType;
typedef detail::SharedObject<ObjectType> SharedObjectType; typedef typename RefCountedPtrFromObject<ObjectType>::Type RefCountedPtrType;
typedef detail::SafeHandle<ObjectType> SafeType; typedef typename PtrFromObject<ObjectType>::Type PtrType;
ObjectType * Object = new ObjectType(this); typedef typename ObjectSafeFromObject<ObjectType>::Type ObjectSafeType;
SharedObjectType * shared = new SharedObjectType(this, Object); typedef typename RefCountedSafeHandleFromObject<ObjectType>::Type RefCountedSafeHandleType;
typedef typename SafeHandleFromObject<TObject>::Type SafeHandleType;
this->m_shareds.insert(shared); ObjectType * object = this->createObject<ObjectType>();
RefCountedPtrType * refCountedPtr = new RefCountedPtrType(object, typename detail::DeleterOf<Object>::Type());
PtrType ptr = PtrType(refCountedPtr);
return SafeType(shared); ObjectSafeType * objecSafe = new ObjectSafeType(ptr);
RefCountedSafeHandleType * refCountedHandle = new RefCountedSafeHandleType(objecSafe, typename detail::DeleterOf<ObjectSafeType>::Type());
SafeHandleType handle = SafeHandleType(refCountedHandle);
this->m_objects.insert(RefCountedPtrPtrMapValue(object, refCountedPtr));
return handle;
}
void noMoreReferencesTo(Object * object)
{
GLW_ASSERT(object != 0);
RefCountedPtrPtrMapIterator it = this->m_objects.find(object);
GLW_ASSERT(it != this->m_objects.end());
this->m_objects.erase(it);
this->destroyObject(object);
}
void invalidateReferencesToAllObjects(void)
{
for (RefCountedPtrPtrMapIterator it=this->m_objects.begin(); it!=this->m_objects.end(); ++it)
{
Object * object = it->first;
RefCountedPtrType * refPtr = it->second;
refPtr->setNull(false);
this->destroyObject(object);
}
}
template <typename TBinding>
typename BindingHandleFromBinding<TBinding>::Type bind(typename SafeHandleFromBinding<TBinding>::Type & h, const typename detail::ParamsOf<TBinding>::Type & params = typename detail::ParamsOf<TBinding>::Type())
{
typedef TBinding BindingType;
typedef typename detail::ParamsOf<TBinding>::Type BindingParamsType;
typedef typename BindingHandleFromBinding<BindingType>::Type BindingHandleType;
typedef typename RefCountedBindingHandleFromBinding<BindingType>::Type RefCountedBindingHandleType;
const BindingTarget bt = BindingTarget(params.target, params.unit);
RefCountedBindingPtrMapIterator it = this->m_bindings.find(bt);
GLW_ASSERT(it != this->m_bindings.end());
RefCountedBindingHandleType * currentBinding = static_cast<RefCountedBindingHandleType *>(it->second);
if (currentBinding != 0)
{
GLW_ASSERT(!currentBinding->isNull());
// WARNING: as state could have been changed outside GLW, uncommenting the following line may prevent correct binding.
//if (currentBinding->object() == Object) return UnsafeObjectType(currentBinding);
if (h.isNull()) currentBinding->object()->unbind();
currentBinding->setNull(true);
currentBinding->unref();
currentBinding = 0;
it->second = 0;
}
if (h.isNull()) return BindingHandleType();
BindingType * binding = new BindingType(h, params);
RefCountedBindingHandleType * newBinding = new RefCountedBindingHandleType(binding, typename detail::DeleterOf<BindingType>::Type());
newBinding->ref();
newBinding->object()->bind();
it->second = newBinding;
return BindingHandleType(newBinding);
} }
}; };
namespace detail namespace detail
{ {
template <typename TObject> inline void ObjectDeleter :: operator () (Object * object) const
inline void SharedObjectBase<TObject>::signalDestruction(void)
{ {
this->m_context->removeShared(this); if (object == 0) return;
object->context()->noMoreReferencesTo(object);
} }
}; };

View File

@ -10,12 +10,13 @@ class FragmentShaderArguments : public ShaderArguments
{ {
public: public:
typedef ShaderArguments BaseType; typedef ShaderArguments BaseType;
typedef FragmentShaderArguments ThisType; typedef FragmentShaderArguments ThisType;
FragmentShaderArguments(void) FragmentShaderArguments(void)
: BaseType()
{ {
this->clear(); ;
} }
void clear(void) void clear(void)
@ -24,33 +25,14 @@ class FragmentShaderArguments : public ShaderArguments
} }
}; };
class SafeFragmentShader : public virtual SafeShader class FragmentShader : public Shader
{
public:
typedef SafeShader BaseType;
typedef SafeFragmentShader ThisType;
protected:
SafeFragmentShader(Context * ctx)
: SafeObject (ctx)
, BaseType (ctx)
{
;
}
};
class FragmentShader : public Shader, public SafeFragmentShader
{ {
friend class Context; friend class Context;
friend class detail::SharedObjectBinding<FragmentShader>;
public: public:
typedef Shader BaseType; typedef Shader BaseType;
typedef SafeFragmentShader SafeType; typedef FragmentShader ThisType;
typedef FragmentShader ThisType;
virtual Type type(void) const virtual Type type(void) const
{ {
@ -60,10 +42,7 @@ class FragmentShader : public Shader, public SafeFragmentShader
protected: protected:
FragmentShader(Context * ctx) FragmentShader(Context * ctx)
: SafeObject (ctx) : BaseType(ctx)
, SafeShader (ctx)
, BaseType (ctx)
, SafeType (ctx)
{ {
; ;
} }
@ -79,9 +58,101 @@ class FragmentShader : public Shader, public SafeFragmentShader
} }
}; };
typedef detail::SafeHandle <FragmentShader> FragmentShaderHandle; namespace detail { template <> struct BaseOf <FragmentShader> { typedef Shader Type; }; };
typedef detail::UnsafeHandle <FragmentShader> BoundFragmentShader; typedef detail::ObjectSharedPointerTraits <FragmentShader> ::Type FragmentShaderPtr;
} // end namespace glw class SafeFragmentShader : public SafeShader
{
friend class Context;
friend class BoundFragmentShader;
public:
typedef SafeShader BaseType;
typedef SafeFragmentShader ThisType;
protected:
SafeFragmentShader(const FragmentShaderPtr & fragmentShader)
: BaseType(fragmentShader)
{
;
}
const FragmentShaderPtr & object(void) const
{
return static_cast<const FragmentShaderPtr &>(BaseType::object());
}
FragmentShaderPtr & object(void)
{
return static_cast<FragmentShaderPtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeFragmentShader> { typedef SafeShader Type; }; };
namespace detail { template <> struct ObjectBase <SafeFragmentShader> { typedef FragmentShader Type; }; };
namespace detail { template <> struct ObjectSafe <FragmentShader > { typedef SafeFragmentShader Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeFragmentShader> ::Type FragmentShaderHandle;
class FragmentShaderBindingParams : public ShaderBindingParams
{
public:
typedef ShaderBindingParams BaseType;
typedef FragmentShaderBindingParams ThisType;
FragmentShaderBindingParams(void)
: BaseType(GL_FRAGMENT_SHADER, 0)
{
;
}
};
class BoundFragmentShader : public BoundShader
{
friend class Context;
public:
typedef BoundShader BaseType;
typedef BoundFragmentShader ThisType;
const FragmentShaderHandle & handle(void) const
{
return static_cast<const FragmentShaderHandle &>(BaseType::handle());
}
FragmentShaderHandle & handle(void)
{
return static_cast<FragmentShaderHandle &>(BaseType::handle());
}
protected:
BoundFragmentShader(const FragmentShaderHandle & handle, const ShaderBindingParams & params)
: BaseType(handle, params)
{
;
}
const FragmentShaderPtr & object(void) const
{
return this->handle()->object();
}
FragmentShaderPtr & object(void)
{
return this->handle()->object();
}
};
namespace detail { template <> struct ParamsOf <BoundFragmentShader> { typedef FragmentShaderBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundFragmentShader> { typedef BoundShader Type; }; };
namespace detail { template <> struct ObjectBase <BoundFragmentShader> { typedef FragmentShader Type; }; };
namespace detail { template <> struct ObjectBound <FragmentShader > { typedef BoundFragmentShader Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundFragmentShader> ::Type BoundFragmentShaderHandle;
};
#endif // GLW_FRAGMENTSHADER_H #endif // GLW_FRAGMENTSHADER_H

View File

@ -1,8 +1,11 @@
#ifndef GLW_FRAMEBUFFER_H #ifndef GLW_FRAMEBUFFER_H
#define GLW_FRAMEBUFFER_H #define GLW_FRAMEBUFFER_H
#include "./object.h" #include "./texture2D.h"
#include "./renderbuffer.h"
#include <vector> #include <vector>
#include <map>
namespace glw namespace glw
{ {
@ -134,12 +137,12 @@ class FramebufferArguments : public ObjectArguments
RenderTargetMapping colorTargets; RenderTargetMapping colorTargets;
RenderTarget depthTarget; RenderTarget depthTarget;
RenderTarget stencilTarget; RenderTarget stencilTarget;
RenderTarget depthStencilTarget;
RenderTargetBinding targetInputs; RenderTargetBinding targetInputs;
FramebufferArguments(void) FramebufferArguments(void)
: BaseType()
{ {
this->clear(); ;
} }
void clear(void) void clear(void)
@ -148,58 +151,102 @@ class FramebufferArguments : public ObjectArguments
this->colorTargets .clear(); this->colorTargets .clear();
this->depthTarget .clear(); this->depthTarget .clear();
this->stencilTarget .clear(); this->stencilTarget .clear();
this->depthStencilTarget .clear();
this->targetInputs .clear(); this->targetInputs .clear();
} }
}; };
class SafeFramebuffer : public virtual SafeObject class Framebuffer : public Object
{
public:
typedef SafeObject BaseType;
typedef SafeFramebuffer ThisType;
protected:
SafeFramebuffer(Context * ctx)
: BaseType(ctx)
{
;
}
};
class Framebuffer : public Object, public SafeFramebuffer
{ {
friend class Context; friend class Context;
friend class detail::SharedObjectBinding<Framebuffer>;
public: public:
typedef Object BaseType; typedef Object BaseType;
typedef SafeFramebuffer SafeType; typedef Framebuffer ThisType;
typedef Framebuffer ThisType;
virtual ~Framebuffer(void)
{
this->destroy();
}
virtual Type type(void) const virtual Type type(void) const
{ {
return FramebufferType; return FramebufferType;
} }
const FramebufferArguments & arguments(void) const
{
return this->m_config;
}
bool setColorTarget(GLenum target, GLint unit, GLint index, const RenderTarget & renderTarget)
{
(void)unit;
GLW_ASSERT(this->isValid());
this->m_config.colorTargets[index].clear();
const bool r = this->attachTarget(target, GL_COLOR_ATTACHMENT0 + index, renderTarget);
if (!r) return false;
this->m_config.colorTargets[index] = renderTarget;
return true;
}
bool removeColorTarget(GLenum target, GLint unit, GLint index)
{
(void)unit;
GLW_ASSERT(this->isValid());
glFramebufferRenderbuffer(target, GL_COLOR_ATTACHMENT0 + index, GL_RENDERBUFFER, 0);
this->m_config.colorTargets[index].clear();
return true;
}
bool setDepthTarget(GLenum target, GLint unit, const RenderTarget & renderTarget)
{
(void)unit;
GLW_ASSERT(this->isValid());
this->m_config.depthTarget.clear();
const bool r = this->attachTarget(target, GL_DEPTH_ATTACHMENT, renderTarget);
if (!r) return false;
this->m_config.depthTarget = renderTarget;
return true;
}
bool removeDepthTarget(GLenum target, GLint unit)
{
(void)unit;
GLW_ASSERT(this->isValid());
glFramebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
this->m_config.depthTarget.clear();
return true;
}
bool setStencilTarget(GLenum target, GLint unit, const RenderTarget & renderTarget)
{
(void)unit;
GLW_ASSERT(this->isValid());
this->m_config.stencilTarget.clear();
const bool r = this->attachTarget(target, GL_STENCIL_ATTACHMENT, renderTarget);
if (!r) return false;
this->m_config.stencilTarget = renderTarget;
return true;
}
bool removeStencilTarget(GLenum target, GLint unit)
{
(void)unit;
GLW_ASSERT(this->isValid());
glFramebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
this->m_config.stencilTarget.clear();
return true;
}
protected: protected:
Framebuffer(Context * ctx) Framebuffer(Context * ctx)
: SafeObject (ctx) : BaseType(ctx)
, BaseType (ctx)
, SafeType (ctx)
{ {
; ;
} }
virtual ~Framebuffer(void)
{
this->destroy();
}
bool create(const FramebufferArguments & args) bool create(const FramebufferArguments & args)
{ {
this->destroy(); this->destroy();
@ -213,9 +260,9 @@ class Framebuffer : public Object, public SafeFramebuffer
glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &boundNameRead); glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &boundNameRead);
glGenFramebuffers(1, &(this->m_name)); glGenFramebuffers(1, &(this->m_name));
this->setBinding(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, this->m_name);
this->bind(); this->configure(GL_FRAMEBUFFER);
this->configure(); glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, boundNameDraw); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, boundNameDraw);
glBindFramebuffer(GL_READ_FRAMEBUFFER, boundNameRead); glBindFramebuffer(GL_READ_FRAMEBUFFER, boundNameRead);
@ -223,45 +270,30 @@ class Framebuffer : public Object, public SafeFramebuffer
return true; return true;
} }
virtual void doDestroy(Context * ctx, GLuint name) virtual void doDestroy(void)
{ {
(void)ctx; glDeleteFramebuffers(1, &(this->m_name));
if (name == 0) return;
glDeleteFramebuffers(1, &name);
this->m_config.clear(); this->m_config.clear();
} }
virtual void doBind(void) virtual bool doIsValid(void) const
{ {
glBindFramebuffer(this->m_target, this->m_name); return true;
}
virtual void doUnbind(void)
{
glBindFramebuffer(this->m_target, 0);
} }
private: private:
FramebufferArguments m_config; FramebufferArguments m_config;
void configure(void) void configure(GLenum target)
{ {
for (RenderTargetMapping::Iterator it=this->m_config.colorTargets.bindings.begin(); it!=this->m_config.colorTargets.bindings.end(); ++it) for (RenderTargetMapping::Iterator it=this->m_config.colorTargets.bindings.begin(); it!=this->m_config.colorTargets.bindings.end(); ++it)
{ {
this->attachTarget(GL_COLOR_ATTACHMENT0 + it->first, it->second); this->attachTarget(target, GL_COLOR_ATTACHMENT0 + it->first, it->second);
} }
if (this->m_config.depthStencilTarget.target) this->attachTarget(target, GL_DEPTH_ATTACHMENT, this->m_config.depthTarget );
{ this->attachTarget(target, GL_STENCIL_ATTACHMENT, this->m_config.stencilTarget);
this->attachTarget(GL_DEPTH_ATTACHMENT, this->m_config.depthStencilTarget);
this->attachTarget(GL_STENCIL_ATTACHMENT, this->m_config.depthStencilTarget);
}
else
{
this->attachTarget(GL_DEPTH_ATTACHMENT, this->m_config.depthTarget );
this->attachTarget(GL_STENCIL_ATTACHMENT, this->m_config.stencilTarget);
}
if (this->m_config.colorTargets.bindings.empty()) if (this->m_config.colorTargets.bindings.empty())
{ {
@ -287,30 +319,318 @@ class Framebuffer : public Object, public SafeFramebuffer
} }
} }
bool attachTarget(GLenum attachment, RenderTarget & target) bool attachTarget(GLenum target, GLenum attachment, const RenderTarget & renderTarget)
{ {
RenderableHandle & handle = target.target; const RenderableHandle & handle = renderTarget.target;
if (!handle) if (!handle)
{ {
glFramebufferRenderbuffer(this->m_target, attachment, GL_RENDERBUFFER, 0); glFramebufferRenderbuffer(target, attachment, GL_RENDERBUFFER, 0);
return false; return false;
} }
switch (handle->type()) switch (handle->type())
{ {
case RenderbufferType : glFramebufferRenderbuffer (this->m_target, attachment, GL_RENDERBUFFER, handle->name() ); break; case RenderbufferType : glFramebufferRenderbuffer (target, attachment, GL_RENDERBUFFER, handle->name() ); break;
case Texture2DType : glFramebufferTexture2D (this->m_target, attachment, GL_TEXTURE_2D, handle->name(), target.level); break; case Texture2DType : glFramebufferTexture2D (target, attachment, GL_TEXTURE_2D, handle->name(), renderTarget.level); break;
default : GLW_ASSERT(0); break; default : GLW_ASSERT(0); break;
} }
return true; return true;
} }
}; };
typedef detail::SafeHandle <Framebuffer> FramebufferHandle; namespace detail { template <> struct BaseOf <Framebuffer> { typedef Object Type; }; };
typedef detail::UnsafeHandle <Framebuffer> BoundFramebuffer; typedef detail::ObjectSharedPointerTraits <Framebuffer> ::Type FramebufferPtr;
} // end namespace glw class SafeFramebuffer : public SafeObject
{
friend class Context;
friend class BoundFramebuffer;
public:
typedef SafeObject BaseType;
typedef SafeFramebuffer ThisType;
const FramebufferArguments & arguments(void) const
{
return this->object()->arguments();
}
protected:
SafeFramebuffer(const FramebufferPtr & program)
: BaseType(program)
{
;
}
const FramebufferPtr & object(void) const
{
return static_cast<const FramebufferPtr &>(BaseType::object());
}
FramebufferPtr & object(void)
{
return static_cast<FramebufferPtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeFramebuffer> { typedef SafeObject Type; }; };
namespace detail { template <> struct ObjectBase <SafeFramebuffer> { typedef Framebuffer Type; }; };
namespace detail { template <> struct ObjectSafe <Framebuffer > { typedef SafeFramebuffer Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeFramebuffer> ::Type FramebufferHandle;
class FramebufferBindingParams : public ObjectBindingParams
{
public:
typedef ObjectBindingParams BaseType;
typedef FramebufferBindingParams ThisType;
FramebufferBindingParams(void)
: BaseType()
{
;
}
FramebufferBindingParams(GLenum target)
: BaseType(target, 0)
{
;
}
};
class BoundFramebuffer : public BoundObject
{
friend class Context;
public:
typedef BoundObject BaseType;
typedef BoundFramebuffer ThisType;
BoundFramebuffer(void)
: BaseType()
{
;
}
const FramebufferHandle & handle(void) const
{
return static_cast<const FramebufferHandle &>(BaseType::handle());
}
FramebufferHandle & handle(void)
{
return static_cast<FramebufferHandle &>(BaseType::handle());
}
GLenum getStatus(void) const
{
return glCheckFramebufferStatus(this->m_target);
}
bool isComplete(void) const
{
return (this->getStatus() == GL_FRAMEBUFFER_COMPLETE);
}
bool setColorTarget(GLint index, const RenderTarget & renderTarget)
{
return this->object()->setColorTarget(this->m_target, this->m_unit, index, renderTarget);
}
bool removeColorTarget(GLint index)
{
return this->object()->removeColorTarget(this->m_target, this->m_unit, index);
}
bool setDepthTarget(const RenderTarget & renderTarget)
{
return this->object()->setDepthTarget(this->m_target, this->m_unit, renderTarget);
}
bool removeDepthTarget(void)
{
return this->object()->removeDepthTarget(this->m_target, this->m_unit);
}
bool setStencilTarget(const RenderTarget & renderTarget)
{
return this->object()->setStencilTarget(this->m_target, this->m_unit, renderTarget);
}
bool removeStencilTarget(void)
{
return this->object()->removeStencilTarget(this->m_target, this->m_unit);
}
protected:
BoundFramebuffer(const FramebufferHandle & handle, const FramebufferBindingParams & params)
: BaseType(handle, params)
{
;
}
const FramebufferPtr & object(void) const
{
return this->handle()->object();
}
FramebufferPtr & object(void)
{
return this->handle()->object();
}
virtual void bind(void)
{
glBindFramebuffer(this->m_target, this->object()->name());
}
virtual void unbind(void)
{
glBindFramebuffer(this->m_target, 0);
}
};
namespace detail { template <> struct ParamsOf <BoundFramebuffer> { typedef FramebufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundFramebuffer> { typedef BoundObject Type; }; };
namespace detail { template <> struct ObjectBase <BoundFramebuffer> { typedef Framebuffer Type; }; };
namespace detail { template <> struct ObjectBound <Framebuffer > { typedef BoundFramebuffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundFramebuffer> ::Type BoundFramebufferHandle;
class ReadFramebufferBindingParams : public FramebufferBindingParams
{
public:
typedef FramebufferBindingParams BaseType;
typedef ReadFramebufferBindingParams ThisType;
ReadFramebufferBindingParams(void)
: BaseType(GL_READ_FRAMEBUFFER)
{
;
}
};
class BoundReadFramebuffer : public BoundFramebuffer
{
friend class Context;
public:
typedef BoundFramebuffer BaseType;
typedef BoundReadFramebuffer ThisType;
BoundReadFramebuffer(void)
: BaseType()
{
;
}
protected:
BoundReadFramebuffer(const FramebufferHandle & handle, const ReadFramebufferBindingParams & params)
: BaseType(handle, params)
{
;
}
};
namespace detail { template <> struct ParamsOf <BoundReadFramebuffer> { typedef ReadFramebufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundReadFramebuffer> { typedef BoundFramebuffer Type; }; };
namespace detail { template <> struct ObjectBase <BoundReadFramebuffer> { typedef Framebuffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundReadFramebuffer> ::Type BoundReadFramebufferHandle;
class DrawFramebufferBindingParams : public FramebufferBindingParams
{
public:
typedef FramebufferBindingParams BaseType;
typedef DrawFramebufferBindingParams ThisType;
DrawFramebufferBindingParams(void)
: BaseType(GL_DRAW_FRAMEBUFFER)
{
;
}
};
class BoundDrawFramebuffer : public BoundFramebuffer
{
friend class Context;
public:
typedef BoundFramebuffer BaseType;
typedef BoundDrawFramebuffer ThisType;
BoundDrawFramebuffer(void)
: BaseType()
{
;
}
protected:
BoundDrawFramebuffer(const FramebufferHandle & handle, const DrawFramebufferBindingParams & params)
: BaseType(handle, params)
{
;
}
};
namespace detail { template <> struct ParamsOf <BoundDrawFramebuffer> { typedef DrawFramebufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundDrawFramebuffer> { typedef BoundFramebuffer Type; }; };
namespace detail { template <> struct ObjectBase <BoundDrawFramebuffer> { typedef Framebuffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundDrawFramebuffer> ::Type BoundDrawFramebufferHandle;
class ReadDrawFramebufferBindingParams : public FramebufferBindingParams
{
public:
typedef FramebufferBindingParams BaseType;
typedef ReadDrawFramebufferBindingParams ThisType;
ReadDrawFramebufferBindingParams(void)
: BaseType(GL_FRAMEBUFFER)
{
;
}
};
class BoundReadDrawFramebuffer : public BoundFramebuffer
{
friend class Context;
public:
typedef BoundFramebuffer BaseType;
typedef BoundReadDrawFramebuffer ThisType;
BoundReadDrawFramebuffer(void)
: BaseType()
{
;
}
protected:
BoundReadDrawFramebuffer(const FramebufferHandle & handle, const ReadDrawFramebufferBindingParams & params)
: BaseType(handle, params)
{
;
}
};
namespace detail { template <> struct ParamsOf <BoundReadDrawFramebuffer> { typedef ReadDrawFramebufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundReadDrawFramebuffer> { typedef BoundFramebuffer Type; }; };
namespace detail { template <> struct ObjectBase <BoundReadDrawFramebuffer> { typedef Framebuffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundReadDrawFramebuffer> ::Type BoundReadDrawFramebufferHandle;
};
#endif // GLW_FRAMEBUFFER_H #endif // GLW_FRAMEBUFFER_H

View File

@ -10,12 +10,13 @@ class GeometryShaderArguments : public ShaderArguments
{ {
public: public:
typedef ShaderArguments BaseType; typedef ShaderArguments BaseType;
typedef GeometryShaderArguments ThisType; typedef GeometryShaderArguments ThisType;
GeometryShaderArguments(void) GeometryShaderArguments(void)
: BaseType()
{ {
this->clear(); ;
} }
void clear(void) void clear(void)
@ -24,33 +25,14 @@ class GeometryShaderArguments : public ShaderArguments
} }
}; };
class SafeGeometryShader : public virtual SafeShader class GeometryShader : public Shader
{
public:
typedef SafeShader BaseType;
typedef SafeGeometryShader ThisType;
protected:
SafeGeometryShader(Context * ctx)
: SafeObject (ctx)
, BaseType (ctx)
{
;
}
};
class GeometryShader : public Shader, public SafeGeometryShader
{ {
friend class Context; friend class Context;
friend class detail::SharedObjectBinding<GeometryShader>;
public: public:
typedef Shader BaseType; typedef Shader BaseType;
typedef SafeGeometryShader SafeType; typedef GeometryShader ThisType;
typedef GeometryShader ThisType;
virtual Type type(void) const virtual Type type(void) const
{ {
@ -60,10 +42,7 @@ class GeometryShader : public Shader, public SafeGeometryShader
protected: protected:
GeometryShader(Context * ctx) GeometryShader(Context * ctx)
: SafeObject (ctx) : BaseType(ctx)
, SafeShader (ctx)
, BaseType (ctx)
, SafeType (ctx)
{ {
; ;
} }
@ -79,9 +58,101 @@ class GeometryShader : public Shader, public SafeGeometryShader
} }
}; };
typedef detail::SafeHandle <GeometryShader> GeometryShaderHandle; namespace detail { template <> struct BaseOf <GeometryShader> { typedef Shader Type; }; };
typedef detail::UnsafeHandle <GeometryShader> BoundGeometryShader; typedef detail::ObjectSharedPointerTraits <GeometryShader> ::Type GeometryShaderPtr;
} // end namespace glw class SafeGeometryShader : public SafeShader
{
friend class Context;
friend class BoundGeometryShader;
public:
typedef SafeShader BaseType;
typedef SafeGeometryShader ThisType;
protected:
SafeGeometryShader(const GeometryShaderPtr & geometryShader)
: BaseType(geometryShader)
{
;
}
const GeometryShaderPtr & object(void) const
{
return static_cast<const GeometryShaderPtr &>(BaseType::object());
}
GeometryShaderPtr & object(void)
{
return static_cast<GeometryShaderPtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeGeometryShader> { typedef SafeShader Type; }; };
namespace detail { template <> struct ObjectBase <SafeGeometryShader> { typedef GeometryShader Type; }; };
namespace detail { template <> struct ObjectSafe <GeometryShader > { typedef SafeGeometryShader Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeGeometryShader> ::Type GeometryShaderHandle;
class GeometryShaderBindingParams : public ShaderBindingParams
{
public:
typedef ShaderBindingParams BaseType;
typedef GeometryShaderBindingParams ThisType;
GeometryShaderBindingParams(void)
: BaseType(GL_GEOMETRY_SHADER, 0)
{
;
}
};
class BoundGeometryShader : public BoundShader
{
friend class Context;
public:
typedef BoundShader BaseType;
typedef BoundGeometryShader ThisType;
const GeometryShaderHandle & handle(void) const
{
return static_cast<const GeometryShaderHandle &>(BaseType::handle());
}
GeometryShaderHandle & handle(void)
{
return static_cast<GeometryShaderHandle &>(BaseType::handle());
}
protected:
BoundGeometryShader(const GeometryShaderHandle & handle, const ShaderBindingParams & params)
: BaseType(handle, params)
{
;
}
const GeometryShaderPtr & object(void) const
{
return this->handle()->object();
}
GeometryShaderPtr & object(void)
{
return this->handle()->object();
}
};
namespace detail { template <> struct ParamsOf <BoundGeometryShader> { typedef GeometryShaderBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundGeometryShader> { typedef BoundShader Type; }; };
namespace detail { template <> struct ObjectBase <BoundGeometryShader> { typedef GeometryShader Type; }; };
namespace detail { template <> struct ObjectBound <GeometryShader > { typedef BoundGeometryShader Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundGeometryShader> ::Type BoundGeometryShaderHandle;
};
#endif // GLW_GEOMETRYSHADER_H #endif // GLW_GEOMETRYSHADER_H

View File

@ -3,6 +3,7 @@
#include "./bookkeeping.h" #include "./bookkeeping.h"
#include "./noncopyable.h" #include "./noncopyable.h"
#include "./objectdeleter.h"
#include "./type.h" #include "./type.h"
#include "./glheaders.h" #include "./glheaders.h"
@ -20,7 +21,7 @@ class ObjectArguments
ObjectArguments(void) ObjectArguments(void)
{ {
this->clear(); ;
} }
void clear(void) void clear(void)
@ -29,26 +30,31 @@ class ObjectArguments
} }
}; };
class SafeObject class Object : public detail::NonCopyable
{ {
friend class Object; friend class Context;
public: public:
typedef void BaseType; typedef detail::NonCopyable BaseType;
typedef SafeObject ThisType; typedef Object ThisType;
virtual ~Object(void)
{
this->destroy();
}
bool isValid(void) const bool isValid(void) const
{ {
return (this->m_name != 0); return ((this->m_name != 0) && this->doIsValid());
} }
Context * context(void) const Context * context(void) const
{ {
return this->m_context; return this->m_context;
} }
const Context * context(void) const Context * context(void)
{ {
return this->m_context; return this->m_context;
} }
@ -62,12 +68,48 @@ class SafeObject
protected: protected:
Context * m_context;
GLuint m_name; GLuint m_name;
Context * m_context;
SafeObject(Context * ctx) Object(Context * ctx)
: m_context (ctx) : m_name (0)
, m_name (0) , m_context (ctx)
{
;
}
void destroy(void)
{
if (this->m_name == 0) return;
this->doDestroy();
this->m_name = 0;
this->m_context = 0;
}
virtual void doDestroy(void) = 0;
virtual bool doIsValid(void) const = 0;
};
namespace detail { template <typename T> struct ObjectBase { typedef NoBase Type; }; };
namespace detail { template <typename T> struct ObjectSafe { typedef NoBase Type; }; };
namespace detail { template <typename T> struct ObjectBound { typedef NoBase Type; }; };
namespace detail { template <> struct BaseOf <Object> { typedef NoBase Type; }; };
namespace detail { template <> struct DeleterOf <Object> { typedef ObjectDeleter Type; }; };
typedef detail::ObjectSharedPointerTraits <Object> ::Type ObjectPtr;
class SafeObject : public detail::NonCopyable
{
friend class Context;
friend class BoundObject;
public:
typedef detail::NonCopyable BaseType;
typedef SafeObject ThisType;
SafeObject(void)
: m_object(0)
{ {
; ;
} }
@ -76,67 +118,178 @@ class SafeObject
{ {
; ;
} }
bool isNull(void) const
{
return this->m_object.isNull();
}
bool isValid(void) const
{
return this->m_object->isValid();
}
const Context * context(void) const
{
if (this->isNull()) return 0;
return this->m_object->context();
}
Context * context(void)
{
if (this->isNull()) return 0;
return this->m_object->context();
}
GLuint name(void) const
{
if (this->isNull()) return 0;
return this->m_object->name();
}
Type type(void) const
{
if (this->isNull()) return NoType;
return this->m_object->type();
}
protected:
SafeObject(const ObjectPtr & object)
: m_object(object)
{
;
}
const ObjectPtr & object(void) const
{
return this->m_object;
}
ObjectPtr & object(void)
{
return this->m_object;
}
private:
ObjectPtr m_object;
}; };
class Object : public detail::NonCopyable, public virtual SafeObject namespace detail { template <> struct BaseOf <SafeObject> { typedef NoBase Type; }; };
namespace detail { template <> struct DeleterOf <SafeObject> { typedef DefaultDeleter<SafeObject> Type; }; };
namespace detail { template <> struct ObjectBase <SafeObject> { typedef Object Type; }; };
namespace detail { template <> struct ObjectSafe <Object > { typedef SafeObject Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeObject> ::Type ObjectHandle;
class ObjectBindingParams
{
public:
typedef void BaseType;
typedef ObjectBindingParams ThisType;
GLenum target;
GLint unit;
ObjectBindingParams(void)
: target (GL_NONE)
, unit (0)
{
;
}
ObjectBindingParams(GLenum aTarget, GLenum aUnit)
: target (aTarget)
, unit (aUnit)
{
;
}
};
class BoundObject : public detail::NonCopyable
{ {
friend class Context; friend class Context;
public: public:
typedef void BaseType; typedef detail::NonCopyable BaseType;
typedef SafeObject SafeType; typedef BoundObject ThisType;
typedef Object ThisType;
protected: BoundObject(void)
: m_handle (0)
GLenum m_target; , m_target (GL_NONE)
GLint m_unit; , m_unit (0)
Object(Context * ctx)
: SafeType (ctx)
, m_target (GL_NONE)
, m_unit (0)
{ {
; ;
} }
void destroy(void) virtual ~BoundObject(void)
{ {
if (!this->isValid()) return; ;
this->doDestroy(this->m_context, this->m_name);
this->m_context = 0;
this->m_name = 0;
} }
void setBinding(GLenum target, GLint unit) const bool isNull(void) const
{ {
ThisType * that = const_cast<ThisType *>(this); return this->m_handle.isNull();
that->m_target = target;
that->m_unit = unit;
} }
void bind(void) const ObjectHandle & handle(void) const
{ {
GLW_ASSERT(this->isValid()); return this->m_handle;
this->doBind();
} }
void unbind(void) ObjectHandle & handle(void)
{ {
GLW_ASSERT(this->isValid()); return this->m_handle;
this->doUnbind();
} }
virtual void doDestroy (Context * ctx, GLuint name) = 0; GLenum target(void) const
virtual void doBind (void) = 0; {
virtual void doUnbind (void) = 0; return this->m_target;
}
GLint unit(void) const
{
return this->m_unit;
}
protected:
ObjectHandle m_handle;
GLenum m_target;
GLint m_unit;
BoundObject(const ObjectHandle & handle, const ObjectBindingParams & params)
: m_handle (handle)
, m_target (params.target)
, m_unit (params.unit)
{
;
}
const ObjectPtr & object(void) const
{
return this->handle()->object();
}
ObjectPtr & object(void)
{
return this->handle()->object();
}
virtual void bind (void) = 0;
virtual void unbind (void) = 0;
}; };
typedef detail::SafeHandle <Object> ObjectHandle; namespace detail { template <typename T> struct ParamsOf { typedef NoBase Type; }; };
typedef detail::UnsafeHandle <Object> BoundObject;
namespace detail { template <> struct ParamsOf <BoundObject> { typedef ObjectBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundObject> { typedef NoBase Type; }; };
namespace detail { template <> struct DeleterOf <BoundObject> { typedef DefaultDeleter<BoundObject> Type; }; };
namespace detail { template <> struct ObjectBase <BoundObject> { typedef Object Type; }; };
namespace detail { template <> struct ObjectBound <Object > { typedef BoundObject Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundObject> ::Type BoundObjectHandle;
}; };

28
wrap/glw/objectdeleter.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef GLW_OBJECTDELETER_H
#define GLW_OBJECTDELETER_H
#include "./common.h"
namespace glw
{
class Object;
namespace detail
{
class ObjectDeleter
{
public:
typedef void BaseType;
typedef ObjectDeleter ThisType;
inline void operator () (Object * object) const;
};
};
};
#endif // GLW_OBJECTDELETER_H

View File

@ -182,8 +182,9 @@ class ProgramArguments : public ObjectArguments
FragmentOutputBinding fragmentOutputs; FragmentOutputBinding fragmentOutputs;
ProgramArguments(void) ProgramArguments(void)
: BaseType()
{ {
this->clear(); ;
} }
void clear(void) void clear(void)
@ -198,12 +199,24 @@ class ProgramArguments : public ObjectArguments
} }
}; };
class SafeProgram : public virtual SafeObject class Program : public Object
{ {
friend class Context;
public: public:
typedef SafeObject BaseType; typedef Object BaseType;
typedef SafeProgram ThisType; typedef Program ThisType;
virtual ~Program(void)
{
this->destroy();
}
virtual Type type(void) const
{
return ProgramType;
}
const ProgramArguments & arguments(void) const const ProgramArguments & arguments(void) const
{ {
@ -220,36 +233,6 @@ class SafeProgram : public virtual SafeObject
return this->m_linked; return this->m_linked;
} }
protected:
ProgramArguments m_arguments;
std::string m_log;
bool m_linked;
SafeProgram(Context * ctx)
: BaseType (ctx)
, m_linked (false)
{
;
}
};
class Program : public Object, public SafeProgram
{
friend class Context;
friend class detail::SharedObjectBinding<Program>;
public:
typedef Object BaseType;
typedef SafeProgram SafeType;
typedef Program ThisType;
virtual Type type(void) const
{
return ProgramType;
}
GLint getUniformLocation(const std::string & name) const GLint getUniformLocation(const std::string & name) const
{ {
GLW_ASSERT(this->m_uniforms.count(name) > 0); GLW_ASSERT(this->m_uniforms.count(name) > 0);
@ -296,18 +279,12 @@ class Program : public Object, public SafeProgram
protected: protected:
Program(Context * ctx) Program(Context * ctx)
: SafeObject (ctx) : BaseType (ctx)
, BaseType (ctx) , m_linked (false)
, SafeType (ctx)
{ {
; ;
} }
virtual ~Program(void)
{
this->destroy();
}
bool create(const ProgramArguments & args) bool create(const ProgramArguments & args)
{ {
this->destroy(); this->destroy();
@ -385,31 +362,22 @@ class Program : public Object, public SafeProgram
this->postLink(); this->postLink();
} }
this->setBinding(GL_CURRENT_PROGRAM, 0);
this->bind();
// TODO
// ... nothing to do ...
glUseProgram(boundName); glUseProgram(boundName);
return this->m_linked; return this->m_linked;
} }
virtual void doDestroy(Context * ctx, GLuint name) virtual void doDestroy()
{ {
(void)ctx; glDeleteProgram(this->m_name);
if (name == 0) return; this->m_arguments.clear();
glDeleteProgram(name); this->m_log.clear();
this->m_linked = false;
} }
virtual void doBind(void) virtual bool doIsValid(void) const
{ {
glUseProgram(this->m_name); return this->m_linked;
}
virtual void doUnbind(void)
{
glUseProgram(0);
} }
private: private:
@ -440,7 +408,10 @@ class Program : public Object, public SafeProgram
typedef UniformMap::iterator UniformMapIterator; typedef UniformMap::iterator UniformMapIterator;
typedef UniformMap::value_type UniformMapValue; typedef UniformMap::value_type UniformMapValue;
UniformMap m_uniforms; ProgramArguments m_arguments;
UniformMap m_uniforms;
std::string m_log;
bool m_linked;
static std::string getInfoLog(GLuint Program) static std::string getInfoLog(GLuint Program)
{ {
@ -496,9 +467,167 @@ class Program : public Object, public SafeProgram
} }
}; };
typedef detail::SafeHandle <Program> ProgramHandle; namespace detail { template <> struct BaseOf <Program> { typedef Object Type; }; };
typedef detail::UnsafeHandle <Program> BoundProgram; typedef detail::ObjectSharedPointerTraits <Program> ::Type ProgramPtr;
} // end namespace glw class SafeProgram : public SafeObject
{
friend class Context;
friend class BoundProgram;
public:
typedef SafeObject BaseType;
typedef SafeProgram ThisType;
const ProgramArguments & arguments(void) const
{
return this->object()->arguments();
}
const std::string & log(void) const
{
return this->object()->log();
}
bool isLinked(void) const
{
return this->object()->isLinked();
}
protected:
SafeProgram(const ProgramPtr & program)
: BaseType(program)
{
;
}
const ProgramPtr & object(void) const
{
return static_cast<const ProgramPtr &>(BaseType::object());
}
ProgramPtr & object(void)
{
return static_cast<ProgramPtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeProgram> { typedef SafeObject Type; }; };
namespace detail { template <> struct ObjectBase <SafeProgram> { typedef Program Type; }; };
namespace detail { template <> struct ObjectSafe <Program > { typedef SafeProgram Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeProgram> ::Type ProgramHandle;
class ProgramBindingParams : public ObjectBindingParams
{
public:
typedef ObjectBindingParams BaseType;
typedef ProgramBindingParams ThisType;
ProgramBindingParams(void)
: BaseType(GL_CURRENT_PROGRAM, 0)
{
;
}
};
class BoundProgram : public BoundObject
{
friend class Context;
public:
typedef BoundObject BaseType;
typedef BoundProgram ThisType;
BoundProgram(void)
: BaseType()
{
;
}
const ProgramHandle & handle(void) const
{
return static_cast<const ProgramHandle &>(BaseType::handle());
}
ProgramHandle & handle(void)
{
return static_cast<ProgramHandle &>(BaseType::handle());
}
#define _GLW_FORWARD_SCALAR_UNIFORM_(TYPE) \
void setUniform (const std::string & name, TYPE x ) { this->object()->setUniform(name, x ); } \
void setUniform (const std::string & name, TYPE x, TYPE y ) { this->object()->setUniform(name, x, y ); } \
void setUniform (const std::string & name, TYPE x, TYPE y, TYPE z ) { this->object()->setUniform(name, x, y, z ); } \
void setUniform (const std::string & name, TYPE x, TYPE y, TYPE z, TYPE w ) { this->object()->setUniform(name, x, y, z, w); }
#define _GLW_FORWARD_VECTOR_UNIFORM_(TYPE) \
void setUniform1 (const std::string & name, const TYPE * v, int count = 1) { this->object()->setUniform1(name, v, count); } \
void setUniform2 (const std::string & name, const TYPE * v, int count = 1) { this->object()->setUniform2(name, v, count); } \
void setUniform3 (const std::string & name, const TYPE * v, int count = 1) { this->object()->setUniform3(name, v, count); } \
void setUniform4 (const std::string & name, const TYPE * v, int count = 1) { this->object()->setUniform4(name, v, count); }
#define _GLW_FORWARD_MATRIX_UNIFORM_(TYPE) \
void setUniform2x2 (const std::string & name, const TYPE * m, bool transpose, int count = 1) { this->object()->setUniform2x2(name, m, transpose, count); } \
void setUniform2x3 (const std::string & name, const TYPE * m, bool transpose, int count = 1) { this->object()->setUniform2x3(name, m, transpose, count); } \
void setUniform2x4 (const std::string & name, const TYPE * m, bool transpose, int count = 1) { this->object()->setUniform2x4(name, m, transpose, count); } \
void setUniform3x2 (const std::string & name, const TYPE * m, bool transpose, int count = 1) { this->object()->setUniform3x2(name, m, transpose, count); } \
void setUniform3x3 (const std::string & name, const TYPE * m, bool transpose, int count = 1) { this->object()->setUniform3x3(name, m, transpose, count); } \
void setUniform3x4 (const std::string & name, const TYPE * m, bool transpose, int count = 1) { this->object()->setUniform3x4(name, m, transpose, count); } \
void setUniform4x2 (const std::string & name, const TYPE * m, bool transpose, int count = 1) { this->object()->setUniform4x2(name, m, transpose, count); } \
void setUniform4x3 (const std::string & name, const TYPE * m, bool transpose, int count = 1) { this->object()->setUniform4x3(name, m, transpose, count); } \
void setUniform4x4 (const std::string & name, const TYPE * m, bool transpose, int count = 1) { this->object()->setUniform4x4(name, m, transpose, count); }
_GLW_FORWARD_SCALAR_UNIFORM_(int)
_GLW_FORWARD_SCALAR_UNIFORM_(unsigned int)
_GLW_FORWARD_SCALAR_UNIFORM_(float)
_GLW_FORWARD_VECTOR_UNIFORM_(int)
_GLW_FORWARD_VECTOR_UNIFORM_(unsigned int)
_GLW_FORWARD_VECTOR_UNIFORM_(float)
_GLW_FORWARD_MATRIX_UNIFORM_(float)
#undef _GLW_FORWARD_SCALAR_UNIFORM_
#undef _GLW_FORWARD_VECTOR_UNIFORM_
#undef _GLW_FORWARD_MATRIX_UNIFORM_
protected:
BoundProgram(const ProgramHandle & handle, const ProgramBindingParams & params)
: BaseType(handle, params)
{
;
}
const ProgramPtr & object(void) const
{
return this->handle()->object();
}
ProgramPtr & object(void)
{
return this->handle()->object();
}
virtual void bind(void)
{
glUseProgram(this->object()->name());
}
virtual void unbind(void)
{
glUseProgram(0);
}
};
namespace detail { template <> struct ParamsOf <BoundProgram> { typedef ProgramBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundProgram> { typedef BoundObject Type; }; };
namespace detail { template <> struct ObjectBase <BoundProgram> { typedef Program Type; }; };
namespace detail { template <> struct ObjectBound <Program > { typedef BoundProgram Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundProgram> ::Type BoundProgramHandle;
};
#endif // GLW_PROGRAM_H #endif // GLW_PROGRAM_H

View File

@ -18,23 +18,34 @@ class RenderableArguments : public ObjectArguments
GLenum format; GLenum format;
RenderableArguments(void) RenderableArguments(void)
: BaseType ()
, format (GL_RGBA8)
{ {
this->clear(); ;
}
RenderableArguments(GLenum aFormat)
: BaseType ()
, format (aFormat)
{
;
} }
void clear(void) void clear(void)
{ {
BaseType::clear(); BaseType::clear();
this->format = GL_NONE; this->format = GL_RGBA8;
} }
}; };
class SafeRenderable : public virtual SafeObject class Renderable : public Object
{ {
friend class Context;
public: public:
typedef SafeObject BaseType; typedef Object BaseType;
typedef SafeRenderable ThisType; typedef Renderable ThisType;
GLenum format(void) const GLenum format(void) const
{ {
@ -48,7 +59,7 @@ class SafeRenderable : public virtual SafeObject
GLenum m_format; GLenum m_format;
SafeRenderable(Context * ctx) Renderable(Context * ctx)
: BaseType (ctx) : BaseType (ctx)
, m_format (GL_NONE) , m_format (GL_NONE)
{ {
@ -56,27 +67,133 @@ class SafeRenderable : public virtual SafeObject
} }
}; };
class Renderable : public Object, public virtual SafeRenderable namespace detail { template <> struct BaseOf <Renderable> { typedef Object Type; }; };
typedef detail::ObjectSharedPointerTraits <Renderable> ::Type RenderablePtr;
class SafeRenderable : public SafeObject
{ {
friend class Context;
friend class BoundRenderable;
public: public:
typedef Object BaseType; typedef SafeObject BaseType;
typedef SafeRenderable SafeType; typedef SafeRenderable ThisType;
typedef Renderable ThisType;
SafeRenderable(void)
: BaseType()
{
;
}
GLenum format(void) const
{
return this->object()->format();
}
int imageDimensions(void) const
{
return this->object()->imageDimensions();
}
bool isArray(void) const
{
return this->object()->isArray();
}
protected: protected:
Renderable(Context * ctx) SafeRenderable(const RenderablePtr & renderable)
: SafeObject (ctx) : BaseType(renderable)
, SafeType (ctx) {
, BaseType (ctx) ;
}
const RenderablePtr & object(void) const
{
return static_cast<const RenderablePtr &>(BaseType::object());
}
RenderablePtr & object(void)
{
return static_cast<RenderablePtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeRenderable> { typedef SafeObject Type; }; };
namespace detail { template <> struct ObjectBase <SafeRenderable> { typedef Renderable Type; }; };
namespace detail { template <> struct ObjectSafe <Renderable > { typedef SafeRenderable Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeRenderable> ::Type RenderableHandle;
class RenderableBindingParams : public ObjectBindingParams
{
public:
typedef ObjectBindingParams BaseType;
typedef RenderableBindingParams ThisType;
RenderableBindingParams(void)
: BaseType()
{
;
}
RenderableBindingParams(GLenum aTarget, GLenum aUnit)
: BaseType(aTarget, aUnit)
{ {
; ;
} }
}; };
typedef detail::SafeHandle <Renderable> RenderableHandle; class BoundRenderable : public BoundObject
typedef detail::UnsafeHandle <Renderable> BoundRenderable; {
friend class Context;
public:
typedef BoundObject BaseType;
typedef BoundRenderable ThisType;
BoundRenderable(void)
: BaseType()
{
;
}
const RenderableHandle & handle(void) const
{
return static_cast<const RenderableHandle &>(BaseType::handle());
}
RenderableHandle & handle(void)
{
return static_cast<RenderableHandle &>(BaseType::handle());
}
protected:
BoundRenderable(const RenderableHandle & handle, const RenderableBindingParams & params)
: BaseType(handle, params)
{
;
}
const RenderablePtr & object(void) const
{
return this->handle()->object();
}
RenderablePtr & object(void)
{
return this->handle()->object();
}
};
namespace detail { template <> struct ParamsOf <BoundRenderable> { typedef RenderableBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundRenderable> { typedef BoundObject Type; }; };
namespace detail { template <> struct ObjectBase <BoundRenderable> { typedef Renderable Type; }; };
namespace detail { template <> struct ObjectBound <Renderable > { typedef BoundRenderable Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundRenderable> ::Type BoundRenderableHandle;
}; };

View File

@ -17,8 +17,18 @@ class RenderbufferArguments : public RenderableArguments
GLsizei height; GLsizei height;
RenderbufferArguments(void) RenderbufferArguments(void)
: BaseType ()
, width (0)
, height (0)
{ {
this->clear(); }
RenderbufferArguments(GLenum aFormat, GLsizei aWidth, GLsizei aHeight)
: BaseType (aFormat)
, width (aWidth)
, height (aHeight)
{
;
} }
void clear(void) void clear(void)
@ -29,48 +39,19 @@ class RenderbufferArguments : public RenderableArguments
} }
}; };
class SafeRenderbuffer : public virtual SafeRenderable class Renderbuffer : public Renderable
{
public:
typedef SafeRenderable BaseType;
typedef SafeRenderbuffer ThisType;
GLsizei width(void) const
{
return this->m_width;
}
GLsizei height(void) const
{
return this->m_height;
}
protected:
GLsizei m_width;
GLsizei m_height;
SafeRenderbuffer(Context * ctx)
: SafeObject (ctx)
, BaseType (ctx)
, m_width (0)
, m_height (0)
{
;
}
};
class Renderbuffer : public Renderable, public SafeRenderbuffer
{ {
friend class Context; friend class Context;
friend class detail::SharedObjectBinding<Renderbuffer>;
public: public:
typedef Renderable BaseType; typedef Renderable BaseType;
typedef SafeRenderbuffer SafeType; typedef Renderbuffer ThisType;
typedef Renderbuffer ThisType;
virtual ~Renderbuffer(void)
{
this->destroy();
}
virtual Type type(void) const virtual Type type(void) const
{ {
@ -87,72 +68,180 @@ class Renderbuffer : public Renderable, public SafeRenderbuffer
return false; return false;
} }
protected: void setStorage(GLenum target, GLint unit, GLenum format, GLsizei width, GLsizei height)
Renderbuffer(Context * ctx)
: SafeObject (ctx)
, SafeRenderable (ctx)
, BaseType (ctx)
, SafeType (ctx)
{ {
; (void)unit;
GLW_ASSERT(this->isValid());
glRenderbufferStorage(target, format, width, height);
this->m_format = format;
this->m_width = width;
this->m_height = height;
} }
virtual ~Renderbuffer(void) protected:
GLsizei m_width;
GLsizei m_height;
Renderbuffer(Context * ctx)
: BaseType (ctx)
, m_width (0)
, m_height (0)
{ {
this->destroy(); ;
} }
bool create(const RenderbufferArguments & args) bool create(const RenderbufferArguments & args)
{ {
this->destroy(); this->destroy();
GLint boundName = 0; GLint boundName = 0;
glGetIntegerv(GL_RENDERBUFFER_BINDING, &boundName); glGetIntegerv(GL_RENDERBUFFER_BINDING, &boundName);
glGenRenderbuffers(1, &(this->m_name)); glGenRenderbuffers(1, &(this->m_name));
this->setBinding(GL_RENDERBUFFER, 0); glBindRenderbuffer(GL_RENDERBUFFER, this->m_name);
this->bind(); glRenderbufferStorage(GL_RENDERBUFFER, args.format, args.width, args.height);
this->allocate(args.format, args.width, args.height);
glBindRenderbuffer(GL_RENDERBUFFER, boundName); glBindRenderbuffer(GL_RENDERBUFFER, boundName);
this->m_format = args.format;
this->m_width = args.width;
this->m_height = args.height;
return true; return true;
} }
virtual void doDestroy(Context * ctx, GLuint name) virtual void doDestroy(void)
{ {
(void)ctx; glDeleteRenderbuffers(1, &(this->m_name));
if (name == 0) return;
this->m_format = GL_NONE; this->m_format = GL_NONE;
this->m_width = 0; this->m_width = 0;
this->m_height = 0; this->m_height = 0;
glDeleteRenderbuffers(1, &name);
} }
virtual void doBind(void) virtual bool doIsValid(void) const
{ {
glBindRenderbuffer(this->m_target, this->m_name); return ((this->m_format != GL_NONE) && (this->m_width > 0) && (this->m_height > 0));
}
virtual void doUnbind(void)
{
glBindRenderbuffer(this->m_target, 0);
}
void allocate(GLenum format, GLsizei width, GLsizei height)
{
GLW_ASSERT(this->isValid());
glRenderbufferStorage(this->m_target, format, width, height);
this->m_format = format;
this->m_width = width;
this->m_height = height;
} }
}; };
typedef detail::SafeHandle <Renderbuffer> RenderbufferHandle; namespace detail { template <> struct BaseOf <Renderbuffer> { typedef Renderable Type; }; };
typedef detail::UnsafeHandle <Renderbuffer> BoundRenderbuffer; typedef detail::ObjectSharedPointerTraits <Renderbuffer> ::Type RenderbufferPtr;
} // end namespace glw class SafeRenderbuffer : public SafeRenderable
{
friend class Context;
friend class BoundRenderbuffer;
public:
typedef SafeRenderable BaseType;
typedef SafeRenderbuffer ThisType;
SafeRenderbuffer(void)
: BaseType()
{
;
}
protected:
SafeRenderbuffer(const RenderbufferPtr & renderbuffer)
: BaseType(renderbuffer)
{
;
}
const RenderbufferPtr & object(void) const
{
return static_cast<const RenderbufferPtr &>(BaseType::object());
}
RenderbufferPtr & object(void)
{
return static_cast<RenderbufferPtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeRenderbuffer> { typedef SafeRenderable Type; }; };
namespace detail { template <> struct ObjectBase <SafeRenderbuffer> { typedef Renderbuffer Type; }; };
namespace detail { template <> struct ObjectSafe <Renderbuffer > { typedef SafeRenderbuffer Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeRenderbuffer> ::Type RenderbufferHandle;
class RenderbufferBindingParams : public RenderableBindingParams
{
public:
typedef RenderableBindingParams BaseType;
typedef RenderbufferBindingParams ThisType;
RenderbufferBindingParams(void)
: BaseType(GL_RENDERBUFFER, 0)
{
;
}
};
class BoundRenderbuffer : public BoundRenderable
{
friend class Context;
public:
typedef BoundRenderable BaseType;
typedef BoundRenderbuffer ThisType;
BoundRenderbuffer(void)
: BaseType()
{
;
}
const RenderbufferHandle & handle(void) const
{
return static_cast<const RenderbufferHandle &>(BaseType::handle());
}
RenderbufferHandle & handle(void)
{
return static_cast<RenderbufferHandle &>(BaseType::handle());
}
void setStorage(GLenum format, GLsizei width, GLsizei height)
{
this->object()->setStorage(this->m_target, this->m_unit, format, width, height);
}
protected:
BoundRenderbuffer(const RenderbufferHandle & handle, const RenderbufferBindingParams & params)
: BaseType(handle, params)
{
;
}
const RenderbufferPtr & object(void) const
{
return this->handle()->object();
}
RenderbufferPtr & object(void)
{
return this->handle()->object();
}
virtual void bind(void)
{
glBindRenderbuffer(this->m_target, this->object()->name());
}
virtual void unbind(void)
{
glBindRenderbuffer(this->m_target, 0);
}
};
namespace detail { template <> struct ParamsOf <BoundRenderbuffer> { typedef RenderbufferBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundRenderbuffer> { typedef BoundObject Type; }; };
namespace detail { template <> struct ObjectBase <BoundRenderbuffer> { typedef Renderbuffer Type; }; };
namespace detail { template <> struct ObjectBound <Renderbuffer > { typedef BoundRenderbuffer Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundRenderbuffer> ::Type BoundRenderbufferHandle;
};
#endif // GLW_RENDERBUFFER_H #endif // GLW_RENDERBUFFER_H

View File

@ -18,8 +18,9 @@ class ShaderArguments : public ObjectArguments
std::string source; std::string source;
ShaderArguments(void) ShaderArguments(void)
: BaseType()
{ {
this->clear(); ;
} }
void clear(void) void clear(void)
@ -29,12 +30,19 @@ class ShaderArguments : public ObjectArguments
} }
}; };
class SafeShader : public virtual SafeObject class Shader : public Object
{ {
friend class Context;
public: public:
typedef SafeObject BaseType; typedef Object BaseType;
typedef SafeShader ThisType; typedef Shader ThisType;
virtual ~Shader(void)
{
this->destroy();
}
const std::string & source(void) const const std::string & source(void) const
{ {
@ -57,77 +65,39 @@ class SafeShader : public virtual SafeObject
std::string m_log; std::string m_log;
bool m_compiled; bool m_compiled;
SafeShader(Context * ctx) Shader(Context * ctx)
: BaseType (ctx) : BaseType (ctx)
, m_compiled (false) , m_compiled (false)
{ {
; ;
} }
};
class Shader : public Object, public virtual SafeShader
{
public:
typedef Object BaseType;
typedef SafeShader SafeType;
typedef Shader ThisType;
protected:
Shader(Context * ctx)
: SafeObject (ctx)
, SafeType (ctx)
, BaseType (ctx)
{
;
}
virtual ~Shader(void)
{
this->destroy();
}
virtual GLenum shaderType(void) const = 0; virtual GLenum shaderType(void) const = 0;
bool create(const ShaderArguments & args) bool create(const ShaderArguments & args)
{ {
this->destroy(); this->destroy();
const GLenum shType = this->shaderType(); const GLenum shType = this->shaderType();
this->m_name = glCreateShader(shType); this->m_name = glCreateShader(shType);
this->setBinding(shType, 0);
this->bind();
this->compile(args.source); this->compile(args.source);
return this->m_compiled; return this->m_compiled;
} }
virtual void doDestroy(Context * ctx, GLuint name) virtual void doDestroy(void)
{ {
(void)ctx; glDeleteShader(this->m_name);
if (name == 0) return;
this->m_source.clear(); this->m_source.clear();
this->m_log.clear(); this->m_log.clear();
this->m_compiled = false; this->m_compiled = false;
glDeleteShader(name);
} }
virtual void doBind(void) virtual bool doIsValid(void) const
{ {
; return this->m_compiled;
}
virtual void doUnbind(void)
{
;
} }
void compile(const std::string & source) void compile(const std::string & source)
{ {
GLW_ASSERT(this->isValid());
const char * src = source.c_str(); const char * src = source.c_str();
glShaderSource(this->m_name, 1, &src, 0); glShaderSource(this->m_name, 1, &src, 0);
glCompileShader(this->m_name); glCompileShader(this->m_name);
@ -166,9 +136,144 @@ class Shader : public Object, public virtual SafeShader
} }
}; };
typedef detail::SafeHandle <Shader> ShaderHandle; namespace detail { template <> struct BaseOf <Shader> { typedef Object Type; }; };
typedef detail::UnsafeHandle <Shader> BoundShader; typedef detail::ObjectSharedPointerTraits <Shader> ::Type ShaderPtr;
} // end namespace glw class SafeShader : public SafeObject
{
friend class Context;
friend class BoundShader;
public:
typedef SafeObject BaseType;
typedef SafeShader ThisType;
SafeShader(void)
: BaseType()
{
;
}
const std::string & source(void) const
{
return this->object()->source();
}
const std::string & log(void) const
{
return this->object()->log();
}
bool isCompiled(void) const
{
return this->object()->isCompiled();
}
protected:
SafeShader(const ShaderPtr & shader)
: BaseType(shader)
{
;
}
const ShaderPtr & object(void) const
{
return static_cast<const ShaderPtr &>(BaseType::object());
}
ShaderPtr & object(void)
{
return static_cast<ShaderPtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeShader> { typedef SafeObject Type; }; };
namespace detail { template <> struct ObjectBase <SafeShader> { typedef Shader Type; }; };
namespace detail { template <> struct ObjectSafe <Shader > { typedef SafeShader Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeShader> ::Type ShaderHandle;
class ShaderBindingParams : public ObjectBindingParams
{
public:
typedef ObjectBindingParams BaseType;
typedef ShaderBindingParams ThisType;
ShaderBindingParams(void)
: BaseType()
{
;
}
ShaderBindingParams(GLenum aTarget, GLenum aUnit)
: BaseType(aTarget, aUnit)
{
;
}
};
class BoundShader : public BoundObject
{
friend class Context;
public:
typedef BoundObject BaseType;
typedef BoundShader ThisType;
BoundShader(void)
: BaseType()
{
;
}
const ShaderHandle & handle(void) const
{
return static_cast<const ShaderHandle &>(BaseType::handle());
}
ShaderHandle & handle(void)
{
return static_cast<ShaderHandle &>(BaseType::handle());
}
protected:
BoundShader(const ShaderHandle & handle, const ShaderBindingParams & params)
: BaseType(handle, params)
{
;
}
const ShaderPtr & object(void) const
{
return this->handle()->object();
}
ShaderPtr & object(void)
{
return this->handle()->object();
}
virtual void bind(void)
{
;
}
virtual void unbind(void)
{
;
}
};
namespace detail { template <> struct ParamsOf <BoundShader> { typedef ShaderBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundShader> { typedef BoundObject Type; }; };
namespace detail { template <> struct ObjectBase <BoundShader> { typedef Shader Type; }; };
namespace detail { template <> struct ObjectBound <Shader > { typedef BoundShader Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundShader> ::Type BoundShaderHandle;
};
#endif // GLW_SHADER_H #endif // GLW_SHADER_H

View File

@ -44,7 +44,7 @@ class TextureSampleMode
} }
}; };
inline TextureSampleMode texSampleMode(GLenum minFilter = GLW_DONT_CARE, GLenum magFilter = GLW_DONT_CARE, GLenum wrapS = GLW_DONT_CARE, GLenum wrapT = GLW_DONT_CARE, GLenum wrapR = GLW_DONT_CARE) inline TextureSampleMode textureSampleMode(GLenum minFilter = GLW_DONT_CARE, GLenum magFilter = GLW_DONT_CARE, GLenum wrapS = GLW_DONT_CARE, GLenum wrapT = GLW_DONT_CARE, GLenum wrapR = GLW_DONT_CARE)
{ {
return TextureSampleMode(minFilter, magFilter, wrapS, wrapT, wrapR); return TextureSampleMode(minFilter, magFilter, wrapS, wrapT, wrapR);
} }
@ -67,69 +67,158 @@ class TextureArguments : public RenderableArguments
} }
}; };
class SafeTexture : public virtual SafeRenderable class Texture : public Renderable
{ {
public: friend class Context;
typedef SafeRenderable BaseType;
typedef SafeTexture ThisType;
protected:
SafeTexture(Context * ctx)
: SafeObject (ctx)
, BaseType (ctx)
{
;
}
};
class Texture : public Renderable, public virtual SafeTexture
{
public: public:
typedef Renderable BaseType; typedef Renderable BaseType;
typedef SafeTexture SafeType;
typedef Texture ThisType; typedef Texture ThisType;
protected:
Texture(Context * ctx)
: SafeObject (ctx)
, SafeRenderable (ctx)
, SafeType (ctx)
, BaseType (ctx)
{
;
}
virtual ~Texture(void) virtual ~Texture(void)
{ {
this->destroy(); this->destroy();
} }
virtual void doDestroy(Context * ctx, GLuint name) protected:
Texture(Context * ctx)
: BaseType(ctx)
{ {
(void)ctx; ;
if (name == 0) return;
glDeleteTextures(1, &name);
} }
virtual void doBind(void) virtual void doDestroy(void)
{
glDeleteTextures(1, &(this->m_name));
}
};
namespace detail { template <> struct BaseOf <Texture> { typedef Renderable Type; }; };
typedef detail::ObjectSharedPointerTraits <Texture> ::Type TexturePtr;
class SafeTexture : public SafeRenderable
{
friend class Context;
friend class BoundTexture;
public:
typedef SafeRenderable BaseType;
typedef SafeTexture ThisType;
SafeTexture(void)
: BaseType()
{
;
}
protected:
SafeTexture(const TexturePtr & texture)
: BaseType(texture)
{
;
}
const TexturePtr & object(void) const
{
return static_cast<const TexturePtr &>(BaseType::object());
}
TexturePtr & object(void)
{
return static_cast<TexturePtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeTexture> { typedef SafeRenderable Type; }; };
namespace detail { template <> struct ObjectBase <SafeTexture> { typedef Texture Type; }; };
namespace detail { template <> struct ObjectSafe <Texture > { typedef SafeTexture Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeTexture> ::Type TextureHandle;
class TextureBindingParams : public RenderableBindingParams
{
public:
typedef RenderableBindingParams BaseType;
typedef TextureBindingParams ThisType;
TextureBindingParams(void)
: BaseType()
{
;
}
TextureBindingParams(GLenum aTarget, GLenum aUnit)
: BaseType(aTarget, aUnit)
{
;
}
};
class BoundTexture : public BoundRenderable
{
friend class Context;
public:
typedef BoundRenderable BaseType;
typedef BoundTexture ThisType;
BoundTexture(void)
: BaseType()
{
;
}
const TextureHandle & handle(void) const
{
return static_cast<const TextureHandle &>(BaseType::handle());
}
TextureHandle & handle(void)
{
return static_cast<TextureHandle &>(BaseType::handle());
}
protected:
BoundTexture(const TextureHandle & handle, const TextureBindingParams & params)
: BaseType(handle, params)
{
;
}
const TexturePtr & object(void) const
{
return this->handle()->object();
}
TexturePtr & object(void)
{
return this->handle()->object();
}
virtual void bind(void)
{ {
glActiveTexture(GL_TEXTURE0 + this->m_unit); glActiveTexture(GL_TEXTURE0 + this->m_unit);
glBindTexture(this->m_target, this->m_name); glBindTexture(this->m_target, this->object()->name());
} }
virtual void doUnbind(void) virtual void unbind(void)
{ {
glActiveTexture(GL_TEXTURE0 + this->m_unit); glActiveTexture(GL_TEXTURE0 + this->m_unit);
glBindTexture(this->m_target, 0); glBindTexture(this->m_target, 0);
} }
}; };
typedef detail::SafeHandle <Texture> TextureHandle; namespace detail { template <> struct ParamsOf <BoundTexture> { typedef TextureBindingParams Type; }; };
typedef detail::UnsafeHandle <Texture> BoundTexture; namespace detail { template <> struct BaseOf <BoundTexture> { typedef BoundObject Type; }; };
namespace detail { template <> struct ObjectBase <BoundTexture> { typedef Texture Type; }; };
namespace detail { template <> struct ObjectBound <Texture > { typedef BoundTexture Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundTexture> ::Type BoundTextureHandle;
}; };

View File

@ -37,49 +37,14 @@ class Texture2DArguments : public TextureArguments
} }
}; };
class SafeTexture2D : public virtual SafeTexture class Texture2D : public Texture
{
public:
typedef SafeTexture BaseType;
typedef SafeTexture2D ThisType;
GLsizei width(void) const
{
return this->m_width;
}
GLsizei height(void) const
{
return this->m_height;
}
protected:
GLsizei m_width;
GLsizei m_height;
SafeTexture2D(Context * ctx)
: SafeObject (ctx)
, SafeRenderable (ctx)
, BaseType (ctx)
, m_width (0)
, m_height (0)
{
;
}
};
class Texture2D : public Texture, public SafeTexture2D
{ {
friend class Context; friend class Context;
friend class detail::SharedObjectBinding<Texture2D>;
public: public:
typedef Texture BaseType; typedef Texture BaseType;
typedef SafeTexture2D SafeType; typedef Texture2D ThisType;
typedef Texture ThisType;
virtual Type type(void) const virtual Type type(void) const
{ {
@ -96,41 +61,46 @@ class Texture2D : public Texture, public SafeTexture2D
return false; return false;
} }
void allocateLevel(GLint level, GLsizei width, GLsizei height, GLenum dataFormat, GLenum dataType, const void * data) void setImage(GLenum target, GLint unit, GLint level, GLsizei width, GLsizei height, GLenum dataFormat, GLenum dataType, const void * data)
{ {
(void)unit;
GLW_ASSERT(this->isValid()); GLW_ASSERT(this->isValid());
glTexImage2D(this->m_target, level, this->m_format, width, height, 0, dataFormat, dataType, data); glTexImage2D(target, level, this->m_format, width, height, 0, dataFormat, dataType, data);
} }
void setSubImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum dataFormat, GLenum dataType, const void * data) void setSubImage(GLenum target, GLint unit, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum dataFormat, GLenum dataType, const void * data)
{ {
(void)unit;
GLW_ASSERT(this->isValid()); GLW_ASSERT(this->isValid());
glTexSubImage2D(this->m_target, level, xoffset, yoffset, width, height, dataFormat, dataType, data); glTexSubImage2D(target, level, xoffset, yoffset, width, height, dataFormat, dataType, data);
} }
void generateMipmap(void) void generateMipmap(GLenum target, GLint unit)
{ {
(void)unit;
GLW_ASSERT(this->isValid()); GLW_ASSERT(this->isValid());
glGenerateMipmap(this->m_target); glGenerateMipmap(target);
} }
void setSampleMode(const TextureSampleMode & sampler) void setSampleMode(GLenum target, GLint unit, const TextureSampleMode & sampler)
{ {
(void)unit;
GLW_ASSERT(this->isValid()); GLW_ASSERT(this->isValid());
if (GLW_CARE_OF(sampler.minFilter)) glTexParameteri(this->m_target, GL_TEXTURE_MIN_FILTER, sampler.minFilter); if (GLW_CARE_OF(sampler.minFilter)) glTexParameteri(target, GL_TEXTURE_MIN_FILTER, sampler.minFilter);
if (GLW_CARE_OF(sampler.magFilter)) glTexParameteri(this->m_target, GL_TEXTURE_MAG_FILTER, sampler.magFilter); if (GLW_CARE_OF(sampler.magFilter)) glTexParameteri(target, GL_TEXTURE_MAG_FILTER, sampler.magFilter);
if (GLW_CARE_OF(sampler.wrapS )) glTexParameteri(this->m_target, GL_TEXTURE_WRAP_S, sampler.wrapS ); if (GLW_CARE_OF(sampler.wrapS )) glTexParameteri(target, GL_TEXTURE_WRAP_S, sampler.wrapS );
if (GLW_CARE_OF(sampler.wrapT )) glTexParameteri(this->m_target, GL_TEXTURE_WRAP_T, sampler.wrapT ); if (GLW_CARE_OF(sampler.wrapT )) glTexParameteri(target, GL_TEXTURE_WRAP_T, sampler.wrapT );
} }
protected: protected:
GLsizei m_width;
GLsizei m_height;
Texture2D(Context * ctx) Texture2D(Context * ctx)
: SafeObject (ctx) : BaseType (ctx)
, SafeRenderable (ctx) , m_width (0)
, SafeTexture (ctx) , m_height (0)
, BaseType (ctx)
, SafeType (ctx)
{ {
; ;
} }
@ -138,38 +108,146 @@ class Texture2D : public Texture, public SafeTexture2D
bool create(const Texture2DArguments & args) bool create(const Texture2DArguments & args)
{ {
this->destroy(); this->destroy();
GLint activeUnit = 0;
glGetIntegerv(GL_ACTIVE_TEXTURE, &activeUnit);
GLint boundName = 0; GLint boundName = 0;
glGetIntegerv(GL_TEXTURE_BINDING_2D, &boundName); glGetIntegerv(GL_TEXTURE_BINDING_2D, &boundName);
glGenTextures(1, &(this->m_name));
glGenRenderbuffers(1, &(this->m_name)); glBindTexture(GL_TEXTURE_2D, this->m_name);
this->setBinding(GL_TEXTURE_2D, 0); glTexImage2D(GL_TEXTURE_2D, 0, args.format, args.width, args.height, 0, args.dataFormat, args.dataType, args.data);
this->bind(); this->m_format = args.format;
this->allocate(args.format, args.width, args.height, args.dataFormat, args.dataType, args.data); this->m_width = args.width;
this->setSampleMode(args.sampler); this->m_height = args.height;
this->setSampleMode(GL_TEXTURE_2D, 0, args.sampler);
glActiveTexture(activeUnit);
glBindTexture(GL_TEXTURE_2D, boundName); glBindTexture(GL_TEXTURE_2D, boundName);
return true; return true;
} }
void allocate(GLenum format, GLsizei width, GLsizei height, GLenum dataFormat, GLenum dataType, const void * data) virtual void doDestroy(void)
{ {
GLW_ASSERT(this->isValid()); BaseType::doDestroy();
glTexImage2D(this->m_target, 0, format, width, height, 0, dataFormat, dataType, data); this->m_format = GL_NONE;
this->m_format = format; this->m_width = 0;
this->m_width = width; this->m_height = 0;
this->m_height = height; }
virtual bool doIsValid(void) const
{
return ((this->m_format != GL_NONE) && (this->m_width > 0) && (this->m_height > 0));
} }
}; };
typedef detail::SafeHandle <Texture2D> Texture2DHandle; namespace detail { template <> struct BaseOf <Texture2D> { typedef Texture Type; }; };
typedef detail::UnsafeHandle <Texture2D> BoundTexture2D; typedef detail::ObjectSharedPointerTraits <Texture2D> ::Type Texture2DPtr;
} // end namespace glw class SafeTexture2D : public SafeTexture
{
friend class Context;
friend class BoundTexture2D;
public:
typedef SafeTexture BaseType;
typedef SafeTexture2D ThisType;
SafeTexture2D(void)
: BaseType()
{
;
}
protected:
SafeTexture2D(const Texture2DPtr & texture2D)
: BaseType(texture2D)
{
;
}
const Texture2DPtr & object(void) const
{
return static_cast<const Texture2DPtr &>(BaseType::object());
}
Texture2DPtr & object(void)
{
return static_cast<Texture2DPtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeTexture2D> { typedef SafeTexture Type; }; };
namespace detail { template <> struct ObjectBase <SafeTexture2D> { typedef Texture2D Type; }; };
namespace detail { template <> struct ObjectSafe <Texture2D > { typedef SafeTexture2D Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeTexture2D> ::Type Texture2DHandle;
class Texture2DBindingParams : public TextureBindingParams
{
public:
typedef TextureBindingParams BaseType;
typedef Texture2DBindingParams ThisType;
Texture2DBindingParams(void)
: BaseType()
{
;
}
Texture2DBindingParams(GLenum aUnit)
: BaseType(GL_TEXTURE_2D, aUnit)
{
;
}
};
class BoundTexture2D : public BoundTexture
{
friend class Context;
public:
typedef BoundTexture BaseType;
typedef BoundTexture2D ThisType;
BoundTexture2D(void)
: BaseType()
{
;
}
const Texture2DHandle & handle(void) const
{
return static_cast<const Texture2DHandle &>(BaseType::handle());
}
Texture2DHandle & handle(void)
{
return static_cast<Texture2DHandle &>(BaseType::handle());
}
protected:
BoundTexture2D(const Texture2DHandle & handle, const Texture2DBindingParams & params)
: BaseType(handle, params)
{
;
}
const Texture2DPtr & object(void) const
{
return this->handle()->object();
}
Texture2DPtr & object(void)
{
return this->handle()->object();
}
};
namespace detail { template <> struct ParamsOf <BoundTexture2D> { typedef Texture2DBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundTexture2D> { typedef BoundObject Type; }; };
namespace detail { template <> struct ObjectBase <BoundTexture2D> { typedef Texture2D Type; }; };
namespace detail { template <> struct ObjectBound <Texture2D > { typedef BoundTexture2D Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundTexture2D> ::Type BoundTexture2DHandle;
};
#endif // GLW_TEXTURE2D_H #endif // GLW_TEXTURE2D_H

View File

@ -283,6 +283,6 @@ inline ProgramHandle loadProgram(Context & ctx, const std::string & srcPrefix, c
return loadProgram(ctx, srcPrefix, vertexFile, "", fragmentFile.c_str(), args); return loadProgram(ctx, srcPrefix, vertexFile, "", fragmentFile.c_str(), args);
} }
} // end namespace glw };
#endif // GLW_UTILITY_H #endif // GLW_UTILITY_H

View File

@ -14,8 +14,9 @@ class VertexShaderArguments : public ShaderArguments
typedef VertexShaderArguments ThisType; typedef VertexShaderArguments ThisType;
VertexShaderArguments(void) VertexShaderArguments(void)
: BaseType()
{ {
this->clear(); ;
} }
void clear(void) void clear(void)
@ -24,33 +25,14 @@ class VertexShaderArguments : public ShaderArguments
} }
}; };
class SafeVertexShader : public virtual SafeShader class VertexShader : public Shader
{
public:
typedef SafeShader BaseType;
typedef SafeVertexShader ThisType;
protected:
SafeVertexShader(Context * ctx)
: SafeObject (ctx)
, BaseType (ctx)
{
;
}
};
class VertexShader : public Shader, public SafeVertexShader
{ {
friend class Context; friend class Context;
friend class detail::SharedObjectBinding<VertexShader>;
public: public:
typedef Shader BaseType; typedef Shader BaseType;
typedef SafeVertexShader SafeType; typedef VertexShader ThisType;
typedef VertexShader ThisType;
virtual Type type(void) const virtual Type type(void) const
{ {
@ -60,10 +42,7 @@ class VertexShader : public Shader, public SafeVertexShader
protected: protected:
VertexShader(Context * ctx) VertexShader(Context * ctx)
: SafeObject (ctx) : BaseType(ctx)
, SafeShader (ctx)
, BaseType (ctx)
, SafeType (ctx)
{ {
; ;
} }
@ -79,9 +58,101 @@ class VertexShader : public Shader, public SafeVertexShader
} }
}; };
typedef detail::SafeHandle <VertexShader> VertexShaderHandle; namespace detail { template <> struct BaseOf <VertexShader> { typedef Shader Type; }; };
typedef detail::UnsafeHandle <VertexShader> BoundVertexShader; typedef detail::ObjectSharedPointerTraits <VertexShader> ::Type VertexShaderPtr;
} // end namespace glw class SafeVertexShader : public SafeShader
{
friend class Context;
friend class BoundVertexShader;
public:
typedef SafeShader BaseType;
typedef SafeVertexShader ThisType;
protected:
SafeVertexShader(const VertexShaderPtr & vertexShader)
: BaseType(vertexShader)
{
;
}
const VertexShaderPtr & object(void) const
{
return static_cast<const VertexShaderPtr &>(BaseType::object());
}
VertexShaderPtr & object(void)
{
return static_cast<VertexShaderPtr &>(BaseType::object());
}
};
namespace detail { template <> struct BaseOf <SafeVertexShader> { typedef SafeShader Type; }; };
namespace detail { template <> struct ObjectBase <SafeVertexShader> { typedef VertexShader Type; }; };
namespace detail { template <> struct ObjectSafe <VertexShader > { typedef SafeVertexShader Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeVertexShader> ::Type VertexShaderHandle;
class VertexShaderBindingParams : public ShaderBindingParams
{
public:
typedef ShaderBindingParams BaseType;
typedef VertexShaderBindingParams ThisType;
VertexShaderBindingParams(void)
: BaseType(GL_VERTEX_SHADER, 0)
{
;
}
};
class BoundVertexShader : public BoundShader
{
friend class Context;
public:
typedef BoundShader BaseType;
typedef BoundVertexShader ThisType;
const VertexShaderHandle & handle(void) const
{
return static_cast<const VertexShaderHandle &>(BaseType::handle());
}
VertexShaderHandle & handle(void)
{
return static_cast<VertexShaderHandle &>(BaseType::handle());
}
protected:
BoundVertexShader(const VertexShaderHandle & handle, const ShaderBindingParams & params)
: BaseType(handle, params)
{
;
}
const VertexShaderPtr & object(void) const
{
return this->handle()->object();
}
VertexShaderPtr & object(void)
{
return this->handle()->object();
}
};
namespace detail { template <> struct ParamsOf <BoundVertexShader> { typedef VertexShaderBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundVertexShader> { typedef BoundShader Type; }; };
namespace detail { template <> struct ObjectBase <BoundVertexShader> { typedef VertexShader Type; }; };
namespace detail { template <> struct ObjectBound <VertexShader > { typedef BoundVertexShader Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundVertexShader> ::Type BoundVertexShaderHandle;
};
#endif // GLW_VERTEXSHADER_H #endif // GLW_VERTEXSHADER_H