blob: f4fbe5132540b80d0f80b9eb505e716c6f448aa0 [file] [log] [blame]
#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;
}
}