xref: /aosp_15_r20/external/deqp/modules/glshared/glsFboUtil.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _GLSFBOUTIL_HPP
2*35238bceSAndroid Build Coastguard Worker #define _GLSFBOUTIL_HPP
3*35238bceSAndroid Build Coastguard Worker 
4*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
5*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL (ES) Module
6*35238bceSAndroid Build Coastguard Worker  * -----------------------------------------------
7*35238bceSAndroid Build Coastguard Worker  *
8*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
9*35238bceSAndroid Build Coastguard Worker  *
10*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
11*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
12*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
13*35238bceSAndroid Build Coastguard Worker  *
14*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
15*35238bceSAndroid Build Coastguard Worker  *
16*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
17*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
18*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
20*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
21*35238bceSAndroid Build Coastguard Worker  *
22*35238bceSAndroid Build Coastguard Worker  *//*!
23*35238bceSAndroid Build Coastguard Worker  * \file
24*35238bceSAndroid Build Coastguard Worker  * \brief Utilities for framebuffer objects.
25*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
26*35238bceSAndroid Build Coastguard Worker 
27*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp"
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker #include <map>
37*35238bceSAndroid Build Coastguard Worker #include <set>
38*35238bceSAndroid Build Coastguard Worker #include <vector>
39*35238bceSAndroid Build Coastguard Worker #include <algorithm>
40*35238bceSAndroid Build Coastguard Worker #include <iterator>
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker namespace deqp
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker namespace gls
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker //! A pair of iterators to present a range.
48*35238bceSAndroid Build Coastguard Worker //! \note This must be POD to allow static initialization.
49*35238bceSAndroid Build Coastguard Worker //! \todo [2013-12-03 lauri] Move this to decpp?
50*35238bceSAndroid Build Coastguard Worker template <typename T>
51*35238bceSAndroid Build Coastguard Worker struct Range
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker     typedef const T *const_iterator;
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker     const T *m_begin;
56*35238bceSAndroid Build Coastguard Worker     const T *m_end;
57*35238bceSAndroid Build Coastguard Worker 
begindeqp::gls::Range58*35238bceSAndroid Build Coastguard Worker     const T *begin(void) const
59*35238bceSAndroid Build Coastguard Worker     {
60*35238bceSAndroid Build Coastguard Worker         return m_begin;
61*35238bceSAndroid Build Coastguard Worker     }
enddeqp::gls::Range62*35238bceSAndroid Build Coastguard Worker     const T *end(void) const
63*35238bceSAndroid Build Coastguard Worker     {
64*35238bceSAndroid Build Coastguard Worker         return m_end;
65*35238bceSAndroid Build Coastguard Worker     }
66*35238bceSAndroid Build Coastguard Worker };
67*35238bceSAndroid Build Coastguard Worker 
68*35238bceSAndroid Build Coastguard Worker #define GLS_ARRAY_RANGE(ARR)                   \
69*35238bceSAndroid Build Coastguard Worker     {                                          \
70*35238bceSAndroid Build Coastguard Worker         DE_ARRAY_BEGIN(ARR), DE_ARRAY_END(ARR) \
71*35238bceSAndroid Build Coastguard Worker     }
72*35238bceSAndroid Build Coastguard Worker 
73*35238bceSAndroid Build Coastguard Worker #define GLS_NULL_RANGE   \
74*35238bceSAndroid Build Coastguard Worker     {                    \
75*35238bceSAndroid Build Coastguard Worker         DE_NULL, DE_NULL \
76*35238bceSAndroid Build Coastguard Worker     }
77*35238bceSAndroid Build Coastguard Worker 
78*35238bceSAndroid Build Coastguard Worker //! A pair type that, unlike stl::pair, is POD so it can be statically initialized.
79*35238bceSAndroid Build Coastguard Worker template <typename T1, typename T2>
80*35238bceSAndroid Build Coastguard Worker struct Pair
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker     typedef T1 first_type;
83*35238bceSAndroid Build Coastguard Worker     typedef T2 second_type;
84*35238bceSAndroid Build Coastguard Worker     T1 first;
85*35238bceSAndroid Build Coastguard Worker     T2 second;
86*35238bceSAndroid Build Coastguard Worker };
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker namespace FboUtil
89*35238bceSAndroid Build Coastguard Worker {
90*35238bceSAndroid Build Coastguard Worker 
91*35238bceSAndroid Build Coastguard Worker //! Configurations for framebuffer objects and their attachments.
92*35238bceSAndroid Build Coastguard Worker 
93*35238bceSAndroid Build Coastguard Worker class FboVerifier;
94*35238bceSAndroid Build Coastguard Worker class FboBuilder;
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker typedef uint32_t FormatKey;
97*35238bceSAndroid Build Coastguard Worker 
98*35238bceSAndroid Build Coastguard Worker #define GLS_UNSIZED_FORMATKEY(FORMAT, TYPE) (uint32_t(TYPE) << 16 | uint32_t(FORMAT))
99*35238bceSAndroid Build Coastguard Worker 
100*35238bceSAndroid Build Coastguard Worker typedef Range<FormatKey> FormatKeys;
101*35238bceSAndroid Build Coastguard Worker 
102*35238bceSAndroid Build Coastguard Worker struct ImageFormat
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker     glw::GLenum format;
105*35238bceSAndroid Build Coastguard Worker 
106*35238bceSAndroid Build Coastguard Worker     //! Type if format is unsized, GL_NONE if sized.
107*35238bceSAndroid Build Coastguard Worker     glw::GLenum unsizedType;
108*35238bceSAndroid Build Coastguard Worker 
operator <deqp::gls::FboUtil::ImageFormat109*35238bceSAndroid Build Coastguard Worker     bool operator<(const ImageFormat &other) const
110*35238bceSAndroid Build Coastguard Worker     {
111*35238bceSAndroid Build Coastguard Worker         return (format < other.format || (format == other.format && unsizedType < other.unsizedType));
112*35238bceSAndroid Build Coastguard Worker     }
113*35238bceSAndroid Build Coastguard Worker 
nonedeqp::gls::FboUtil::ImageFormat114*35238bceSAndroid Build Coastguard Worker     static ImageFormat none(void)
115*35238bceSAndroid Build Coastguard Worker     {
116*35238bceSAndroid Build Coastguard Worker         ImageFormat fmt = {GL_NONE, GL_NONE};
117*35238bceSAndroid Build Coastguard Worker         return fmt;
118*35238bceSAndroid Build Coastguard Worker     }
119*35238bceSAndroid Build Coastguard Worker };
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &stream, const ImageFormat &format);
122*35238bceSAndroid Build Coastguard Worker 
formatKeyInfo(FormatKey key)123*35238bceSAndroid Build Coastguard Worker static inline ImageFormat formatKeyInfo(FormatKey key)
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker     ImageFormat fmt = {key & 0xffff, key >> 16};
126*35238bceSAndroid Build Coastguard Worker     return fmt;
127*35238bceSAndroid Build Coastguard Worker }
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker enum FormatFlags
130*35238bceSAndroid Build Coastguard Worker {
131*35238bceSAndroid Build Coastguard Worker     ANY_FORMAT          = 0,
132*35238bceSAndroid Build Coastguard Worker     COLOR_RENDERABLE    = 1 << 0,
133*35238bceSAndroid Build Coastguard Worker     DEPTH_RENDERABLE    = 1 << 1,
134*35238bceSAndroid Build Coastguard Worker     STENCIL_RENDERABLE  = 1 << 2,
135*35238bceSAndroid Build Coastguard Worker     RENDERBUFFER_VALID  = 1 << 3,
136*35238bceSAndroid Build Coastguard Worker     TEXTURE_VALID       = 1 << 4,
137*35238bceSAndroid Build Coastguard Worker     REQUIRED_RENDERABLE = 1 << 5, //< Without this, renderability is allowed, not required.
138*35238bceSAndroid Build Coastguard Worker };
139*35238bceSAndroid Build Coastguard Worker 
operator |(FormatFlags f1,FormatFlags f2)140*35238bceSAndroid Build Coastguard Worker static inline FormatFlags operator|(FormatFlags f1, FormatFlags f2)
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker     return FormatFlags(uint32_t(f1) | uint32_t(f2));
143*35238bceSAndroid Build Coastguard Worker }
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker FormatFlags formatFlag(glw::GLenum context);
146*35238bceSAndroid Build Coastguard Worker 
147*35238bceSAndroid Build Coastguard Worker typedef std::set<ImageFormat> Formats;
148*35238bceSAndroid Build Coastguard Worker 
149*35238bceSAndroid Build Coastguard Worker class FormatDB
150*35238bceSAndroid Build Coastguard Worker {
151*35238bceSAndroid Build Coastguard Worker public:
152*35238bceSAndroid Build Coastguard Worker     void addCoreFormat(ImageFormat format, FormatFlags flags);
153*35238bceSAndroid Build Coastguard Worker     void addExtensionFormat(ImageFormat format, FormatFlags flags, const std::set<std::string> &requiredExtensions);
154*35238bceSAndroid Build Coastguard Worker 
155*35238bceSAndroid Build Coastguard Worker     Formats getFormats(FormatFlags requirements) const;
156*35238bceSAndroid Build Coastguard Worker     bool isKnownFormat(ImageFormat format) const;
157*35238bceSAndroid Build Coastguard Worker     FormatFlags getFormatInfo(ImageFormat format) const;
158*35238bceSAndroid Build Coastguard Worker     std::set<std::set<std::string>> getFormatFeatureExtensions(ImageFormat format, FormatFlags requirements) const;
159*35238bceSAndroid Build Coastguard Worker 
160*35238bceSAndroid Build Coastguard Worker private:
161*35238bceSAndroid Build Coastguard Worker     struct ExtensionInfo
162*35238bceSAndroid Build Coastguard Worker     {
163*35238bceSAndroid Build Coastguard Worker         FormatFlags flags;
164*35238bceSAndroid Build Coastguard Worker         std::set<std::string> requiredExtensions;
165*35238bceSAndroid Build Coastguard Worker 
166*35238bceSAndroid Build Coastguard Worker         bool operator<(const ExtensionInfo &other) const;
167*35238bceSAndroid Build Coastguard Worker     };
168*35238bceSAndroid Build Coastguard Worker 
169*35238bceSAndroid Build Coastguard Worker     typedef std::map<ImageFormat, FormatFlags> FormatMap;
170*35238bceSAndroid Build Coastguard Worker     typedef std::map<ImageFormat, std::set<ExtensionInfo>> FormatExtensionMap;
171*35238bceSAndroid Build Coastguard Worker 
172*35238bceSAndroid Build Coastguard Worker     FormatMap m_formatFlags;
173*35238bceSAndroid Build Coastguard Worker     FormatExtensionMap m_formatExtensions;
174*35238bceSAndroid Build Coastguard Worker };
175*35238bceSAndroid Build Coastguard Worker 
176*35238bceSAndroid Build Coastguard Worker typedef Pair<FormatFlags, FormatKeys> FormatEntry;
177*35238bceSAndroid Build Coastguard Worker typedef Range<FormatEntry> FormatEntries;
178*35238bceSAndroid Build Coastguard Worker 
179*35238bceSAndroid Build Coastguard Worker // \todo [2013-12-20 lauri] It turns out that format properties in extensions
180*35238bceSAndroid Build Coastguard Worker // are actually far too fine-grained for this bundling to be reasonable,
181*35238bceSAndroid Build Coastguard Worker // especially given the syntactic cumbersomeness of static arrays. It's better
182*35238bceSAndroid Build Coastguard Worker // to list each entry separately.
183*35238bceSAndroid Build Coastguard Worker 
184*35238bceSAndroid Build Coastguard Worker struct FormatExtEntry
185*35238bceSAndroid Build Coastguard Worker {
186*35238bceSAndroid Build Coastguard Worker     const char *extensions;
187*35238bceSAndroid Build Coastguard Worker     uint32_t flags;
188*35238bceSAndroid Build Coastguard Worker     Range<FormatKey> formats;
189*35238bceSAndroid Build Coastguard Worker };
190*35238bceSAndroid Build Coastguard Worker 
191*35238bceSAndroid Build Coastguard Worker typedef Range<FormatExtEntry> FormatExtEntries;
192*35238bceSAndroid Build Coastguard Worker 
193*35238bceSAndroid Build Coastguard Worker // Check support for GL_* and DEQP_* extensions
194*35238bceSAndroid Build Coastguard Worker bool checkExtensionSupport(const glu::RenderContext &ctx, const std::string &extension);
195*35238bceSAndroid Build Coastguard Worker 
196*35238bceSAndroid Build Coastguard Worker // Accepts GL_* and DEQP_* extension strings and converts DEQP_* strings to a human readable string
197*35238bceSAndroid Build Coastguard Worker std::string getExtensionDescription(const std::string &extensionName);
198*35238bceSAndroid Build Coastguard Worker 
199*35238bceSAndroid Build Coastguard Worker void addFormats(FormatDB &db, FormatEntries stdFmts);
200*35238bceSAndroid Build Coastguard Worker void addExtFormats(FormatDB &db, FormatExtEntries extFmts, const glu::RenderContext *ctx);
201*35238bceSAndroid Build Coastguard Worker glu::TransferFormat transferImageFormat(const ImageFormat &imgFormat);
202*35238bceSAndroid Build Coastguard Worker 
203*35238bceSAndroid Build Coastguard Worker namespace config
204*35238bceSAndroid Build Coastguard Worker {
205*35238bceSAndroid Build Coastguard Worker 
206*35238bceSAndroid Build Coastguard Worker struct Config
207*35238bceSAndroid Build Coastguard Worker {
~Configdeqp::gls::FboUtil::config::Config208*35238bceSAndroid Build Coastguard Worker     virtual ~Config(void)
209*35238bceSAndroid Build Coastguard Worker     {
210*35238bceSAndroid Build Coastguard Worker     }
211*35238bceSAndroid Build Coastguard Worker };
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker struct Image : public Config
214*35238bceSAndroid Build Coastguard Worker {
215*35238bceSAndroid Build Coastguard Worker     ImageFormat internalFormat;
216*35238bceSAndroid Build Coastguard Worker     glw::GLsizei width;
217*35238bceSAndroid Build Coastguard Worker     glw::GLsizei height;
218*35238bceSAndroid Build Coastguard Worker 
219*35238bceSAndroid Build Coastguard Worker protected:
Imagedeqp::gls::FboUtil::config::Image220*35238bceSAndroid Build Coastguard Worker     Image(void) : internalFormat(ImageFormat::none()), width(0), height(0)
221*35238bceSAndroid Build Coastguard Worker     {
222*35238bceSAndroid Build Coastguard Worker     }
223*35238bceSAndroid Build Coastguard Worker };
224*35238bceSAndroid Build Coastguard Worker 
225*35238bceSAndroid Build Coastguard Worker struct Renderbuffer : public Image
226*35238bceSAndroid Build Coastguard Worker {
Renderbufferdeqp::gls::FboUtil::config::Renderbuffer227*35238bceSAndroid Build Coastguard Worker     Renderbuffer(void) : numSamples(0)
228*35238bceSAndroid Build Coastguard Worker     {
229*35238bceSAndroid Build Coastguard Worker     }
230*35238bceSAndroid Build Coastguard Worker 
231*35238bceSAndroid Build Coastguard Worker     glw::GLsizei numSamples;
232*35238bceSAndroid Build Coastguard Worker };
233*35238bceSAndroid Build Coastguard Worker 
234*35238bceSAndroid Build Coastguard Worker struct Texture : public Image
235*35238bceSAndroid Build Coastguard Worker {
Texturedeqp::gls::FboUtil::config::Texture236*35238bceSAndroid Build Coastguard Worker     Texture(void) : numLevels(1)
237*35238bceSAndroid Build Coastguard Worker     {
238*35238bceSAndroid Build Coastguard Worker     }
239*35238bceSAndroid Build Coastguard Worker 
240*35238bceSAndroid Build Coastguard Worker     glw::GLint numLevels;
241*35238bceSAndroid Build Coastguard Worker };
242*35238bceSAndroid Build Coastguard Worker 
243*35238bceSAndroid Build Coastguard Worker struct TextureFlat : public Texture
244*35238bceSAndroid Build Coastguard Worker {
245*35238bceSAndroid Build Coastguard Worker };
246*35238bceSAndroid Build Coastguard Worker 
247*35238bceSAndroid Build Coastguard Worker struct Texture2D : public TextureFlat
248*35238bceSAndroid Build Coastguard Worker {
249*35238bceSAndroid Build Coastguard Worker };
250*35238bceSAndroid Build Coastguard Worker 
251*35238bceSAndroid Build Coastguard Worker struct TextureCubeMap : public TextureFlat
252*35238bceSAndroid Build Coastguard Worker {
253*35238bceSAndroid Build Coastguard Worker };
254*35238bceSAndroid Build Coastguard Worker 
255*35238bceSAndroid Build Coastguard Worker struct TextureLayered : public Texture
256*35238bceSAndroid Build Coastguard Worker {
TextureLayereddeqp::gls::FboUtil::config::TextureLayered257*35238bceSAndroid Build Coastguard Worker     TextureLayered(void) : numLayers(1)
258*35238bceSAndroid Build Coastguard Worker     {
259*35238bceSAndroid Build Coastguard Worker     }
260*35238bceSAndroid Build Coastguard Worker     glw::GLsizei numLayers;
261*35238bceSAndroid Build Coastguard Worker };
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker struct Texture3D : public TextureLayered
264*35238bceSAndroid Build Coastguard Worker {
265*35238bceSAndroid Build Coastguard Worker };
266*35238bceSAndroid Build Coastguard Worker 
267*35238bceSAndroid Build Coastguard Worker struct Texture2DArray : public TextureLayered
268*35238bceSAndroid Build Coastguard Worker {
269*35238bceSAndroid Build Coastguard Worker };
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker struct Attachment : public Config
272*35238bceSAndroid Build Coastguard Worker {
Attachmentdeqp::gls::FboUtil::config::Attachment273*35238bceSAndroid Build Coastguard Worker     Attachment(void) : target(GL_FRAMEBUFFER), imageName(0)
274*35238bceSAndroid Build Coastguard Worker     {
275*35238bceSAndroid Build Coastguard Worker     }
276*35238bceSAndroid Build Coastguard Worker 
277*35238bceSAndroid Build Coastguard Worker     glw::GLenum target;
278*35238bceSAndroid Build Coastguard Worker     glw::GLuint imageName;
279*35238bceSAndroid Build Coastguard Worker 
280*35238bceSAndroid Build Coastguard Worker     //! Returns `true` iff this attachment is "framebuffer attachment
281*35238bceSAndroid Build Coastguard Worker     //! complete" when bound to attachment point `attPoint`, and the current
282*35238bceSAndroid Build Coastguard Worker     //! image with name `imageName` is `image`, using `vfr` to check format
283*35238bceSAndroid Build Coastguard Worker     //! renderability.
284*35238bceSAndroid Build Coastguard Worker     bool isComplete(glw::GLenum attPoint, const Image *image, const FboVerifier &vfr) const;
285*35238bceSAndroid Build Coastguard Worker };
286*35238bceSAndroid Build Coastguard Worker 
287*35238bceSAndroid Build Coastguard Worker struct RenderbufferAttachment : public Attachment
288*35238bceSAndroid Build Coastguard Worker {
RenderbufferAttachmentdeqp::gls::FboUtil::config::RenderbufferAttachment289*35238bceSAndroid Build Coastguard Worker     RenderbufferAttachment(void) : renderbufferTarget(GL_RENDERBUFFER)
290*35238bceSAndroid Build Coastguard Worker     {
291*35238bceSAndroid Build Coastguard Worker     }
292*35238bceSAndroid Build Coastguard Worker 
293*35238bceSAndroid Build Coastguard Worker     glw::GLenum renderbufferTarget;
294*35238bceSAndroid Build Coastguard Worker };
295*35238bceSAndroid Build Coastguard Worker 
296*35238bceSAndroid Build Coastguard Worker struct TextureAttachment : public Attachment
297*35238bceSAndroid Build Coastguard Worker {
TextureAttachmentdeqp::gls::FboUtil::config::TextureAttachment298*35238bceSAndroid Build Coastguard Worker     TextureAttachment(void) : level(0)
299*35238bceSAndroid Build Coastguard Worker     {
300*35238bceSAndroid Build Coastguard Worker     }
301*35238bceSAndroid Build Coastguard Worker 
302*35238bceSAndroid Build Coastguard Worker     glw::GLint level;
303*35238bceSAndroid Build Coastguard Worker };
304*35238bceSAndroid Build Coastguard Worker 
305*35238bceSAndroid Build Coastguard Worker struct TextureFlatAttachment : public TextureAttachment
306*35238bceSAndroid Build Coastguard Worker {
TextureFlatAttachmentdeqp::gls::FboUtil::config::TextureFlatAttachment307*35238bceSAndroid Build Coastguard Worker     TextureFlatAttachment(void) : texTarget(GL_NONE)
308*35238bceSAndroid Build Coastguard Worker     {
309*35238bceSAndroid Build Coastguard Worker     }
310*35238bceSAndroid Build Coastguard Worker 
311*35238bceSAndroid Build Coastguard Worker     glw::GLenum texTarget;
312*35238bceSAndroid Build Coastguard Worker };
313*35238bceSAndroid Build Coastguard Worker 
314*35238bceSAndroid Build Coastguard Worker struct TextureLayerAttachment : public TextureAttachment
315*35238bceSAndroid Build Coastguard Worker {
TextureLayerAttachmentdeqp::gls::FboUtil::config::TextureLayerAttachment316*35238bceSAndroid Build Coastguard Worker     TextureLayerAttachment(void) : layer(0)
317*35238bceSAndroid Build Coastguard Worker     {
318*35238bceSAndroid Build Coastguard Worker     }
319*35238bceSAndroid Build Coastguard Worker 
320*35238bceSAndroid Build Coastguard Worker     glw::GLsizei layer;
321*35238bceSAndroid Build Coastguard Worker };
322*35238bceSAndroid Build Coastguard Worker 
323*35238bceSAndroid Build Coastguard Worker glw::GLenum attachmentType(const Attachment &att);
324*35238bceSAndroid Build Coastguard Worker glw::GLsizei imageNumSamples(const Image &img);
325*35238bceSAndroid Build Coastguard Worker 
326*35238bceSAndroid Build Coastguard Worker //! Mapping from attachment points to attachment configurations.
327*35238bceSAndroid Build Coastguard Worker typedef std::map<glw::GLenum, const Attachment *> AttachmentMap;
328*35238bceSAndroid Build Coastguard Worker 
329*35238bceSAndroid Build Coastguard Worker //! Mapping from object names to texture configurations.
330*35238bceSAndroid Build Coastguard Worker typedef std::map<glw::GLuint, const Texture *> TextureMap;
331*35238bceSAndroid Build Coastguard Worker 
332*35238bceSAndroid Build Coastguard Worker //! Mapping from object names to renderbuffer configurations.
333*35238bceSAndroid Build Coastguard Worker typedef std::map<glw::GLuint, const Renderbuffer *> RboMap;
334*35238bceSAndroid Build Coastguard Worker 
335*35238bceSAndroid Build Coastguard Worker //! A framebuffer configuration.
336*35238bceSAndroid Build Coastguard Worker struct Framebuffer
337*35238bceSAndroid Build Coastguard Worker {
338*35238bceSAndroid Build Coastguard Worker     AttachmentMap attachments;
339*35238bceSAndroid Build Coastguard Worker     TextureMap textures;
340*35238bceSAndroid Build Coastguard Worker     RboMap rbos;
341*35238bceSAndroid Build Coastguard Worker 
342*35238bceSAndroid Build Coastguard Worker     void attach(glw::GLenum attPoint, const Attachment *att);
343*35238bceSAndroid Build Coastguard Worker     void setTexture(glw::GLuint texName, const Texture &texCfg);
344*35238bceSAndroid Build Coastguard Worker     void setRbo(glw::GLuint rbName, const Renderbuffer &rbCfg);
345*35238bceSAndroid Build Coastguard Worker     const Image *getImage(glw::GLenum type, glw::GLuint imgName) const;
346*35238bceSAndroid Build Coastguard Worker };
347*35238bceSAndroid Build Coastguard Worker 
348*35238bceSAndroid Build Coastguard Worker } // namespace config
349*35238bceSAndroid Build Coastguard Worker 
350*35238bceSAndroid Build Coastguard Worker class FboBuilder : public config::Framebuffer
351*35238bceSAndroid Build Coastguard Worker {
352*35238bceSAndroid Build Coastguard Worker public:
353*35238bceSAndroid Build Coastguard Worker     void glAttach(glw::GLenum attPoint, const config::Attachment *att);
354*35238bceSAndroid Build Coastguard Worker     glw::GLuint glCreateTexture(const config::Texture &texCfg);
355*35238bceSAndroid Build Coastguard Worker     glw::GLuint glCreateRbo(const config::Renderbuffer &rbCfg);
356*35238bceSAndroid Build Coastguard Worker     FboBuilder(glw::GLuint fbo, glw::GLenum target, const glw::Functions &gl);
357*35238bceSAndroid Build Coastguard Worker     ~FboBuilder(void);
getError(void)358*35238bceSAndroid Build Coastguard Worker     glw::GLenum getError(void)
359*35238bceSAndroid Build Coastguard Worker     {
360*35238bceSAndroid Build Coastguard Worker         return m_error;
361*35238bceSAndroid Build Coastguard Worker     }
362*35238bceSAndroid Build Coastguard Worker 
363*35238bceSAndroid Build Coastguard Worker     //! Allocate a new configuration of type `Config` (which must be a
364*35238bceSAndroid Build Coastguard Worker     //! subclass of `config::Config`), and return a referenc to it. The newly
365*35238bceSAndroid Build Coastguard Worker     //! allocated object will be freed when this builder object is destroyed.
366*35238bceSAndroid Build Coastguard Worker     template <typename Config>
makeConfig(void)367*35238bceSAndroid Build Coastguard Worker     Config &makeConfig(void)
368*35238bceSAndroid Build Coastguard Worker     {
369*35238bceSAndroid Build Coastguard Worker         Config *cfg = new Config();
370*35238bceSAndroid Build Coastguard Worker         m_configs.insert(cfg);
371*35238bceSAndroid Build Coastguard Worker         return *cfg;
372*35238bceSAndroid Build Coastguard Worker     }
373*35238bceSAndroid Build Coastguard Worker 
374*35238bceSAndroid Build Coastguard Worker private:
375*35238bceSAndroid Build Coastguard Worker     typedef std::set<config::Config *> Configs;
376*35238bceSAndroid Build Coastguard Worker 
377*35238bceSAndroid Build Coastguard Worker     void checkError(void);
378*35238bceSAndroid Build Coastguard Worker 
379*35238bceSAndroid Build Coastguard Worker     glw::GLenum m_error; //< The first GL error encountered.
380*35238bceSAndroid Build Coastguard Worker     glw::GLenum m_target;
381*35238bceSAndroid Build Coastguard Worker     const glw::Functions &m_gl;
382*35238bceSAndroid Build Coastguard Worker     Configs m_configs;
383*35238bceSAndroid Build Coastguard Worker };
384*35238bceSAndroid Build Coastguard Worker 
385*35238bceSAndroid Build Coastguard Worker struct ValidStatusCodes
386*35238bceSAndroid Build Coastguard Worker {
387*35238bceSAndroid Build Coastguard Worker     ValidStatusCodes(void);
388*35238bceSAndroid Build Coastguard Worker 
389*35238bceSAndroid Build Coastguard Worker     bool isFBOStatusValid(glw::GLenum fboStatus) const;
390*35238bceSAndroid Build Coastguard Worker     bool isFBOStatusRequired(glw::GLenum fboStatus) const;
391*35238bceSAndroid Build Coastguard Worker     bool isErrorCodeValid(glw::GLenum errorCode) const;
392*35238bceSAndroid Build Coastguard Worker     bool isErrorCodeRequired(glw::GLenum errorCode) const;
393*35238bceSAndroid Build Coastguard Worker 
394*35238bceSAndroid Build Coastguard Worker     void addErrorCode(glw::GLenum error, const char *description);
395*35238bceSAndroid Build Coastguard Worker     void addFBOErrorStatus(glw::GLenum status, const char *description);
396*35238bceSAndroid Build Coastguard Worker     void setAllowComplete(bool);
397*35238bceSAndroid Build Coastguard Worker 
398*35238bceSAndroid Build Coastguard Worker     void logLegalResults(tcu::TestLog &log) const;
399*35238bceSAndroid Build Coastguard Worker     void logRules(tcu::TestLog &log) const;
400*35238bceSAndroid Build Coastguard Worker 
401*35238bceSAndroid Build Coastguard Worker private:
402*35238bceSAndroid Build Coastguard Worker     struct RuleViolation
403*35238bceSAndroid Build Coastguard Worker     {
404*35238bceSAndroid Build Coastguard Worker         glw::GLenum errorCode;
405*35238bceSAndroid Build Coastguard Worker         std::set<std::string> rules;
406*35238bceSAndroid Build Coastguard Worker     };
407*35238bceSAndroid Build Coastguard Worker 
408*35238bceSAndroid Build Coastguard Worker     void logRule(tcu::TestLog &log, const std::string &ruleName, const std::set<std::string> &rules) const;
409*35238bceSAndroid Build Coastguard Worker     void addViolation(std::vector<RuleViolation> &dst, glw::GLenum code, const char *description) const;
410*35238bceSAndroid Build Coastguard Worker 
411*35238bceSAndroid Build Coastguard Worker     std::vector<RuleViolation> m_errorCodes;    //!< Allowed GL errors, GL_NO_ERROR is not allowed
412*35238bceSAndroid Build Coastguard Worker     std::vector<RuleViolation> m_errorStatuses; //!< Allowed FBO error statuses, GL_FRAMEBUFFER_COMPLETE is not allowed
413*35238bceSAndroid Build Coastguard Worker     bool m_allowComplete;                       //!< true if (GL_NO_ERROR && GL_FRAMEBUFFER_COMPLETE) is allowed
414*35238bceSAndroid Build Coastguard Worker };
415*35238bceSAndroid Build Coastguard Worker 
416*35238bceSAndroid Build Coastguard Worker void logFramebufferConfig(const config::Framebuffer &cfg, tcu::TestLog &log);
417*35238bceSAndroid Build Coastguard Worker 
418*35238bceSAndroid Build Coastguard Worker class Checker
419*35238bceSAndroid Build Coastguard Worker {
420*35238bceSAndroid Build Coastguard Worker public:
421*35238bceSAndroid Build Coastguard Worker     Checker(const glu::RenderContext &, const FormatDB &);
~Checker(void)422*35238bceSAndroid Build Coastguard Worker     virtual ~Checker(void)
423*35238bceSAndroid Build Coastguard Worker     {
424*35238bceSAndroid Build Coastguard Worker     }
425*35238bceSAndroid Build Coastguard Worker 
426*35238bceSAndroid Build Coastguard Worker     void addGLError(glw::GLenum error, const char *description);
427*35238bceSAndroid Build Coastguard Worker     void addPotentialGLError(glw::GLenum error, const char *description);
428*35238bceSAndroid Build Coastguard Worker     void addFBOStatus(glw::GLenum status, const char *description);
429*35238bceSAndroid Build Coastguard Worker     void addPotentialFBOStatus(glw::GLenum status, const char *description);
430*35238bceSAndroid Build Coastguard Worker 
getStatusCodes(void)431*35238bceSAndroid Build Coastguard Worker     ValidStatusCodes getStatusCodes(void)
432*35238bceSAndroid Build Coastguard Worker     {
433*35238bceSAndroid Build Coastguard Worker         return m_statusCodes;
434*35238bceSAndroid Build Coastguard Worker     }
435*35238bceSAndroid Build Coastguard Worker 
436*35238bceSAndroid Build Coastguard Worker     virtual void check(glw::GLenum attPoint, const config::Attachment &att, const config::Image *image) = 0;
437*35238bceSAndroid Build Coastguard Worker 
438*35238bceSAndroid Build Coastguard Worker protected:
439*35238bceSAndroid Build Coastguard Worker     const glu::RenderContext &m_renderCtx;
440*35238bceSAndroid Build Coastguard Worker     const FormatDB &m_formats;
441*35238bceSAndroid Build Coastguard Worker 
442*35238bceSAndroid Build Coastguard Worker private:
443*35238bceSAndroid Build Coastguard Worker     ValidStatusCodes m_statusCodes; //< Allowed return values for glCheckFramebufferStatus.
444*35238bceSAndroid Build Coastguard Worker };
445*35238bceSAndroid Build Coastguard Worker 
446*35238bceSAndroid Build Coastguard Worker class CheckerFactory
447*35238bceSAndroid Build Coastguard Worker {
448*35238bceSAndroid Build Coastguard Worker public:
449*35238bceSAndroid Build Coastguard Worker     virtual Checker *createChecker(const glu::RenderContext &, const FormatDB &) = 0;
450*35238bceSAndroid Build Coastguard Worker };
451*35238bceSAndroid Build Coastguard Worker 
452*35238bceSAndroid Build Coastguard Worker typedef std::set<glw::GLenum> AttachmentPoints;
453*35238bceSAndroid Build Coastguard Worker typedef std::set<ImageFormat> Formats;
454*35238bceSAndroid Build Coastguard Worker 
455*35238bceSAndroid Build Coastguard Worker class FboVerifier
456*35238bceSAndroid Build Coastguard Worker {
457*35238bceSAndroid Build Coastguard Worker public:
458*35238bceSAndroid Build Coastguard Worker     FboVerifier(const FormatDB &formats, CheckerFactory &factory, const glu::RenderContext &renderCtx);
459*35238bceSAndroid Build Coastguard Worker 
460*35238bceSAndroid Build Coastguard Worker     ValidStatusCodes validStatusCodes(const config::Framebuffer &cfg) const;
461*35238bceSAndroid Build Coastguard Worker 
462*35238bceSAndroid Build Coastguard Worker private:
463*35238bceSAndroid Build Coastguard Worker     const FormatDB &m_formats;
464*35238bceSAndroid Build Coastguard Worker     CheckerFactory &m_factory;
465*35238bceSAndroid Build Coastguard Worker     const glu::RenderContext &m_renderCtx;
466*35238bceSAndroid Build Coastguard Worker };
467*35238bceSAndroid Build Coastguard Worker 
468*35238bceSAndroid Build Coastguard Worker } // namespace FboUtil
469*35238bceSAndroid Build Coastguard Worker } // namespace gls
470*35238bceSAndroid Build Coastguard Worker } // namespace deqp
471*35238bceSAndroid Build Coastguard Worker 
472*35238bceSAndroid Build Coastguard Worker #endif // _GLSFBOUTIL_HPP
473