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