blob: 161fbea797bcdd9989519356eefb1d1404e6db67 [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),
28 mInternalFormat(GL_RGBA4),
29 mSamples(0)
Shannon Woodsf108df22014-10-30 18:53:29 +000030{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040031}
32
Cooper Partin75c42f42014-08-11 10:16:44 -070033Renderbuffer::~Renderbuffer()
34{
Shannon Woodse2632d22014-10-17 13:08:51 -040035 SafeDelete(mRenderbuffer);
Cooper Partin75c42f42014-08-11 10:16:44 -070036}
37
Geoff Lang70d0f492015-12-10 17:45:46 -050038void Renderbuffer::setLabel(const std::string &label)
39{
40 mLabel = label;
41}
42
43const std::string &Renderbuffer::getLabel() const
44{
45 return mLabel;
46}
47
Geoff Langa08e1bd2015-03-24 10:17:18 -040048Error Renderbuffer::setStorage(GLenum internalformat, size_t width, size_t height)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040049{
Geoff Langa8406172015-07-21 16:53:39 -040050 orphanImages();
51
Geoff Langa08e1bd2015-03-24 10:17:18 -040052 Error error = mRenderbuffer->setStorage(internalformat, width, height);
53 if (error.isError())
54 {
55 return error;
56 }
57
Cooper Partin4d61f7e2015-08-12 10:56:50 -070058 mWidth = static_cast<GLsizei>(width);
59 mHeight = static_cast<GLsizei>(height);
Geoff Langa08e1bd2015-03-24 10:17:18 -040060 mInternalFormat = internalformat;
61 mSamples = 0;
62
63 return Error(GL_NO_ERROR);
64}
65
66Error Renderbuffer::setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height)
67{
Geoff Langa8406172015-07-21 16:53:39 -040068 orphanImages();
69
Geoff Langa08e1bd2015-03-24 10:17:18 -040070 Error error = mRenderbuffer->setStorageMultisample(samples, internalformat, width, height);
Geoff Langbafefdf2014-10-10 14:26:35 -040071 if (error.isError())
72 {
73 return error;
74 }
75
Cooper Partin4d61f7e2015-08-12 10:56:50 -070076 mWidth = static_cast<GLsizei>(width);
77 mHeight = static_cast<GLsizei>(height);
Shannon Woodse2632d22014-10-17 13:08:51 -040078 mInternalFormat = internalformat;
Cooper Partin4d61f7e2015-08-12 10:56:50 -070079 mSamples = static_cast<GLsizei>(samples);
Geoff Langbafefdf2014-10-10 14:26:35 -040080
81 return Error(GL_NO_ERROR);
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040082}
83
Geoff Langa8406172015-07-21 16:53:39 -040084Error Renderbuffer::setStorageEGLImageTarget(egl::Image *image)
85{
86 orphanImages();
87
88 Error error = mRenderbuffer->setStorageEGLImageTarget(image);
89 if (error.isError())
90 {
91 return error;
92 }
93
94 setTargetImage(image);
95
Cooper Partin4d61f7e2015-08-12 10:56:50 -070096 mWidth = static_cast<GLsizei>(image->getWidth());
97 mHeight = static_cast<GLsizei>(image->getHeight());
Geoff Langa8406172015-07-21 16:53:39 -040098 mInternalFormat = image->getInternalFormat();
99 mSamples = 0;
100
101 return Error(GL_NO_ERROR);
102}
103
Shannon Woodse2632d22014-10-17 13:08:51 -0400104rx::RenderbufferImpl *Renderbuffer::getImplementation()
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400105{
Shannon Woodse2632d22014-10-17 13:08:51 -0400106 ASSERT(mRenderbuffer);
107 return mRenderbuffer;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400108}
109
Geoff Langcd69f1c2015-03-18 14:33:23 -0400110const rx::RenderbufferImpl *Renderbuffer::getImplementation() const
111{
112 return mRenderbuffer;
113}
114
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400115GLsizei Renderbuffer::getWidth() const
116{
Shannon Woodse2632d22014-10-17 13:08:51 -0400117 return mWidth;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400118}
119
120GLsizei Renderbuffer::getHeight() const
121{
Shannon Woodse2632d22014-10-17 13:08:51 -0400122 return mHeight;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400123}
124
125GLenum Renderbuffer::getInternalFormat() const
126{
Shannon Woodse2632d22014-10-17 13:08:51 -0400127 return mInternalFormat;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400128}
129
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400130GLsizei Renderbuffer::getSamples() const
131{
Shannon Woodse2632d22014-10-17 13:08:51 -0400132 return mSamples;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400133}
134
135GLuint Renderbuffer::getRedSize() const
136{
Geoff Langd8a22582014-12-17 15:28:23 -0500137 return GetInternalFormatInfo(mInternalFormat).redBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400138}
139
140GLuint Renderbuffer::getGreenSize() const
141{
Geoff Langd8a22582014-12-17 15:28:23 -0500142 return GetInternalFormatInfo(mInternalFormat).greenBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400143}
144
145GLuint Renderbuffer::getBlueSize() const
146{
Geoff Langd8a22582014-12-17 15:28:23 -0500147 return GetInternalFormatInfo(mInternalFormat).blueBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400148}
149
150GLuint Renderbuffer::getAlphaSize() const
151{
Geoff Langd8a22582014-12-17 15:28:23 -0500152 return GetInternalFormatInfo(mInternalFormat).alphaBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400153}
154
155GLuint Renderbuffer::getDepthSize() const
156{
Geoff Langd8a22582014-12-17 15:28:23 -0500157 return GetInternalFormatInfo(mInternalFormat).depthBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400158}
159
160GLuint Renderbuffer::getStencilSize() const
161{
Geoff Langd8a22582014-12-17 15:28:23 -0500162 return GetInternalFormatInfo(mInternalFormat).stencilBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400163}
164
Corentin Wallez51706ea2015-08-07 14:39:22 -0400165void Renderbuffer::onAttach()
166{
167 addRef();
168}
169
170void Renderbuffer::onDetach()
171{
172 release();
173}
174
175GLuint Renderbuffer::getId() const
176{
177 return id();
178}
Jamie Madill6b120b92015-11-24 13:00:07 -0500179
180Extents Renderbuffer::getAttachmentSize(const FramebufferAttachment::Target & /*target*/) const
181{
182 return Extents(mWidth, mHeight, 1);
183}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000184}