Caches.cpp revision 8ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695
1dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase/*
2dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * Copyright (C) 2010 The Android Open Source Project
3dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase *
4dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * Licensed under the Apache License, Version 2.0 (the "License");
5dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * you may not use this file except in compliance with the License.
6dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * You may obtain a copy of the License at
7dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase *
8dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase *      http://www.apache.org/licenses/LICENSE-2.0
9dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase *
10dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * Unless required by applicable law or agreed to in writing, software
11dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * distributed under the License is distributed on an "AS IS" BASIS,
12dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * See the License for the specific language governing permissions and
14dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * limitations under the License.
15dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase */
16dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
17dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#define LOG_TAG "OpenGLRenderer"
18dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
19c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy#include <utils/Log.h>
209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include <utils/String8.h>
21c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
22dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#include "Caches.h"
23e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy#include "Properties.h"
2409b7c91de73b59aa3f679b3ae3ba299f82ec9f8aRomain Guy#include "LayerRenderer.h"
25dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
26dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haasenamespace android {
27dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
28dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#ifdef USE_OPENGL_RENDERER
29dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haaseusing namespace uirenderer;
30dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet HaaseANDROID_SINGLETON_STATIC_INSTANCE(Caches);
31dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#endif
32dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
33dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haasenamespace uirenderer {
34dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
35dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase///////////////////////////////////////////////////////////////////////////////
36bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy// Macros
37bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy///////////////////////////////////////////////////////////////////////////////
38bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
39bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy#if DEBUG_CACHE_FLUSH
40bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    #define FLUSH_LOGD(...) LOGD(__VA_ARGS__)
41bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy#else
42bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    #define FLUSH_LOGD(...)
43bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy#endif
44bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
45bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy///////////////////////////////////////////////////////////////////////////////
46dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase// Constructors/destructor
47dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase///////////////////////////////////////////////////////////////////////////////
48dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
498ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain GuyCaches::Caches(): Singleton<Caches>(), mInitialized(false) {
50dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    GLint maxTextureUnits;
51dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
52dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    if (maxTextureUnits < REQUIRED_TEXTURE_UNITS_COUNT) {
53dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase        LOGW("At least %d texture units are required!", REQUIRED_TEXTURE_UNITS_COUNT);
54dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    }
55dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
56746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
57746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
588ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    init();
59e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy
60e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    mDebugLevel = readDebugLevel();
61e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    LOGD("Enabling debug mode %d", mDebugLevel);
627230a74e9a36dfc6c4346c14e325bf07cd05b380Romain Guy
637230a74e9a36dfc6c4346c14e325bf07cd05b380Romain Guy#if RENDER_LAYERS_AS_REGIONS
6402ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy    INIT_LOGD("Layers will be composited as regions");
657230a74e9a36dfc6c4346c14e325bf07cd05b380Romain Guy#endif
66dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase}
67dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
688ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guyvoid Caches::init() {
698ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    if (mInitialized) return;
708ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
718ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    glGenBuffers(1, &meshBuffer);
728ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    glBindBuffer(GL_ARRAY_BUFFER, meshBuffer);
738ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    glBufferData(GL_ARRAY_BUFFER, sizeof(gMeshVertices), gMeshVertices, GL_STATIC_DRAW);
748ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
758ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    mCurrentBuffer = meshBuffer;
768ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    mRegionMesh = NULL;
778ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
788ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    blend = false;
798ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    lastSrcMode = GL_ZERO;
808ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    lastDstMode = GL_ZERO;
818ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    currentProgram = NULL;
828ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
838ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    mInitialized = true;
848ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy}
858ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
868ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guyvoid Caches::terminate() {
878ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    if (!mInitialized) return;
888ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
898ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    glDeleteBuffers(1, &meshBuffer);
908ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    mCurrentBuffer = 0;
918ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
928ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    glDeleteBuffers(1, &mRegionMeshIndices);
935b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    delete[] mRegionMesh;
948ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    mRegionMesh = NULL;
958ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
968ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    fboCache.clear();
978ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
988ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    programCache.clear();
998ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    currentProgram = NULL;
1008ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1018ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    mInitialized = false;
1025b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
1035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
1045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy///////////////////////////////////////////////////////////////////////////////
105c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy// Debug
106c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy///////////////////////////////////////////////////////////////////////////////
107c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
108c15008e72ec00ca20a271c3006dac649fd07533bRomain Guyvoid Caches::dumpMemoryUsage() {
1099c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    String8 stringLog;
1109c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    dumpMemoryUsage(stringLog);
1119c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    LOGD("%s", stringLog.string());
1129c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
1139c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
1149c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid Caches::dumpMemoryUsage(String8 &log) {
1159c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("Current memory usage / total memory usage (bytes):\n");
1169c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  TextureCache         %8d / %8d\n",
1179c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            textureCache.getSize(), textureCache.getMaxSize());
1189c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  LayerCache           %8d / %8d\n",
1199c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            layerCache.getSize(), layerCache.getMaxSize());
1209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  GradientCache        %8d / %8d\n",
1219c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            gradientCache.getSize(), gradientCache.getMaxSize());
1229c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  PathCache            %8d / %8d\n",
1239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            pathCache.getSize(), pathCache.getMaxSize());
1249c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  CircleShapeCache     %8d / %8d\n",
12501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            circleShapeCache.getSize(), circleShapeCache.getMaxSize());
1269c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  OvalShapeCache       %8d / %8d\n",
1272fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            ovalShapeCache.getSize(), ovalShapeCache.getMaxSize());
1289c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  RoundRectShapeCache  %8d / %8d\n",
12901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            roundRectShapeCache.getSize(), roundRectShapeCache.getMaxSize());
1309c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  RectShapeCache       %8d / %8d\n",
1312fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            rectShapeCache.getSize(), rectShapeCache.getMaxSize());
1329c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  ArcShapeCache        %8d / %8d\n",
1332fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            arcShapeCache.getSize(), arcShapeCache.getMaxSize());
1349c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  TextDropShadowCache  %8d / %8d\n", dropShadowCache.getSize(),
135c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy            dropShadowCache.getMaxSize());
136c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    for (uint32_t i = 0; i < fontRenderer.getFontRendererCount(); i++) {
137c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy        const uint32_t size = fontRenderer.getFontRendererSize(i);
1389c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        log.appendFormat("  FontRenderer %d       %8d / %8d\n", i, size, size);
139c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    }
140d2ba50ab861ec0950bda18dd0f463b687e66249fRomain Guy    log.appendFormat("Other:\n");
1419c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  FboCache             %8d / %8d\n",
1429c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            fboCache.getSize(), fboCache.getMaxSize());
1439c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  PatchCache           %8d / %8d\n",
1449c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            patchCache.getSize(), patchCache.getMaxSize());
145c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
146c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    uint32_t total = 0;
147c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    total += textureCache.getSize();
148c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    total += layerCache.getSize();
149c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    total += gradientCache.getSize();
150c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    total += pathCache.getSize();
151c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    total += dropShadowCache.getSize();
1522fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    total += roundRectShapeCache.getSize();
1532fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    total += circleShapeCache.getSize();
1542fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    total += ovalShapeCache.getSize();
1552fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    total += rectShapeCache.getSize();
1562fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    total += arcShapeCache.getSize();
157c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    for (uint32_t i = 0; i < fontRenderer.getFontRendererCount(); i++) {
158c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy        total += fontRenderer.getFontRendererSize(i);
159c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    }
160c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
1619c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("Total memory usage:\n");
1629c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    log.appendFormat("  %d bytes, %.2f MB\n", total, total / 1024.0f / 1024.0f);
163c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy}
164c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
165c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy///////////////////////////////////////////////////////////////////////////////
166fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy// Memory management
167fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy///////////////////////////////////////////////////////////////////////////////
168fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy
169fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guyvoid Caches::clearGarbage() {
170fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    textureCache.clearGarbage();
171fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    pathCache.clearGarbage();
17257066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy
17357066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    Mutex::Autolock _l(mGarbageLock);
17457066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy
175ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    size_t count = mLayerGarbage.size();
17657066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    for (size_t i = 0; i < count; i++) {
177ada830f639591b99c3e40de22b07296c7932a33fRomain Guy        Layer* layer = mLayerGarbage.itemAt(i);
17809b7c91de73b59aa3f679b3ae3ba299f82ec9f8aRomain Guy        LayerRenderer::destroyLayer(layer);
17957066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    }
180ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    mLayerGarbage.clear();
18157066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy}
18257066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy
183ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid Caches::deleteLayerDeferred(Layer* layer) {
18457066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    Mutex::Autolock _l(mGarbageLock);
185ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    mLayerGarbage.push(layer);
186fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy}
187fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy
188bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guyvoid Caches::flush(FlushMode mode) {
189bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    FLUSH_LOGD("Flushing caches (mode %d)", mode);
190bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
191bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    clearGarbage();
192bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
193bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    switch (mode) {
194bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy        case kFlushMode_Full:
195bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            textureCache.clear();
196bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            patchCache.clear();
197bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            dropShadowCache.clear();
198bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            gradientCache.clear();
199eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy            fontRenderer.clear();
200bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            // fall through
201bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy        case kFlushMode_Moderate:
202eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy            fontRenderer.flush();
203eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy            textureCache.flush();
204bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            pathCache.clear();
205bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            roundRectShapeCache.clear();
206bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            circleShapeCache.clear();
207bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            ovalShapeCache.clear();
208bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            rectShapeCache.clear();
209bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            arcShapeCache.clear();
2106d7475d666baefaa3ba9f0dcee25238739454241Romain Guy            // fall through
2116d7475d666baefaa3ba9f0dcee25238739454241Romain Guy        case kFlushMode_Layers:
2126d7475d666baefaa3ba9f0dcee25238739454241Romain Guy            layerCache.clear();
213bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy            break;
214bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    }
215bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy}
216bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
217fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy///////////////////////////////////////////////////////////////////////////////
2185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy// VBO
2195b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy///////////////////////////////////////////////////////////////////////////////
2205b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
221dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haasevoid Caches::bindMeshBuffer() {
222dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    bindMeshBuffer(meshBuffer);
223dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase}
224dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
225dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haasevoid Caches::bindMeshBuffer(const GLuint buffer) {
2269bca4793a33d2714b306d69ceb870925a588fe71Romain Guy    if (mCurrentBuffer != buffer) {
227dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase        glBindBuffer(GL_ARRAY_BUFFER, buffer);
2289bca4793a33d2714b306d69ceb870925a588fe71Romain Guy        mCurrentBuffer = buffer;
229dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    }
230dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase}
231dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
232dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haasevoid Caches::unbindMeshBuffer() {
2339bca4793a33d2714b306d69ceb870925a588fe71Romain Guy    if (mCurrentBuffer) {
234dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase        glBindBuffer(GL_ARRAY_BUFFER, 0);
2359bca4793a33d2714b306d69ceb870925a588fe71Romain Guy        mCurrentBuffer = 0;
236dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    }
237dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase}
238dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase
2395b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain GuyTextureVertex* Caches::getRegionMesh() {
2405b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    // Create the mesh, 2 triangles and 4 vertices per rectangle in the region
2415b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    if (!mRegionMesh) {
2425b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        mRegionMesh = new TextureVertex[REGION_MESH_QUAD_COUNT * 4];
2435b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
2445b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        uint16_t* regionIndices = new uint16_t[REGION_MESH_QUAD_COUNT * 6];
2455b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        for (int i = 0; i < REGION_MESH_QUAD_COUNT; i++) {
2465b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            uint16_t quad = i * 4;
2475b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            int index = i * 6;
2485b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            regionIndices[index    ] = quad;       // top-left
2495b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            regionIndices[index + 1] = quad + 1;   // top-right
2505b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            regionIndices[index + 2] = quad + 2;   // bottom-left
2515b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            regionIndices[index + 3] = quad + 2;   // bottom-left
2525b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            regionIndices[index + 4] = quad + 1;   // top-right
2535b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            regionIndices[index + 5] = quad + 3;   // bottom-right
2545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        }
2555b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
2565b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        glGenBuffers(1, &mRegionMeshIndices);
2575b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mRegionMeshIndices);
2585b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        glBufferData(GL_ELEMENT_ARRAY_BUFFER, REGION_MESH_QUAD_COUNT * 6 * sizeof(uint16_t),
2595b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                regionIndices, GL_STATIC_DRAW);
2605b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
2615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        delete[] regionIndices;
2625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    } else {
2635b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mRegionMeshIndices);
2645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    }
2655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
2665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return mRegionMesh;
2675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
2685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
269dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase}; // namespace uirenderer
270dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase}; // namespace android
271