// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ResourceManager.cpp: Implements the ResourceManager class, which tracks and
// retrieves objects which may be shared by multiple Contexts.
#include "ResourceManager.h"
#include "Buffer.h"
#include "Renderbuffer.h"
#include "Texture.h"
namespace es1
{
ResourceManager::ResourceManager()
{
mRefCount = 1;
}
ResourceManager::~ResourceManager()
{
while(!mBufferNameSpace.empty())
{
deleteBuffer(mBufferNameSpace.firstName());
}
while(!mRenderbufferNameSpace.empty())
{
deleteRenderbuffer(mRenderbufferNameSpace.firstName());
}
while(!mTextureNameSpace.empty())
{
deleteTexture(mTextureNameSpace.firstName());
}
}
void ResourceManager::addRef()
{
mRefCount++;
}
void ResourceManager::release()
{
if(--mRefCount == 0)
{
delete this;
}
}
// Returns an unused buffer name
GLuint ResourceManager::createBuffer()
{
return mBufferNameSpace.allocate();
}
// Returns an unused texture name
GLuint ResourceManager::createTexture()
{
return mTextureNameSpace.allocate();
}
// Returns an unused renderbuffer name
GLuint ResourceManager::createRenderbuffer()
{
return mRenderbufferNameSpace.allocate();
}
void ResourceManager::deleteBuffer(GLuint buffer)
{
Buffer *bufferObject = mBufferNameSpace.remove(buffer);
if(bufferObject)
{
bufferObject->release();
}
}
void ResourceManager::deleteTexture(GLuint texture)
{
Texture *textureObject = mTextureNameSpace.remove(texture);
if(textureObject)
{
textureObject->release();
}
}
void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
{
Renderbuffer *renderbufferObject = mRenderbufferNameSpace.remove(renderbuffer);
if(renderbufferObject)
{
renderbufferObject->release();
}
}
Buffer *ResourceManager::getBuffer(unsigned int handle)
{
return mBufferNameSpace.find(handle);
}
Texture *ResourceManager::getTexture(unsigned int handle)
{
return mTextureNameSpace.find(handle);
}
Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
{
return mRenderbufferNameSpace.find(handle);
}
void ResourceManager::checkBufferAllocation(unsigned int buffer)
{
if(buffer != 0 && !getBuffer(buffer))
{
Buffer *bufferObject = new Buffer(buffer);
bufferObject->addRef();
mBufferNameSpace.insert(buffer, bufferObject);
}
}
void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type)
{
if(!getTexture(texture) && texture != 0)
{
Texture *textureObject;
if(type == TEXTURE_2D)
{
textureObject = new Texture2D(texture);
}
else if(type == TEXTURE_EXTERNAL)
{
textureObject = new TextureExternal(texture);
}
else
{
UNREACHABLE(type);
return;
}
textureObject->addRef();
mTextureNameSpace.insert(texture, textureObject);
}
}
void ResourceManager::checkRenderbufferAllocation(GLuint handle)
{
if(handle != 0 && !getRenderbuffer(handle))
{
Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
renderbufferObject->addRef();
mRenderbufferNameSpace.insert(handle, renderbufferObject);
}
}
}