void StateManagerGL::deleteRenderbuffer(GLuint rbo) { if (rbo != 0) { if (mRenderbuffer == rbo) { bindRenderbuffer(GL_RENDERBUFFER, 0); } mFunctions->deleteRenderbuffers(1, &rbo); } }
Context::Context(const egl::Config *config, int clientVersion, const Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess) : mRenderer(renderer), mData(clientVersion, mState, mCaps, mTextureCaps, mExtensions, nullptr) { ASSERT(robustAccess == false); // Unimplemented initCaps(clientVersion); mState.initialize(mCaps, clientVersion); mClientVersion = clientVersion; mConfigID = config->configID; mClientType = EGL_OPENGL_ES_API; mFenceNVHandleAllocator.setBaseHandle(0); if (shareContext != NULL) { mResourceManager = shareContext->mResourceManager; mResourceManager->addRef(); } else { mResourceManager = new ResourceManager(mRenderer); } mData.resourceManager = mResourceManager; // [OpenGL ES 2.0.24] section 3.7 page 83: // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional // and cube map texture state vectors respectively associated with them. // In order that access to these initial textures not be lost, they are treated as texture // objects all of whose names are 0. Texture *zeroTexture2D = new Texture(mRenderer->createTexture(GL_TEXTURE_2D), 0, GL_TEXTURE_2D); mZeroTextures[GL_TEXTURE_2D].set(zeroTexture2D); Texture *zeroTextureCube = new Texture(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), 0, GL_TEXTURE_CUBE_MAP); mZeroTextures[GL_TEXTURE_CUBE_MAP].set(zeroTextureCube); if (mClientVersion >= 3) { // TODO: These could also be enabled via extension Texture *zeroTexture3D = new Texture(mRenderer->createTexture(GL_TEXTURE_3D), 0, GL_TEXTURE_3D); mZeroTextures[GL_TEXTURE_3D].set(zeroTexture3D); Texture *zeroTexture2DArray = new Texture(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), 0, GL_TEXTURE_2D_ARRAY); mZeroTextures[GL_TEXTURE_2D_ARRAY].set(zeroTexture2DArray); } mState.initializeZeroTextures(mZeroTextures); // Allocate default FBO mFramebufferMap[0] = new Framebuffer(mCaps, mRenderer, 0); bindVertexArray(0); bindArrayBuffer(0); bindElementArrayBuffer(0); bindReadFramebuffer(0); bindDrawFramebuffer(0); bindRenderbuffer(0); bindGenericUniformBuffer(0); for (unsigned int i = 0; i < mCaps.maxCombinedUniformBlocks; i++) { bindIndexedUniformBuffer(0, i, 0, -1); } bindCopyReadBuffer(0); bindCopyWriteBuffer(0); bindPixelPackBuffer(0); bindPixelUnpackBuffer(0); // [OpenGL ES 3.0.2] section 2.14.1 pg 85: // In the initial state, a default transform feedback object is bound and treated as // a transform feedback object with a name of zero. That object is bound any time // BindTransformFeedback is called with id of zero mTransformFeedbackZero.set(new TransformFeedback(mRenderer->createTransformFeedback(), 0, mCaps)); bindTransformFeedback(0); mHasBeenCurrent = false; mContextLost = false; mResetStatus = GL_NO_ERROR; mResetStrategy = (notifyResets ? GL_LOSE_CONTEXT_ON_RESET_EXT : GL_NO_RESET_NOTIFICATION_EXT); mRobustAccess = robustAccess; mCompiler = new Compiler(mRenderer->createCompiler(getData())); }