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