unsigned TextureManager::requestTexture(TextureToken token, IntSize size, unsigned format, bool* newTexture) { if (size.width() > m_maxTextureSize || size.height() > m_maxTextureSize) return 0; TextureMap::iterator it = m_textures.find(token); if (it != m_textures.end()) { ASSERT(it->second.size != size || it->second.format != format); removeTexture(token, it->second); } size_t memoryRequiredBytes = memoryUseBytes(size, format); if (memoryRequiredBytes > m_memoryLimitBytes || !reduceMemoryToLimit(m_memoryLimitBytes - memoryRequiredBytes)) return 0; unsigned textureId = m_context->createTexture(); GLC(m_context.get(), textureId = m_context->createTexture()); GLC(m_context.get(), m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, textureId)); // Do basic linear filtering on resize. GLC(m_context.get(), m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR)); GLC(m_context.get(), m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR)); // NPOT textures in GL ES only work when the wrap mode is set to GraphicsContext3D::CLAMP_TO_EDGE. GLC(m_context.get(), m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE)); GLC(m_context.get(), m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE)); GLC(m_context.get(), m_context->texImage2DResourceSafe(GraphicsContext3D::TEXTURE_2D, 0, format, size.width(), size.height(), 0, format, GraphicsContext3D::UNSIGNED_BYTE)); TextureInfo info; info.size = size; info.format = format; info.textureId = textureId; info.isProtected = true; addTexture(token, info); return textureId; }
bool TextureManager::requestTexture(TextureToken token, IntSize size, unsigned format) { if (size.width() > m_maxTextureSize || size.height() > m_maxTextureSize) return false; TextureMap::iterator it = m_textures.find(token); if (it != m_textures.end()) { ASSERT(it->second.size != size || it->second.format != format); removeTexture(token, it->second); } size_t memoryRequiredBytes = memoryUseBytes(size, format); if (memoryRequiredBytes > m_maxMemoryLimitBytes) return false; reduceMemoryToLimit(m_maxMemoryLimitBytes - memoryRequiredBytes); if (m_memoryUseBytes + memoryRequiredBytes > m_maxMemoryLimitBytes) return false; TextureInfo info; info.size = size; info.format = format; info.textureId = 0; info.isProtected = true; #ifndef NDEBUG info.allocator = 0; #endif addTexture(token, info); return true; }
bool TextureManager::requestTexture(TextureToken token, IntSize size, unsigned format, unsigned& textureId) { textureId = 0; if (size.width() > m_maxTextureSize || size.height() > m_maxTextureSize) return false; TextureMap::iterator it = m_textures.find(token); if (it != m_textures.end()) { ASSERT(it->second.size != size || it->second.format != format); removeTexture(token, it->second); } size_t memoryRequiredBytes = memoryUseBytes(size, format); if (memoryRequiredBytes > m_maxMemoryLimitBytes) return false; reduceMemoryToLimit(m_maxMemoryLimitBytes - memoryRequiredBytes); if (m_memoryUseBytes + memoryRequiredBytes > m_maxMemoryLimitBytes) return false; TextureInfo info; info.size = size; info.format = format; info.textureId = 0; info.isProtected = true; #ifndef NDEBUG info.allocator = 0; #endif // Avoid churning by reusing the texture if it is about to be reclaimed and // it has the same size and format as the requesting texture. if (m_memoryUseBytes + memoryRequiredBytes > m_preferredMemoryLimitBytes) { textureId = replaceTexture(token, info); if (textureId) return true; } addTexture(token, info); return true; }
void TextureManager::evictAndDeleteAllTextures(TextureAllocator* allocator) { unprotectAllTextures(); reduceMemoryToLimit(0); deleteEvictedTextures(allocator); }
void TextureManager::setMaxMemoryLimitBytes(size_t memoryLimitBytes) { reduceMemoryToLimit(memoryLimitBytes); ASSERT(currentMemoryUseBytes() <= memoryLimitBytes); m_maxMemoryLimitBytes = memoryLimitBytes; }