15abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick//
25abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
35abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Use of this source code is governed by a BSD-style license that can be
45abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// found in the LICENSE file.
55abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick//
65abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
75abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// RefCountObject.h: Defines the gl::RefCountObject base class that provides
85abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// lifecycle support for GL objects using the traditional BindObject scheme, but
95abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// that need to be reference counted for correct cross-context deletion.
105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// (Concretely, textures, buffers and renderbuffers.)
115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#ifndef LIBGLESV2_REFCOUNTOBJECT_H_
135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#define LIBGLESV2_REFCOUNTOBJECT_H_
145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include <cstddef>
165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#define GL_APICALL
185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include <GLES2/gl2.h>
195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "common/debug.h"
215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricknamespace gl
235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass RefCountObject
265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick  public:
285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    explicit RefCountObject(GLuint id);
295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    virtual ~RefCountObject();
305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    virtual void addRef() const;
325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    virtual void release() const;
335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    GLuint id() const { return mId; }
355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick  private:
375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    GLuint mId;
385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    mutable std::size_t mRefCount;
405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick};
415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass RefCountObjectBindingPointer
435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick  protected:
455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    RefCountObjectBindingPointer() : mObject(NULL) { }
465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ~RefCountObjectBindingPointer() { ASSERT(mObject == NULL); } // Objects have to be released before the resource manager is destroyed, so they must be explicitly cleaned up.
475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    void set(RefCountObject *newObject);
495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    RefCountObject *get() const { return mObject; }
505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick  public:
525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    GLuint id() const { return (mObject != NULL) ? mObject->id() : 0; }
535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool operator ! () const { return (get() == NULL); }
545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick  private:
565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    RefCountObject *mObject;
575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick};
585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricktemplate <class ObjectType>
605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass BindingPointer : public RefCountObjectBindingPointer
615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick  public:
635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    void set(ObjectType *newObject) { RefCountObjectBindingPointer::set(newObject); }
645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ObjectType *get() const { return static_cast<ObjectType*>(RefCountObjectBindingPointer::get()); }
655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ObjectType *operator -> () const { return get(); }
665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick};
675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif   // LIBGLESV2_REFCOUNTOBJECT_H_
71