Stencil.cpp revision 0baaac5e9adf3ee280ae1239e2e58754a9d2b099
10baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy/* 20baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Copyright (C) 2012 The Android Open Source Project 30baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * 40baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 50baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * you may not use this file except in compliance with the License. 60baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * You may obtain a copy of the License at 70baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * 80baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 90baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * 100baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Unless required by applicable law or agreed to in writing, software 110baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 120baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * See the License for the specific language governing permissions and 140baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * limitations under the License. 150baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy */ 160baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 170baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#include <GLES2/gl2.h> 180baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 190baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#include "Properties.h" 200baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#include "Stencil.h" 210baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 220baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guynamespace android { 230baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guynamespace uirenderer { 240baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 250baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain GuyStencil::Stencil(): mState(kDisabled) { 260baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy} 270baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 280baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyuint32_t Stencil::getStencilSize() { 290baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy return STENCIL_BUFFER_SIZE; 300baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy} 310baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 320baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyvoid Stencil::clear() { 330baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy glClearStencil(0); 340baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy glClear(GL_STENCIL_BUFFER_BIT); 350baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy} 360baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 370baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyvoid Stencil::enableTest() { 380baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy if (mState != kTest) { 390baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy enable(); 400baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy glStencilFunc(GL_LESS, 0x0, 0x1); 410baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy // We only want to test, let's keep everything 420baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 430baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy mState = kTest; 440baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy } 450baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy} 460baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 470baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyvoid Stencil::enableWrite() { 480baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy if (mState != kWrite) { 490baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy enable(); 500baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy glStencilFunc(GL_ALWAYS, 0x1, 0x1); 510baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy // The test always passes so the first two values are meaningless 520baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 530baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy mState = kWrite; 540baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy } 550baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy} 560baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 570baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyvoid Stencil::enable() { 580baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy if (!mState == kDisabled) { 590baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy glEnable(GL_STENCIL_TEST); 600baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy } 610baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy} 620baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 630baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyvoid Stencil::disable() { 640baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy if (mState != kDisabled) { 650baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy glDisable(GL_STENCIL_TEST); 660baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy mState = kDisabled; 670baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy } 680baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy} 690baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 700baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}; // namespace uirenderer 710baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}; // namespace android 72