RenderState.cpp revision 443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44
13b20251a355c88193c439f928a84ae69483fb488John Reck/* 23b20251a355c88193c439f928a84ae69483fb488John Reck * Copyright (C) 2014 The Android Open Source Project 33b20251a355c88193c439f928a84ae69483fb488John Reck * 43b20251a355c88193c439f928a84ae69483fb488John Reck * Licensed under the Apache License, Version 2.0 (the "License"); 53b20251a355c88193c439f928a84ae69483fb488John Reck * you may not use this file except in compliance with the License. 63b20251a355c88193c439f928a84ae69483fb488John Reck * You may obtain a copy of the License at 73b20251a355c88193c439f928a84ae69483fb488John Reck * 83b20251a355c88193c439f928a84ae69483fb488John Reck * http://www.apache.org/licenses/LICENSE-2.0 93b20251a355c88193c439f928a84ae69483fb488John Reck * 103b20251a355c88193c439f928a84ae69483fb488John Reck * Unless required by applicable law or agreed to in writing, software 113b20251a355c88193c439f928a84ae69483fb488John Reck * distributed under the License is distributed on an "AS IS" BASIS, 123b20251a355c88193c439f928a84ae69483fb488John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133b20251a355c88193c439f928a84ae69483fb488John Reck * See the License for the specific language governing permissions and 143b20251a355c88193c439f928a84ae69483fb488John Reck * limitations under the License. 153b20251a355c88193c439f928a84ae69483fb488John Reck */ 163b20251a355c88193c439f928a84ae69483fb488John Reck#include "RenderState.h" 173b20251a355c88193c439f928a84ae69483fb488John Reck 18443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck#include "renderthread/CanvasContext.h" 19443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck 203b20251a355c88193c439f928a84ae69483fb488John Recknamespace android { 213b20251a355c88193c439f928a84ae69483fb488John Recknamespace uirenderer { 223b20251a355c88193c439f928a84ae69483fb488John Reck 233b20251a355c88193c439f928a84ae69483fb488John ReckRenderState::RenderState() 243b20251a355c88193c439f928a84ae69483fb488John Reck : mCaches(NULL) 253b20251a355c88193c439f928a84ae69483fb488John Reck , mViewportWidth(0) 263b20251a355c88193c439f928a84ae69483fb488John Reck , mViewportHeight(0) 273b20251a355c88193c439f928a84ae69483fb488John Reck , mFramebuffer(0) { 283b20251a355c88193c439f928a84ae69483fb488John Reck} 293b20251a355c88193c439f928a84ae69483fb488John Reck 303b20251a355c88193c439f928a84ae69483fb488John ReckRenderState::~RenderState() { 313b20251a355c88193c439f928a84ae69483fb488John Reck} 323b20251a355c88193c439f928a84ae69483fb488John Reck 333b20251a355c88193c439f928a84ae69483fb488John Reckvoid RenderState::onGLContextCreated() { 343b20251a355c88193c439f928a84ae69483fb488John Reck // This is delayed because the first access of Caches makes GL calls 353b20251a355c88193c439f928a84ae69483fb488John Reck mCaches = &Caches::getInstance(); 363b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->init(); 3717035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck mCaches->setRenderState(this); 383b20251a355c88193c439f928a84ae69483fb488John Reck} 393b20251a355c88193c439f928a84ae69483fb488John Reck 401d4774233304c484673e2af2c1de2ab41021c979Chris Craikvoid RenderState::onGLContextDestroyed() { 4117035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck if (CC_UNLIKELY(!mActiveLayers.empty())) { 4217035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck mCaches->dumpMemoryUsage(); 43443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck for (std::set<renderthread::CanvasContext*>::iterator cit = mRegisteredContexts.begin(); 44443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck cit != mRegisteredContexts.end(); cit++) { 45443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck renderthread::CanvasContext* context = *cit; 46443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck ALOGD("Context: %p (root = %p)", context, context->mRootRenderNode.get()); 47443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck ALOGD(" Prefeteched layers: %zu", context->mPrefetechedLayers.size()); 48443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck for (std::set<RenderNode*>::iterator pit = context->mPrefetechedLayers.begin(); 49443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck pit != context->mPrefetechedLayers.end(); pit++) { 50443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck (*pit)->debugDumpLayers(" "); 51443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck } 52443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck context->mRootRenderNode->debugDumpLayers(" "); 53443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck } 5417035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck LOG_ALWAYS_FATAL("layers have survived gl context destruction"); 5517035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck } 561d4774233304c484673e2af2c1de2ab41021c979Chris Craik} 571d4774233304c484673e2af2c1de2ab41021c979Chris Craik 583b20251a355c88193c439f928a84ae69483fb488John Reckvoid RenderState::setViewport(GLsizei width, GLsizei height) { 593b20251a355c88193c439f928a84ae69483fb488John Reck mViewportWidth = width; 603b20251a355c88193c439f928a84ae69483fb488John Reck mViewportHeight = height; 613b20251a355c88193c439f928a84ae69483fb488John Reck glViewport(0, 0, mViewportWidth, mViewportHeight); 623b20251a355c88193c439f928a84ae69483fb488John Reck} 633b20251a355c88193c439f928a84ae69483fb488John Reck 643b20251a355c88193c439f928a84ae69483fb488John Reck 653b20251a355c88193c439f928a84ae69483fb488John Reckvoid RenderState::getViewport(GLsizei* outWidth, GLsizei* outHeight) { 663b20251a355c88193c439f928a84ae69483fb488John Reck *outWidth = mViewportWidth; 673b20251a355c88193c439f928a84ae69483fb488John Reck *outHeight = mViewportHeight; 683b20251a355c88193c439f928a84ae69483fb488John Reck} 693b20251a355c88193c439f928a84ae69483fb488John Reck 703b20251a355c88193c439f928a84ae69483fb488John Reckvoid RenderState::bindFramebuffer(GLuint fbo) { 713b20251a355c88193c439f928a84ae69483fb488John Reck if (mFramebuffer != fbo) { 723b20251a355c88193c439f928a84ae69483fb488John Reck mFramebuffer = fbo; 733b20251a355c88193c439f928a84ae69483fb488John Reck glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); 743b20251a355c88193c439f928a84ae69483fb488John Reck } 753b20251a355c88193c439f928a84ae69483fb488John Reck} 763b20251a355c88193c439f928a84ae69483fb488John Reck 773b20251a355c88193c439f928a84ae69483fb488John Reckvoid RenderState::invokeFunctor(Functor* functor, DrawGlInfo::Mode mode, DrawGlInfo* info) { 783b20251a355c88193c439f928a84ae69483fb488John Reck interruptForFunctorInvoke(); 793b20251a355c88193c439f928a84ae69483fb488John Reck (*functor)(mode, info); 803b20251a355c88193c439f928a84ae69483fb488John Reck resumeFromFunctorInvoke(); 813b20251a355c88193c439f928a84ae69483fb488John Reck} 823b20251a355c88193c439f928a84ae69483fb488John Reck 833b20251a355c88193c439f928a84ae69483fb488John Reckvoid RenderState::interruptForFunctorInvoke() { 843b20251a355c88193c439f928a84ae69483fb488John Reck if (mCaches->currentProgram) { 853b20251a355c88193c439f928a84ae69483fb488John Reck if (mCaches->currentProgram->isInUse()) { 863b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->currentProgram->remove(); 873b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->currentProgram = NULL; 883b20251a355c88193c439f928a84ae69483fb488John Reck } 893b20251a355c88193c439f928a84ae69483fb488John Reck } 903b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->resetActiveTexture(); 913b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->unbindMeshBuffer(); 923b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->unbindIndicesBuffer(); 933b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->resetVertexPointers(); 943b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->disableTexCoordsVertexArray(); 953b20251a355c88193c439f928a84ae69483fb488John Reck debugOverdraw(false, false); 963b20251a355c88193c439f928a84ae69483fb488John Reck} 973b20251a355c88193c439f928a84ae69483fb488John Reck 983b20251a355c88193c439f928a84ae69483fb488John Reckvoid RenderState::resumeFromFunctorInvoke() { 993b20251a355c88193c439f928a84ae69483fb488John Reck glViewport(0, 0, mViewportWidth, mViewportHeight); 1003b20251a355c88193c439f928a84ae69483fb488John Reck glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); 1013b20251a355c88193c439f928a84ae69483fb488John Reck debugOverdraw(false, false); 1023b20251a355c88193c439f928a84ae69483fb488John Reck 1033b20251a355c88193c439f928a84ae69483fb488John Reck glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 1043b20251a355c88193c439f928a84ae69483fb488John Reck 1053b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->scissorEnabled = glIsEnabled(GL_SCISSOR_TEST); 1063b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->enableScissor(); 1073b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->resetScissor(); 1083b20251a355c88193c439f928a84ae69483fb488John Reck 1093b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->activeTexture(0); 1103b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->resetBoundTextures(); 1113b20251a355c88193c439f928a84ae69483fb488John Reck 1123b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->blend = true; 1133b20251a355c88193c439f928a84ae69483fb488John Reck glEnable(GL_BLEND); 1143b20251a355c88193c439f928a84ae69483fb488John Reck glBlendFunc(mCaches->lastSrcMode, mCaches->lastDstMode); 1153b20251a355c88193c439f928a84ae69483fb488John Reck glBlendEquation(GL_FUNC_ADD); 1163b20251a355c88193c439f928a84ae69483fb488John Reck} 1173b20251a355c88193c439f928a84ae69483fb488John Reck 1183b20251a355c88193c439f928a84ae69483fb488John Reckvoid RenderState::debugOverdraw(bool enable, bool clear) { 1193b20251a355c88193c439f928a84ae69483fb488John Reck if (mCaches->debugOverdraw && mFramebuffer == 0) { 1203b20251a355c88193c439f928a84ae69483fb488John Reck if (clear) { 1213b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->disableScissor(); 1223b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->stencil.clear(); 1233b20251a355c88193c439f928a84ae69483fb488John Reck } 1243b20251a355c88193c439f928a84ae69483fb488John Reck if (enable) { 1253b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->stencil.enableDebugWrite(); 1263b20251a355c88193c439f928a84ae69483fb488John Reck } else { 1273b20251a355c88193c439f928a84ae69483fb488John Reck mCaches->stencil.disable(); 1283b20251a355c88193c439f928a84ae69483fb488John Reck } 1293b20251a355c88193c439f928a84ae69483fb488John Reck } 1303b20251a355c88193c439f928a84ae69483fb488John Reck} 1313b20251a355c88193c439f928a84ae69483fb488John Reck 1323b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace uirenderer */ 1333b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace android */ 134