RenderBufferCache.cpp revision 48a8f431fa52ae2ee25ffba9d20676f03bb710ff
18d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy/* 28d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * Copyright (C) 2013 The Android Open Source Project 38d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * 48d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 58d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * you may not use this file except in compliance with the License. 68d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * You may obtain a copy of the License at 78d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * 88d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 98d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * 108d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * Unless required by applicable law or agreed to in writing, software 118d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 128d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * See the License for the specific language governing permissions and 148d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * limitations under the License. 158d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy */ 168d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 178d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy#include "Debug.h" 188d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy#include "Properties.h" 198d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy#include "RenderBufferCache.h" 208d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 216b50780363d3bb8db600c770183fa07677509ae8John Reck#include <utils/Log.h> 226b50780363d3bb8db600c770183fa07677509ae8John Reck 236b50780363d3bb8db600c770183fa07677509ae8John Reck#include <cstdlib> 246b50780363d3bb8db600c770183fa07677509ae8John Reck 258d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guynamespace android { 268d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guynamespace uirenderer { 278d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 288d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy/////////////////////////////////////////////////////////////////////////////// 298d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy// Defines 308d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy/////////////////////////////////////////////////////////////////////////////// 318d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 328d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy// Debug 338d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy#if DEBUG_RENDER_BUFFERS 348d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy #define RENDER_BUFFER_LOGD(...) ALOGD(__VA_ARGS__) 358d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy#else 368d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy #define RENDER_BUFFER_LOGD(...) 378d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy#endif 388d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 398d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy/////////////////////////////////////////////////////////////////////////////// 408d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy// Constructors/destructor 418d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy/////////////////////////////////////////////////////////////////////////////// 428d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 4348a8f431fa52ae2ee25ffba9d20676f03bb710ffChris CraikRenderBufferCache::RenderBufferCache() 4448a8f431fa52ae2ee25ffba9d20676f03bb710ffChris Craik : mSize(0) 4548a8f431fa52ae2ee25ffba9d20676f03bb710ffChris Craik , mMaxSize(Properties::renderBufferCacheSize) {} 468d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 478d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain GuyRenderBufferCache::~RenderBufferCache() { 488d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy clear(); 498d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy} 508d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 518d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy/////////////////////////////////////////////////////////////////////////////// 528d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy// Size management 538d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy/////////////////////////////////////////////////////////////////////////////// 548d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 558d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guyuint32_t RenderBufferCache::getSize() { 568d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy return mSize; 578d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy} 588d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 598d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guyuint32_t RenderBufferCache::getMaxSize() { 608d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy return mMaxSize; 618d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy} 628d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 638d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy/////////////////////////////////////////////////////////////////////////////// 648d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy// Caching 658d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy/////////////////////////////////////////////////////////////////////////////// 668d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 678d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guyint RenderBufferCache::RenderBufferEntry::compare( 688d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy const RenderBufferCache::RenderBufferEntry& lhs, 698d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy const RenderBufferCache::RenderBufferEntry& rhs) { 708d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy int deltaInt = int(lhs.mWidth) - int(rhs.mWidth); 718d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy if (deltaInt != 0) return deltaInt; 728d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 738d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy deltaInt = int(lhs.mHeight) - int(rhs.mHeight); 748d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy if (deltaInt != 0) return deltaInt; 758d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 768d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy return int(lhs.mFormat) - int(rhs.mFormat); 778d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy} 788d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 798d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guyvoid RenderBufferCache::deleteBuffer(RenderBuffer* buffer) { 808d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy if (buffer) { 818d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RENDER_BUFFER_LOGD("Deleted %s render buffer (%dx%d)", 828d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RenderBuffer::formatName(buffer->getFormat()), 838d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy buffer->getWidth(), buffer->getHeight()); 848d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 858d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy mSize -= buffer->getSize(); 868d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy delete buffer; 878d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy } 888d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy} 898d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 908d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guyvoid RenderBufferCache::clear() { 91bef837dc57b47fd7fcc17c86d741cf77eac4487bJohn Reck for (auto entry : mCache) { 92bef837dc57b47fd7fcc17c86d741cf77eac4487bJohn Reck deleteBuffer(entry.mBuffer); 938d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy } 948d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy mCache.clear(); 958d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy} 968d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 978d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain GuyRenderBuffer* RenderBufferCache::get(GLenum format, const uint32_t width, const uint32_t height) { 98d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik RenderBuffer* buffer = nullptr; 998d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1008d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RenderBufferEntry entry(format, width, height); 101bef837dc57b47fd7fcc17c86d741cf77eac4487bJohn Reck auto iter = mCache.find(entry); 1028d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 103bef837dc57b47fd7fcc17c86d741cf77eac4487bJohn Reck if (iter != mCache.end()) { 104bef837dc57b47fd7fcc17c86d741cf77eac4487bJohn Reck entry = *iter; 105bef837dc57b47fd7fcc17c86d741cf77eac4487bJohn Reck mCache.erase(iter); 1068d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1078d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy buffer = entry.mBuffer; 1088d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy mSize -= buffer->getSize(); 1098d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1108d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RENDER_BUFFER_LOGD("Found %s render buffer (%dx%d)", 1118d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RenderBuffer::formatName(format), width, height); 1128d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy } else { 1138d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy buffer = new RenderBuffer(format, width, height); 1148d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1158d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RENDER_BUFFER_LOGD("Created new %s render buffer (%dx%d)", 1168d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RenderBuffer::formatName(format), width, height); 1178d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy } 1188d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1198d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy buffer->bind(); 1208d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy buffer->allocate(); 1218d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1228d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy return buffer; 1238d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy} 1248d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1258d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guybool RenderBufferCache::put(RenderBuffer* buffer) { 1268d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy if (!buffer) return false; 1278d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1288d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy const uint32_t size = buffer->getSize(); 1298d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy if (size < mMaxSize) { 1308d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy while (mSize + size > mMaxSize) { 131bef837dc57b47fd7fcc17c86d741cf77eac4487bJohn Reck RenderBuffer* victim = mCache.begin()->mBuffer; 1328d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy deleteBuffer(victim); 133bef837dc57b47fd7fcc17c86d741cf77eac4487bJohn Reck mCache.erase(mCache.begin()); 1348d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy } 1358d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1368d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RenderBufferEntry entry(buffer); 1378d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 138bef837dc57b47fd7fcc17c86d741cf77eac4487bJohn Reck mCache.insert(entry); 1398d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy mSize += size; 1408d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1418d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RENDER_BUFFER_LOGD("Added %s render buffer (%dx%d)", 1428d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RenderBuffer::formatName(buffer->getFormat()), 1438d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy buffer->getWidth(), buffer->getHeight()); 1448d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1458d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy return true; 146e11f3ab000ec8d71e816aea7f266a3ceafebfd56Samsung } else { 147e11f3ab000ec8d71e816aea7f266a3ceafebfd56Samsung RENDER_BUFFER_LOGD("Deleted %s render buffer (%dx%d) Size=%d, MaxSize=%d", 148e11f3ab000ec8d71e816aea7f266a3ceafebfd56Samsung RenderBuffer::formatName(buffer->getFormat()), 149e11f3ab000ec8d71e816aea7f266a3ceafebfd56Samsung buffer->getWidth(), buffer->getHeight(), size, mMaxSize); 150e11f3ab000ec8d71e816aea7f266a3ceafebfd56Samsung delete buffer; 1518d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy } 1528d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy return false; 1538d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy} 1548d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 1558d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy}; // namespace uirenderer 1568d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy}; // namespace android 157