RenderBuffer.h revision 2b44eb75c42e4caa94f0b002f0ea9e134fe7b543
17be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov/*
27be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * Copyright (C) 2013 The Android Open Source Project
37be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov *
47be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License");
57be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * you may not use this file except in compliance with the License.
67be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * You may obtain a copy of the License at
77be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov *
87be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov *      http://www.apache.org/licenses/LICENSE-2.0
97be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov *
107be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * Unless required by applicable law or agreed to in writing, software
117be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS,
127be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * See the License for the specific language governing permissions and
147be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * limitations under the License.
157be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov */
167be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
17a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav#ifndef ANDROID_HWUI_RENDER_BUFFER_H
187be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov#define ANDROID_HWUI_RENDER_BUFFER_H
190c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
207be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov#include <GLES2/gl2.h>
210c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann#include <GLES2/gl2ext.h>
220c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
237be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganovnamespace android {
247be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganovnamespace uirenderer {
25a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
26a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav/**
277be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * Represents an OpenGL render buffer. Render buffers are attached
280c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann * to layers to perform stencil work.
297be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov */
307be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganovstruct RenderBuffer {
317be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    /**
327be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * Creates a new render buffer in the specified format and dimensions.
337be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * The format must be one of the formats allowed by glRenderbufferStorage().
34a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     */
357be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    RenderBuffer(GLenum format, uint32_t width, uint32_t height):
360c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        mFormat(format), mWidth(width), mHeight(height), mAllocated(false) {
370c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
380c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        glGenRenderbuffers(1, &mName);
390c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    }
407be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
41a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    ~RenderBuffer() {
42a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        if (mName) {
43a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            glDeleteRenderbuffers(1, &mName);
44a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
457be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    }
467be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
477be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    /**
487be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * Returns the GL name of this render buffer.
497be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     */
507be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    GLuint getName() const {
517be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        return mName;
527be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    }
537be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
547be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    /**
557be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * Returns the format of this render buffer.
560c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     */
570c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    GLenum getFormat() const {
580c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        return mFormat;
590c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    }
600c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
610c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    /**
620c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     * Binds this render buffer to the current GL context.
630c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     */
640c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    void bind() const {
657be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        glBindRenderbuffer(GL_RENDERBUFFER, mName);
660c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    }
670c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
680c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    /**
690c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     * Indicates whether this render buffer has allocated its
707be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * storage. See allocate() and resize().
717be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     */
727be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    bool isAllocated() const {
737be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        return mAllocated;
747be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    }
757be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
760c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    /**
777be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * Allocates this render buffer's storage if needed.
787be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * This method doesn't do anything if isAllocated() returns true.
797be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     */
800c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    void allocate() {
810c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        if (!mAllocated) {
827be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov            glRenderbufferStorage(GL_RENDERBUFFER, mFormat, mWidth, mHeight);
837be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov            mAllocated = true;
847be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        }
857be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    }
867be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
877be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    /**
887be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * Resizes this render buffer. If the buffer was previously allocated,
897be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * the storage is re-allocated wit the new specified dimensions. If the
907be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * buffer wasn't previously allocated, the buffer remains unallocated.
917be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     */
920c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    void resize(uint32_t width, uint32_t height) {
930c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        if (isAllocated() && (width != mWidth || height != mHeight)) {
940c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann            glRenderbufferStorage(GL_RENDERBUFFER, mFormat, width, height);
950c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        }
960c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
970c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        mWidth = width;
980c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        mHeight = height;
990c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    }
1000c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
1017be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    /**
1027be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     * Returns the width of the render buffer in pixels.
1030c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     */
1040c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    uint32_t getWidth() const {
1050c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        return mWidth;
1060c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    }
1070c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
1080c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    /**
1090c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     * Returns the height of the render buffer in pixels.
1100c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     */
1110c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    uint32_t getHeight() const {
1120c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        return mHeight;
1130c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    }
1140c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
1150c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    /**
1160c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     * Returns the size of this render buffer in bytes.
1170c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     */
1180c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    uint32_t getSize() const {
1190c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        // Round to the nearest byte
1200c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        return (uint32_t) ((mWidth * mHeight * formatSize(mFormat)) / 8.0f + 0.5f);
1210c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    }
1220c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
1230c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    /**
1240c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     * Returns the number of bits per component in the specified format.
1250c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     * The format must be one of the formats allowed by glRenderbufferStorage().
1260c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     */
1270c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    static uint32_t formatSize(GLenum format) {
1280c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        switch (format) {
1290c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann            case GL_STENCIL_INDEX8:
1300c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann                return 8;
1310c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann            case GL_STENCIL_INDEX1_OES:
1320c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann                return 1;
1330c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann            case GL_STENCIL_INDEX4_OES:
1340c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann                return 4;
1350c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann            case GL_DEPTH_COMPONENT16:
1360c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann            case GL_RGBA4:
1370c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann            case GL_RGB565:
1380c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann            case GL_RGB5_A1:
1390c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann                return 16;
1407be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        }
1417be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        return 0;
1427be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    }
1437be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
1440c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann    /**
1450c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     * Indicates whether the specified format represents a stencil buffer.
1467be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     */
1477be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    static bool isStencilBuffer(GLenum format) {
1480c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        switch (format) {
1490c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann            case GL_STENCIL_INDEX8:
1507be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov            case GL_STENCIL_INDEX1_OES:
1517be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov            case GL_STENCIL_INDEX4_OES:
1520c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann                return true;
1537be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        }
1547be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        return false;
1557be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    }
1560c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann
1577be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    /**
1580c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann     * Returns the name of the specified render buffer format.
1597be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov     */
1607be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov    static const char* formatName(GLenum format) {
1610c470821d35d1aa13f051c883d9ab7ed292f81dfPhilip P. Moltmann        switch (format) {
1627be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov            case GL_STENCIL_INDEX8:
1637be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov                return "STENCIL_8";
1647be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov            case GL_STENCIL_INDEX1_OES:
1657be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov                return "STENCIL_1";
166            case GL_STENCIL_INDEX4_OES:
167                return "STENCIL_4";
168            case GL_DEPTH_COMPONENT16:
169                return "DEPTH_16";
170            case GL_RGBA4:
171                return "RGBA_4444";
172            case GL_RGB565:
173                return "RGB_565";
174            case GL_RGB5_A1:
175                return "RGBA_5551";
176        }
177        return "Unknown";
178    }
179
180private:
181    GLenum mFormat;
182
183    uint32_t mWidth;
184    uint32_t mHeight;
185
186    bool mAllocated;
187
188    GLuint mName;
189}; // struct RenderBuffer
190
191}; // namespace uirenderer
192}; // namespace android
193
194#endif // ANDROID_HWUI_RENDER_BUFFER_H
195