#include "precompiled.h" // // Copyright (c) 2013 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. // // RenderbufferProxySet.cpp: Implements the gl::RenderbufferProxySet, a class for // maintaining a Texture's weak references to the Renderbuffers that represent it. #include "libGLESv2/RenderbufferProxySet.h" #include "common/debug.h" namespace gl { void RenderbufferProxySet::addRef(const FramebufferAttachment *proxy) { RefCountMap::iterator i = mRefCountMap.find(proxy); if (i != mRefCountMap.end()) { i->second++; } } void RenderbufferProxySet::release(const FramebufferAttachment *proxy) { RefCountMap::iterator i = mRefCountMap.find(proxy); if (i != mRefCountMap.end()) { if (i->second > 0) { i->second--; } if (i->second == 0) { // Clear the buffer map of references to this FramebufferAttachment BufferMap::iterator j = mBufferMap.begin(); while (j != mBufferMap.end()) { if (j->second == proxy) { j = mBufferMap.erase(j); } else { ++j; } } mRefCountMap.erase(i); } } } void RenderbufferProxySet::add(unsigned int mipLevel, unsigned int layer, FramebufferAttachment *renderBuffer) { if (mRefCountMap.find(renderBuffer) == mRefCountMap.end()) { mRefCountMap.insert(std::make_pair(renderBuffer, 0)); } RenderbufferKey key; key.mipLevel = mipLevel; key.layer = layer; if (mBufferMap.find(key) == mBufferMap.end()) { mBufferMap.insert(std::make_pair(key, renderBuffer)); } } FramebufferAttachment *RenderbufferProxySet::get(unsigned int mipLevel, unsigned int layer) const { RenderbufferKey key; key.mipLevel = mipLevel; key.layer = layer; BufferMap::const_iterator i = mBufferMap.find(key); return (i != mBufferMap.end()) ? i->second : NULL; } bool RenderbufferProxySet::RenderbufferKey::operator<(const RenderbufferKey &other) const { return (mipLevel != other.mipLevel) ? mipLevel < other.mipLevel : layer < other.layer; } }