blob: 3c1a2cc0b1bfdac102dd8c64d3f41ab3382e7cea [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.combdfb3912012-10-31 19:55:21 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Shannon Woodse2632d22014-10-17 13:08:51 -04007// Renderbuffer.cpp: Implements the renderer-agnostic gl::Renderbuffer class,
8// GL renderbuffer objects and related functionality.
9// [OpenGL ES 2.0.24] section 4.4.3 page 108.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010
Geoff Lang2b5420c2014-11-19 14:20:15 -050011#include "libANGLE/Renderbuffer.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040012
13#include "common/utilities.h"
Jamie Madilld98bbc32014-12-03 11:36:42 -050014#include "libANGLE/FramebufferAttachment.h"
Geoff Langa8406172015-07-21 16:53:39 -040015#include "libANGLE/Image.h"
Jamie Madilld98bbc32014-12-03 11:36:42 -050016#include "libANGLE/Texture.h"
17#include "libANGLE/formatutils.h"
Geoff Langc2e75af2015-01-05 14:26:24 -050018#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019
20namespace gl
21{
Shannon Woodse2632d22014-10-17 13:08:51 -040022Renderbuffer::Renderbuffer(rx::RenderbufferImpl *impl, GLuint id)
Geoff Langa8406172015-07-21 16:53:39 -040023 : egl::ImageSibling(id),
24 mRenderbuffer(impl),
25 mWidth(0),
26 mHeight(0),
27 mInternalFormat(GL_RGBA4),
28 mSamples(0)
Shannon Woodsf108df22014-10-30 18:53:29 +000029{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040030}
31
Cooper Partin75c42f42014-08-11 10:16:44 -070032Renderbuffer::~Renderbuffer()
33{
Shannon Woodse2632d22014-10-17 13:08:51 -040034 SafeDelete(mRenderbuffer);
Cooper Partin75c42f42014-08-11 10:16:44 -070035}
36
Geoff Langa08e1bd2015-03-24 10:17:18 -040037Error Renderbuffer::setStorage(GLenum internalformat, size_t width, size_t height)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040038{
Geoff Langa8406172015-07-21 16:53:39 -040039 orphanImages();
40
Geoff Langa08e1bd2015-03-24 10:17:18 -040041 Error error = mRenderbuffer->setStorage(internalformat, width, height);
42 if (error.isError())
43 {
44 return error;
45 }
46
Cooper Partin4d61f7e2015-08-12 10:56:50 -070047 mWidth = static_cast<GLsizei>(width);
48 mHeight = static_cast<GLsizei>(height);
Geoff Langa08e1bd2015-03-24 10:17:18 -040049 mInternalFormat = internalformat;
50 mSamples = 0;
51
52 return Error(GL_NO_ERROR);
53}
54
55Error Renderbuffer::setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height)
56{
Geoff Langa8406172015-07-21 16:53:39 -040057 orphanImages();
58
Geoff Langa08e1bd2015-03-24 10:17:18 -040059 Error error = mRenderbuffer->setStorageMultisample(samples, internalformat, width, height);
Geoff Langbafefdf2014-10-10 14:26:35 -040060 if (error.isError())
61 {
62 return error;
63 }
64
Cooper Partin4d61f7e2015-08-12 10:56:50 -070065 mWidth = static_cast<GLsizei>(width);
66 mHeight = static_cast<GLsizei>(height);
Shannon Woodse2632d22014-10-17 13:08:51 -040067 mInternalFormat = internalformat;
Cooper Partin4d61f7e2015-08-12 10:56:50 -070068 mSamples = static_cast<GLsizei>(samples);
Geoff Langbafefdf2014-10-10 14:26:35 -040069
70 return Error(GL_NO_ERROR);
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040071}
72
Geoff Langa8406172015-07-21 16:53:39 -040073Error Renderbuffer::setStorageEGLImageTarget(egl::Image *image)
74{
75 orphanImages();
76
77 Error error = mRenderbuffer->setStorageEGLImageTarget(image);
78 if (error.isError())
79 {
80 return error;
81 }
82
83 setTargetImage(image);
84
Cooper Partin4d61f7e2015-08-12 10:56:50 -070085 mWidth = static_cast<GLsizei>(image->getWidth());
86 mHeight = static_cast<GLsizei>(image->getHeight());
Geoff Langa8406172015-07-21 16:53:39 -040087 mInternalFormat = image->getInternalFormat();
88 mSamples = 0;
89
90 return Error(GL_NO_ERROR);
91}
92
Shannon Woodse2632d22014-10-17 13:08:51 -040093rx::RenderbufferImpl *Renderbuffer::getImplementation()
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040094{
Shannon Woodse2632d22014-10-17 13:08:51 -040095 ASSERT(mRenderbuffer);
96 return mRenderbuffer;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040097}
98
Geoff Langcd69f1c2015-03-18 14:33:23 -040099const rx::RenderbufferImpl *Renderbuffer::getImplementation() const
100{
101 return mRenderbuffer;
102}
103
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400104GLsizei Renderbuffer::getWidth() const
105{
Shannon Woodse2632d22014-10-17 13:08:51 -0400106 return mWidth;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400107}
108
109GLsizei Renderbuffer::getHeight() const
110{
Shannon Woodse2632d22014-10-17 13:08:51 -0400111 return mHeight;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400112}
113
114GLenum Renderbuffer::getInternalFormat() const
115{
Shannon Woodse2632d22014-10-17 13:08:51 -0400116 return mInternalFormat;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400117}
118
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400119GLsizei Renderbuffer::getSamples() const
120{
Shannon Woodse2632d22014-10-17 13:08:51 -0400121 return mSamples;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400122}
123
124GLuint Renderbuffer::getRedSize() const
125{
Geoff Langd8a22582014-12-17 15:28:23 -0500126 return GetInternalFormatInfo(mInternalFormat).redBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400127}
128
129GLuint Renderbuffer::getGreenSize() const
130{
Geoff Langd8a22582014-12-17 15:28:23 -0500131 return GetInternalFormatInfo(mInternalFormat).greenBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400132}
133
134GLuint Renderbuffer::getBlueSize() const
135{
Geoff Langd8a22582014-12-17 15:28:23 -0500136 return GetInternalFormatInfo(mInternalFormat).blueBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400137}
138
139GLuint Renderbuffer::getAlphaSize() const
140{
Geoff Langd8a22582014-12-17 15:28:23 -0500141 return GetInternalFormatInfo(mInternalFormat).alphaBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400142}
143
144GLuint Renderbuffer::getDepthSize() const
145{
Geoff Langd8a22582014-12-17 15:28:23 -0500146 return GetInternalFormatInfo(mInternalFormat).depthBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400147}
148
149GLuint Renderbuffer::getStencilSize() const
150{
Geoff Langd8a22582014-12-17 15:28:23 -0500151 return GetInternalFormatInfo(mInternalFormat).stencilBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400152}
153
Corentin Wallez51706ea2015-08-07 14:39:22 -0400154void Renderbuffer::onAttach()
155{
156 addRef();
157}
158
159void Renderbuffer::onDetach()
160{
161 release();
162}
163
164GLuint Renderbuffer::getId() const
165{
166 return id();
167}
Jamie Madill6b120b92015-11-24 13:00:07 -0500168
169Extents Renderbuffer::getAttachmentSize(const FramebufferAttachment::Target & /*target*/) const
170{
171 return Extents(mWidth, mHeight, 1);
172}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000173}