blob: 17d7dbf0b7e90ec7461ae81a026d8f5b6f4bf543 [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),
Geoff Langa8406172015-07-21 16:53:39 -040029 mSamples(0)
Shannon Woodsf108df22014-10-30 18:53:29 +000030{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040031}
32
Jamie Madill71c88b32017-09-14 22:20:29 -040033Error Renderbuffer::onDestroy(const Context *context)
Jamie Madill4928b7c2017-06-20 12:57:39 -040034{
Jamie Madillea84f6f2017-09-20 13:20:30 -040035 ANGLE_TRY(orphanImages(context));
36
37 if (mRenderbuffer)
38 {
39 ANGLE_TRY(mRenderbuffer->onDestroy(context));
40 }
41
42 return NoError();
Jamie Madill4928b7c2017-06-20 12:57:39 -040043}
44
Cooper Partin75c42f42014-08-11 10:16:44 -070045Renderbuffer::~Renderbuffer()
46{
Shannon Woodse2632d22014-10-17 13:08:51 -040047 SafeDelete(mRenderbuffer);
Cooper Partin75c42f42014-08-11 10:16:44 -070048}
49
Geoff Lang70d0f492015-12-10 17:45:46 -050050void Renderbuffer::setLabel(const std::string &label)
51{
52 mLabel = label;
53}
54
55const std::string &Renderbuffer::getLabel() const
56{
57 return mLabel;
58}
59
Jamie Madill4928b7c2017-06-20 12:57:39 -040060Error Renderbuffer::setStorage(const Context *context,
61 GLenum internalformat,
62 size_t width,
63 size_t height)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040064{
Jamie Madill4928b7c2017-06-20 12:57:39 -040065 ANGLE_TRY(orphanImages(context));
Geoff Langa8406172015-07-21 16:53:39 -040066
Jamie Madillea84f6f2017-09-20 13:20:30 -040067 ANGLE_TRY(mRenderbuffer->setStorage(context, internalformat, width, height));
Geoff Langa08e1bd2015-03-24 10:17:18 -040068
Cooper Partin4d61f7e2015-08-12 10:56:50 -070069 mWidth = static_cast<GLsizei>(width);
70 mHeight = static_cast<GLsizei>(height);
Jamie Madilla3944d42016-07-22 22:13:26 -040071 mFormat = Format(internalformat);
Geoff Langa08e1bd2015-03-24 10:17:18 -040072 mSamples = 0;
73
Jamie Madill362876b2016-06-16 14:46:59 -040074 mDirtyChannel.signal();
75
76 return NoError();
Geoff Langa08e1bd2015-03-24 10:17:18 -040077}
78
Jamie Madill4928b7c2017-06-20 12:57:39 -040079Error Renderbuffer::setStorageMultisample(const Context *context,
80 size_t samples,
81 GLenum internalformat,
82 size_t width,
83 size_t height)
Geoff Langa08e1bd2015-03-24 10:17:18 -040084{
Jamie Madill4928b7c2017-06-20 12:57:39 -040085 ANGLE_TRY(orphanImages(context));
Geoff Langa8406172015-07-21 16:53:39 -040086
Jamie Madillea84f6f2017-09-20 13:20:30 -040087 ANGLE_TRY(
88 mRenderbuffer->setStorageMultisample(context, samples, internalformat, width, height));
Geoff Langbafefdf2014-10-10 14:26:35 -040089
Cooper Partin4d61f7e2015-08-12 10:56:50 -070090 mWidth = static_cast<GLsizei>(width);
91 mHeight = static_cast<GLsizei>(height);
Jamie Madilla3944d42016-07-22 22:13:26 -040092 mFormat = Format(internalformat);
Cooper Partin4d61f7e2015-08-12 10:56:50 -070093 mSamples = static_cast<GLsizei>(samples);
Geoff Langbafefdf2014-10-10 14:26:35 -040094
Jamie Madill362876b2016-06-16 14:46:59 -040095 mDirtyChannel.signal();
96
97 return NoError();
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040098}
99
Jamie Madill4928b7c2017-06-20 12:57:39 -0400100Error Renderbuffer::setStorageEGLImageTarget(const Context *context, egl::Image *image)
Geoff Langa8406172015-07-21 16:53:39 -0400101{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400102 ANGLE_TRY(orphanImages(context));
Geoff Langa8406172015-07-21 16:53:39 -0400103
Jamie Madillea84f6f2017-09-20 13:20:30 -0400104 ANGLE_TRY(mRenderbuffer->setStorageEGLImageTarget(context, image));
Geoff Langa8406172015-07-21 16:53:39 -0400105
Jamie Madill4928b7c2017-06-20 12:57:39 -0400106 setTargetImage(context, image);
Geoff Langa8406172015-07-21 16:53:39 -0400107
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700108 mWidth = static_cast<GLsizei>(image->getWidth());
109 mHeight = static_cast<GLsizei>(image->getHeight());
Jamie Madilla3944d42016-07-22 22:13:26 -0400110 mFormat = Format(image->getFormat());
Geoff Langa8406172015-07-21 16:53:39 -0400111 mSamples = 0;
112
Jamie Madill362876b2016-06-16 14:46:59 -0400113 mDirtyChannel.signal();
114
115 return NoError();
Geoff Langa8406172015-07-21 16:53:39 -0400116}
117
Geoff Lang47110bf2016-04-20 11:13:22 -0700118rx::RenderbufferImpl *Renderbuffer::getImplementation() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400119{
Shannon Woodse2632d22014-10-17 13:08:51 -0400120 ASSERT(mRenderbuffer);
121 return mRenderbuffer;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400122}
123
124GLsizei Renderbuffer::getWidth() const
125{
Shannon Woodse2632d22014-10-17 13:08:51 -0400126 return mWidth;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400127}
128
129GLsizei Renderbuffer::getHeight() const
130{
Shannon Woodse2632d22014-10-17 13:08:51 -0400131 return mHeight;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400132}
133
Jamie Madilla3944d42016-07-22 22:13:26 -0400134const Format &Renderbuffer::getFormat() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400135{
Jamie Madilla3944d42016-07-22 22:13:26 -0400136 return mFormat;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400137}
138
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400139GLsizei Renderbuffer::getSamples() const
140{
Shannon Woodse2632d22014-10-17 13:08:51 -0400141 return mSamples;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400142}
143
144GLuint Renderbuffer::getRedSize() const
145{
Jamie Madilla3944d42016-07-22 22:13:26 -0400146 return mFormat.info->redBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400147}
148
149GLuint Renderbuffer::getGreenSize() const
150{
Jamie Madilla3944d42016-07-22 22:13:26 -0400151 return mFormat.info->greenBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400152}
153
154GLuint Renderbuffer::getBlueSize() const
155{
Jamie Madilla3944d42016-07-22 22:13:26 -0400156 return mFormat.info->blueBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400157}
158
159GLuint Renderbuffer::getAlphaSize() const
160{
Jamie Madilla3944d42016-07-22 22:13:26 -0400161 return mFormat.info->alphaBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400162}
163
164GLuint Renderbuffer::getDepthSize() const
165{
Jamie Madilla3944d42016-07-22 22:13:26 -0400166 return mFormat.info->depthBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400167}
168
169GLuint Renderbuffer::getStencilSize() const
170{
Jamie Madilla3944d42016-07-22 22:13:26 -0400171 return mFormat.info->stencilBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400172}
173
Jamie Madill4928b7c2017-06-20 12:57:39 -0400174void Renderbuffer::onAttach(const Context *context)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400175{
176 addRef();
177}
178
Jamie Madill4928b7c2017-06-20 12:57:39 -0400179void Renderbuffer::onDetach(const Context *context)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400180{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400181 release(context);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400182}
183
184GLuint Renderbuffer::getId() const
185{
186 return id();
187}
Jamie Madill6b120b92015-11-24 13:00:07 -0500188
Jamie Madill4fd95d52017-04-05 11:22:18 -0400189Extents Renderbuffer::getAttachmentSize(const gl::ImageIndex & /*imageIndex*/) const
Jamie Madill6b120b92015-11-24 13:00:07 -0500190{
191 return Extents(mWidth, mHeight, 1);
192}
Jamie Madill362876b2016-06-16 14:46:59 -0400193} // namespace gl