void State::initializeZeroTextures(const TextureMap &zeroTextures) { for (TextureMap::const_iterator i = zeroTextures.begin(); i != zeroTextures.end(); i++) { TextureBindingVector &samplerTextureArray = mSamplerTextures[i->first]; for (size_t textureUnit = 0; textureUnit < samplerTextureArray.size(); ++textureUnit) { samplerTextureArray[textureUnit].set(i->second.get()); } } }
void State::detachTexture(const TextureMap &zeroTextures, GLuint texture) { // Textures have a detach method on State rather than a simple // removeBinding, because the zero/null texture objects are managed // separately, and don't have to go through the Context's maps or // the ResourceManager. // [OpenGL ES 2.0.24] section 3.8 page 84: // If a texture object is deleted, it is as if all texture units which are bound to that texture object are // rebound to texture object zero for (TextureBindingMap::iterator bindingVec = mSamplerTextures.begin(); bindingVec != mSamplerTextures.end(); bindingVec++) { GLenum textureType = bindingVec->first; TextureBindingVector &textureVector = bindingVec->second; for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++) { BindingPointer<Texture> &binding = textureVector[textureIdx]; if (binding.id() == texture) { auto it = zeroTextures.find(textureType); ASSERT(it != zeroTextures.end()); // Zero textures are the "default" textures instead of NULL binding.set(it->second.get()); } } } // [OpenGL ES 2.0.24] section 4.4 page 112: // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this // image was attached in the currently bound framebuffer. if (mReadFramebuffer) { mReadFramebuffer->detachTexture(texture); } if (mDrawFramebuffer) { mDrawFramebuffer->detachTexture(texture); } }