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