17b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com// 27b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 37b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 47b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com// found in the LICENSE file. 57b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com// 67b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com 77b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com// RefCountObject.cpp: Defines the gl::RefCountObject base class that provides 87b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com// lifecycle support for GL objects using the traditional BindObject scheme, but 97b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com// that need to be reference counted for correct cross-context deletion. 107b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com// (Concretely, textures, buffers and renderbuffers.) 117b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com 127b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com#include "RefCountObject.h" 137b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com 147b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.comRefCountObject::RefCountObject(GLuint id) 157b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com{ 167b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com mId = id; 177b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com mRefCount = 0; 187b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com} 197b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com 207b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.comRefCountObject::~RefCountObject() 217b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com{ 227335d1c485a228e53d065a0a268087b8d23d243dapatrick@chromium.org ASSERT(mRefCount == 0); 237b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com} 247b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com 257b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.comvoid RefCountObject::addRef() const 267b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com{ 277b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com mRefCount++; 287b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com} 297b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com 307b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.comvoid RefCountObject::release() const 317b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com{ 327b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com ASSERT(mRefCount > 0); 337b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com 347b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com if (--mRefCount == 0) 357b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com { 367b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com delete this; 377b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com } 387b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com} 397b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com 407b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.comvoid RefCountObjectBindingPointer::set(RefCountObject *newObject) 417b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com{ 427b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com // addRef first in case newObject == mObject and this is the last reference to it. 437b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com if (newObject != NULL) newObject->addRef(); 447b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com if (mObject != NULL) mObject->release(); 457b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com 467b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com mObject = newObject; 477b62093e6f02fc1eb2961681f032cd6bf66cc873daniel@transgaming.com} 48