xref: /aosp_15_r20/external/angle/src/libANGLE/FramebufferAttachment.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 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 // FramebufferAttachment.cpp: the gl::FramebufferAttachment class and its derived classes
8*8975f5c5SAndroid Build Coastguard Worker // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/FramebufferAttachment.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/utilities.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Config.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Renderbuffer.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Surface.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Texture.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/formatutils.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/FramebufferImpl.h"
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker namespace gl
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker ////// FramebufferAttachment::Target Implementation //////
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker const GLsizei FramebufferAttachment::kDefaultNumViews             = 1;
28*8975f5c5SAndroid Build Coastguard Worker const GLint FramebufferAttachment::kDefaultBaseViewIndex          = 0;
29*8975f5c5SAndroid Build Coastguard Worker const GLint FramebufferAttachment::kDefaultRenderToTextureSamples = 0;
30*8975f5c5SAndroid Build Coastguard Worker 
Target()31*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment::Target::Target() : mBinding(GL_NONE), mTextureIndex() {}
32*8975f5c5SAndroid Build Coastguard Worker 
Target(GLenum binding,const ImageIndex & imageIndex)33*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment::Target::Target(GLenum binding, const ImageIndex &imageIndex)
34*8975f5c5SAndroid Build Coastguard Worker     : mBinding(binding), mTextureIndex(imageIndex)
35*8975f5c5SAndroid Build Coastguard Worker {}
36*8975f5c5SAndroid Build Coastguard Worker 
Target(const Target & other)37*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment::Target::Target(const Target &other)
38*8975f5c5SAndroid Build Coastguard Worker     : mBinding(other.mBinding), mTextureIndex(other.mTextureIndex)
39*8975f5c5SAndroid Build Coastguard Worker {}
40*8975f5c5SAndroid Build Coastguard Worker 
operator =(const Target & other)41*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment::Target &FramebufferAttachment::Target::operator=(const Target &other)
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker     this->mBinding      = other.mBinding;
44*8975f5c5SAndroid Build Coastguard Worker     this->mTextureIndex = other.mTextureIndex;
45*8975f5c5SAndroid Build Coastguard Worker     return *this;
46*8975f5c5SAndroid Build Coastguard Worker }
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker ////// FramebufferAttachment Implementation //////
49*8975f5c5SAndroid Build Coastguard Worker 
FramebufferAttachment()50*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment::FramebufferAttachment()
51*8975f5c5SAndroid Build Coastguard Worker     : mType(GL_NONE),
52*8975f5c5SAndroid Build Coastguard Worker       mResource(nullptr),
53*8975f5c5SAndroid Build Coastguard Worker       mNumViews(kDefaultNumViews),
54*8975f5c5SAndroid Build Coastguard Worker       mIsMultiview(false),
55*8975f5c5SAndroid Build Coastguard Worker       mBaseViewIndex(kDefaultBaseViewIndex),
56*8975f5c5SAndroid Build Coastguard Worker       mRenderToTextureSamples(kDefaultRenderToTextureSamples)
57*8975f5c5SAndroid Build Coastguard Worker {}
58*8975f5c5SAndroid Build Coastguard Worker 
FramebufferAttachment(const Context * context,GLenum type,GLenum binding,const ImageIndex & textureIndex,FramebufferAttachmentObject * resource,rx::UniqueSerial framebufferSerial)59*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment::FramebufferAttachment(const Context *context,
60*8975f5c5SAndroid Build Coastguard Worker                                              GLenum type,
61*8975f5c5SAndroid Build Coastguard Worker                                              GLenum binding,
62*8975f5c5SAndroid Build Coastguard Worker                                              const ImageIndex &textureIndex,
63*8975f5c5SAndroid Build Coastguard Worker                                              FramebufferAttachmentObject *resource,
64*8975f5c5SAndroid Build Coastguard Worker                                              rx::UniqueSerial framebufferSerial)
65*8975f5c5SAndroid Build Coastguard Worker     : mResource(nullptr)
66*8975f5c5SAndroid Build Coastguard Worker {
67*8975f5c5SAndroid Build Coastguard Worker     attach(context, type, binding, textureIndex, resource, kDefaultNumViews, kDefaultBaseViewIndex,
68*8975f5c5SAndroid Build Coastguard Worker            false, kDefaultRenderToTextureSamples, framebufferSerial);
69*8975f5c5SAndroid Build Coastguard Worker }
70*8975f5c5SAndroid Build Coastguard Worker 
FramebufferAttachment(FramebufferAttachment && other)71*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment::FramebufferAttachment(FramebufferAttachment &&other)
72*8975f5c5SAndroid Build Coastguard Worker     : FramebufferAttachment()
73*8975f5c5SAndroid Build Coastguard Worker {
74*8975f5c5SAndroid Build Coastguard Worker     *this = std::move(other);
75*8975f5c5SAndroid Build Coastguard Worker }
76*8975f5c5SAndroid Build Coastguard Worker 
operator =(FramebufferAttachment && other)77*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment &FramebufferAttachment::operator=(FramebufferAttachment &&other)
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker     std::swap(mType, other.mType);
80*8975f5c5SAndroid Build Coastguard Worker     std::swap(mTarget, other.mTarget);
81*8975f5c5SAndroid Build Coastguard Worker     std::swap(mResource, other.mResource);
82*8975f5c5SAndroid Build Coastguard Worker     std::swap(mNumViews, other.mNumViews);
83*8975f5c5SAndroid Build Coastguard Worker     std::swap(mIsMultiview, other.mIsMultiview);
84*8975f5c5SAndroid Build Coastguard Worker     std::swap(mBaseViewIndex, other.mBaseViewIndex);
85*8975f5c5SAndroid Build Coastguard Worker     std::swap(mRenderToTextureSamples, other.mRenderToTextureSamples);
86*8975f5c5SAndroid Build Coastguard Worker     return *this;
87*8975f5c5SAndroid Build Coastguard Worker }
88*8975f5c5SAndroid Build Coastguard Worker 
~FramebufferAttachment()89*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment::~FramebufferAttachment()
90*8975f5c5SAndroid Build Coastguard Worker {
91*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!isAttached());
92*8975f5c5SAndroid Build Coastguard Worker }
93*8975f5c5SAndroid Build Coastguard Worker 
detach(const Context * context,rx::UniqueSerial framebufferSerial)94*8975f5c5SAndroid Build Coastguard Worker void FramebufferAttachment::detach(const Context *context, rx::UniqueSerial framebufferSerial)
95*8975f5c5SAndroid Build Coastguard Worker {
96*8975f5c5SAndroid Build Coastguard Worker     mType = GL_NONE;
97*8975f5c5SAndroid Build Coastguard Worker     if (mResource != nullptr)
98*8975f5c5SAndroid Build Coastguard Worker     {
99*8975f5c5SAndroid Build Coastguard Worker         mResource->onDetach(context, framebufferSerial);
100*8975f5c5SAndroid Build Coastguard Worker         mResource = nullptr;
101*8975f5c5SAndroid Build Coastguard Worker     }
102*8975f5c5SAndroid Build Coastguard Worker     mNumViews      = kDefaultNumViews;
103*8975f5c5SAndroid Build Coastguard Worker     mIsMultiview   = false;
104*8975f5c5SAndroid Build Coastguard Worker     mBaseViewIndex = kDefaultBaseViewIndex;
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     // not technically necessary, could omit for performance
107*8975f5c5SAndroid Build Coastguard Worker     mTarget = Target();
108*8975f5c5SAndroid Build Coastguard Worker }
109*8975f5c5SAndroid Build Coastguard Worker 
attach(const Context * context,GLenum type,GLenum binding,const ImageIndex & textureIndex,FramebufferAttachmentObject * resource,GLsizei numViews,GLuint baseViewIndex,bool isMultiview,GLsizei samples,rx::UniqueSerial framebufferSerial)110*8975f5c5SAndroid Build Coastguard Worker void FramebufferAttachment::attach(const Context *context,
111*8975f5c5SAndroid Build Coastguard Worker                                    GLenum type,
112*8975f5c5SAndroid Build Coastguard Worker                                    GLenum binding,
113*8975f5c5SAndroid Build Coastguard Worker                                    const ImageIndex &textureIndex,
114*8975f5c5SAndroid Build Coastguard Worker                                    FramebufferAttachmentObject *resource,
115*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei numViews,
116*8975f5c5SAndroid Build Coastguard Worker                                    GLuint baseViewIndex,
117*8975f5c5SAndroid Build Coastguard Worker                                    bool isMultiview,
118*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei samples,
119*8975f5c5SAndroid Build Coastguard Worker                                    rx::UniqueSerial framebufferSerial)
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker     if (resource == nullptr)
122*8975f5c5SAndroid Build Coastguard Worker     {
123*8975f5c5SAndroid Build Coastguard Worker         detach(context, framebufferSerial);
124*8975f5c5SAndroid Build Coastguard Worker         return;
125*8975f5c5SAndroid Build Coastguard Worker     }
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker     mType                   = type;
128*8975f5c5SAndroid Build Coastguard Worker     mTarget                 = Target(binding, textureIndex);
129*8975f5c5SAndroid Build Coastguard Worker     mNumViews               = numViews;
130*8975f5c5SAndroid Build Coastguard Worker     mBaseViewIndex          = baseViewIndex;
131*8975f5c5SAndroid Build Coastguard Worker     mIsMultiview            = isMultiview;
132*8975f5c5SAndroid Build Coastguard Worker     mRenderToTextureSamples = type == GL_RENDERBUFFER ? kDefaultRenderToTextureSamples : samples;
133*8975f5c5SAndroid Build Coastguard Worker     resource->onAttach(context, framebufferSerial);
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker     if (mResource != nullptr)
136*8975f5c5SAndroid Build Coastguard Worker     {
137*8975f5c5SAndroid Build Coastguard Worker         mResource->onDetach(context, framebufferSerial);
138*8975f5c5SAndroid Build Coastguard Worker     }
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker     mResource = resource;
141*8975f5c5SAndroid Build Coastguard Worker }
142*8975f5c5SAndroid Build Coastguard Worker 
getRedSize() const143*8975f5c5SAndroid Build Coastguard Worker GLuint FramebufferAttachment::getRedSize() const
144*8975f5c5SAndroid Build Coastguard Worker {
145*8975f5c5SAndroid Build Coastguard Worker     return getSize().empty() ? 0 : getFormat().info->redBits;
146*8975f5c5SAndroid Build Coastguard Worker }
147*8975f5c5SAndroid Build Coastguard Worker 
getGreenSize() const148*8975f5c5SAndroid Build Coastguard Worker GLuint FramebufferAttachment::getGreenSize() const
149*8975f5c5SAndroid Build Coastguard Worker {
150*8975f5c5SAndroid Build Coastguard Worker     return getSize().empty() ? 0 : getFormat().info->greenBits;
151*8975f5c5SAndroid Build Coastguard Worker }
152*8975f5c5SAndroid Build Coastguard Worker 
getBlueSize() const153*8975f5c5SAndroid Build Coastguard Worker GLuint FramebufferAttachment::getBlueSize() const
154*8975f5c5SAndroid Build Coastguard Worker {
155*8975f5c5SAndroid Build Coastguard Worker     return getSize().empty() ? 0 : getFormat().info->blueBits;
156*8975f5c5SAndroid Build Coastguard Worker }
157*8975f5c5SAndroid Build Coastguard Worker 
getAlphaSize() const158*8975f5c5SAndroid Build Coastguard Worker GLuint FramebufferAttachment::getAlphaSize() const
159*8975f5c5SAndroid Build Coastguard Worker {
160*8975f5c5SAndroid Build Coastguard Worker     return getSize().empty() ? 0 : getFormat().info->alphaBits;
161*8975f5c5SAndroid Build Coastguard Worker }
162*8975f5c5SAndroid Build Coastguard Worker 
getDepthSize() const163*8975f5c5SAndroid Build Coastguard Worker GLuint FramebufferAttachment::getDepthSize() const
164*8975f5c5SAndroid Build Coastguard Worker {
165*8975f5c5SAndroid Build Coastguard Worker     return getSize().empty() ? 0 : getFormat().info->depthBits;
166*8975f5c5SAndroid Build Coastguard Worker }
167*8975f5c5SAndroid Build Coastguard Worker 
getStencilSize() const168*8975f5c5SAndroid Build Coastguard Worker GLuint FramebufferAttachment::getStencilSize() const
169*8975f5c5SAndroid Build Coastguard Worker {
170*8975f5c5SAndroid Build Coastguard Worker     return getSize().empty() ? 0 : getFormat().info->stencilBits;
171*8975f5c5SAndroid Build Coastguard Worker }
172*8975f5c5SAndroid Build Coastguard Worker 
getComponentType() const173*8975f5c5SAndroid Build Coastguard Worker GLenum FramebufferAttachment::getComponentType() const
174*8975f5c5SAndroid Build Coastguard Worker {
175*8975f5c5SAndroid Build Coastguard Worker     return getFormat().info->componentType;
176*8975f5c5SAndroid Build Coastguard Worker }
177*8975f5c5SAndroid Build Coastguard Worker 
getColorEncoding() const178*8975f5c5SAndroid Build Coastguard Worker GLenum FramebufferAttachment::getColorEncoding() const
179*8975f5c5SAndroid Build Coastguard Worker {
180*8975f5c5SAndroid Build Coastguard Worker     return getFormat().info->colorEncoding;
181*8975f5c5SAndroid Build Coastguard Worker }
182*8975f5c5SAndroid Build Coastguard Worker 
id() const183*8975f5c5SAndroid Build Coastguard Worker GLuint FramebufferAttachment::id() const
184*8975f5c5SAndroid Build Coastguard Worker {
185*8975f5c5SAndroid Build Coastguard Worker     return mResource->getId();
186*8975f5c5SAndroid Build Coastguard Worker }
187*8975f5c5SAndroid Build Coastguard Worker 
cubeMapFace() const188*8975f5c5SAndroid Build Coastguard Worker TextureTarget FramebufferAttachment::cubeMapFace() const
189*8975f5c5SAndroid Build Coastguard Worker {
190*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mType == GL_TEXTURE);
191*8975f5c5SAndroid Build Coastguard Worker 
192*8975f5c5SAndroid Build Coastguard Worker     const auto &index = mTarget.textureIndex();
193*8975f5c5SAndroid Build Coastguard Worker     return index.getType() == TextureType::CubeMap ? index.getTarget() : TextureTarget::InvalidEnum;
194*8975f5c5SAndroid Build Coastguard Worker }
195*8975f5c5SAndroid Build Coastguard Worker 
mipLevel() const196*8975f5c5SAndroid Build Coastguard Worker GLint FramebufferAttachment::mipLevel() const
197*8975f5c5SAndroid Build Coastguard Worker {
198*8975f5c5SAndroid Build Coastguard Worker     ASSERT(type() == GL_TEXTURE);
199*8975f5c5SAndroid Build Coastguard Worker     return mTarget.textureIndex().getLevelIndex();
200*8975f5c5SAndroid Build Coastguard Worker }
201*8975f5c5SAndroid Build Coastguard Worker 
layer() const202*8975f5c5SAndroid Build Coastguard Worker GLint FramebufferAttachment::layer() const
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mType == GL_TEXTURE);
205*8975f5c5SAndroid Build Coastguard Worker 
206*8975f5c5SAndroid Build Coastguard Worker     const gl::ImageIndex &index = mTarget.textureIndex();
207*8975f5c5SAndroid Build Coastguard Worker     return (index.has3DLayer() ? index.getLayerIndex() : 0);
208*8975f5c5SAndroid Build Coastguard Worker }
209*8975f5c5SAndroid Build Coastguard Worker 
isLayered() const210*8975f5c5SAndroid Build Coastguard Worker bool FramebufferAttachment::isLayered() const
211*8975f5c5SAndroid Build Coastguard Worker {
212*8975f5c5SAndroid Build Coastguard Worker     return mTarget.textureIndex().isLayered();
213*8975f5c5SAndroid Build Coastguard Worker }
214*8975f5c5SAndroid Build Coastguard Worker 
isMultiview() const215*8975f5c5SAndroid Build Coastguard Worker bool FramebufferAttachment::isMultiview() const
216*8975f5c5SAndroid Build Coastguard Worker {
217*8975f5c5SAndroid Build Coastguard Worker     return mIsMultiview;
218*8975f5c5SAndroid Build Coastguard Worker }
219*8975f5c5SAndroid Build Coastguard Worker 
getBaseViewIndex() const220*8975f5c5SAndroid Build Coastguard Worker GLint FramebufferAttachment::getBaseViewIndex() const
221*8975f5c5SAndroid Build Coastguard Worker {
222*8975f5c5SAndroid Build Coastguard Worker     return mBaseViewIndex;
223*8975f5c5SAndroid Build Coastguard Worker }
224*8975f5c5SAndroid Build Coastguard Worker 
isRenderToTexture() const225*8975f5c5SAndroid Build Coastguard Worker bool FramebufferAttachment::isRenderToTexture() const
226*8975f5c5SAndroid Build Coastguard Worker {
227*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderToTextureSamples == kDefaultRenderToTextureSamples || mType == GL_TEXTURE);
228*8975f5c5SAndroid Build Coastguard Worker 
229*8975f5c5SAndroid Build Coastguard Worker     if (mType == GL_RENDERBUFFER)
230*8975f5c5SAndroid Build Coastguard Worker     {
231*8975f5c5SAndroid Build Coastguard Worker         return getRenderbuffer()->getMultisamplingMode() ==
232*8975f5c5SAndroid Build Coastguard Worker                MultisamplingMode::MultisampledRenderToTexture;
233*8975f5c5SAndroid Build Coastguard Worker     }
234*8975f5c5SAndroid Build Coastguard Worker     return mRenderToTextureSamples != kDefaultRenderToTextureSamples;
235*8975f5c5SAndroid Build Coastguard Worker }
236*8975f5c5SAndroid Build Coastguard Worker 
getRenderToTextureSamples() const237*8975f5c5SAndroid Build Coastguard Worker GLsizei FramebufferAttachment::getRenderToTextureSamples() const
238*8975f5c5SAndroid Build Coastguard Worker {
239*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderToTextureSamples == kDefaultRenderToTextureSamples || mType == GL_TEXTURE);
240*8975f5c5SAndroid Build Coastguard Worker 
241*8975f5c5SAndroid Build Coastguard Worker     if (mType == GL_RENDERBUFFER)
242*8975f5c5SAndroid Build Coastguard Worker     {
243*8975f5c5SAndroid Build Coastguard Worker         return getRenderbuffer()->getState().getSamples();
244*8975f5c5SAndroid Build Coastguard Worker     }
245*8975f5c5SAndroid Build Coastguard Worker     return mRenderToTextureSamples;
246*8975f5c5SAndroid Build Coastguard Worker }
247*8975f5c5SAndroid Build Coastguard Worker 
getTexture() const248*8975f5c5SAndroid Build Coastguard Worker Texture *FramebufferAttachment::getTexture() const
249*8975f5c5SAndroid Build Coastguard Worker {
250*8975f5c5SAndroid Build Coastguard Worker     return rx::GetAs<Texture>(mResource);
251*8975f5c5SAndroid Build Coastguard Worker }
252*8975f5c5SAndroid Build Coastguard Worker 
getRenderbuffer() const253*8975f5c5SAndroid Build Coastguard Worker Renderbuffer *FramebufferAttachment::getRenderbuffer() const
254*8975f5c5SAndroid Build Coastguard Worker {
255*8975f5c5SAndroid Build Coastguard Worker     return rx::GetAs<Renderbuffer>(mResource);
256*8975f5c5SAndroid Build Coastguard Worker }
257*8975f5c5SAndroid Build Coastguard Worker 
getSurface() const258*8975f5c5SAndroid Build Coastguard Worker const egl::Surface *FramebufferAttachment::getSurface() const
259*8975f5c5SAndroid Build Coastguard Worker {
260*8975f5c5SAndroid Build Coastguard Worker     return rx::GetAs<egl::Surface>(mResource);
261*8975f5c5SAndroid Build Coastguard Worker }
262*8975f5c5SAndroid Build Coastguard Worker 
getResource() const263*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentObject *FramebufferAttachment::getResource() const
264*8975f5c5SAndroid Build Coastguard Worker {
265*8975f5c5SAndroid Build Coastguard Worker     return mResource;
266*8975f5c5SAndroid Build Coastguard Worker }
267*8975f5c5SAndroid Build Coastguard Worker 
operator ==(const FramebufferAttachment & other) const268*8975f5c5SAndroid Build Coastguard Worker bool FramebufferAttachment::operator==(const FramebufferAttachment &other) const
269*8975f5c5SAndroid Build Coastguard Worker {
270*8975f5c5SAndroid Build Coastguard Worker     if (mResource != other.mResource || mType != other.mType || mNumViews != other.mNumViews ||
271*8975f5c5SAndroid Build Coastguard Worker         mIsMultiview != other.mIsMultiview || mBaseViewIndex != other.mBaseViewIndex ||
272*8975f5c5SAndroid Build Coastguard Worker         mRenderToTextureSamples != other.mRenderToTextureSamples)
273*8975f5c5SAndroid Build Coastguard Worker     {
274*8975f5c5SAndroid Build Coastguard Worker         return false;
275*8975f5c5SAndroid Build Coastguard Worker     }
276*8975f5c5SAndroid Build Coastguard Worker 
277*8975f5c5SAndroid Build Coastguard Worker     if (mType == GL_TEXTURE && getTextureImageIndex() != other.getTextureImageIndex())
278*8975f5c5SAndroid Build Coastguard Worker     {
279*8975f5c5SAndroid Build Coastguard Worker         return false;
280*8975f5c5SAndroid Build Coastguard Worker     }
281*8975f5c5SAndroid Build Coastguard Worker 
282*8975f5c5SAndroid Build Coastguard Worker     return true;
283*8975f5c5SAndroid Build Coastguard Worker }
284*8975f5c5SAndroid Build Coastguard Worker 
operator !=(const FramebufferAttachment & other) const285*8975f5c5SAndroid Build Coastguard Worker bool FramebufferAttachment::operator!=(const FramebufferAttachment &other) const
286*8975f5c5SAndroid Build Coastguard Worker {
287*8975f5c5SAndroid Build Coastguard Worker     return !(*this == other);
288*8975f5c5SAndroid Build Coastguard Worker }
289*8975f5c5SAndroid Build Coastguard Worker 
initState() const290*8975f5c5SAndroid Build Coastguard Worker InitState FramebufferAttachment::initState() const
291*8975f5c5SAndroid Build Coastguard Worker {
292*8975f5c5SAndroid Build Coastguard Worker     return mResource ? mResource->initState(mTarget.binding(), mTarget.textureIndex())
293*8975f5c5SAndroid Build Coastguard Worker                      : InitState::Initialized;
294*8975f5c5SAndroid Build Coastguard Worker }
295*8975f5c5SAndroid Build Coastguard Worker 
initializeContents(const Context * context) const296*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferAttachment::initializeContents(const Context *context) const
297*8975f5c5SAndroid Build Coastguard Worker {
298*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mResource);
299*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mResource->initializeContents(context, mTarget.binding(), mTarget.textureIndex()));
300*8975f5c5SAndroid Build Coastguard Worker     setInitState(InitState::Initialized);
301*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
302*8975f5c5SAndroid Build Coastguard Worker }
303*8975f5c5SAndroid Build Coastguard Worker 
setInitState(InitState initState) const304*8975f5c5SAndroid Build Coastguard Worker void FramebufferAttachment::setInitState(InitState initState) const
305*8975f5c5SAndroid Build Coastguard Worker {
306*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mResource);
307*8975f5c5SAndroid Build Coastguard Worker     mResource->setInitState(mTarget.binding(), mTarget.textureIndex(), initState);
308*8975f5c5SAndroid Build Coastguard Worker }
309*8975f5c5SAndroid Build Coastguard Worker 
310*8975f5c5SAndroid Build Coastguard Worker ////// FramebufferAttachmentObject Implementation //////
311*8975f5c5SAndroid Build Coastguard Worker 
FramebufferAttachmentObject()312*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentObject::FramebufferAttachmentObject() {}
313*8975f5c5SAndroid Build Coastguard Worker 
~FramebufferAttachmentObject()314*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentObject::~FramebufferAttachmentObject() {}
315*8975f5c5SAndroid Build Coastguard Worker 
getAttachmentRenderTarget(const Context * context,GLenum binding,const ImageIndex & imageIndex,GLsizei samples,rx::FramebufferAttachmentRenderTarget ** rtOut) const316*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferAttachmentObject::getAttachmentRenderTarget(
317*8975f5c5SAndroid Build Coastguard Worker     const Context *context,
318*8975f5c5SAndroid Build Coastguard Worker     GLenum binding,
319*8975f5c5SAndroid Build Coastguard Worker     const ImageIndex &imageIndex,
320*8975f5c5SAndroid Build Coastguard Worker     GLsizei samples,
321*8975f5c5SAndroid Build Coastguard Worker     rx::FramebufferAttachmentRenderTarget **rtOut) const
322*8975f5c5SAndroid Build Coastguard Worker {
323*8975f5c5SAndroid Build Coastguard Worker     return getAttachmentImpl()->getAttachmentRenderTarget(context, binding, imageIndex, samples,
324*8975f5c5SAndroid Build Coastguard Worker                                                           rtOut);
325*8975f5c5SAndroid Build Coastguard Worker }
326*8975f5c5SAndroid Build Coastguard Worker 
initializeContents(const Context * context,GLenum binding,const ImageIndex & imageIndex)327*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferAttachmentObject::initializeContents(const Context *context,
328*8975f5c5SAndroid Build Coastguard Worker                                                               GLenum binding,
329*8975f5c5SAndroid Build Coastguard Worker                                                               const ImageIndex &imageIndex)
330*8975f5c5SAndroid Build Coastguard Worker {
331*8975f5c5SAndroid Build Coastguard Worker     ASSERT(context->isRobustResourceInitEnabled());
332*8975f5c5SAndroid Build Coastguard Worker 
333*8975f5c5SAndroid Build Coastguard Worker     // Because gl::Texture cannot support tracking individual layer dirtiness, we only handle
334*8975f5c5SAndroid Build Coastguard Worker     // initializing entire mip levels for textures with layers
335*8975f5c5SAndroid Build Coastguard Worker     if (imageIndex.usesTex3D() && imageIndex.hasLayer())
336*8975f5c5SAndroid Build Coastguard Worker     {
337*8975f5c5SAndroid Build Coastguard Worker         // Compute the layer count so we get a correct layer index.
338*8975f5c5SAndroid Build Coastguard Worker         const gl::Extents &size = getAttachmentSize(imageIndex);
339*8975f5c5SAndroid Build Coastguard Worker 
340*8975f5c5SAndroid Build Coastguard Worker         ImageIndex fullMipIndex = ImageIndex::MakeFromType(
341*8975f5c5SAndroid Build Coastguard Worker             imageIndex.getType(), imageIndex.getLevelIndex(), ImageIndex::kEntireLevel, size.depth);
342*8975f5c5SAndroid Build Coastguard Worker         return getAttachmentImpl()->initializeContents(context, binding, fullMipIndex);
343*8975f5c5SAndroid Build Coastguard Worker     }
344*8975f5c5SAndroid Build Coastguard Worker     else
345*8975f5c5SAndroid Build Coastguard Worker     {
346*8975f5c5SAndroid Build Coastguard Worker         return getAttachmentImpl()->initializeContents(context, binding, imageIndex);
347*8975f5c5SAndroid Build Coastguard Worker     }
348*8975f5c5SAndroid Build Coastguard Worker }
349*8975f5c5SAndroid Build Coastguard Worker 
350*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
351