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