diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.cpp | 229 |
1 files changed, 0 insertions, 229 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.cpp b/src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.cpp deleted file mode 100644 index 2a97ce939f..0000000000 --- a/src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.cpp +++ /dev/null @@ -1,229 +0,0 @@ -// -// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// - -// HandleRangeAllocator.cpp : Implementation for HandleRangeAllocator.h - -#include "libANGLE/HandleRangeAllocator.h" - -#include <algorithm> -#include <limits> -#include <utility> - -#include "common/angleutils.h" -#include "common/debug.h" - -namespace gl -{ - -const GLuint HandleRangeAllocator::kInvalidHandle = 0; - -HandleRangeAllocator::HandleRangeAllocator() -{ - // Simplify the code by making sure that lower_bound(id) never - // returns the beginning of the map, if id is valid (eg != kInvalidHandle). - mUsed.insert(std::make_pair(0u, 0u)); -} - -HandleRangeAllocator::~HandleRangeAllocator() -{ -} - -GLuint HandleRangeAllocator::allocate() -{ - return allocateRange(1u); -} - -GLuint HandleRangeAllocator::allocateAtOrAbove(GLuint wanted) -{ - if (wanted == 0u || wanted == 1u) - return allocateRange(1u); - - auto current = mUsed.lower_bound(wanted); - auto next = current; - if (current == mUsed.end() || current->first > wanted) - { - current--; - } - else - { - next++; - } - - GLuint firstId = current->first; - GLuint lastId = current->second; - ASSERT(wanted >= firstId); - - if (wanted - 1u <= lastId) - { - // Append to current range. - lastId++; - if (lastId == 0) - { - // The increment overflowed. - return allocateRange(1u); - } - - current->second = lastId; - - if (next != mUsed.end() && next->first - 1u == lastId) - { - // Merge with next range. - current->second = next->second; - mUsed.erase(next); - } - return lastId; - } - else if (next != mUsed.end() && next->first - 1u == wanted) - { - // Prepend to next range. - GLuint lastExisting = next->second; - mUsed.erase(next); - mUsed.insert(std::make_pair(wanted, lastExisting)); - return wanted; - } - mUsed.insert(std::make_pair(wanted, wanted)); - return wanted; -} - -GLuint HandleRangeAllocator::allocateRange(GLuint range) -{ - ASSERT(range != 0); - - auto current = mUsed.begin(); - auto next = current; - - while (++next != mUsed.end()) - { - if (next->first - current->second > range) - break; - current = next; - } - const GLuint firstId = current->second + 1u; - const GLuint lastId = firstId + range - 1u; - - // deal with wraparound - if (firstId == 0u || lastId < firstId) - return kInvalidHandle; - - current->second = lastId; - - if (next != mUsed.end() && next->first - 1u == lastId) - { - // merge with next range - current->second = next->second; - mUsed.erase(next); - } - return firstId; -} - -bool HandleRangeAllocator::markAsUsed(GLuint handle) -{ - ASSERT(handle); - auto current = mUsed.lower_bound(handle); - if (current != mUsed.end() && current->first == handle) - return false; - - auto next = current; - --current; - - if (current->second >= handle) - return false; - - ASSERT(current->first < handle && current->second < handle); - - if (current->second + 1u == handle) - { - // Append to current range. - current->second = handle; - if (next != mUsed.end() && next->first - 1u == handle) - { - // Merge with next range. - current->second = next->second; - mUsed.erase(next); - } - return true; - } - else if (next != mUsed.end() && next->first - 1u == handle) - { - // Prepend to next range. - GLuint lastExisting = next->second; - mUsed.erase(next); - mUsed.insert(std::make_pair(handle, lastExisting)); - return true; - } - - mUsed.insert(std::make_pair(handle, handle)); - return true; -} - -void HandleRangeAllocator::release(GLuint handle) -{ - releaseRange(handle, 1u); -} - -void HandleRangeAllocator::releaseRange(GLuint first, GLuint range) -{ - if (range == 0u || (first == 0u && range == 1u)) - return; - - if (first == 0u) - { - first++; - range--; - } - - GLuint last = first + range - 1u; - if (last < first) - last = std::numeric_limits<GLuint>::max(); - - while (true) - { - auto current = mUsed.lower_bound(last); - if (current == mUsed.end() || current->first > last) - --current; - - if (current->second < first) - return; - - if (current->first >= first) - { - const GLuint lastExisting = current->second; - mUsed.erase(current); - if (last < lastExisting) - { - mUsed.insert(std::make_pair(last + 1u, lastExisting)); - } - } - else if (current->second <= last) - { - current->second = first - 1u; - } - else - { - ASSERT(current->first < first && current->second > last); - const GLuint lastExisting = current->second; - current->second = first - 1u; - mUsed.insert(std::make_pair(last + 1u, lastExisting)); - } - } -} - -bool HandleRangeAllocator::isUsed(GLuint handle) const -{ - if (handle == kInvalidHandle) - return false; - - auto current = mUsed.lower_bound(handle); - if (current != mUsed.end()) - { - if (current->first == handle) - return true; - } - --current; - return current->second >= handle; -} - -} // namespace gl
\ No newline at end of file |