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#ifndef ANDROID_HWUI_STENCIL_H 180baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#define ANDROID_HWUI_STENCIL_H 190baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 200baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#ifndef LOG_TAG 210baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy #define LOG_TAG "OpenGLRenderer" 220baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#endif 230baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 243bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy#include <GLES2/gl2.h> 253bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy 260baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#include <cutils/compiler.h> 270baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 280baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guynamespace android { 290baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guynamespace uirenderer { 300baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 310baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy/////////////////////////////////////////////////////////////////////////////// 320baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy// Stencil buffer management 330baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy/////////////////////////////////////////////////////////////////////////////// 340baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 350baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyclass ANDROID_API Stencil { 360baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guypublic: 370baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy Stencil(); 380baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 390baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy /** 400baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Returns the desired size for the stencil buffer. If the returned value 410baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * is 0, then no stencil buffer is required. 420baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy */ 4323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck ANDROID_API static uint8_t getStencilSize(); 440baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 450baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy /** 463bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy * Returns the smallest stencil format accepted by render buffers. 473bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy */ 483bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy static GLenum getSmallestStencilFormat(); 493bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy 503bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy /** 510baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Clears the stencil buffer. 520baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy */ 530baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy void clear(); 540baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 550baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy /** 560baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Enables stencil test. When the stencil test is enabled the stencil 570baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * buffer is not written into. 580baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy */ 590baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy void enableTest(); 600baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 610baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy /** 620baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Enables stencil write. When stencil write is enabled, the stencil 630baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * test always succeeds and the value 0x1 is written in the stencil 640baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * buffer for each fragment. 650baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy */ 660baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy void enableWrite(); 670baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 680baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy /** 697c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy * The test passes only when equal to the specified value. 707c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy */ 717c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy void enableDebugTest(GLint value, bool greater = false); 727c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy 737c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy /** 747c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy * Used for debugging. The stencil test always passes and increments. 757c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy */ 767c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy void enableDebugWrite(); 777c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy 787c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy /** 790baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Disables stencil test and write. 800baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy */ 810baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy void disable(); 820baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 830baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy /** 840baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Indicates whether either test or write is enabled. 850baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy */ 860baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy bool isEnabled() { 870baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy return mState != kDisabled; 880baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy } 890baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 903ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy /** 913ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy * Indicates whether testing only is enabled. 923ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy */ 933ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy bool isTestEnabled() { 943ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy return mState == kTest; 953ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy } 963ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy 970baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyprivate: 980baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy void enable(); 990baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 1000baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy enum StencilState { 1010baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy kDisabled, 1020baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy kTest, 1030baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy kWrite 1040baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy }; 1050baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 1060baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy StencilState mState; 1070baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 1080baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}; // class Stencil 1090baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 1100baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}; // namespace uirenderer 1110baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}; // namespace android 1120baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 1130baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#endif // ANDROID_HWUI_STENCIL_H 114