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