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