xref: /aosp_15_r20/external/angle/src/libANGLE/Renderbuffer.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // Renderbuffer.cpp: Implements the renderer-agnostic gl::Renderbuffer class,
8*8975f5c5SAndroid Build Coastguard Worker // GL renderbuffer objects and related functionality.
9*8975f5c5SAndroid Build Coastguard Worker // [OpenGL ES 2.0.24] section 4.4.3 page 108.
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Renderbuffer.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "common/utilities.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/FramebufferAttachment.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Image.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Renderbuffer.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Texture.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/formatutils.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/GLImplFactory.h"
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker namespace gl
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker namespace
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker angle::SubjectIndex kRenderbufferImplSubjectIndex = 0;
27*8975f5c5SAndroid Build Coastguard Worker 
DetermineInitState(const Context * context)28*8975f5c5SAndroid Build Coastguard Worker InitState DetermineInitState(const Context *context)
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker     return (context && context->isRobustResourceInitEnabled()) ? InitState::MayNeedInit
31*8975f5c5SAndroid Build Coastguard Worker                                                                : InitState::Initialized;
32*8975f5c5SAndroid Build Coastguard Worker }
33*8975f5c5SAndroid Build Coastguard Worker }  // namespace
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker // RenderbufferState implementation.
RenderbufferState()36*8975f5c5SAndroid Build Coastguard Worker RenderbufferState::RenderbufferState()
37*8975f5c5SAndroid Build Coastguard Worker     : mWidth(0),
38*8975f5c5SAndroid Build Coastguard Worker       mHeight(0),
39*8975f5c5SAndroid Build Coastguard Worker       mFormat(GL_RGBA4),
40*8975f5c5SAndroid Build Coastguard Worker       mSamples(0),
41*8975f5c5SAndroid Build Coastguard Worker       mMultisamplingMode(MultisamplingMode::Regular),
42*8975f5c5SAndroid Build Coastguard Worker       mHasProtectedContent(false),
43*8975f5c5SAndroid Build Coastguard Worker       mInitState(InitState::Initialized)
44*8975f5c5SAndroid Build Coastguard Worker {}
45*8975f5c5SAndroid Build Coastguard Worker 
~RenderbufferState()46*8975f5c5SAndroid Build Coastguard Worker RenderbufferState::~RenderbufferState() {}
47*8975f5c5SAndroid Build Coastguard Worker 
getWidth() const48*8975f5c5SAndroid Build Coastguard Worker GLsizei RenderbufferState::getWidth() const
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker     return mWidth;
51*8975f5c5SAndroid Build Coastguard Worker }
52*8975f5c5SAndroid Build Coastguard Worker 
getHeight() const53*8975f5c5SAndroid Build Coastguard Worker GLsizei RenderbufferState::getHeight() const
54*8975f5c5SAndroid Build Coastguard Worker {
55*8975f5c5SAndroid Build Coastguard Worker     return mHeight;
56*8975f5c5SAndroid Build Coastguard Worker }
57*8975f5c5SAndroid Build Coastguard Worker 
getFormat() const58*8975f5c5SAndroid Build Coastguard Worker const Format &RenderbufferState::getFormat() const
59*8975f5c5SAndroid Build Coastguard Worker {
60*8975f5c5SAndroid Build Coastguard Worker     return mFormat;
61*8975f5c5SAndroid Build Coastguard Worker }
62*8975f5c5SAndroid Build Coastguard Worker 
getSamples() const63*8975f5c5SAndroid Build Coastguard Worker GLsizei RenderbufferState::getSamples() const
64*8975f5c5SAndroid Build Coastguard Worker {
65*8975f5c5SAndroid Build Coastguard Worker     return mSamples;
66*8975f5c5SAndroid Build Coastguard Worker }
67*8975f5c5SAndroid Build Coastguard Worker 
getMultisamplingMode() const68*8975f5c5SAndroid Build Coastguard Worker MultisamplingMode RenderbufferState::getMultisamplingMode() const
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker     return mMultisamplingMode;
71*8975f5c5SAndroid Build Coastguard Worker }
72*8975f5c5SAndroid Build Coastguard Worker 
getInitState() const73*8975f5c5SAndroid Build Coastguard Worker InitState RenderbufferState::getInitState() const
74*8975f5c5SAndroid Build Coastguard Worker {
75*8975f5c5SAndroid Build Coastguard Worker     return mInitState;
76*8975f5c5SAndroid Build Coastguard Worker }
77*8975f5c5SAndroid Build Coastguard Worker 
update(GLsizei width,GLsizei height,const Format & format,GLsizei samples,MultisamplingMode multisamplingMode,InitState initState)78*8975f5c5SAndroid Build Coastguard Worker void RenderbufferState::update(GLsizei width,
79*8975f5c5SAndroid Build Coastguard Worker                                GLsizei height,
80*8975f5c5SAndroid Build Coastguard Worker                                const Format &format,
81*8975f5c5SAndroid Build Coastguard Worker                                GLsizei samples,
82*8975f5c5SAndroid Build Coastguard Worker                                MultisamplingMode multisamplingMode,
83*8975f5c5SAndroid Build Coastguard Worker                                InitState initState)
84*8975f5c5SAndroid Build Coastguard Worker {
85*8975f5c5SAndroid Build Coastguard Worker     mWidth               = width;
86*8975f5c5SAndroid Build Coastguard Worker     mHeight              = height;
87*8975f5c5SAndroid Build Coastguard Worker     mFormat              = format;
88*8975f5c5SAndroid Build Coastguard Worker     mSamples             = samples;
89*8975f5c5SAndroid Build Coastguard Worker     mMultisamplingMode   = multisamplingMode;
90*8975f5c5SAndroid Build Coastguard Worker     mInitState           = initState;
91*8975f5c5SAndroid Build Coastguard Worker     mHasProtectedContent = false;
92*8975f5c5SAndroid Build Coastguard Worker }
93*8975f5c5SAndroid Build Coastguard Worker 
setProtectedContent(bool hasProtectedContent)94*8975f5c5SAndroid Build Coastguard Worker void RenderbufferState::setProtectedContent(bool hasProtectedContent)
95*8975f5c5SAndroid Build Coastguard Worker {
96*8975f5c5SAndroid Build Coastguard Worker     mHasProtectedContent = hasProtectedContent;
97*8975f5c5SAndroid Build Coastguard Worker }
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker // Renderbuffer implementation.
Renderbuffer(rx::GLImplFactory * implFactory,RenderbufferID id)100*8975f5c5SAndroid Build Coastguard Worker Renderbuffer::Renderbuffer(rx::GLImplFactory *implFactory, RenderbufferID id)
101*8975f5c5SAndroid Build Coastguard Worker     : RefCountObject(implFactory->generateSerial(), id),
102*8975f5c5SAndroid Build Coastguard Worker       mState(),
103*8975f5c5SAndroid Build Coastguard Worker       mImplementation(implFactory->createRenderbuffer(mState)),
104*8975f5c5SAndroid Build Coastguard Worker       mLabel(),
105*8975f5c5SAndroid Build Coastguard Worker       mImplObserverBinding(this, kRenderbufferImplSubjectIndex)
106*8975f5c5SAndroid Build Coastguard Worker {
107*8975f5c5SAndroid Build Coastguard Worker     mImplObserverBinding.bind(mImplementation.get());
108*8975f5c5SAndroid Build Coastguard Worker }
109*8975f5c5SAndroid Build Coastguard Worker 
onDestroy(const Context * context)110*8975f5c5SAndroid Build Coastguard Worker void Renderbuffer::onDestroy(const Context *context)
111*8975f5c5SAndroid Build Coastguard Worker {
112*8975f5c5SAndroid Build Coastguard Worker     egl::RefCountObjectReleaser<egl::Image> releaseImage;
113*8975f5c5SAndroid Build Coastguard Worker     (void)orphanImages(context, &releaseImage);
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker     if (mImplementation)
116*8975f5c5SAndroid Build Coastguard Worker     {
117*8975f5c5SAndroid Build Coastguard Worker         mImplementation->onDestroy(context);
118*8975f5c5SAndroid Build Coastguard Worker     }
119*8975f5c5SAndroid Build Coastguard Worker }
120*8975f5c5SAndroid Build Coastguard Worker 
~Renderbuffer()121*8975f5c5SAndroid Build Coastguard Worker Renderbuffer::~Renderbuffer() {}
122*8975f5c5SAndroid Build Coastguard Worker 
setLabel(const Context * context,const std::string & label)123*8975f5c5SAndroid Build Coastguard Worker angle::Result Renderbuffer::setLabel(const Context *context, const std::string &label)
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker     mLabel = label;
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker     if (mImplementation)
128*8975f5c5SAndroid Build Coastguard Worker     {
129*8975f5c5SAndroid Build Coastguard Worker         return mImplementation->onLabelUpdate(context);
130*8975f5c5SAndroid Build Coastguard Worker     }
131*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
132*8975f5c5SAndroid Build Coastguard Worker }
133*8975f5c5SAndroid Build Coastguard Worker 
getLabel() const134*8975f5c5SAndroid Build Coastguard Worker const std::string &Renderbuffer::getLabel() const
135*8975f5c5SAndroid Build Coastguard Worker {
136*8975f5c5SAndroid Build Coastguard Worker     return mLabel;
137*8975f5c5SAndroid Build Coastguard Worker }
138*8975f5c5SAndroid Build Coastguard Worker 
setStorage(const Context * context,GLenum internalformat,GLsizei width,GLsizei height)139*8975f5c5SAndroid Build Coastguard Worker angle::Result Renderbuffer::setStorage(const Context *context,
140*8975f5c5SAndroid Build Coastguard Worker                                        GLenum internalformat,
141*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei width,
142*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei height)
143*8975f5c5SAndroid Build Coastguard Worker {
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker     egl::RefCountObjectReleaser<egl::Image> releaseImage;
146*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(orphanImages(context, &releaseImage));
147*8975f5c5SAndroid Build Coastguard Worker 
148*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->setStorage(context, internalformat, width, height));
149*8975f5c5SAndroid Build Coastguard Worker 
150*8975f5c5SAndroid Build Coastguard Worker     mState.update(width, height, Format(internalformat), 0, MultisamplingMode::Regular,
151*8975f5c5SAndroid Build Coastguard Worker                   DetermineInitState(context));
152*8975f5c5SAndroid Build Coastguard Worker     onStateChange(angle::SubjectMessage::SubjectChanged);
153*8975f5c5SAndroid Build Coastguard Worker 
154*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
155*8975f5c5SAndroid Build Coastguard Worker }
156*8975f5c5SAndroid Build Coastguard Worker 
setStorageMultisample(const Context * context,GLsizei samplesIn,GLenum internalformat,GLsizei width,GLsizei height,MultisamplingMode mode)157*8975f5c5SAndroid Build Coastguard Worker angle::Result Renderbuffer::setStorageMultisample(const Context *context,
158*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei samplesIn,
159*8975f5c5SAndroid Build Coastguard Worker                                                   GLenum internalformat,
160*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei width,
161*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei height,
162*8975f5c5SAndroid Build Coastguard Worker                                                   MultisamplingMode mode)
163*8975f5c5SAndroid Build Coastguard Worker {
164*8975f5c5SAndroid Build Coastguard Worker     egl::RefCountObjectReleaser<egl::Image> releaseImage;
165*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(orphanImages(context, &releaseImage));
166*8975f5c5SAndroid Build Coastguard Worker 
167*8975f5c5SAndroid Build Coastguard Worker     // Potentially adjust "samplesIn" to a supported value
168*8975f5c5SAndroid Build Coastguard Worker     const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
169*8975f5c5SAndroid Build Coastguard Worker     GLsizei samples               = formatCaps.getNearestSamples(samplesIn);
170*8975f5c5SAndroid Build Coastguard Worker 
171*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->setStorageMultisample(context, samples, internalformat, width,
172*8975f5c5SAndroid Build Coastguard Worker                                                      height, mode));
173*8975f5c5SAndroid Build Coastguard Worker 
174*8975f5c5SAndroid Build Coastguard Worker     mState.update(width, height, Format(internalformat), samples, mode,
175*8975f5c5SAndroid Build Coastguard Worker                   DetermineInitState(context));
176*8975f5c5SAndroid Build Coastguard Worker     onStateChange(angle::SubjectMessage::SubjectChanged);
177*8975f5c5SAndroid Build Coastguard Worker 
178*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
179*8975f5c5SAndroid Build Coastguard Worker }
180*8975f5c5SAndroid Build Coastguard Worker 
setStorageEGLImageTarget(const Context * context,egl::Image * image)181*8975f5c5SAndroid Build Coastguard Worker angle::Result Renderbuffer::setStorageEGLImageTarget(const Context *context, egl::Image *image)
182*8975f5c5SAndroid Build Coastguard Worker {
183*8975f5c5SAndroid Build Coastguard Worker     egl::RefCountObjectReleaser<egl::Image> releaseImage;
184*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(orphanImages(context, &releaseImage));
185*8975f5c5SAndroid Build Coastguard Worker 
186*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->setStorageEGLImageTarget(context, image));
187*8975f5c5SAndroid Build Coastguard Worker 
188*8975f5c5SAndroid Build Coastguard Worker     setTargetImage(context, image);
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker     mState.update(static_cast<GLsizei>(image->getWidth()), static_cast<GLsizei>(image->getHeight()),
191*8975f5c5SAndroid Build Coastguard Worker                   Format(image->getFormat()), 0, MultisamplingMode::Regular,
192*8975f5c5SAndroid Build Coastguard Worker                   image->sourceInitState());
193*8975f5c5SAndroid Build Coastguard Worker     mState.setProtectedContent(image->hasProtectedContent());
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker     onStateChange(angle::SubjectMessage::SubjectChanged);
196*8975f5c5SAndroid Build Coastguard Worker 
197*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
198*8975f5c5SAndroid Build Coastguard Worker }
199*8975f5c5SAndroid Build Coastguard Worker 
copyRenderbufferSubData(Context * context,const gl::Renderbuffer * srcBuffer,GLint srcLevel,GLint srcX,GLint srcY,GLint srcZ,GLint dstLevel,GLint dstX,GLint dstY,GLint dstZ,GLsizei srcWidth,GLsizei srcHeight,GLsizei srcDepth)200*8975f5c5SAndroid Build Coastguard Worker angle::Result Renderbuffer::copyRenderbufferSubData(Context *context,
201*8975f5c5SAndroid Build Coastguard Worker                                                     const gl::Renderbuffer *srcBuffer,
202*8975f5c5SAndroid Build Coastguard Worker                                                     GLint srcLevel,
203*8975f5c5SAndroid Build Coastguard Worker                                                     GLint srcX,
204*8975f5c5SAndroid Build Coastguard Worker                                                     GLint srcY,
205*8975f5c5SAndroid Build Coastguard Worker                                                     GLint srcZ,
206*8975f5c5SAndroid Build Coastguard Worker                                                     GLint dstLevel,
207*8975f5c5SAndroid Build Coastguard Worker                                                     GLint dstX,
208*8975f5c5SAndroid Build Coastguard Worker                                                     GLint dstY,
209*8975f5c5SAndroid Build Coastguard Worker                                                     GLint dstZ,
210*8975f5c5SAndroid Build Coastguard Worker                                                     GLsizei srcWidth,
211*8975f5c5SAndroid Build Coastguard Worker                                                     GLsizei srcHeight,
212*8975f5c5SAndroid Build Coastguard Worker                                                     GLsizei srcDepth)
213*8975f5c5SAndroid Build Coastguard Worker {
214*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->copyRenderbufferSubData(context, srcBuffer, srcLevel, srcX, srcY,
215*8975f5c5SAndroid Build Coastguard Worker                                                        srcZ, dstLevel, dstX, dstY, dstZ, srcWidth,
216*8975f5c5SAndroid Build Coastguard Worker                                                        srcHeight, srcDepth));
217*8975f5c5SAndroid Build Coastguard Worker 
218*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
219*8975f5c5SAndroid Build Coastguard Worker }
220*8975f5c5SAndroid Build Coastguard Worker 
copyTextureSubData(Context * context,const gl::Texture * srcTexture,GLint srcLevel,GLint srcX,GLint srcY,GLint srcZ,GLint dstLevel,GLint dstX,GLint dstY,GLint dstZ,GLsizei srcWidth,GLsizei srcHeight,GLsizei srcDepth)221*8975f5c5SAndroid Build Coastguard Worker angle::Result Renderbuffer::copyTextureSubData(Context *context,
222*8975f5c5SAndroid Build Coastguard Worker                                                const gl::Texture *srcTexture,
223*8975f5c5SAndroid Build Coastguard Worker                                                GLint srcLevel,
224*8975f5c5SAndroid Build Coastguard Worker                                                GLint srcX,
225*8975f5c5SAndroid Build Coastguard Worker                                                GLint srcY,
226*8975f5c5SAndroid Build Coastguard Worker                                                GLint srcZ,
227*8975f5c5SAndroid Build Coastguard Worker                                                GLint dstLevel,
228*8975f5c5SAndroid Build Coastguard Worker                                                GLint dstX,
229*8975f5c5SAndroid Build Coastguard Worker                                                GLint dstY,
230*8975f5c5SAndroid Build Coastguard Worker                                                GLint dstZ,
231*8975f5c5SAndroid Build Coastguard Worker                                                GLsizei srcWidth,
232*8975f5c5SAndroid Build Coastguard Worker                                                GLsizei srcHeight,
233*8975f5c5SAndroid Build Coastguard Worker                                                GLsizei srcDepth)
234*8975f5c5SAndroid Build Coastguard Worker {
235*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->copyTextureSubData(context, srcTexture, srcLevel, srcX, srcY, srcZ,
236*8975f5c5SAndroid Build Coastguard Worker                                                   dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight,
237*8975f5c5SAndroid Build Coastguard Worker                                                   srcDepth));
238*8975f5c5SAndroid Build Coastguard Worker 
239*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
240*8975f5c5SAndroid Build Coastguard Worker }
241*8975f5c5SAndroid Build Coastguard Worker 
getImplementation() const242*8975f5c5SAndroid Build Coastguard Worker rx::RenderbufferImpl *Renderbuffer::getImplementation() const
243*8975f5c5SAndroid Build Coastguard Worker {
244*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mImplementation);
245*8975f5c5SAndroid Build Coastguard Worker     return mImplementation.get();
246*8975f5c5SAndroid Build Coastguard Worker }
247*8975f5c5SAndroid Build Coastguard Worker 
getWidth() const248*8975f5c5SAndroid Build Coastguard Worker GLsizei Renderbuffer::getWidth() const
249*8975f5c5SAndroid Build Coastguard Worker {
250*8975f5c5SAndroid Build Coastguard Worker     return mState.mWidth;
251*8975f5c5SAndroid Build Coastguard Worker }
252*8975f5c5SAndroid Build Coastguard Worker 
getHeight() const253*8975f5c5SAndroid Build Coastguard Worker GLsizei Renderbuffer::getHeight() const
254*8975f5c5SAndroid Build Coastguard Worker {
255*8975f5c5SAndroid Build Coastguard Worker     return mState.mHeight;
256*8975f5c5SAndroid Build Coastguard Worker }
257*8975f5c5SAndroid Build Coastguard Worker 
getFormat() const258*8975f5c5SAndroid Build Coastguard Worker const Format &Renderbuffer::getFormat() const
259*8975f5c5SAndroid Build Coastguard Worker {
260*8975f5c5SAndroid Build Coastguard Worker     return mState.mFormat;
261*8975f5c5SAndroid Build Coastguard Worker }
262*8975f5c5SAndroid Build Coastguard Worker 
getSamples() const263*8975f5c5SAndroid Build Coastguard Worker GLsizei Renderbuffer::getSamples() const
264*8975f5c5SAndroid Build Coastguard Worker {
265*8975f5c5SAndroid Build Coastguard Worker     return mState.mMultisamplingMode == MultisamplingMode::Regular ? mState.mSamples : 0;
266*8975f5c5SAndroid Build Coastguard Worker }
267*8975f5c5SAndroid Build Coastguard Worker 
getMultisamplingMode() const268*8975f5c5SAndroid Build Coastguard Worker MultisamplingMode Renderbuffer::getMultisamplingMode() const
269*8975f5c5SAndroid Build Coastguard Worker {
270*8975f5c5SAndroid Build Coastguard Worker     return mState.mMultisamplingMode;
271*8975f5c5SAndroid Build Coastguard Worker }
272*8975f5c5SAndroid Build Coastguard Worker 
getRedSize() const273*8975f5c5SAndroid Build Coastguard Worker GLuint Renderbuffer::getRedSize() const
274*8975f5c5SAndroid Build Coastguard Worker {
275*8975f5c5SAndroid Build Coastguard Worker     return mState.mFormat.info->redBits;
276*8975f5c5SAndroid Build Coastguard Worker }
277*8975f5c5SAndroid Build Coastguard Worker 
getGreenSize() const278*8975f5c5SAndroid Build Coastguard Worker GLuint Renderbuffer::getGreenSize() const
279*8975f5c5SAndroid Build Coastguard Worker {
280*8975f5c5SAndroid Build Coastguard Worker     return mState.mFormat.info->greenBits;
281*8975f5c5SAndroid Build Coastguard Worker }
282*8975f5c5SAndroid Build Coastguard Worker 
getBlueSize() const283*8975f5c5SAndroid Build Coastguard Worker GLuint Renderbuffer::getBlueSize() const
284*8975f5c5SAndroid Build Coastguard Worker {
285*8975f5c5SAndroid Build Coastguard Worker     return mState.mFormat.info->blueBits;
286*8975f5c5SAndroid Build Coastguard Worker }
287*8975f5c5SAndroid Build Coastguard Worker 
getAlphaSize() const288*8975f5c5SAndroid Build Coastguard Worker GLuint Renderbuffer::getAlphaSize() const
289*8975f5c5SAndroid Build Coastguard Worker {
290*8975f5c5SAndroid Build Coastguard Worker     return mState.mFormat.info->alphaBits;
291*8975f5c5SAndroid Build Coastguard Worker }
292*8975f5c5SAndroid Build Coastguard Worker 
getDepthSize() const293*8975f5c5SAndroid Build Coastguard Worker GLuint Renderbuffer::getDepthSize() const
294*8975f5c5SAndroid Build Coastguard Worker {
295*8975f5c5SAndroid Build Coastguard Worker     return mState.mFormat.info->depthBits;
296*8975f5c5SAndroid Build Coastguard Worker }
297*8975f5c5SAndroid Build Coastguard Worker 
getStencilSize() const298*8975f5c5SAndroid Build Coastguard Worker GLuint Renderbuffer::getStencilSize() const
299*8975f5c5SAndroid Build Coastguard Worker {
300*8975f5c5SAndroid Build Coastguard Worker     return mState.mFormat.info->stencilBits;
301*8975f5c5SAndroid Build Coastguard Worker }
302*8975f5c5SAndroid Build Coastguard Worker 
getState() const303*8975f5c5SAndroid Build Coastguard Worker const RenderbufferState &Renderbuffer::getState() const
304*8975f5c5SAndroid Build Coastguard Worker {
305*8975f5c5SAndroid Build Coastguard Worker     return mState;
306*8975f5c5SAndroid Build Coastguard Worker }
307*8975f5c5SAndroid Build Coastguard Worker 
getMemorySize() const308*8975f5c5SAndroid Build Coastguard Worker GLint Renderbuffer::getMemorySize() const
309*8975f5c5SAndroid Build Coastguard Worker {
310*8975f5c5SAndroid Build Coastguard Worker     GLint implSize = mImplementation->getMemorySize();
311*8975f5c5SAndroid Build Coastguard Worker     if (implSize > 0)
312*8975f5c5SAndroid Build Coastguard Worker     {
313*8975f5c5SAndroid Build Coastguard Worker         return implSize;
314*8975f5c5SAndroid Build Coastguard Worker     }
315*8975f5c5SAndroid Build Coastguard Worker 
316*8975f5c5SAndroid Build Coastguard Worker     // Assume allocated size is around width * height * samples * pixelBytes
317*8975f5c5SAndroid Build Coastguard Worker     angle::CheckedNumeric<GLint> size = 1;
318*8975f5c5SAndroid Build Coastguard Worker     size *= mState.mFormat.info->pixelBytes;
319*8975f5c5SAndroid Build Coastguard Worker     size *= mState.mWidth;
320*8975f5c5SAndroid Build Coastguard Worker     size *= mState.mHeight;
321*8975f5c5SAndroid Build Coastguard Worker     size *= std::max(mState.mSamples, 1);
322*8975f5c5SAndroid Build Coastguard Worker     return size.ValueOrDefault(std::numeric_limits<GLint>::max());
323*8975f5c5SAndroid Build Coastguard Worker }
324*8975f5c5SAndroid Build Coastguard Worker 
onAttach(const Context * context,rx::UniqueSerial framebufferSerial)325*8975f5c5SAndroid Build Coastguard Worker void Renderbuffer::onAttach(const Context *context, rx::UniqueSerial framebufferSerial)
326*8975f5c5SAndroid Build Coastguard Worker {
327*8975f5c5SAndroid Build Coastguard Worker     addRef();
328*8975f5c5SAndroid Build Coastguard Worker }
329*8975f5c5SAndroid Build Coastguard Worker 
onDetach(const Context * context,rx::UniqueSerial framebufferSerial)330*8975f5c5SAndroid Build Coastguard Worker void Renderbuffer::onDetach(const Context *context, rx::UniqueSerial framebufferSerial)
331*8975f5c5SAndroid Build Coastguard Worker {
332*8975f5c5SAndroid Build Coastguard Worker     release(context);
333*8975f5c5SAndroid Build Coastguard Worker }
334*8975f5c5SAndroid Build Coastguard Worker 
getId() const335*8975f5c5SAndroid Build Coastguard Worker GLuint Renderbuffer::getId() const
336*8975f5c5SAndroid Build Coastguard Worker {
337*8975f5c5SAndroid Build Coastguard Worker     return id().value;
338*8975f5c5SAndroid Build Coastguard Worker }
339*8975f5c5SAndroid Build Coastguard Worker 
getAttachmentSize(const gl::ImageIndex &) const340*8975f5c5SAndroid Build Coastguard Worker Extents Renderbuffer::getAttachmentSize(const gl::ImageIndex & /*imageIndex*/) const
341*8975f5c5SAndroid Build Coastguard Worker {
342*8975f5c5SAndroid Build Coastguard Worker     return Extents(mState.mWidth, mState.mHeight, 1);
343*8975f5c5SAndroid Build Coastguard Worker }
344*8975f5c5SAndroid Build Coastguard Worker 
getAttachmentFormat(GLenum,const ImageIndex &) const345*8975f5c5SAndroid Build Coastguard Worker Format Renderbuffer::getAttachmentFormat(GLenum /*binding*/,
346*8975f5c5SAndroid Build Coastguard Worker                                          const ImageIndex & /*imageIndex*/) const
347*8975f5c5SAndroid Build Coastguard Worker {
348*8975f5c5SAndroid Build Coastguard Worker     return getFormat();
349*8975f5c5SAndroid Build Coastguard Worker }
getAttachmentSamples(const ImageIndex &) const350*8975f5c5SAndroid Build Coastguard Worker GLsizei Renderbuffer::getAttachmentSamples(const ImageIndex & /*imageIndex*/) const
351*8975f5c5SAndroid Build Coastguard Worker {
352*8975f5c5SAndroid Build Coastguard Worker     return getSamples();
353*8975f5c5SAndroid Build Coastguard Worker }
354*8975f5c5SAndroid Build Coastguard Worker 
isRenderable(const Context * context,GLenum binding,const ImageIndex & imageIndex) const355*8975f5c5SAndroid Build Coastguard Worker bool Renderbuffer::isRenderable(const Context *context,
356*8975f5c5SAndroid Build Coastguard Worker                                 GLenum binding,
357*8975f5c5SAndroid Build Coastguard Worker                                 const ImageIndex &imageIndex) const
358*8975f5c5SAndroid Build Coastguard Worker {
359*8975f5c5SAndroid Build Coastguard Worker     if (isEGLImageTarget())
360*8975f5c5SAndroid Build Coastguard Worker     {
361*8975f5c5SAndroid Build Coastguard Worker         return ImageSibling::isRenderable(context, binding, imageIndex);
362*8975f5c5SAndroid Build Coastguard Worker     }
363*8975f5c5SAndroid Build Coastguard Worker     return getFormat().info->renderbufferSupport(context->getClientVersion(),
364*8975f5c5SAndroid Build Coastguard Worker                                                  context->getExtensions());
365*8975f5c5SAndroid Build Coastguard Worker }
366*8975f5c5SAndroid Build Coastguard Worker 
initState(GLenum,const gl::ImageIndex &) const367*8975f5c5SAndroid Build Coastguard Worker InitState Renderbuffer::initState(GLenum /*binding*/, const gl::ImageIndex & /*imageIndex*/) const
368*8975f5c5SAndroid Build Coastguard Worker {
369*8975f5c5SAndroid Build Coastguard Worker     if (isEGLImageTarget())
370*8975f5c5SAndroid Build Coastguard Worker     {
371*8975f5c5SAndroid Build Coastguard Worker         return sourceEGLImageInitState();
372*8975f5c5SAndroid Build Coastguard Worker     }
373*8975f5c5SAndroid Build Coastguard Worker 
374*8975f5c5SAndroid Build Coastguard Worker     return mState.mInitState;
375*8975f5c5SAndroid Build Coastguard Worker }
376*8975f5c5SAndroid Build Coastguard Worker 
setInitState(GLenum,const gl::ImageIndex &,InitState initState)377*8975f5c5SAndroid Build Coastguard Worker void Renderbuffer::setInitState(GLenum /*binding*/,
378*8975f5c5SAndroid Build Coastguard Worker                                 const gl::ImageIndex & /*imageIndex*/,
379*8975f5c5SAndroid Build Coastguard Worker                                 InitState initState)
380*8975f5c5SAndroid Build Coastguard Worker {
381*8975f5c5SAndroid Build Coastguard Worker     if (isEGLImageTarget())
382*8975f5c5SAndroid Build Coastguard Worker     {
383*8975f5c5SAndroid Build Coastguard Worker         setSourceEGLImageInitState(initState);
384*8975f5c5SAndroid Build Coastguard Worker     }
385*8975f5c5SAndroid Build Coastguard Worker     else
386*8975f5c5SAndroid Build Coastguard Worker     {
387*8975f5c5SAndroid Build Coastguard Worker         mState.mInitState = initState;
388*8975f5c5SAndroid Build Coastguard Worker     }
389*8975f5c5SAndroid Build Coastguard Worker }
390*8975f5c5SAndroid Build Coastguard Worker 
getAttachmentImpl() const391*8975f5c5SAndroid Build Coastguard Worker rx::FramebufferAttachmentObjectImpl *Renderbuffer::getAttachmentImpl() const
392*8975f5c5SAndroid Build Coastguard Worker {
393*8975f5c5SAndroid Build Coastguard Worker     return mImplementation.get();
394*8975f5c5SAndroid Build Coastguard Worker }
395*8975f5c5SAndroid Build Coastguard Worker 
getImplementationColorReadFormat(const Context * context) const396*8975f5c5SAndroid Build Coastguard Worker GLenum Renderbuffer::getImplementationColorReadFormat(const Context *context) const
397*8975f5c5SAndroid Build Coastguard Worker {
398*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->getColorReadFormat(context);
399*8975f5c5SAndroid Build Coastguard Worker }
400*8975f5c5SAndroid Build Coastguard Worker 
getImplementationColorReadType(const Context * context) const401*8975f5c5SAndroid Build Coastguard Worker GLenum Renderbuffer::getImplementationColorReadType(const Context *context) const
402*8975f5c5SAndroid Build Coastguard Worker {
403*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->getColorReadType(context);
404*8975f5c5SAndroid Build Coastguard Worker }
405*8975f5c5SAndroid Build Coastguard Worker 
getRenderbufferImage(const Context * context,const PixelPackState & packState,Buffer * packBuffer,GLenum format,GLenum type,void * pixels) const406*8975f5c5SAndroid Build Coastguard Worker angle::Result Renderbuffer::getRenderbufferImage(const Context *context,
407*8975f5c5SAndroid Build Coastguard Worker                                                  const PixelPackState &packState,
408*8975f5c5SAndroid Build Coastguard Worker                                                  Buffer *packBuffer,
409*8975f5c5SAndroid Build Coastguard Worker                                                  GLenum format,
410*8975f5c5SAndroid Build Coastguard Worker                                                  GLenum type,
411*8975f5c5SAndroid Build Coastguard Worker                                                  void *pixels) const
412*8975f5c5SAndroid Build Coastguard Worker {
413*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->getRenderbufferImage(context, packState, packBuffer, format, type,
414*8975f5c5SAndroid Build Coastguard Worker                                                  pixels);
415*8975f5c5SAndroid Build Coastguard Worker }
416*8975f5c5SAndroid Build Coastguard Worker 
onSubjectStateChange(angle::SubjectIndex index,angle::SubjectMessage message)417*8975f5c5SAndroid Build Coastguard Worker void Renderbuffer::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message)
418*8975f5c5SAndroid Build Coastguard Worker {
419*8975f5c5SAndroid Build Coastguard Worker     ASSERT(message == angle::SubjectMessage::SubjectChanged);
420*8975f5c5SAndroid Build Coastguard Worker     onStateChange(angle::SubjectMessage::ContentsChanged);
421*8975f5c5SAndroid Build Coastguard Worker }
422*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
423