1bdf2d80f459d43f5a6df074431bacf41584f81b7shannon.woods@transgaming.com#include "precompiled.h"
29ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com//
39ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
49ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
59ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com// found in the LICENSE file.
69ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com//
79ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com
89ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com// RefCountObject.cpp: Defines the gl::RefCountObject base class that provides
99ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com// lifecycle support for GL objects using the traditional BindObject scheme, but
109ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com// that need to be reference counted for correct cross-context deletion.
119ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com// (Concretely, textures, buffers and renderbuffers.)
129ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com
139ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com#include "RefCountObject.h"
149ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com
159ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.comRefCountObject::RefCountObject(GLuint id)
169ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com{
179ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    mId = id;
189ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    mRefCount = 0;
199ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com}
209ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com
219ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.comRefCountObject::~RefCountObject()
229ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com{
238d012dfca24b1151bdda0599d26ca79eb7817cf2apatrick@chromium.org    ASSERT(mRefCount == 0);
249ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com}
259ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com
269ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.comvoid RefCountObject::addRef() const
279ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com{
289ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    mRefCount++;
299ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com}
309ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com
319ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.comvoid RefCountObject::release() const
329ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com{
339ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    ASSERT(mRefCount > 0);
349ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com
359ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    if (--mRefCount == 0)
369ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    {
379ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com        delete this;
389ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    }
399ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com}
409ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com
419ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.comvoid RefCountObjectBindingPointer::set(RefCountObject *newObject)
429ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com{
439ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    // addRef first in case newObject == mObject and this is the last reference to it.
449ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    if (newObject != NULL) newObject->addRef();
459ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    if (mObject != NULL) mObject->release();
469ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com
479ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com    mObject = newObject;
489ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com}
49