Commit 4e25a0d6 by Jamie Madill Committed by Commit Bot

Use std::unordered_map in ResourceManager.

The hashed query performs significantly faster than std::map. This improves performance in applications which use Bind* often. Also use the same scheme for the Context-managed resources. BUG=angleproject:1333 Change-Id: I8a1f25d80e060c62dab1f86005e1bc4df1c06dba Reviewed-on: https://chromium-review.googlesource.com/331387Reviewed-by: 's avatarZhenyao Mo <zmo@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 0e49e6b5
......@@ -567,7 +567,7 @@ void Context::deleteTransformFeedback(GLuint transformFeedback)
void Context::deleteFramebuffer(GLuint framebuffer)
{
FramebufferMap::iterator framebufferObject = mFramebufferMap.find(framebuffer);
auto framebufferObject = mFramebufferMap.find(framebuffer);
if (framebufferObject != mFramebufferMap.end())
{
......@@ -581,7 +581,7 @@ void Context::deleteFramebuffer(GLuint framebuffer)
void Context::deleteFenceNV(GLuint fence)
{
FenceNVMap::iterator fenceObject = mFenceNVMap.find(fence);
auto fenceObject = mFenceNVMap.find(fence);
if (fenceObject != mFenceNVMap.end())
{
......@@ -593,7 +593,7 @@ void Context::deleteFenceNV(GLuint fence)
void Context::deleteQuery(GLuint query)
{
QueryMap::iterator queryObject = mQueryMap.find(query);
auto queryObject = mQueryMap.find(query);
if (queryObject != mQueryMap.end())
{
mQueryHandleAllocator.release(queryObject->first);
......@@ -915,7 +915,7 @@ Framebuffer *Context::getFramebuffer(unsigned int handle) const
FenceNV *Context::getFenceNV(unsigned int handle)
{
FenceNVMap::iterator fence = mFenceNVMap.find(handle);
auto fence = mFenceNVMap.find(handle);
if (fence == mFenceNVMap.end())
{
......@@ -929,7 +929,7 @@ FenceNV *Context::getFenceNV(unsigned int handle)
Query *Context::getQuery(unsigned int handle, bool create, GLenum type)
{
QueryMap::iterator query = mQueryMap.find(handle);
auto query = mQueryMap.find(handle);
if (query == mQueryMap.end())
{
......
......@@ -10,6 +10,10 @@
#ifndef LIBANGLE_CONTEXT_H_
#define LIBANGLE_CONTEXT_H_
#include <set>
#include <string>
#include "angle_gl.h"
#include "common/angleutils.h"
#include "libANGLE/RefCountObject.h"
#include "libANGLE/Caps.h"
......@@ -20,12 +24,6 @@
#include "libANGLE/VertexAttribute.h"
#include "libANGLE/angletypes.h"
#include "angle_gl.h"
#include <string>
#include <set>
#include <map>
namespace rx
{
class Renderer;
......@@ -439,24 +437,19 @@ class Context final : public ValidationContext
TextureMap mZeroTextures;
typedef std::map<GLuint, Framebuffer*> FramebufferMap;
FramebufferMap mFramebufferMap;
ResourceMap<Framebuffer> mFramebufferMap;
HandleAllocator mFramebufferHandleAllocator;
typedef std::map<GLuint, FenceNV*> FenceNVMap;
FenceNVMap mFenceNVMap;
ResourceMap<FenceNV> mFenceNVMap;
HandleAllocator mFenceNVHandleAllocator;
typedef std::map<GLuint, Query*> QueryMap;
QueryMap mQueryMap;
ResourceMap<Query> mQueryMap;
HandleAllocator mQueryHandleAllocator;
typedef std::map<GLuint, VertexArray*> VertexArrayMap;
VertexArrayMap mVertexArrayMap;
ResourceMap<VertexArray> mVertexArrayMap;
HandleAllocator mVertexArrayHandleAllocator;
typedef std::map<GLuint, TransformFeedback*> TransformFeedbackMap;
TransformFeedbackMap mTransformFeedbackMap;
ResourceMap<TransformFeedback> mTransformFeedbackMap;
HandleAllocator mTransformFeedbackAllocator;
std::string mRendererString;
......
......@@ -82,7 +82,7 @@ GLuint ResourceManager::createBuffer()
{
GLuint handle = mBufferHandleAllocator.allocate();
mBufferMap[handle] = NULL;
mBufferMap[handle] = nullptr;
return handle;
}
......@@ -116,7 +116,7 @@ GLuint ResourceManager::createTexture()
{
GLuint handle = mTextureHandleAllocator.allocate();
mTextureMap[handle] = NULL;
mTextureMap[handle] = nullptr;
return handle;
}
......@@ -126,7 +126,7 @@ GLuint ResourceManager::createRenderbuffer()
{
GLuint handle = mRenderbufferHandleAllocator.allocate();
mRenderbufferMap[handle] = NULL;
mRenderbufferMap[handle] = nullptr;
return handle;
}
......@@ -136,7 +136,7 @@ GLuint ResourceManager::createSampler()
{
GLuint handle = mSamplerHandleAllocator.allocate();
mSamplerMap[handle] = NULL;
mSamplerMap[handle] = nullptr;
return handle;
}
......@@ -155,7 +155,7 @@ GLuint ResourceManager::createFenceSync()
void ResourceManager::deleteBuffer(GLuint buffer)
{
BufferMap::iterator bufferObject = mBufferMap.find(buffer);
auto bufferObject = mBufferMap.find(buffer);
if (bufferObject != mBufferMap.end())
{
......@@ -167,7 +167,7 @@ void ResourceManager::deleteBuffer(GLuint buffer)
void ResourceManager::deleteShader(GLuint shader)
{
ShaderMap::iterator shaderObject = mShaderMap.find(shader);
auto shaderObject = mShaderMap.find(shader);
if (shaderObject != mShaderMap.end())
{
......@@ -186,7 +186,7 @@ void ResourceManager::deleteShader(GLuint shader)
void ResourceManager::deleteProgram(GLuint program)
{
ProgramMap::iterator programObject = mProgramMap.find(program);
auto programObject = mProgramMap.find(program);
if (programObject != mProgramMap.end())
{
......@@ -205,7 +205,7 @@ void ResourceManager::deleteProgram(GLuint program)
void ResourceManager::deleteTexture(GLuint texture)
{
TextureMap::iterator textureObject = mTextureMap.find(texture);
auto textureObject = mTextureMap.find(texture);
if (textureObject != mTextureMap.end())
{
......@@ -217,7 +217,7 @@ void ResourceManager::deleteTexture(GLuint texture)
void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
{
RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
auto renderbufferObject = mRenderbufferMap.find(renderbuffer);
if (renderbufferObject != mRenderbufferMap.end())
{
......@@ -253,11 +253,11 @@ void ResourceManager::deleteFenceSync(GLuint fenceSync)
Buffer *ResourceManager::getBuffer(unsigned int handle)
{
BufferMap::iterator buffer = mBufferMap.find(handle);
auto buffer = mBufferMap.find(handle);
if (buffer == mBufferMap.end())
{
return NULL;
return nullptr;
}
else
{
......@@ -267,11 +267,11 @@ Buffer *ResourceManager::getBuffer(unsigned int handle)
Shader *ResourceManager::getShader(unsigned int handle)
{
ShaderMap::iterator shader = mShaderMap.find(handle);
auto shader = mShaderMap.find(handle);
if (shader == mShaderMap.end())
{
return NULL;
return nullptr;
}
else
{
......@@ -281,13 +281,14 @@ Shader *ResourceManager::getShader(unsigned int handle)
Texture *ResourceManager::getTexture(unsigned int handle)
{
if (handle == 0) return NULL;
if (handle == 0)
return nullptr;
TextureMap::iterator texture = mTextureMap.find(handle);
auto texture = mTextureMap.find(handle);
if (texture == mTextureMap.end())
{
return NULL;
return nullptr;
}
else
{
......@@ -297,11 +298,11 @@ Texture *ResourceManager::getTexture(unsigned int handle)
Program *ResourceManager::getProgram(unsigned int handle) const
{
ProgramMap::const_iterator program = mProgramMap.find(handle);
auto program = mProgramMap.find(handle);
if (program == mProgramMap.end())
{
return NULL;
return nullptr;
}
else
{
......@@ -311,11 +312,11 @@ Program *ResourceManager::getProgram(unsigned int handle) const
Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
{
RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
auto renderbuffer = mRenderbufferMap.find(handle);
if (renderbuffer == mRenderbufferMap.end())
{
return NULL;
return nullptr;
}
else
{
......@@ -329,7 +330,7 @@ Sampler *ResourceManager::getSampler(unsigned int handle)
if (sampler == mSamplerMap.end())
{
return NULL;
return nullptr;
}
else
{
......@@ -343,7 +344,7 @@ FenceSync *ResourceManager::getFenceSync(unsigned int handle)
if (fenceObjectIt == mFenceSyncMap.end())
{
return NULL;
return nullptr;
}
else
{
......
......@@ -15,8 +15,6 @@
#include "libANGLE/angletypes.h"
#include "libANGLE/HandleAllocator.h"
#include <map>
namespace rx
{
class ImplFactory;
......@@ -82,31 +80,24 @@ class ResourceManager : angle::NonCopyable
rx::ImplFactory *mFactory;
std::size_t mRefCount;
typedef std::map<GLuint, Buffer*> BufferMap;
BufferMap mBufferMap;
ResourceMap<Buffer> mBufferMap;
HandleAllocator mBufferHandleAllocator;
typedef std::map<GLuint, Shader*> ShaderMap;
ShaderMap mShaderMap;
ResourceMap<Shader> mShaderMap;
typedef std::map<GLuint, Program*> ProgramMap;
ProgramMap mProgramMap;
ResourceMap<Program> mProgramMap;
HandleAllocator mProgramShaderHandleAllocator;
typedef std::map<GLuint, Texture*> TextureMap;
TextureMap mTextureMap;
ResourceMap<Texture> mTextureMap;
HandleAllocator mTextureHandleAllocator;
typedef std::map<GLuint, Renderbuffer*> RenderbufferMap;
RenderbufferMap mRenderbufferMap;
ResourceMap<Renderbuffer> mRenderbufferMap;
HandleAllocator mRenderbufferHandleAllocator;
typedef std::map<GLuint, Sampler*> SamplerMap;
SamplerMap mSamplerMap;
ResourceMap<Sampler> mSamplerMap;
HandleAllocator mSamplerHandleAllocator;
typedef std::map<GLuint, FenceSync*> FenceMap;
FenceMap mFenceSyncMap;
ResourceMap<FenceSync> mFenceSyncMap;
HandleAllocator mFenceSyncHandleAllocator;
};
......
......@@ -15,6 +15,7 @@
#include <stdint.h>
#include <bitset>
#include <unordered_map>
namespace gl
{
......@@ -301,6 +302,11 @@ typedef std::bitset<MAX_VERTEX_ATTRIBS> AttributesMask;
// Use in Program
typedef std::bitset<IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS> UniformBlockBindingMask;
// A map of GL objects indexed by object ID. The specific map implementation may change.
// Client code should treat it as a std::map.
template <class ResourceT>
using ResourceMap = std::unordered_map<GLuint, ResourceT *>;
}
namespace rx
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment