1 #include "precompiled.h" 2 // 3 // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 // 7 8 // RenderbufferProxySet.cpp: Implements the gl::RenderbufferProxySet, a class for 9 // maintaining a Texture's weak references to the Renderbuffers that represent it. 10 11 #include "libGLESv2/RenderbufferProxySet.h" 12 #include "common/debug.h" 13 14 namespace gl 15 { 16 addRef(const FramebufferAttachment * proxy)17void RenderbufferProxySet::addRef(const FramebufferAttachment *proxy) 18 { 19 RefCountMap::iterator i = mRefCountMap.find(proxy); 20 if (i != mRefCountMap.end()) 21 { 22 i->second++; 23 } 24 } 25 release(const FramebufferAttachment * proxy)26void RenderbufferProxySet::release(const FramebufferAttachment *proxy) 27 { 28 RefCountMap::iterator i = mRefCountMap.find(proxy); 29 if (i != mRefCountMap.end()) 30 { 31 if (i->second > 0) 32 { 33 i->second--; 34 } 35 36 if (i->second == 0) 37 { 38 // Clear the buffer map of references to this FramebufferAttachment 39 BufferMap::iterator j = mBufferMap.begin(); 40 while (j != mBufferMap.end()) 41 { 42 if (j->second == proxy) 43 { 44 j = mBufferMap.erase(j); 45 } 46 else 47 { 48 ++j; 49 } 50 } 51 52 mRefCountMap.erase(i); 53 } 54 } 55 } 56 add(unsigned int mipLevel,unsigned int layer,FramebufferAttachment * renderBuffer)57void RenderbufferProxySet::add(unsigned int mipLevel, unsigned int layer, FramebufferAttachment *renderBuffer) 58 { 59 if (mRefCountMap.find(renderBuffer) == mRefCountMap.end()) 60 { 61 mRefCountMap.insert(std::make_pair(renderBuffer, 0)); 62 } 63 64 RenderbufferKey key; 65 key.mipLevel = mipLevel; 66 key.layer = layer; 67 if (mBufferMap.find(key) == mBufferMap.end()) 68 { 69 mBufferMap.insert(std::make_pair(key, renderBuffer)); 70 } 71 } 72 get(unsigned int mipLevel,unsigned int layer) const73FramebufferAttachment *RenderbufferProxySet::get(unsigned int mipLevel, unsigned int layer) const 74 { 75 RenderbufferKey key; 76 key.mipLevel = mipLevel; 77 key.layer = layer; 78 BufferMap::const_iterator i = mBufferMap.find(key); 79 return (i != mBufferMap.end()) ? i->second : NULL; 80 } 81 operator <(const RenderbufferKey & other) const82bool RenderbufferProxySet::RenderbufferKey::operator<(const RenderbufferKey &other) const 83 { 84 return (mipLevel != other.mipLevel) ? mipLevel < other.mipLevel : layer < other.layer; 85 } 86 87 } 88