11a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com//
21a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
31a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com// Use of this source code is governed by a BSD-style license that can be
41a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com// found in the LICENSE file.
51a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com//
61a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com
71a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com// HandleAllocator.cpp: Implements the gl::HandleAllocator class, which is used
81a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com// to allocate GL handles.
91a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com
101a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com#include "libGLESv2/HandleAllocator.h"
111a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com
121a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com#include "libGLESv2/main.h"
131a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com
141a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.comnamespace gl
151a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com{
161a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com
171a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.comHandleAllocator::HandleAllocator() : mBaseValue(1), mNextValue(1)
181a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com{
191a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com}
201a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com
211a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.comHandleAllocator::~HandleAllocator()
221a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com{
231a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com}
241a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com
251a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.comvoid HandleAllocator::setBaseHandle(GLuint value)
261a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com{
271a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com    ASSERT(mBaseValue == mNextValue);
281a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com    mBaseValue = value;
291a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com    mNextValue = value;
301a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com}
311a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com
321a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.comGLuint HandleAllocator::allocate()
331a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com{
341a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com    if (mFreeValues.size())
351a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com    {
361a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com        GLuint handle = mFreeValues.back();
371a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com        mFreeValues.pop_back();
381a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com        return handle;
391a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com    }
401a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com    return mNextValue++;
411a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com}
421a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com
431a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.comvoid HandleAllocator::release(GLuint handle)
441a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com{
451a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com    if (handle == mNextValue - 1)
461a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com    {
4707792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com        // Don't drop below base value
4807792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com        if(mNextValue > mBaseValue)
4907792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com        {
5007792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com            mNextValue--;
5107792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com        }
5207792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com    }
5307792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com    else
5407792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com    {
5507792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com        // Only free handles that we own - don't drop below the base value
5607792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com        if (handle >= mBaseValue)
5707792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com        {
5807792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com            mFreeValues.push_back(handle);
5907792e5485a003177af34fc200f0eeb5d180bc4abenvanik@google.com        }
601a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com    }
611a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com}
621a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com
631a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com}
64