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