Refactor ResourceManager into separate managers per resource type.
BUG=angleproject:1639
Change-Id: I943f553cfb0e0feb57953770784b48e22fccc875
Reviewed-on: https://chromium-review.googlesource.com/423172
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/ContextState.cpp b/src/libANGLE/ContextState.cpp
index 144a8f3..7504919 100644
--- a/src/libANGLE/ContextState.cpp
+++ b/src/libANGLE/ContextState.cpp
@@ -14,13 +14,37 @@
namespace gl
{
+namespace
+{
+
+template <typename T>
+using ContextStateMember = T *(ContextState::*);
+
+template <typename T>
+T *AllocateOrGetSharedResourceManager(const ContextState *shareContextState,
+ ContextStateMember<T> member)
+{
+ if (shareContextState)
+ {
+ T *resourceManager = (*shareContextState).*member;
+ resourceManager->addRef();
+ return resourceManager;
+ }
+ else
+ {
+ return new T();
+ }
+}
+
+} // anonymous namespace
+
ContextState::ContextState(uintptr_t contextIn,
+ const ContextState *shareContextState,
const Version &clientVersion,
State *stateIn,
const Caps &capsIn,
const TextureCapsMap &textureCapsIn,
const Extensions &extensionsIn,
- const ResourceManager *resourceManagerIn,
const Limitations &limitationsIn,
const ResourceMap<Framebuffer> &framebufferMap)
: mClientVersion(clientVersion),
@@ -29,14 +53,30 @@
mCaps(capsIn),
mTextureCaps(textureCapsIn),
mExtensions(extensionsIn),
- mResourceManager(resourceManagerIn),
mLimitations(limitationsIn),
- mFramebufferMap(framebufferMap)
+ mFramebufferMap(framebufferMap),
+ mBuffers(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mBuffers)),
+ mShaderPrograms(
+ AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mShaderPrograms)),
+ mTextures(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mTextures)),
+ mRenderbuffers(
+ AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mRenderbuffers)),
+ mSamplers(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mSamplers)),
+ mFenceSyncs(
+ AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mFenceSyncs)),
+ mPaths(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mPaths))
{
}
ContextState::~ContextState()
{
+ mBuffers->release();
+ mShaderPrograms->release();
+ mTextures->release();
+ mRenderbuffers->release();
+ mSamplers->release();
+ mFenceSyncs->release();
+ mPaths->release();
}
const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
@@ -44,22 +84,22 @@
return mTextureCaps.get(internalFormat);
}
-ValidationContext::ValidationContext(const Version &clientVersion,
+ValidationContext::ValidationContext(const ValidationContext *shareContext,
+ const Version &clientVersion,
State *state,
const Caps &caps,
const TextureCapsMap &textureCaps,
const Extensions &extensions,
- const ResourceManager *resourceManager,
const Limitations &limitations,
const ResourceMap<Framebuffer> &framebufferMap,
bool skipValidation)
: mState(reinterpret_cast<uintptr_t>(this),
+ shareContext ? &shareContext->mState : nullptr,
clientVersion,
state,
caps,
textureCaps,
extensions,
- resourceManager,
limitations,
framebufferMap),
mSkipValidation(skipValidation)
@@ -598,27 +638,27 @@
Program *ValidationContext::getProgram(GLuint handle) const
{
- return mState.mResourceManager->getProgram(handle);
+ return mState.mShaderPrograms->getProgram(handle);
}
Shader *ValidationContext::getShader(GLuint handle) const
{
- return mState.mResourceManager->getShader(handle);
+ return mState.mShaderPrograms->getShader(handle);
}
bool ValidationContext::isTextureGenerated(GLuint texture) const
{
- return mState.mResourceManager->isTextureGenerated(texture);
+ return mState.mTextures->isTextureGenerated(texture);
}
bool ValidationContext::isBufferGenerated(GLuint buffer) const
{
- return mState.mResourceManager->isBufferGenerated(buffer);
+ return mState.mBuffers->isBufferGenerated(buffer);
}
bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
{
- return mState.mResourceManager->isRenderbufferGenerated(renderbuffer);
+ return mState.mRenderbuffers->isRenderbufferGenerated(renderbuffer);
}
bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const