1 #include "precompiled.h" 2 // 3 // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 // 7 8 // Renderbuffer.cpp: the gl::Renderbuffer class and its derived classes 9 // Colorbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer 10 // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. 11 12 #include "libGLESv2/Renderbuffer.h" 13 #include "libGLESv2/renderer/RenderTarget.h" 14 15 #include "libGLESv2/Texture.h" 16 #include "libGLESv2/renderer/Renderer.h" 17 #include "libGLESv2/renderer/TextureStorage.h" 18 #include "common/utilities.h" 19 #include "libGLESv2/formatutils.h" 20 21 namespace gl 22 { 23 unsigned int RenderbufferStorage::mCurrentSerial = 1; 24 25 RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1)) 26 { 27 mWidth = 0; 28 mHeight = 0; 29 mInternalFormat = GL_RGBA4; 30 mActualFormat = GL_RGBA8_OES; 31 mSamples = 0; 32 } 33 34 RenderbufferStorage::~RenderbufferStorage() 35 { 36 } 37 38 rx::RenderTarget *RenderbufferStorage::getRenderTarget() 39 { 40 return NULL; 41 } 42 43 rx::RenderTarget *RenderbufferStorage::getDepthStencil() 44 { 45 return NULL; 46 } 47 48 rx::TextureStorage *RenderbufferStorage::getTextureStorage() 49 { 50 return NULL; 51 } 52 53 GLsizei RenderbufferStorage::getWidth() const 54 { 55 return mWidth; 56 } 57 58 GLsizei RenderbufferStorage::getHeight() const 59 { 60 return mHeight; 61 } 62 63 GLenum RenderbufferStorage::getInternalFormat() const 64 { 65 return mInternalFormat; 66 } 67 68 GLenum RenderbufferStorage::getActualFormat() const 69 { 70 return mActualFormat; 71 } 72 73 GLsizei RenderbufferStorage::getSamples() const 74 { 75 return mSamples; 76 } 77 78 unsigned int RenderbufferStorage::getSerial() const 79 { 80 return mSerial; 81 } 82 83 unsigned int RenderbufferStorage::issueSerials(GLuint count) 84 { 85 unsigned int firstSerial = mCurrentSerial; 86 mCurrentSerial += count; 87 return firstSerial; 88 } 89 90 bool RenderbufferStorage::isTexture() const 91 { 92 return false; 93 } 94 95 unsigned int RenderbufferStorage::getTextureSerial() const 96 { 97 return -1; 98 } 99 100 Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain) 101 { 102 mRenderTarget = renderer->createRenderTarget(swapChain, false); 103 104 if (mRenderTarget) 105 { 106 mWidth = mRenderTarget->getWidth(); 107 mHeight = mRenderTarget->getHeight(); 108 mInternalFormat = mRenderTarget->getInternalFormat(); 109 mActualFormat = mRenderTarget->getActualFormat(); 110 mSamples = mRenderTarget->getSamples(); 111 } 112 } 113 114 Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL) 115 { 116 mRenderTarget = renderer->createRenderTarget(width, height, format, samples); 117 118 if (mRenderTarget) 119 { 120 mWidth = width; 121 mHeight = height; 122 mInternalFormat = format; 123 mActualFormat = mRenderTarget->getActualFormat(); 124 mSamples = mRenderTarget->getSamples(); 125 } 126 } 127 128 Colorbuffer::~Colorbuffer() 129 { 130 if (mRenderTarget) 131 { 132 delete mRenderTarget; 133 } 134 } 135 136 rx::RenderTarget *Colorbuffer::getRenderTarget() 137 { 138 return mRenderTarget; 139 } 140 141 DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain) 142 { 143 mDepthStencil = renderer->createRenderTarget(swapChain, true); 144 if (mDepthStencil) 145 { 146 mWidth = mDepthStencil->getWidth(); 147 mHeight = mDepthStencil->getHeight(); 148 mInternalFormat = mDepthStencil->getInternalFormat(); 149 mSamples = mDepthStencil->getSamples(); 150 mActualFormat = mDepthStencil->getActualFormat(); 151 } 152 } 153 154 DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) 155 { 156 157 mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples); 158 159 mWidth = mDepthStencil->getWidth(); 160 mHeight = mDepthStencil->getHeight(); 161 mInternalFormat = GL_DEPTH24_STENCIL8_OES; 162 mActualFormat = mDepthStencil->getActualFormat(); 163 mSamples = mDepthStencil->getSamples(); 164 } 165 166 DepthStencilbuffer::~DepthStencilbuffer() 167 { 168 if (mDepthStencil) 169 { 170 delete mDepthStencil; 171 } 172 } 173 174 rx::RenderTarget *DepthStencilbuffer::getDepthStencil() 175 { 176 return mDepthStencil; 177 } 178 179 Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples) 180 { 181 if (mDepthStencil) 182 { 183 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function 184 // will expect one of the valid renderbuffer formats for use in 185 // glRenderbufferStorage 186 } 187 } 188 189 Depthbuffer::~Depthbuffer() 190 { 191 } 192 193 Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples) 194 { 195 if (mDepthStencil) 196 { 197 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function 198 // will expect one of the valid renderbuffer formats for use in 199 // glRenderbufferStorage 200 } 201 } 202 203 Stencilbuffer::~Stencilbuffer() 204 { 205 } 206 207 } 208