Return pointers from check*Allocation.
This avoids the need to consult the resource maps twice per bind.
It improves performance in applications which call Bind* often.
BUG=angleproject:1333
Change-Id: I7b733cc89e50e24a2e38a2eb2dc7fd658d612e27
Reviewed-on: https://chromium-review.googlesource.com/331386
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/ResourceManager.cpp b/src/libANGLE/ResourceManager.cpp
index dc9dad1..db2c55f 100644
--- a/src/libANGLE/ResourceManager.cpp
+++ b/src/libANGLE/ResourceManager.cpp
@@ -356,96 +356,117 @@
mRenderbufferMap[handle] = buffer;
}
-void ResourceManager::checkBufferAllocation(GLuint handle)
+Buffer *ResourceManager::checkBufferAllocation(GLuint handle)
{
- if (handle != 0)
+ if (handle == 0)
{
- auto bufferMapIt = mBufferMap.find(handle);
- bool handleAllocated = (bufferMapIt != mBufferMap.end());
-
- if (handleAllocated && bufferMapIt->second != nullptr)
- {
- return;
- }
-
- Buffer *buffer = new Buffer(mFactory->createBuffer(), handle);
- buffer->addRef();
-
- if (handleAllocated)
- {
- bufferMapIt->second = buffer;
- }
- else
- {
- mBufferHandleAllocator.reserve(handle);
- mBufferMap[handle] = buffer;
- }
+ return nullptr;
}
+
+ auto bufferMapIt = mBufferMap.find(handle);
+ bool handleAllocated = (bufferMapIt != mBufferMap.end());
+
+ if (handleAllocated && bufferMapIt->second != nullptr)
+ {
+ return bufferMapIt->second;
+ }
+
+ Buffer *buffer = new Buffer(mFactory->createBuffer(), handle);
+ buffer->addRef();
+
+ if (handleAllocated)
+ {
+ bufferMapIt->second = buffer;
+ }
+ else
+ {
+ mBufferHandleAllocator.reserve(handle);
+ mBufferMap[handle] = buffer;
+ }
+
+ return buffer;
}
-void ResourceManager::checkTextureAllocation(GLuint handle, GLenum type)
+Texture *ResourceManager::checkTextureAllocation(GLuint handle, GLenum type)
{
- if (handle != 0)
+ if (handle == 0)
{
- auto textureMapIt = mTextureMap.find(handle);
- bool handleAllocated = (textureMapIt != mTextureMap.end());
-
- if (handleAllocated && textureMapIt->second != nullptr)
- {
- return;
- }
-
- Texture *texture = new Texture(mFactory->createTexture(type), handle, type);
- texture->addRef();
-
- if (handleAllocated)
- {
- textureMapIt->second = texture;
- }
- else
- {
- mTextureHandleAllocator.reserve(handle);
- mTextureMap[handle] = texture;
- }
+ return nullptr;
}
+
+ auto textureMapIt = mTextureMap.find(handle);
+ bool handleAllocated = (textureMapIt != mTextureMap.end());
+
+ if (handleAllocated && textureMapIt->second != nullptr)
+ {
+ return textureMapIt->second;
+ }
+
+ Texture *texture = new Texture(mFactory->createTexture(type), handle, type);
+ texture->addRef();
+
+ if (handleAllocated)
+ {
+ textureMapIt->second = texture;
+ }
+ else
+ {
+ mTextureHandleAllocator.reserve(handle);
+ mTextureMap[handle] = texture;
+ }
+
+ return texture;
}
-void ResourceManager::checkRenderbufferAllocation(GLuint handle)
+Renderbuffer *ResourceManager::checkRenderbufferAllocation(GLuint handle)
{
- if (handle != 0)
+ if (handle == 0)
{
- auto renderbufferMapIt = mRenderbufferMap.find(handle);
- bool handleAllocated = (renderbufferMapIt != mRenderbufferMap.end());
-
- if (handleAllocated && renderbufferMapIt->second != nullptr)
- {
- return;
- }
-
- Renderbuffer *renderbuffer = new Renderbuffer(mFactory->createRenderbuffer(), handle);
- renderbuffer->addRef();
-
- if (handleAllocated)
- {
- renderbufferMapIt->second = renderbuffer;
- }
- else
- {
- mRenderbufferHandleAllocator.reserve(handle);
- mRenderbufferMap[handle] = renderbuffer;
- }
+ return nullptr;
}
+
+ auto renderbufferMapIt = mRenderbufferMap.find(handle);
+ bool handleAllocated = (renderbufferMapIt != mRenderbufferMap.end());
+
+ if (handleAllocated && renderbufferMapIt->second != nullptr)
+ {
+ return renderbufferMapIt->second;
+ }
+
+ Renderbuffer *renderbuffer = new Renderbuffer(mFactory->createRenderbuffer(), handle);
+ renderbuffer->addRef();
+
+ if (handleAllocated)
+ {
+ renderbufferMapIt->second = renderbuffer;
+ }
+ else
+ {
+ mRenderbufferHandleAllocator.reserve(handle);
+ mRenderbufferMap[handle] = renderbuffer;
+ }
+
+ return renderbuffer;
}
-void ResourceManager::checkSamplerAllocation(GLuint sampler)
+Sampler *ResourceManager::checkSamplerAllocation(GLuint samplerHandle)
{
- if (sampler != 0 && !getSampler(sampler))
+ // Samplers cannot be created via Bind
+ if (samplerHandle == 0)
{
- Sampler *samplerObject = new Sampler(mFactory, sampler);
- mSamplerMap[sampler] = samplerObject;
- samplerObject->addRef();
- // Samplers cannot be created via Bind
+ return nullptr;
}
+
+ Sampler *sampler = getSampler(samplerHandle);
+
+ if (!sampler)
+ {
+ sampler = new Sampler(mFactory, samplerHandle);
+ mSamplerMap[samplerHandle] = sampler;
+ sampler->addRef();
+ }
+
+ return sampler;
}
bool ResourceManager::isSampler(GLuint sampler)
@@ -453,4 +474,4 @@
return mSamplerMap.find(sampler) != mSamplerMap.end();
}
-}
+} // namespace gl