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) ...@@ -567,7 +567,7 @@ void Context::deleteTransformFeedback(GLuint transformFeedback)
void Context::deleteFramebuffer(GLuint framebuffer) void Context::deleteFramebuffer(GLuint framebuffer)
{ {
FramebufferMap::iterator framebufferObject = mFramebufferMap.find(framebuffer); auto framebufferObject = mFramebufferMap.find(framebuffer);
if (framebufferObject != mFramebufferMap.end()) if (framebufferObject != mFramebufferMap.end())
{ {
...@@ -581,7 +581,7 @@ void Context::deleteFramebuffer(GLuint framebuffer) ...@@ -581,7 +581,7 @@ void Context::deleteFramebuffer(GLuint framebuffer)
void Context::deleteFenceNV(GLuint fence) void Context::deleteFenceNV(GLuint fence)
{ {
FenceNVMap::iterator fenceObject = mFenceNVMap.find(fence); auto fenceObject = mFenceNVMap.find(fence);
if (fenceObject != mFenceNVMap.end()) if (fenceObject != mFenceNVMap.end())
{ {
...@@ -593,7 +593,7 @@ void Context::deleteFenceNV(GLuint fence) ...@@ -593,7 +593,7 @@ void Context::deleteFenceNV(GLuint fence)
void Context::deleteQuery(GLuint query) void Context::deleteQuery(GLuint query)
{ {
QueryMap::iterator queryObject = mQueryMap.find(query); auto queryObject = mQueryMap.find(query);
if (queryObject != mQueryMap.end()) if (queryObject != mQueryMap.end())
{ {
mQueryHandleAllocator.release(queryObject->first); mQueryHandleAllocator.release(queryObject->first);
...@@ -915,7 +915,7 @@ Framebuffer *Context::getFramebuffer(unsigned int handle) const ...@@ -915,7 +915,7 @@ Framebuffer *Context::getFramebuffer(unsigned int handle) const
FenceNV *Context::getFenceNV(unsigned int handle) FenceNV *Context::getFenceNV(unsigned int handle)
{ {
FenceNVMap::iterator fence = mFenceNVMap.find(handle); auto fence = mFenceNVMap.find(handle);
if (fence == mFenceNVMap.end()) if (fence == mFenceNVMap.end())
{ {
...@@ -929,7 +929,7 @@ FenceNV *Context::getFenceNV(unsigned int handle) ...@@ -929,7 +929,7 @@ FenceNV *Context::getFenceNV(unsigned int handle)
Query *Context::getQuery(unsigned int handle, bool create, GLenum type) 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()) if (query == mQueryMap.end())
{ {
......
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
#ifndef LIBANGLE_CONTEXT_H_ #ifndef LIBANGLE_CONTEXT_H_
#define LIBANGLE_CONTEXT_H_ #define LIBANGLE_CONTEXT_H_
#include <set>
#include <string>
#include "angle_gl.h"
#include "common/angleutils.h" #include "common/angleutils.h"
#include "libANGLE/RefCountObject.h" #include "libANGLE/RefCountObject.h"
#include "libANGLE/Caps.h" #include "libANGLE/Caps.h"
...@@ -20,12 +24,6 @@ ...@@ -20,12 +24,6 @@
#include "libANGLE/VertexAttribute.h" #include "libANGLE/VertexAttribute.h"
#include "libANGLE/angletypes.h" #include "libANGLE/angletypes.h"
#include "angle_gl.h"
#include <string>
#include <set>
#include <map>
namespace rx namespace rx
{ {
class Renderer; class Renderer;
...@@ -439,24 +437,19 @@ class Context final : public ValidationContext ...@@ -439,24 +437,19 @@ class Context final : public ValidationContext
TextureMap mZeroTextures; TextureMap mZeroTextures;
typedef std::map<GLuint, Framebuffer*> FramebufferMap; ResourceMap<Framebuffer> mFramebufferMap;
FramebufferMap mFramebufferMap;
HandleAllocator mFramebufferHandleAllocator; HandleAllocator mFramebufferHandleAllocator;
typedef std::map<GLuint, FenceNV*> FenceNVMap; ResourceMap<FenceNV> mFenceNVMap;
FenceNVMap mFenceNVMap;
HandleAllocator mFenceNVHandleAllocator; HandleAllocator mFenceNVHandleAllocator;
typedef std::map<GLuint, Query*> QueryMap; ResourceMap<Query> mQueryMap;
QueryMap mQueryMap;
HandleAllocator mQueryHandleAllocator; HandleAllocator mQueryHandleAllocator;
typedef std::map<GLuint, VertexArray*> VertexArrayMap; ResourceMap<VertexArray> mVertexArrayMap;
VertexArrayMap mVertexArrayMap;
HandleAllocator mVertexArrayHandleAllocator; HandleAllocator mVertexArrayHandleAllocator;
typedef std::map<GLuint, TransformFeedback*> TransformFeedbackMap; ResourceMap<TransformFeedback> mTransformFeedbackMap;
TransformFeedbackMap mTransformFeedbackMap;
HandleAllocator mTransformFeedbackAllocator; HandleAllocator mTransformFeedbackAllocator;
std::string mRendererString; std::string mRendererString;
......
...@@ -82,7 +82,7 @@ GLuint ResourceManager::createBuffer() ...@@ -82,7 +82,7 @@ GLuint ResourceManager::createBuffer()
{ {
GLuint handle = mBufferHandleAllocator.allocate(); GLuint handle = mBufferHandleAllocator.allocate();
mBufferMap[handle] = NULL; mBufferMap[handle] = nullptr;
return handle; return handle;
} }
...@@ -116,7 +116,7 @@ GLuint ResourceManager::createTexture() ...@@ -116,7 +116,7 @@ GLuint ResourceManager::createTexture()
{ {
GLuint handle = mTextureHandleAllocator.allocate(); GLuint handle = mTextureHandleAllocator.allocate();
mTextureMap[handle] = NULL; mTextureMap[handle] = nullptr;
return handle; return handle;
} }
...@@ -126,7 +126,7 @@ GLuint ResourceManager::createRenderbuffer() ...@@ -126,7 +126,7 @@ GLuint ResourceManager::createRenderbuffer()
{ {
GLuint handle = mRenderbufferHandleAllocator.allocate(); GLuint handle = mRenderbufferHandleAllocator.allocate();
mRenderbufferMap[handle] = NULL; mRenderbufferMap[handle] = nullptr;
return handle; return handle;
} }
...@@ -136,7 +136,7 @@ GLuint ResourceManager::createSampler() ...@@ -136,7 +136,7 @@ GLuint ResourceManager::createSampler()
{ {
GLuint handle = mSamplerHandleAllocator.allocate(); GLuint handle = mSamplerHandleAllocator.allocate();
mSamplerMap[handle] = NULL; mSamplerMap[handle] = nullptr;
return handle; return handle;
} }
...@@ -155,7 +155,7 @@ GLuint ResourceManager::createFenceSync() ...@@ -155,7 +155,7 @@ GLuint ResourceManager::createFenceSync()
void ResourceManager::deleteBuffer(GLuint buffer) void ResourceManager::deleteBuffer(GLuint buffer)
{ {
BufferMap::iterator bufferObject = mBufferMap.find(buffer); auto bufferObject = mBufferMap.find(buffer);
if (bufferObject != mBufferMap.end()) if (bufferObject != mBufferMap.end())
{ {
...@@ -167,7 +167,7 @@ void ResourceManager::deleteBuffer(GLuint buffer) ...@@ -167,7 +167,7 @@ void ResourceManager::deleteBuffer(GLuint buffer)
void ResourceManager::deleteShader(GLuint shader) void ResourceManager::deleteShader(GLuint shader)
{ {
ShaderMap::iterator shaderObject = mShaderMap.find(shader); auto shaderObject = mShaderMap.find(shader);
if (shaderObject != mShaderMap.end()) if (shaderObject != mShaderMap.end())
{ {
...@@ -186,7 +186,7 @@ void ResourceManager::deleteShader(GLuint shader) ...@@ -186,7 +186,7 @@ void ResourceManager::deleteShader(GLuint shader)
void ResourceManager::deleteProgram(GLuint program) void ResourceManager::deleteProgram(GLuint program)
{ {
ProgramMap::iterator programObject = mProgramMap.find(program); auto programObject = mProgramMap.find(program);
if (programObject != mProgramMap.end()) if (programObject != mProgramMap.end())
{ {
...@@ -205,7 +205,7 @@ void ResourceManager::deleteProgram(GLuint program) ...@@ -205,7 +205,7 @@ void ResourceManager::deleteProgram(GLuint program)
void ResourceManager::deleteTexture(GLuint texture) void ResourceManager::deleteTexture(GLuint texture)
{ {
TextureMap::iterator textureObject = mTextureMap.find(texture); auto textureObject = mTextureMap.find(texture);
if (textureObject != mTextureMap.end()) if (textureObject != mTextureMap.end())
{ {
...@@ -217,7 +217,7 @@ void ResourceManager::deleteTexture(GLuint texture) ...@@ -217,7 +217,7 @@ void ResourceManager::deleteTexture(GLuint texture)
void ResourceManager::deleteRenderbuffer(GLuint renderbuffer) void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
{ {
RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer); auto renderbufferObject = mRenderbufferMap.find(renderbuffer);
if (renderbufferObject != mRenderbufferMap.end()) if (renderbufferObject != mRenderbufferMap.end())
{ {
...@@ -253,11 +253,11 @@ void ResourceManager::deleteFenceSync(GLuint fenceSync) ...@@ -253,11 +253,11 @@ void ResourceManager::deleteFenceSync(GLuint fenceSync)
Buffer *ResourceManager::getBuffer(unsigned int handle) Buffer *ResourceManager::getBuffer(unsigned int handle)
{ {
BufferMap::iterator buffer = mBufferMap.find(handle); auto buffer = mBufferMap.find(handle);
if (buffer == mBufferMap.end()) if (buffer == mBufferMap.end())
{ {
return NULL; return nullptr;
} }
else else
{ {
...@@ -267,11 +267,11 @@ Buffer *ResourceManager::getBuffer(unsigned int handle) ...@@ -267,11 +267,11 @@ Buffer *ResourceManager::getBuffer(unsigned int handle)
Shader *ResourceManager::getShader(unsigned int handle) Shader *ResourceManager::getShader(unsigned int handle)
{ {
ShaderMap::iterator shader = mShaderMap.find(handle); auto shader = mShaderMap.find(handle);
if (shader == mShaderMap.end()) if (shader == mShaderMap.end())
{ {
return NULL; return nullptr;
} }
else else
{ {
...@@ -281,13 +281,14 @@ Shader *ResourceManager::getShader(unsigned int handle) ...@@ -281,13 +281,14 @@ Shader *ResourceManager::getShader(unsigned int handle)
Texture *ResourceManager::getTexture(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()) if (texture == mTextureMap.end())
{ {
return NULL; return nullptr;
} }
else else
{ {
...@@ -297,11 +298,11 @@ Texture *ResourceManager::getTexture(unsigned int handle) ...@@ -297,11 +298,11 @@ Texture *ResourceManager::getTexture(unsigned int handle)
Program *ResourceManager::getProgram(unsigned int handle) const Program *ResourceManager::getProgram(unsigned int handle) const
{ {
ProgramMap::const_iterator program = mProgramMap.find(handle); auto program = mProgramMap.find(handle);
if (program == mProgramMap.end()) if (program == mProgramMap.end())
{ {
return NULL; return nullptr;
} }
else else
{ {
...@@ -311,11 +312,11 @@ Program *ResourceManager::getProgram(unsigned int handle) const ...@@ -311,11 +312,11 @@ Program *ResourceManager::getProgram(unsigned int handle) const
Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle) Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
{ {
RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle); auto renderbuffer = mRenderbufferMap.find(handle);
if (renderbuffer == mRenderbufferMap.end()) if (renderbuffer == mRenderbufferMap.end())
{ {
return NULL; return nullptr;
} }
else else
{ {
...@@ -329,7 +330,7 @@ Sampler *ResourceManager::getSampler(unsigned int handle) ...@@ -329,7 +330,7 @@ Sampler *ResourceManager::getSampler(unsigned int handle)
if (sampler == mSamplerMap.end()) if (sampler == mSamplerMap.end())
{ {
return NULL; return nullptr;
} }
else else
{ {
...@@ -343,7 +344,7 @@ FenceSync *ResourceManager::getFenceSync(unsigned int handle) ...@@ -343,7 +344,7 @@ FenceSync *ResourceManager::getFenceSync(unsigned int handle)
if (fenceObjectIt == mFenceSyncMap.end()) if (fenceObjectIt == mFenceSyncMap.end())
{ {
return NULL; return nullptr;
} }
else else
{ {
......
...@@ -15,8 +15,6 @@ ...@@ -15,8 +15,6 @@
#include "libANGLE/angletypes.h" #include "libANGLE/angletypes.h"
#include "libANGLE/HandleAllocator.h" #include "libANGLE/HandleAllocator.h"
#include <map>
namespace rx namespace rx
{ {
class ImplFactory; class ImplFactory;
...@@ -82,31 +80,24 @@ class ResourceManager : angle::NonCopyable ...@@ -82,31 +80,24 @@ class ResourceManager : angle::NonCopyable
rx::ImplFactory *mFactory; rx::ImplFactory *mFactory;
std::size_t mRefCount; std::size_t mRefCount;
typedef std::map<GLuint, Buffer*> BufferMap; ResourceMap<Buffer> mBufferMap;
BufferMap mBufferMap;
HandleAllocator mBufferHandleAllocator; HandleAllocator mBufferHandleAllocator;
typedef std::map<GLuint, Shader*> ShaderMap; ResourceMap<Shader> mShaderMap;
ShaderMap mShaderMap;
typedef std::map<GLuint, Program*> ProgramMap; ResourceMap<Program> mProgramMap;
ProgramMap mProgramMap;
HandleAllocator mProgramShaderHandleAllocator; HandleAllocator mProgramShaderHandleAllocator;
typedef std::map<GLuint, Texture*> TextureMap; ResourceMap<Texture> mTextureMap;
TextureMap mTextureMap;
HandleAllocator mTextureHandleAllocator; HandleAllocator mTextureHandleAllocator;
typedef std::map<GLuint, Renderbuffer*> RenderbufferMap; ResourceMap<Renderbuffer> mRenderbufferMap;
RenderbufferMap mRenderbufferMap;
HandleAllocator mRenderbufferHandleAllocator; HandleAllocator mRenderbufferHandleAllocator;
typedef std::map<GLuint, Sampler*> SamplerMap; ResourceMap<Sampler> mSamplerMap;
SamplerMap mSamplerMap;
HandleAllocator mSamplerHandleAllocator; HandleAllocator mSamplerHandleAllocator;
typedef std::map<GLuint, FenceSync*> FenceMap; ResourceMap<FenceSync> mFenceSyncMap;
FenceMap mFenceSyncMap;
HandleAllocator mFenceSyncHandleAllocator; HandleAllocator mFenceSyncHandleAllocator;
}; };
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <stdint.h> #include <stdint.h>
#include <bitset> #include <bitset>
#include <unordered_map>
namespace gl namespace gl
{ {
...@@ -301,6 +302,11 @@ typedef std::bitset<MAX_VERTEX_ATTRIBS> AttributesMask; ...@@ -301,6 +302,11 @@ typedef std::bitset<MAX_VERTEX_ATTRIBS> AttributesMask;
// Use in Program // Use in Program
typedef std::bitset<IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS> UniformBlockBindingMask; 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 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