195 lines
5.1 KiB
C++
195 lines
5.1 KiB
C++
/*
|
|
* Copyright (C) 2013 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef ANDROID_HWUI_RENDER_BUFFER_H
|
|
#define ANDROID_HWUI_RENDER_BUFFER_H
|
|
|
|
#include <GLES2/gl2.h>
|
|
#include <GLES2/gl2ext.h>
|
|
|
|
namespace android {
|
|
namespace uirenderer {
|
|
|
|
/**
|
|
* Represents an OpenGL render buffer. Render buffers are attached
|
|
* to layers to perform stencil work.
|
|
*/
|
|
struct RenderBuffer {
|
|
/**
|
|
* Creates a new render buffer in the specified format and dimensions.
|
|
* The format must be one of the formats allowed by glRenderbufferStorage().
|
|
*/
|
|
RenderBuffer(GLenum format, uint32_t width, uint32_t height):
|
|
mFormat(format), mWidth(width), mHeight(height), mAllocated(false) {
|
|
|
|
glGenRenderbuffers(1, &mName);
|
|
}
|
|
|
|
~RenderBuffer() {
|
|
if (mName) {
|
|
glDeleteRenderbuffers(1, &mName);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the GL name of this render buffer.
|
|
*/
|
|
GLuint getName() const {
|
|
return mName;
|
|
}
|
|
|
|
/**
|
|
* Returns the format of this render buffer.
|
|
*/
|
|
GLenum getFormat() const {
|
|
return mFormat;
|
|
}
|
|
|
|
/**
|
|
* Binds this render buffer to the current GL context.
|
|
*/
|
|
void bind() const {
|
|
glBindRenderbuffer(GL_RENDERBUFFER, mName);
|
|
}
|
|
|
|
/**
|
|
* Indicates whether this render buffer has allocated its
|
|
* storage. See allocate() and resize().
|
|
*/
|
|
bool isAllocated() const {
|
|
return mAllocated;
|
|
}
|
|
|
|
/**
|
|
* Allocates this render buffer's storage if needed.
|
|
* This method doesn't do anything if isAllocated() returns true.
|
|
*/
|
|
void allocate() {
|
|
if (!mAllocated) {
|
|
glRenderbufferStorage(GL_RENDERBUFFER, mFormat, mWidth, mHeight);
|
|
mAllocated = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Resizes this render buffer. If the buffer was previously allocated,
|
|
* the storage is re-allocated wit the new specified dimensions. If the
|
|
* buffer wasn't previously allocated, the buffer remains unallocated.
|
|
*/
|
|
void resize(uint32_t width, uint32_t height) {
|
|
if (isAllocated() && (width != mWidth || height != mHeight)) {
|
|
glRenderbufferStorage(GL_RENDERBUFFER, mFormat, width, height);
|
|
}
|
|
|
|
mWidth = width;
|
|
mHeight = height;
|
|
}
|
|
|
|
/**
|
|
* Returns the width of the render buffer in pixels.
|
|
*/
|
|
uint32_t getWidth() const {
|
|
return mWidth;
|
|
}
|
|
|
|
/**
|
|
* Returns the height of the render buffer in pixels.
|
|
*/
|
|
uint32_t getHeight() const {
|
|
return mHeight;
|
|
}
|
|
|
|
/**
|
|
* Returns the size of this render buffer in bytes.
|
|
*/
|
|
uint32_t getSize() const {
|
|
// Round to the nearest byte
|
|
return (uint32_t) ((mWidth * mHeight * formatSize(mFormat)) / 8.0f + 0.5f);
|
|
}
|
|
|
|
/**
|
|
* Returns the number of bits per component in the specified format.
|
|
* The format must be one of the formats allowed by glRenderbufferStorage().
|
|
*/
|
|
static uint32_t formatSize(GLenum format) {
|
|
switch (format) {
|
|
case GL_STENCIL_INDEX8:
|
|
return 8;
|
|
case GL_STENCIL_INDEX1_OES:
|
|
return 1;
|
|
case GL_STENCIL_INDEX4_OES:
|
|
return 4;
|
|
case GL_DEPTH_COMPONENT16:
|
|
case GL_RGBA4:
|
|
case GL_RGB565:
|
|
case GL_RGB5_A1:
|
|
return 16;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Indicates whether the specified format represents a stencil buffer.
|
|
*/
|
|
static bool isStencilBuffer(GLenum format) {
|
|
switch (format) {
|
|
case GL_STENCIL_INDEX8:
|
|
case GL_STENCIL_INDEX1_OES:
|
|
case GL_STENCIL_INDEX4_OES:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns the name of the specified render buffer format.
|
|
*/
|
|
static const char* formatName(GLenum format) {
|
|
switch (format) {
|
|
case GL_STENCIL_INDEX8:
|
|
return "STENCIL_8";
|
|
case GL_STENCIL_INDEX1_OES:
|
|
return "STENCIL_1";
|
|
case GL_STENCIL_INDEX4_OES:
|
|
return "STENCIL_4";
|
|
case GL_DEPTH_COMPONENT16:
|
|
return "DEPTH_16";
|
|
case GL_RGBA4:
|
|
return "RGBA_4444";
|
|
case GL_RGB565:
|
|
return "RGB_565";
|
|
case GL_RGB5_A1:
|
|
return "RGBA_5551";
|
|
}
|
|
return "Unknown";
|
|
}
|
|
|
|
private:
|
|
GLenum mFormat;
|
|
|
|
uint32_t mWidth;
|
|
uint32_t mHeight;
|
|
|
|
bool mAllocated;
|
|
|
|
GLuint mName;
|
|
}; // struct RenderBuffer
|
|
|
|
}; // namespace uirenderer
|
|
}; // namespace android
|
|
|
|
#endif // ANDROID_HWUI_RENDER_BUFFER_H
|