blob: 8310f1abda500d877f018aebf81d09d70de30fbf [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),
Geoff Lang70d0f492015-12-10 17:45:46 -050025 mLabel(),
Geoff Langa8406172015-07-21 16:53:39 -040026 mWidth(0),
27 mHeight(0),
Jamie Madilla3944d42016-07-22 22:13:26 -040028 mFormat(GL_RGBA4),
Jamie Madill05b35b22017-10-03 09:01:44 -040029 mSamples(0),
30 mInitState(InitState::MayNeedInit)
Shannon Woodsf108df22014-10-30 18:53:29 +000031{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040032}
33
Jamie Madill71c88b32017-09-14 22:20:29 -040034Error Renderbuffer::onDestroy(const Context *context)
Jamie Madill4928b7c2017-06-20 12:57:39 -040035{
Jamie Madillea84f6f2017-09-20 13:20:30 -040036 ANGLE_TRY(orphanImages(context));
37
38 if (mRenderbuffer)
39 {
40 ANGLE_TRY(mRenderbuffer->onDestroy(context));
41 }
42
43 return NoError();
Jamie Madill4928b7c2017-06-20 12:57:39 -040044}
45
Cooper Partin75c42f42014-08-11 10:16:44 -070046Renderbuffer::~Renderbuffer()
47{
Shannon Woodse2632d22014-10-17 13:08:51 -040048 SafeDelete(mRenderbuffer);
Cooper Partin75c42f42014-08-11 10:16:44 -070049}
50
Geoff Lang70d0f492015-12-10 17:45:46 -050051void Renderbuffer::setLabel(const std::string &label)
52{
53 mLabel = label;
54}
55
56const std::string &Renderbuffer::getLabel() const
57{
58 return mLabel;
59}
60
Jamie Madill4928b7c2017-06-20 12:57:39 -040061Error Renderbuffer::setStorage(const Context *context,
62 GLenum internalformat,
63 size_t width,
64 size_t height)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040065{
Jamie Madill4928b7c2017-06-20 12:57:39 -040066 ANGLE_TRY(orphanImages(context));
Geoff Langa8406172015-07-21 16:53:39 -040067
Jamie Madillea84f6f2017-09-20 13:20:30 -040068 ANGLE_TRY(mRenderbuffer->setStorage(context, internalformat, width, height));
Geoff Langa08e1bd2015-03-24 10:17:18 -040069
Cooper Partin4d61f7e2015-08-12 10:56:50 -070070 mWidth = static_cast<GLsizei>(width);
71 mHeight = static_cast<GLsizei>(height);
Jamie Madilla3944d42016-07-22 22:13:26 -040072 mFormat = Format(internalformat);
Geoff Langa08e1bd2015-03-24 10:17:18 -040073 mSamples = 0;
74
Jamie Madill05b35b22017-10-03 09:01:44 -040075 mInitState = InitState::MayNeedInit;
76 mDirtyChannel.signal(mInitState);
Jamie Madill362876b2016-06-16 14:46:59 -040077
78 return NoError();
Geoff Langa08e1bd2015-03-24 10:17:18 -040079}
80
Jamie Madill4928b7c2017-06-20 12:57:39 -040081Error Renderbuffer::setStorageMultisample(const Context *context,
82 size_t samples,
83 GLenum internalformat,
84 size_t width,
85 size_t height)
Geoff Langa08e1bd2015-03-24 10:17:18 -040086{
Jamie Madill4928b7c2017-06-20 12:57:39 -040087 ANGLE_TRY(orphanImages(context));
Geoff Langa8406172015-07-21 16:53:39 -040088
Jamie Madillea84f6f2017-09-20 13:20:30 -040089 ANGLE_TRY(
90 mRenderbuffer->setStorageMultisample(context, samples, internalformat, width, height));
Geoff Langbafefdf2014-10-10 14:26:35 -040091
Cooper Partin4d61f7e2015-08-12 10:56:50 -070092 mWidth = static_cast<GLsizei>(width);
93 mHeight = static_cast<GLsizei>(height);
Jamie Madilla3944d42016-07-22 22:13:26 -040094 mFormat = Format(internalformat);
Cooper Partin4d61f7e2015-08-12 10:56:50 -070095 mSamples = static_cast<GLsizei>(samples);
Geoff Langbafefdf2014-10-10 14:26:35 -040096
Jamie Madill05b35b22017-10-03 09:01:44 -040097 mInitState = InitState::MayNeedInit;
98 mDirtyChannel.signal(mInitState);
Jamie Madill362876b2016-06-16 14:46:59 -040099
100 return NoError();
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400101}
102
Jamie Madill4928b7c2017-06-20 12:57:39 -0400103Error Renderbuffer::setStorageEGLImageTarget(const Context *context, egl::Image *image)
Geoff Langa8406172015-07-21 16:53:39 -0400104{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400105 ANGLE_TRY(orphanImages(context));
Geoff Langa8406172015-07-21 16:53:39 -0400106
Jamie Madillea84f6f2017-09-20 13:20:30 -0400107 ANGLE_TRY(mRenderbuffer->setStorageEGLImageTarget(context, image));
Geoff Langa8406172015-07-21 16:53:39 -0400108
Jamie Madill4928b7c2017-06-20 12:57:39 -0400109 setTargetImage(context, image);
Geoff Langa8406172015-07-21 16:53:39 -0400110
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700111 mWidth = static_cast<GLsizei>(image->getWidth());
112 mHeight = static_cast<GLsizei>(image->getHeight());
Jamie Madilla3944d42016-07-22 22:13:26 -0400113 mFormat = Format(image->getFormat());
Geoff Langa8406172015-07-21 16:53:39 -0400114 mSamples = 0;
115
Jamie Madill05b35b22017-10-03 09:01:44 -0400116 mInitState = image->sourceInitState();
117 mDirtyChannel.signal(mInitState);
Jamie Madill362876b2016-06-16 14:46:59 -0400118
119 return NoError();
Geoff Langa8406172015-07-21 16:53:39 -0400120}
121
Geoff Lang47110bf2016-04-20 11:13:22 -0700122rx::RenderbufferImpl *Renderbuffer::getImplementation() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400123{
Shannon Woodse2632d22014-10-17 13:08:51 -0400124 ASSERT(mRenderbuffer);
125 return mRenderbuffer;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400126}
127
128GLsizei Renderbuffer::getWidth() const
129{
Shannon Woodse2632d22014-10-17 13:08:51 -0400130 return mWidth;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400131}
132
133GLsizei Renderbuffer::getHeight() const
134{
Shannon Woodse2632d22014-10-17 13:08:51 -0400135 return mHeight;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400136}
137
Jamie Madilla3944d42016-07-22 22:13:26 -0400138const Format &Renderbuffer::getFormat() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400139{
Jamie Madilla3944d42016-07-22 22:13:26 -0400140 return mFormat;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400141}
142
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400143GLsizei Renderbuffer::getSamples() const
144{
Shannon Woodse2632d22014-10-17 13:08:51 -0400145 return mSamples;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400146}
147
148GLuint Renderbuffer::getRedSize() const
149{
Jamie Madilla3944d42016-07-22 22:13:26 -0400150 return mFormat.info->redBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400151}
152
153GLuint Renderbuffer::getGreenSize() const
154{
Jamie Madilla3944d42016-07-22 22:13:26 -0400155 return mFormat.info->greenBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400156}
157
158GLuint Renderbuffer::getBlueSize() const
159{
Jamie Madilla3944d42016-07-22 22:13:26 -0400160 return mFormat.info->blueBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400161}
162
163GLuint Renderbuffer::getAlphaSize() const
164{
Jamie Madilla3944d42016-07-22 22:13:26 -0400165 return mFormat.info->alphaBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400166}
167
168GLuint Renderbuffer::getDepthSize() const
169{
Jamie Madilla3944d42016-07-22 22:13:26 -0400170 return mFormat.info->depthBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400171}
172
173GLuint Renderbuffer::getStencilSize() const
174{
Jamie Madilla3944d42016-07-22 22:13:26 -0400175 return mFormat.info->stencilBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400176}
177
Jamie Madill4928b7c2017-06-20 12:57:39 -0400178void Renderbuffer::onAttach(const Context *context)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400179{
180 addRef();
181}
182
Jamie Madill4928b7c2017-06-20 12:57:39 -0400183void Renderbuffer::onDetach(const Context *context)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400184{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400185 release(context);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400186}
187
188GLuint Renderbuffer::getId() const
189{
190 return id();
191}
Jamie Madill6b120b92015-11-24 13:00:07 -0500192
Jamie Madill4fd95d52017-04-05 11:22:18 -0400193Extents Renderbuffer::getAttachmentSize(const gl::ImageIndex & /*imageIndex*/) const
Jamie Madill6b120b92015-11-24 13:00:07 -0500194{
195 return Extents(mWidth, mHeight, 1);
196}
Jamie Madill05b35b22017-10-03 09:01:44 -0400197
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500198const Format &Renderbuffer::getAttachmentFormat(GLenum /*binding*/,
199 const ImageIndex & /*imageIndex*/) const
200{
201 return getFormat();
202}
203GLsizei Renderbuffer::getAttachmentSamples(const ImageIndex & /*imageIndex*/) const
204{
205 return getSamples();
206}
207
Jamie Madill05b35b22017-10-03 09:01:44 -0400208InitState Renderbuffer::initState(const gl::ImageIndex & /*imageIndex*/) const
209{
210 if (isEGLImageTarget())
211 {
212 return sourceEGLImageInitState();
213 }
214
215 return mInitState;
216}
217
218void Renderbuffer::setInitState(const gl::ImageIndex & /*imageIndex*/, InitState initState)
219{
220 if (isEGLImageTarget())
221 {
222 setSourceEGLImageInitState(initState);
223 }
224 else
225 {
226 mInitState = initState;
227 }
228}
229
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500230rx::FramebufferAttachmentObjectImpl *Renderbuffer::getAttachmentImpl() const
231{
232 return mRenderbuffer;
233}
234
Jamie Madill362876b2016-06-16 14:46:59 -0400235} // namespace gl