| // |
| // Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| // Data.cpp: Container class for all GL relevant state, caps and objects |
| |
| #include "libANGLE/ContextState.h" |
| |
| #include "libANGLE/Framebuffer.h" |
| #include "libANGLE/ResourceManager.h" |
| |
| 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(); |
| } |
| } |
| |
| TextureManager *AllocateOrGetSharedTextureManager(const ContextState *shareContextState, |
| TextureManager *shareTextures, |
| ContextStateMember<TextureManager> member) |
| { |
| if (shareContextState) |
| { |
| TextureManager *textureManager = (*shareContextState).*member; |
| ASSERT(shareTextures == nullptr || textureManager == shareTextures); |
| textureManager->addRef(); |
| return textureManager; |
| } |
| else if (shareTextures) |
| { |
| TextureManager *textureManager = shareTextures; |
| textureManager->addRef(); |
| return textureManager; |
| } |
| else |
| { |
| return new TextureManager(); |
| } |
| } |
| |
| } // anonymous namespace |
| |
| ContextState::ContextState(ContextID contextIn, |
| const ContextState *shareContextState, |
| TextureManager *shareTextures, |
| const Version &clientVersion, |
| State *stateIn, |
| const Caps &capsIn, |
| const TextureCapsMap &textureCapsIn, |
| const Extensions &extensionsIn, |
| const Limitations &limitationsIn) |
| : mClientVersion(clientVersion), |
| mContext(contextIn), |
| mState(stateIn), |
| mCaps(capsIn), |
| mTextureCaps(textureCapsIn), |
| mExtensions(extensionsIn), |
| mLimitations(limitationsIn), |
| mBuffers(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mBuffers)), |
| mShaderPrograms( |
| AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mShaderPrograms)), |
| mTextures(AllocateOrGetSharedTextureManager(shareContextState, |
| shareTextures, |
| &ContextState::mTextures)), |
| mRenderbuffers( |
| AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mRenderbuffers)), |
| mSamplers(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mSamplers)), |
| mSyncs(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mSyncs)), |
| mPaths(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mPaths)), |
| mFramebuffers(new FramebufferManager()), |
| mPipelines(new ProgramPipelineManager()) |
| { |
| } |
| |
| ContextState::~ContextState() |
| { |
| // Handles are released by the Context. |
| } |
| |
| bool ContextState::isWebGL() const |
| { |
| return mExtensions.webglCompatibility; |
| } |
| |
| bool ContextState::isWebGL1() const |
| { |
| return (isWebGL() && mClientVersion.major == 2); |
| } |
| |
| const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const |
| { |
| return mTextureCaps.get(internalFormat); |
| } |
| |
| } // namespace gl |