1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // HandleAllocator.h: Defines the gl::HandleAllocator class, which is used to 8*8975f5c5SAndroid Build Coastguard Worker // allocate GL handles. 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_HANDLEALLOCATOR_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_HANDLEALLOCATOR_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h" 16*8975f5c5SAndroid Build Coastguard Worker 17*8975f5c5SAndroid Build Coastguard Worker namespace gl 18*8975f5c5SAndroid Build Coastguard Worker { 19*8975f5c5SAndroid Build Coastguard Worker 20*8975f5c5SAndroid Build Coastguard Worker class HandleAllocator final : angle::NonCopyable 21*8975f5c5SAndroid Build Coastguard Worker { 22*8975f5c5SAndroid Build Coastguard Worker public: 23*8975f5c5SAndroid Build Coastguard Worker // Maximum handle = MAX_UINT-1 24*8975f5c5SAndroid Build Coastguard Worker HandleAllocator(); 25*8975f5c5SAndroid Build Coastguard Worker // Specify maximum handle value. Used for testing. 26*8975f5c5SAndroid Build Coastguard Worker HandleAllocator(GLuint maximumHandleValue); 27*8975f5c5SAndroid Build Coastguard Worker 28*8975f5c5SAndroid Build Coastguard Worker ~HandleAllocator(); 29*8975f5c5SAndroid Build Coastguard Worker 30*8975f5c5SAndroid Build Coastguard Worker void setBaseHandle(GLuint value); 31*8975f5c5SAndroid Build Coastguard Worker 32*8975f5c5SAndroid Build Coastguard Worker GLuint allocate(); 33*8975f5c5SAndroid Build Coastguard Worker void release(GLuint handle); 34*8975f5c5SAndroid Build Coastguard Worker void reserve(GLuint handle); 35*8975f5c5SAndroid Build Coastguard Worker void reset(); 36*8975f5c5SAndroid Build Coastguard Worker bool anyHandleAvailableForAllocation() const; 37*8975f5c5SAndroid Build Coastguard Worker 38*8975f5c5SAndroid Build Coastguard Worker void enableLogging(bool enabled); 39*8975f5c5SAndroid Build Coastguard Worker 40*8975f5c5SAndroid Build Coastguard Worker private: 41*8975f5c5SAndroid Build Coastguard Worker GLuint mBaseValue; 42*8975f5c5SAndroid Build Coastguard Worker GLuint mNextValue; 43*8975f5c5SAndroid Build Coastguard Worker const GLuint mMaxValue; 44*8975f5c5SAndroid Build Coastguard Worker 45*8975f5c5SAndroid Build Coastguard Worker // Represents an inclusive range [begin, end] 46*8975f5c5SAndroid Build Coastguard Worker struct HandleRange 47*8975f5c5SAndroid Build Coastguard Worker { HandleRangeHandleRange48*8975f5c5SAndroid Build Coastguard Worker HandleRange(GLuint beginIn, GLuint endIn) : begin(beginIn), end(endIn) {} 49*8975f5c5SAndroid Build Coastguard Worker 50*8975f5c5SAndroid Build Coastguard Worker GLuint begin; 51*8975f5c5SAndroid Build Coastguard Worker GLuint end; 52*8975f5c5SAndroid Build Coastguard Worker }; 53*8975f5c5SAndroid Build Coastguard Worker 54*8975f5c5SAndroid Build Coastguard Worker struct HandleRangeComparator; 55*8975f5c5SAndroid Build Coastguard Worker 56*8975f5c5SAndroid Build Coastguard Worker // The freelist consists of never-allocated handles, stored 57*8975f5c5SAndroid Build Coastguard Worker // as ranges, and handles that were previously allocated and 58*8975f5c5SAndroid Build Coastguard Worker // released, stored in a heap. 59*8975f5c5SAndroid Build Coastguard Worker std::vector<HandleRange> mUnallocatedList; 60*8975f5c5SAndroid Build Coastguard Worker std::vector<GLuint> mReleasedList; 61*8975f5c5SAndroid Build Coastguard Worker 62*8975f5c5SAndroid Build Coastguard Worker bool mLoggingEnabled; 63*8975f5c5SAndroid Build Coastguard Worker }; 64*8975f5c5SAndroid Build Coastguard Worker 65*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_HANDLEALLOCATOR_H_ 68