Edit

kc3-lang/angle/src/libGLESv2/RenderbufferProxySet.cpp

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2013-07-25 16:49:54
    Hash : 8040f57d
    Message : Updated Renderbuffers, Textures and TextureStorageInterface to be aware of render targets which are based on miplevels and layers other than zero. TRAC #23470 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang

  • src/libGLESv2/RenderbufferProxySet.cpp
  • #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 Renderbuffer *proxy)
    {
        RefCountMap::iterator i = mRefCountMap.find(proxy);
        if (i != mRefCountMap.end())
        {
            i->second++;
        }
    }
    
    void RenderbufferProxySet::release(const Renderbuffer *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 Renderbuffer
                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, Renderbuffer *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));
        }
    }
    
    Renderbuffer *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;
    }
    
    }