Upstream version 9.37.197.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / libGLESv2 / RenderbufferProxySet.cpp
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
17 void 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
26 void 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
57 void 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
73 FramebufferAttachment *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
82 bool RenderbufferProxySet::RenderbufferKey::operator<(const RenderbufferKey &other) const
83 {
84     return (mipLevel != other.mipLevel) ? mipLevel < other.mipLevel : layer < other.layer;
85 }
86
87 }