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