Merge "Merge "DEPTH_STENCIL_OES as tex format requires OES_depth_texture" into nougat...
[platform/upstream/VK-GL-CTS.git] / framework / opengl / simplereference / sglrReferenceContext.hpp
1 #ifndef _SGLRREFERENCECONTEXT_HPP
2 #define _SGLRREFERENCECONTEXT_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program OpenGL ES Utilities
5  * ------------------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief Reference Rendering Context.
24  *//*--------------------------------------------------------------------*/
25
26 #include "tcuDefs.hpp"
27 #include "sglrContext.hpp"
28 #include "tcuPixelFormat.hpp"
29 #include "tcuSurface.hpp"
30 #include "tcuTexture.hpp"
31 #include "tcuVector.hpp"
32 #include "rrFragmentOperations.hpp"
33 #include "rrRenderState.hpp"
34 #include "rrRenderer.hpp"
35 #include "rrMultisamplePixelBufferAccess.hpp"
36 #include "gluRenderContext.hpp"
37 #include "gluShaderUtil.hpp"
38 #include "deArrayBuffer.hpp"
39
40 #include <map>
41 #include <vector>
42
43 namespace sglr
44 {
45 namespace rc
46 {
47
48 enum
49 {
50         MAX_TEXTURE_SIZE_LOG2           = 14,
51         MAX_TEXTURE_SIZE                        = 1<<MAX_TEXTURE_SIZE_LOG2
52 };
53
54 class NamedObject
55 {
56 public:
57         virtual                 ~NamedObject            (void) {}
58
59         deUint32                getName                         (void) const    { return m_name;                                                                }
60
61         int                             getRefCount                     (void) const    { return m_refCount;                                                    }
62         void                    incRefCount                     (void)                  { m_refCount += 1;                                                              }
63         void                    decRefCount                     (void)                  { DE_ASSERT(m_refCount > 0); m_refCount -= 1;   }
64
65 protected:
66                                         NamedObject                     (deUint32 name) : m_name(name), m_refCount(1) {}
67
68 private:
69         deUint32                m_name;
70         int                             m_refCount;
71 };
72
73 class Texture : public NamedObject
74 {
75 public:
76         enum Type
77         {
78                 TYPE_1D,
79                 TYPE_2D,
80                 TYPE_CUBE_MAP,
81                 TYPE_2D_ARRAY,
82                 TYPE_3D,
83                 TYPE_CUBE_MAP_ARRAY,
84
85                 TYPE_LAST
86         };
87
88                                                                 Texture                 (deUint32 name, Type type);
89         virtual                                         ~Texture                (void) {}
90
91         Type                                            getType                 (void) const    { return m_type;                        }
92
93         int                                                     getBaseLevel    (void) const    { return m_baseLevel;           }
94         int                                                     getMaxLevel             (void) const    { return m_maxLevel;            }
95         bool                                            isImmutable             (void) const    { return m_immutable;           }
96
97         void                                            setBaseLevel    (int baseLevel) { m_baseLevel = baseLevel;      }
98         void                                            setMaxLevel             (int maxLevel)  { m_maxLevel = maxLevel;        }
99         void                                            setImmutable    (void)                  { m_immutable = true;           }
100
101         const tcu::Sampler&                     getSampler              (void) const    { return m_sampler;                     }
102         tcu::Sampler&                           getSampler              (void)                  { return m_sampler;                     }
103
104 private:
105         Type                                            m_type;
106
107         bool                                            m_immutable;
108
109         tcu::Sampler                            m_sampler;
110         int                                                     m_baseLevel;
111         int                                                     m_maxLevel;
112 };
113
114 //! Class for managing list of texture levels.
115 class TextureLevelArray
116 {
117 public:
118                                                                                 TextureLevelArray       (void);
119                                                                                 ~TextureLevelArray      (void);
120
121         bool                                                            hasLevel                        (int level) const       { return deInBounds32(level, 0, DE_LENGTH_OF_ARRAY(m_data)) && !m_data[level].empty();  }
122         const tcu::PixelBufferAccess&           getLevel                        (int level)                     { DE_ASSERT(hasLevel(level)); return m_access[level];                                                                   }
123         const tcu::ConstPixelBufferAccess&      getLevel                        (int level) const       { DE_ASSERT(hasLevel(level)); return m_access[level];                                                                   }
124
125         const tcu::ConstPixelBufferAccess*      getLevels                       (void) const            { return &m_access[0];                                                                                                                                  }
126         const tcu::ConstPixelBufferAccess*      getEffectiveLevels      (void) const            { return &m_effectiveAccess[0];                                                                                                                 }
127
128         void                                                            allocLevel                      (int level, const tcu::TextureFormat& format, int width, int height, int depth);
129         void                                                            clearLevel                      (int level);
130
131         void                                                            clear                           (void);
132
133         void                                                            updateSamplerMode       (tcu::Sampler::DepthStencilMode);
134
135 private:
136         de::ArrayBuffer<deUint8>                        m_data[MAX_TEXTURE_SIZE_LOG2];
137         tcu::PixelBufferAccess                          m_access[MAX_TEXTURE_SIZE_LOG2];
138         tcu::ConstPixelBufferAccess                     m_effectiveAccess[MAX_TEXTURE_SIZE_LOG2];       //!< the currently effective sampling mode. For Depth-stencil texture always either Depth or stencil.
139 };
140
141 class Texture1D : public Texture
142 {
143 public:
144                                                                                 Texture1D               (deUint32 name = 0);
145         virtual                                                         ~Texture1D              (void);
146
147         void                                                            clearLevels             (void) { m_levels.clear(); }
148
149         bool                                                            hasLevel                (int level) const       { return m_levels.hasLevel(level);      }
150         const tcu::ConstPixelBufferAccess&      getLevel                (int level) const       { return m_levels.getLevel(level);      }
151         const tcu::PixelBufferAccess&           getLevel                (int level)                     { return m_levels.getLevel(level);      }
152
153         void                                                            allocLevel              (int level, const tcu::TextureFormat& format, int width);
154
155         bool                                                            isComplete              (void) const;
156
157         void                                                            updateView              (tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()
158
159         tcu::Vec4                                                       sample                  (float s, float lod) const;
160         void                                                            sample4                 (tcu::Vec4 output[4], const float packetTexcoords[4], float lodBias = 0.0f) const;
161
162 private:
163         TextureLevelArray                                       m_levels;
164         tcu::Texture2DView                                      m_view;
165 };
166
167 class Texture2D : public Texture
168 {
169 public:
170                                                                                 Texture2D               (deUint32 name = 0);
171         virtual                                                         ~Texture2D              (void);
172
173         void                                                            clearLevels             (void) { m_levels.clear(); }
174
175         bool                                                            hasLevel                (int level) const       { return m_levels.hasLevel(level);      }
176         const tcu::ConstPixelBufferAccess&      getLevel                (int level) const       { return m_levels.getLevel(level);      }
177         const tcu::PixelBufferAccess&           getLevel                (int level)                     { return m_levels.getLevel(level);      }
178
179         void                                                            allocLevel              (int level, const tcu::TextureFormat& format, int width, int height);
180
181         bool                                                            isComplete              (void) const;
182
183         void                                                            updateView              (tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()
184
185         tcu::Vec4                                                       sample                  (float s, float t, float lod) const;
186         void                                                            sample4                 (tcu::Vec4 output[4], const tcu::Vec2 packetTexcoords[4], float lodBias = 0.0f) const;
187
188 private:
189         TextureLevelArray                                       m_levels;
190         tcu::Texture2DView                                      m_view;
191 };
192
193 class TextureCube : public Texture
194 {
195 public:
196                                                                                 TextureCube             (deUint32 name = 0);
197         virtual                                                         ~TextureCube    (void);
198
199         void                                                            clearLevels             (void);
200
201         bool                                                            hasFace                 (int level, tcu::CubeFace face) const   { return m_levels[face].hasLevel(level);        }
202         const tcu::PixelBufferAccess&           getFace                 (int level, tcu::CubeFace face)                 { return m_levels[face].getLevel(level);        }
203         const tcu::ConstPixelBufferAccess&      getFace                 (int level, tcu::CubeFace face) const   { return m_levels[face].getLevel(level);        }
204
205         void                                                            allocFace               (int level, tcu::CubeFace face, const tcu::TextureFormat& format, int width, int height);
206
207         bool                                                            isComplete              (void) const;
208         void                                                            updateView              (tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()
209
210         tcu::Vec4                                                       sample                  (float s, float t, float p, float lod) const;
211         void                                                            sample4                 (tcu::Vec4 output[4], const tcu::Vec3 packetTexcoords[4], float lodBias = 0.0f) const;
212
213 private:
214         TextureLevelArray                                       m_levels[tcu::CUBEFACE_LAST];
215         tcu::TextureCubeView                            m_view;
216 };
217
218 class Texture2DArray : public Texture
219 {
220 public:
221                                                                                 Texture2DArray  (deUint32 name = 0);
222         virtual                                                         ~Texture2DArray (void);
223
224         void                                                            clearLevels             (void) { m_levels.clear(); }
225
226         bool                                                            hasLevel                (int level) const       { return m_levels.hasLevel(level);      }
227         const tcu::ConstPixelBufferAccess&      getLevel                (int level) const       { return m_levels.getLevel(level);      }
228         const tcu::PixelBufferAccess&           getLevel                (int level)                     { return m_levels.getLevel(level);      }
229
230         void                                                            allocLevel              (int level, const tcu::TextureFormat& format, int width, int height, int numLayers);
231
232         bool                                                            isComplete              (void) const;
233
234         void                                                            updateView              (tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()
235
236         tcu::Vec4                                                       sample                  (float s, float t, float r, float lod) const;
237         void                                                            sample4                 (tcu::Vec4 output[4], const tcu::Vec3 packetTexcoords[4], float lodBias = 0.0f) const;
238
239 private:
240         TextureLevelArray                                       m_levels;
241         tcu::Texture2DArrayView                         m_view;
242 };
243
244 class Texture3D : public Texture
245 {
246 public:
247                                                                                 Texture3D               (deUint32 name = 0);
248         virtual                                                         ~Texture3D              (void);
249
250         void                                                            clearLevels             (void) { m_levels.clear(); }
251
252         bool                                                            hasLevel                (int level) const       { return m_levels.hasLevel(level);      }
253         const tcu::ConstPixelBufferAccess&      getLevel                (int level) const       { return m_levels.getLevel(level);      }
254         const tcu::PixelBufferAccess&           getLevel                (int level)                     { return m_levels.getLevel(level);      }
255
256         void                                                            allocLevel              (int level, const tcu::TextureFormat& format, int width, int height, int numLayers);
257
258         bool                                                            isComplete              (void) const;
259
260         void                                                            updateView              (tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()
261
262         tcu::Vec4                                                       sample                  (float s, float t, float r, float lod) const;
263         void                                                            sample4                 (tcu::Vec4 output[4], const tcu::Vec3 packetTexcoords[4], float lodBias = 0.0f) const;
264
265 private:
266         TextureLevelArray                                       m_levels;
267         tcu::Texture3DView                                      m_view;
268 };
269
270 class TextureCubeArray : public Texture
271 {
272 public:
273                                                                                 TextureCubeArray        (deUint32 name = 0);
274         virtual                                                         ~TextureCubeArray       (void);
275
276         void                                                            clearLevels                     (void) { m_levels.clear(); }
277
278         bool                                                            hasLevel                        (int level) const       { return m_levels.hasLevel(level);      }
279         const tcu::ConstPixelBufferAccess&      getLevel                        (int level) const       { return m_levels.getLevel(level);      }
280         const tcu::PixelBufferAccess&           getLevel                        (int level)                     { return m_levels.getLevel(level);      }
281
282         void                                                            allocLevel                      (int level, const tcu::TextureFormat& format, int width, int height, int numLayers);
283
284         bool                                                            isComplete                      (void) const;
285
286         void                                                            updateView                      (tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()
287
288         tcu::Vec4                                                       sample                          (float s, float t, float r, float q, float lod) const;
289         void                                                            sample4                         (tcu::Vec4 output[4], const tcu::Vec4 packetTexcoords[4], float lodBias = 0.0f) const;
290
291 private:
292         TextureLevelArray                                       m_levels;
293         tcu::TextureCubeArrayView                       m_view;
294 };
295
296 class Renderbuffer : public NamedObject
297 {
298 public:
299         enum Format
300         {
301                 FORMAT_DEPTH_COMPONENT16,
302                 FORMAT_RGBA4,
303                 FORMAT_RGB5_A1,
304                 FORMAT_RGB565,
305                 FORMAT_STENCIL_INDEX8,
306
307                 FORMAT_LAST
308         };
309
310                                                                 Renderbuffer            (deUint32 name);
311         virtual                                         ~Renderbuffer           (void);
312
313         void                                            setStorage                      (const tcu::TextureFormat& format, int width, int height);
314
315         int                                                     getWidth                        (void) const    { return m_data.getWidth();             }
316         int                                                     getHeight                       (void) const    { return m_data.getHeight();    }
317         tcu::TextureFormat                      getFormat                       (void) const    { return m_data.getFormat();    }
318
319         tcu::PixelBufferAccess          getAccess                       (void)                  { return m_data.getAccess();    }
320         tcu::ConstPixelBufferAccess     getAccess                       (void) const    { return m_data.getAccess();    }
321
322 private:
323         tcu::TextureLevel                       m_data;
324 };
325
326 class Framebuffer : public NamedObject
327 {
328 public:
329         enum AttachmentPoint
330         {
331                 ATTACHMENTPOINT_COLOR0,
332                 ATTACHMENTPOINT_DEPTH,
333                 ATTACHMENTPOINT_STENCIL,
334
335                 ATTACHMENTPOINT_LAST
336         };
337
338         enum AttachmentType
339         {
340                 ATTACHMENTTYPE_RENDERBUFFER,
341                 ATTACHMENTTYPE_TEXTURE,
342
343                 ATTACHMENTTYPE_LAST
344         };
345
346         enum TexTarget
347         {
348                 TEXTARGET_2D,
349                 TEXTARGET_CUBE_MAP_POSITIVE_X,
350                 TEXTARGET_CUBE_MAP_POSITIVE_Y,
351                 TEXTARGET_CUBE_MAP_POSITIVE_Z,
352                 TEXTARGET_CUBE_MAP_NEGATIVE_X,
353                 TEXTARGET_CUBE_MAP_NEGATIVE_Y,
354                 TEXTARGET_CUBE_MAP_NEGATIVE_Z,
355                 TEXTARGET_2D_ARRAY,
356                 TEXTARGET_3D,
357                 TEXTARGET_CUBE_MAP_ARRAY,
358
359                 TEXTARGET_LAST
360         };
361
362         struct Attachment
363         {
364                 AttachmentType  type;
365                 deUint32                name;
366                 TexTarget               texTarget;
367                 int                             level;
368                 int                             layer;
369
370                 Attachment (void)
371                         : type          (ATTACHMENTTYPE_LAST)
372                         , name          (0)
373                         , texTarget     (TEXTARGET_LAST)
374                         , level         (0)
375                         , layer         (0)
376                 {
377                 }
378         };
379
380                                                         Framebuffer             (deUint32 name);
381         virtual                                 ~Framebuffer    (void);
382
383         Attachment&                             getAttachment   (AttachmentPoint point)                 { return m_attachments[point]; }
384         const Attachment&               getAttachment   (AttachmentPoint point) const   { return m_attachments[point]; }
385
386 private:
387
388         Attachment                      m_attachments[ATTACHMENTPOINT_LAST];
389 };
390
391 class DataBuffer : public NamedObject
392 {
393 public:
394                                                         DataBuffer                      (deUint32 name) : NamedObject(name) {}
395                                                         ~DataBuffer                     (void) {}
396
397         void                                    setStorage                      (int size) { m_data.resize(size); }
398
399         int                                             getSize                         (void) const    { return (int)m_data.size();                                    }
400         const deUint8*                  getData                         (void) const    { return m_data.empty() ? DE_NULL : &m_data[0]; }
401         deUint8*                                getData                         (void)                  { return m_data.empty() ? DE_NULL : &m_data[0]; }
402
403 private:
404         std::vector<deUint8>    m_data;
405 };
406
407 class VertexArray : public NamedObject
408 {
409 public:
410         struct VertexAttribArray
411         {
412                 bool                    enabled;
413                 int                             size;
414                 int                             stride;
415                 deUint32                type;
416
417                 bool                    normalized;
418                 bool                    integer;
419                 int                             divisor;
420
421                 /**
422                   ! These three variables define the state. bufferDeleted is needed to distinguish
423                   ! drawing from user pointer and offset to a deleted buffer from each other.
424                   !
425                   ! Only these three combinations are possible:
426                   ! 1) bufferDeleted = false, bufferBinding = NULL, pointer = user_ptr.   < render from a user ptr
427                   ! 2) bufferDeleted = false, bufferBinding = ptr,  pointer = offset.     < render from a buffer with offset
428                   ! 3) bufferDeleted = true,  bufferBinding = NULL, pointer = offset      < render from a deleted buffer. Don't do anything
429                   !
430                   ! (bufferFreed = true) implies (bufferBinding = NULL)
431                  */
432                 bool                    bufferDeleted;
433                 rc::DataBuffer* bufferBinding;
434                 const void*             pointer;
435         };
436
437                                                                         VertexArray             (deUint32 name, int maxVertexAttribs);
438                                                                         ~VertexArray    (void) {}
439
440         rc::DataBuffer*                                 m_elementArrayBufferBinding;
441         std::vector<VertexAttribArray>  m_arrays;
442 };
443
444 class ShaderProgramObjectContainer : public NamedObject
445 {
446 public:
447                                                                         ShaderProgramObjectContainer    (deUint32 name, ShaderProgram* program);
448                                                                         ~ShaderProgramObjectContainer   (void);
449
450         ShaderProgram*                                  m_program;
451         bool                                                    m_deleteFlag;
452 };
453
454 template <typename T>
455 class ObjectManager
456 {
457 public:
458                                                         ObjectManager                   (void);
459                                                         ~ObjectManager                  (void);
460
461         deUint32                                allocateName                    (void);
462         void                                    insert                                  (T* object);
463         T*                                              find                                    (deUint32 name);
464
465         void                                    acquireReference                (T* object);
466         void                                    releaseReference                (T* object);
467
468         int                                             getCount                                (void) const { return (int)m_objects.size(); }
469         void                                    getAll                                  (typename std::vector<T*>& objects) const;
470
471 private:
472                                                         ObjectManager                   (const ObjectManager<T>& other);
473         ObjectManager&                  operator=                               (const ObjectManager<T>& other);
474
475         deUint32                                m_lastName;
476         std::map<deUint32, T*>  m_objects;
477 };
478
479 template <typename T>
480 ObjectManager<T>::ObjectManager (void)
481         : m_lastName(0)
482 {
483 }
484
485 template <typename T>
486 ObjectManager<T>::~ObjectManager (void)
487 {
488         DE_ASSERT(m_objects.size() == 0);
489 }
490
491 template <typename T>
492 deUint32 ObjectManager<T>::allocateName (void)
493 {
494         TCU_CHECK(m_lastName != 0xffffffff);
495         return ++m_lastName;
496 }
497
498 template <typename T>
499 void ObjectManager<T>::insert (T* object)
500 {
501         deUint32 name = object->getName();
502         DE_ASSERT(object->getName() != 0);
503
504         if (name > m_lastName)
505                 m_lastName = name;
506
507         m_objects.insert(std::pair<deUint32, T*>(name, object));
508 }
509
510 template <typename T>
511 T* ObjectManager<T>::find (deUint32 name)
512 {
513         typename std::map<deUint32, T*>::iterator it = m_objects.find(name);
514         if (it != m_objects.end())
515                 return it->second;
516         else
517                 return DE_NULL;
518 }
519
520 template <typename T>
521 void ObjectManager<T>::acquireReference (T* object)
522 {
523         DE_ASSERT(find(object->getName()) == object);
524         object->incRefCount();
525 }
526
527 template <typename T>
528 void ObjectManager<T>::releaseReference (T* object)
529 {
530         DE_ASSERT(find(object->getName()) == object);
531         object->decRefCount();
532
533         if (object->getRefCount() == 0)
534         {
535                 m_objects.erase(object->getName());
536                 delete object;
537         }
538 }
539
540 template <typename T>
541 void ObjectManager<T>::getAll (typename std::vector<T*>& objects) const
542 {
543         objects.resize(m_objects.size());
544         typename std::vector<T*>::iterator dst = objects.begin();
545
546         for (typename std::map<deUint32, T*>::const_iterator i = m_objects.begin();
547                  i != m_objects.end(); i++)
548         {
549                 *dst++ = i->second;
550         }
551 }
552
553 } // rc
554
555 struct ReferenceContextLimits
556 {
557         ReferenceContextLimits (void)
558                 : contextType                           (glu::ApiType::es(3,0))
559                 , maxTextureImageUnits          (16)
560                 , maxTexture2DSize                      (2048)
561                 , maxTextureCubeSize            (2048)
562                 , maxTexture2DArrayLayers       (256)
563                 , maxTexture3DSize                      (256)
564                 , maxRenderbufferSize           (2048)
565                 , maxVertexAttribs                      (16)
566         {
567         }
568
569                                                                 ReferenceContextLimits  (const glu::RenderContext& renderCtx);
570
571         void                                            addExtension                    (const char* extension);
572
573         glu::ContextType                        contextType;
574
575         int                                                     maxTextureImageUnits;
576         int                                                     maxTexture2DSize;
577         int                                                     maxTextureCubeSize;
578         int                                                     maxTexture2DArrayLayers;
579         int                                                     maxTexture3DSize;
580         int                                                     maxRenderbufferSize;
581         int                                                     maxVertexAttribs;
582
583         // Both variants are needed since there are glGetString() and glGetStringi()
584         std::vector<std::string>        extensionList;
585         std::string                                     extensionStr;
586 };
587
588 class ReferenceContextBuffers
589 {
590 public:
591         ReferenceContextBuffers (const tcu::PixelFormat& colorBits, int depthBits, int stencilBits, int width, int height, int samples = 1);
592
593         rr::MultisamplePixelBufferAccess        getColorbuffer          (void) { return rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_colorbuffer.getAccess());     }
594         rr::MultisamplePixelBufferAccess        getDepthbuffer          (void) { return rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_depthbuffer.getAccess());     }
595         rr::MultisamplePixelBufferAccess        getStencilbuffer        (void) { return rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_stencilbuffer.getAccess());   }
596
597 private:
598         tcu::TextureLevel       m_colorbuffer;
599         tcu::TextureLevel       m_depthbuffer;
600         tcu::TextureLevel       m_stencilbuffer;
601 };
602
603 class ReferenceContext : public Context
604 {
605 public:
606                                                         ReferenceContext                (const ReferenceContextLimits& limits, const rr::MultisamplePixelBufferAccess& colorbuffer, const rr::MultisamplePixelBufferAccess& depthbuffer, const rr::MultisamplePixelBufferAccess& stencilbuffer);
607         virtual                                 ~ReferenceContext               (void);
608
609         virtual int                             getWidth                                (void) const    { return m_defaultColorbuffer.raw().getHeight();        }
610         virtual int                             getHeight                               (void) const    { return m_defaultColorbuffer.raw().getDepth();         }
611
612         virtual void                    viewport                                (int x, int y, int width, int height) { m_viewport = tcu::IVec4(x, y, width, height); }
613         virtual void                    activeTexture                   (deUint32 texture);
614
615         virtual void                    bindTexture                             (deUint32 target, deUint32 texture);
616         virtual void                    genTextures                             (int numTextures, deUint32* textures);
617         virtual void                    deleteTextures                  (int numTextures, const deUint32* textures);
618
619         virtual void                    bindFramebuffer                 (deUint32 target, deUint32 framebuffer);
620         virtual void                    genFramebuffers                 (int numFramebuffers, deUint32* framebuffers);
621         virtual void                    deleteFramebuffers              (int numFramebuffers, const deUint32* framebuffers);
622
623         virtual void                    bindRenderbuffer                (deUint32 target, deUint32 renderbuffer);
624         virtual void                    genRenderbuffers                (int numRenderbuffers, deUint32* renderbuffers);
625         virtual void                    deleteRenderbuffers             (int numRenderbuffers, const deUint32* renderbuffers);
626
627         virtual void                    pixelStorei                             (deUint32 pname, int param);
628         virtual void                    texImage1D                              (deUint32 target, int level, deUint32 internalFormat, int width, int border, deUint32 format, deUint32 type, const void* data);
629         virtual void                    texImage2D                              (deUint32 target, int level, deUint32 internalFormat, int width, int height, int border, deUint32 format, deUint32 type, const void* data);
630         virtual void                    texImage3D                              (deUint32 target, int level, deUint32 internalFormat, int width, int height, int depth, int border, deUint32 format, deUint32 type, const void* data);
631         virtual void                    texSubImage1D                   (deUint32 target, int level, int xoffset, int width, deUint32 format, deUint32 type, const void* data);
632         virtual void                    texSubImage2D                   (deUint32 target, int level, int xoffset, int yoffset, int width, int height, deUint32 format, deUint32 type, const void* data);
633         virtual void                    texSubImage3D                   (deUint32 target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, deUint32 format, deUint32 type, const void* data);
634         virtual void                    copyTexImage1D                  (deUint32 target, int level, deUint32 internalFormat, int x, int y, int width, int border);
635         virtual void                    copyTexImage2D                  (deUint32 target, int level, deUint32 internalFormat, int x, int y, int width, int height, int border);
636         virtual void                    copyTexSubImage1D               (deUint32 target, int level, int xoffset, int x, int y, int width);
637         virtual void                    copyTexSubImage2D               (deUint32 target, int level, int xoffset, int yoffset, int x, int y, int width, int height);
638         virtual void                    copyTexSubImage3D               (deUint32 target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height);
639
640         virtual void                    texStorage2D                    (deUint32 target, int levels, deUint32 internalFormat, int width, int height);
641         virtual void                    texStorage3D                    (deUint32 target, int levels, deUint32 internalFormat, int width, int height, int depth);
642
643         virtual void                    texParameteri                   (deUint32 target, deUint32 pname, int value);
644
645         virtual void                    framebufferTexture2D    (deUint32 target, deUint32 attachment, deUint32 textarget, deUint32 texture, int level);
646         virtual void                    framebufferTextureLayer (deUint32 target, deUint32 attachment, deUint32 texture, int level, int layer);
647         virtual void                    framebufferRenderbuffer (deUint32 target, deUint32 attachment, deUint32 renderbuffertarget, deUint32 renderbuffer);
648         virtual deUint32                checkFramebufferStatus  (deUint32 target);
649
650         virtual void                    getFramebufferAttachmentParameteriv     (deUint32 target, deUint32 attachment, deUint32 pname, int* params);
651
652         virtual void                    renderbufferStorage                             (deUint32 target, deUint32 internalformat, int width, int height);
653         virtual void                    renderbufferStorageMultisample  (deUint32 target, int samples, deUint32 internalFormat, int width, int height);
654
655         virtual void                    bindBuffer                              (deUint32 target, deUint32 buffer);
656         virtual void                    genBuffers                              (int numBuffers, deUint32* buffers);
657         virtual void                    deleteBuffers                   (int numBuffers, const deUint32* buffers);
658
659         virtual void                    bufferData                              (deUint32 target, deIntptr size, const void* data, deUint32 usage);
660         virtual void                    bufferSubData                   (deUint32 target, deIntptr offset, deIntptr size, const void* data);
661
662         virtual void                    clearColor                              (float red, float green, float blue, float alpha);
663         virtual void                    clearDepthf                             (float depth);
664         virtual void                    clearStencil                    (int stencil);
665
666         virtual void                    clear                                   (deUint32 buffers);
667         virtual void                    clearBufferiv                   (deUint32 buffer, int drawbuffer, const int* value);
668         virtual void                    clearBufferfv                   (deUint32 buffer, int drawbuffer, const float* value);
669         virtual void                    clearBufferuiv                  (deUint32 buffer, int drawbuffer, const deUint32* value);
670         virtual void                    clearBufferfi                   (deUint32 buffer, int drawbuffer, float depth, int stencil);
671         virtual void                    scissor                                 (int x, int y, int width, int height);
672
673         virtual void                    enable                                  (deUint32 cap);
674         virtual void                    disable                                 (deUint32 cap);
675
676         virtual void                    stencilFunc                             (deUint32 func, int ref, deUint32 mask);
677         virtual void                    stencilOp                               (deUint32 sfail, deUint32 dpfail, deUint32 dppass);
678         virtual void                    stencilFuncSeparate             (deUint32 face, deUint32 func, int ref, deUint32 mask);
679         virtual void                    stencilOpSeparate               (deUint32 face, deUint32 sfail, deUint32 dpfail, deUint32 dppass);
680
681         virtual void                    depthFunc                               (deUint32 func);
682         virtual void                    depthRangef                             (float n, float f);
683         virtual void                    depthRange                              (double n, double f);
684
685         virtual void                    polygonOffset                   (float factor, float units);
686         virtual void                    provokingVertex                 (deUint32 convention);
687         virtual void                    primitiveRestartIndex   (deUint32 index);
688
689         virtual void                    blendEquation                   (deUint32 mode);
690         virtual void                    blendEquationSeparate   (deUint32 modeRGB, deUint32 modeAlpha);
691         virtual void                    blendFunc                               (deUint32 src, deUint32 dst);
692         virtual void                    blendFuncSeparate               (deUint32 srcRGB, deUint32 dstRGB, deUint32 srcAlpha, deUint32 dstAlpha);
693         virtual void                    blendColor                              (float red, float green, float blue, float alpha);
694
695         virtual void                    colorMask                               (deBool r, deBool g, deBool b, deBool a);
696         virtual void                    depthMask                               (deBool mask);
697         virtual void                    stencilMask                             (deUint32 mask);
698         virtual void                    stencilMaskSeparate             (deUint32 face, deUint32 mask);
699
700         virtual void                    blitFramebuffer                 (int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, deUint32 mask, deUint32 filter);
701
702         virtual void                    invalidateSubFramebuffer(deUint32 target, int numAttachments, const deUint32* attachments, int x, int y, int width, int height);
703         virtual void                    invalidateFramebuffer   (deUint32 target, int numAttachments, const deUint32* attachments);
704
705         virtual void                    bindVertexArray                 (deUint32 array);
706         virtual void                    genVertexArrays                 (int numArrays, deUint32* vertexArrays);
707         virtual void                    deleteVertexArrays              (int numArrays, const deUint32* vertexArrays);
708
709         virtual void                    vertexAttribPointer             (deUint32 index, int size, deUint32 type, deBool normalized, int stride, const void *pointer);
710         virtual void                    vertexAttribIPointer    (deUint32 index, int size, deUint32 type, int stride, const void *pointer);
711         virtual void                    enableVertexAttribArray (deUint32 index);
712         virtual void                    disableVertexAttribArray(deUint32 index);
713         virtual void                    vertexAttribDivisor             (deUint32 index, deUint32 divisor);
714
715         virtual void                    vertexAttrib1f                  (deUint32 index, float);
716         virtual void                    vertexAttrib2f                  (deUint32 index, float, float);
717         virtual void                    vertexAttrib3f                  (deUint32 index, float, float, float);
718         virtual void                    vertexAttrib4f                  (deUint32 index, float, float, float, float);
719         virtual void                    vertexAttribI4i                 (deUint32 index, deInt32, deInt32, deInt32, deInt32);
720         virtual void                    vertexAttribI4ui                (deUint32 index, deUint32, deUint32, deUint32, deUint32);
721
722         virtual deInt32                 getAttribLocation               (deUint32 program, const char *name);
723
724         virtual void                    uniform1f                               (deInt32 location, float);
725         virtual void                    uniform1i                               (deInt32 location, deInt32);
726         virtual void                    uniform1fv                              (deInt32 index, deInt32 count, const float*);
727         virtual void                    uniform2fv                              (deInt32 index, deInt32 count, const float*);
728         virtual void                    uniform3fv                              (deInt32 index, deInt32 count, const float*);
729         virtual void                    uniform4fv                              (deInt32 index, deInt32 count, const float*);
730         virtual void                    uniform1iv                              (deInt32 index, deInt32 count, const deInt32*);
731         virtual void                    uniform2iv                              (deInt32 index, deInt32 count, const deInt32*);
732         virtual void                    uniform3iv                              (deInt32 index, deInt32 count, const deInt32*);
733         virtual void                    uniform4iv                              (deInt32 index, deInt32 count, const deInt32*);
734         virtual void                    uniformMatrix3fv                (deInt32 location, deInt32 count, deBool transpose, const float *value);
735         virtual void                    uniformMatrix4fv                (deInt32 location, deInt32 count, deBool transpose, const float *value);
736         virtual deInt32                 getUniformLocation              (deUint32 program, const char *name);
737
738         virtual void                    lineWidth                               (float);
739
740         virtual void                    drawArrays                              (deUint32 mode, int first, int count);
741         virtual void                    drawArraysInstanced             (deUint32 mode, int first, int count, int instanceCount);
742         virtual void                    drawElements                    (deUint32 mode, int count, deUint32 type, const void *indices);
743         virtual void                    drawElementsBaseVertex  (deUint32 mode, int count, deUint32 type, const void *indices, int baseVertex);
744         virtual void                    drawElementsInstanced   (deUint32 mode, int count, deUint32 type, const void *indices, int instanceCount);
745         virtual void                    drawElementsInstancedBaseVertex (deUint32 mode, int count, deUint32 type, const void *indices, int instanceCount, int baseVertex);
746         virtual void                    drawRangeElements               (deUint32 mode, deUint32 start, deUint32 end, int count, deUint32 type, const void *indices);
747         virtual void                    drawRangeElementsBaseVertex (deUint32 mode, deUint32 start, deUint32 end, int count, deUint32 type, const void *indices, int baseVertex);
748         virtual void                    drawArraysIndirect              (deUint32 mode, const void *indirect);
749         virtual void                    drawElementsIndirect    (deUint32 mode, deUint32 type, const void *indirect);
750
751         virtual void                    multiDrawArrays                 (deUint32 mode, const int* first, const int* count, int primCount);
752         virtual void                    multiDrawElements               (deUint32 mode, const int* count, deUint32 type, const void** indices, int primCount);
753         virtual void                    multiDrawElementsBaseVertex (deUint32 mode, const int* count, deUint32 type, const void** indices, int primCount, const int* baseVertex);
754
755         virtual deUint32                createProgram                   (ShaderProgram* program);
756         virtual void                    useProgram                              (deUint32 program);
757         virtual void                    deleteProgram                   (deUint32 program);
758
759         virtual void                    readPixels                              (int x, int y, int width, int height, deUint32 format, deUint32 type, void* data);
760         virtual deUint32                getError                                (void);
761         virtual void                    finish                                  (void);
762
763         virtual void                    getIntegerv                             (deUint32 pname, int* params);
764         virtual const char*             getString                               (deUint32 pname);
765
766         // Expose helpers from Context.
767         using Context::readPixels;
768         using Context::texImage2D;
769         using Context::texSubImage2D;
770
771 private:
772                                                         ReferenceContext                (const ReferenceContext& other); // Not allowed!
773         ReferenceContext&               operator=                               (const ReferenceContext& other); // Not allowed!
774
775         void                                    deleteTexture                   (rc::Texture* texture);
776         void                                    deleteFramebuffer               (rc::Framebuffer* framebuffer);
777         void                                    deleteRenderbuffer              (rc::Renderbuffer* renderbuffer);
778         void                                    deleteBuffer                    (rc::DataBuffer* buffer);
779         void                                    deleteVertexArray               (rc::VertexArray* vertexArray);
780         void                                    deleteProgramObject             (rc::ShaderProgramObjectContainer* sp);
781
782         void                                    acquireFboAttachmentReference   (const rc::Framebuffer::Attachment& attachment);
783         void                                    releaseFboAttachmentReference   (const rc::Framebuffer::Attachment& attachment);
784         tcu::PixelBufferAccess  getFboAttachment                (const rc::Framebuffer& framebuffer, rc::Framebuffer::AttachmentPoint point);
785
786         deUint32                                blitResolveMultisampleFramebuffer (deUint32 mask, const tcu::IVec4& srcRect, const tcu::IVec4& dstRect, bool flipX, bool flipY);
787
788         rr::MultisamplePixelBufferAccess        getDrawColorbuffer              (void)  { return (m_drawFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_drawFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_COLOR0)))  :       (m_defaultColorbuffer);         }
789         rr::MultisamplePixelBufferAccess        getDrawDepthbuffer              (void)  { return (m_drawFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_drawFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_DEPTH)))   :       (m_defaultDepthbuffer);         }
790         rr::MultisamplePixelBufferAccess        getDrawStencilbuffer    (void)  { return (m_drawFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_drawFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_STENCIL))) :       (m_defaultStencilbuffer);       }
791         rr::MultisamplePixelBufferAccess        getReadColorbuffer              (void)  { return (m_readFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_readFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_COLOR0)))  :       (m_defaultColorbuffer);         }
792         rr::MultisamplePixelBufferAccess        getReadDepthbuffer              (void)  { return (m_readFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_readFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_DEPTH)))   :       (m_defaultDepthbuffer);         }
793         rr::MultisamplePixelBufferAccess        getReadStencilbuffer    (void)  { return (m_readFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_readFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_STENCIL))) :       (m_defaultStencilbuffer);       }
794
795         const rc::Texture2D&    getTexture2D                    (int unitNdx) const;
796         const rc::TextureCube&  getTextureCube                  (int unitNdx) const;
797         const tcu::IVec4&               getViewport                             (void) const { return m_viewport; }
798
799         void                                    setError                                (deUint32 error);
800
801         void                                    setTex1DBinding                 (int unit, rc::Texture1D*                       tex1D);
802         void                                    setTex2DBinding                 (int unit, rc::Texture2D*                       tex2D);
803         void                                    setTexCubeBinding               (int unit, rc::TextureCube*                     texCube);
804         void                                    setTex2DArrayBinding    (int unit, rc::Texture2DArray*          tex2DArray);
805         void                                    setTex3DBinding                 (int unit, rc::Texture3D*                       tex3D);
806         void                                    setTexCubeArrayBinding  (int unit, rc::TextureCubeArray*        texCubeArray);
807
808         void                                    setBufferBinding                (deUint32 target, rc::DataBuffer* buffer);
809         rc::DataBuffer*                 getBufferBinding                (deUint32 target) const;
810
811         void*                                   getPixelPackPtr                 (void* ptrOffset) const                 { return m_pixelPackBufferBinding ? (void*)((deUintptr)m_pixelPackBufferBinding->getData()+(deUintptr)ptrOffset) : ptrOffset;   }
812         const void*                             getPixelUnpackPtr               (const void* ptrOffset) const   { return m_pixelUnpackBufferBinding ? (const void*)((deUintptr)m_pixelUnpackBufferBinding->getData()+(deUintptr)ptrOffset) : ptrOffset; }
813
814         bool                                    predrawErrorChecks              (deUint32 mode);
815         void                                    drawWithReference               (const rr::PrimitiveList& primitives, int instanceCount);
816
817         // Helpers for getting valid access object based on current unpack state.
818         tcu::ConstPixelBufferAccess             getUnpack2DAccess               (const tcu::TextureFormat& format, int width, int height, const void* data);
819         tcu::ConstPixelBufferAccess             getUnpack3DAccess               (const tcu::TextureFormat& format, int width, int height, int depth, const void* data);
820
821         void                                    uniformv                                (deInt32 index, glu::DataType type, deInt32 count, const void*);
822
823         struct TextureUnit
824         {
825
826                 rc::Texture1D*                  tex1DBinding;
827                 rc::Texture2D*                  tex2DBinding;
828                 rc::TextureCube*                texCubeBinding;
829                 rc::Texture2DArray*             tex2DArrayBinding;
830                 rc::Texture3D*                  tex3DBinding;
831                 rc::TextureCubeArray*   texCubeArrayBinding;
832
833                 rc::Texture1D                   default1DTex;
834                 rc::Texture2D                   default2DTex;
835                 rc::TextureCube                 defaultCubeTex;
836                 rc::Texture2DArray              default2DArrayTex;
837                 rc::Texture3D                   default3DTex;
838                 rc::TextureCubeArray    defaultCubeArrayTex;
839
840                 TextureUnit (void)
841                         : tex1DBinding                  (DE_NULL)
842                         , tex2DBinding                  (DE_NULL)
843                         , texCubeBinding                (DE_NULL)
844                         , tex2DArrayBinding             (DE_NULL)
845                         , tex3DBinding                  (DE_NULL)
846                         , texCubeArrayBinding   (DE_NULL)
847                         , default1DTex                  (0)
848                         , default2DTex                  (0)
849                         , defaultCubeTex                (0)
850                         , default2DArrayTex             (0)
851                         , default3DTex                  (0)
852                         , defaultCubeArrayTex   (0)
853                 {
854                 }
855         };
856
857         struct StencilState
858         {
859                 deUint32                func;
860                 int                             ref;
861                 deUint32                opMask;
862                 deUint32                opStencilFail;
863                 deUint32                opDepthFail;
864                 deUint32                opDepthPass;
865                 deUint32                writeMask;
866
867                 StencilState (void);
868         };
869
870         ReferenceContextLimits                                          m_limits;
871
872         rr::MultisamplePixelBufferAccess                        m_defaultColorbuffer;
873         rr::MultisamplePixelBufferAccess                        m_defaultDepthbuffer;
874         rr::MultisamplePixelBufferAccess                        m_defaultStencilbuffer;
875         rc::VertexArray                                                         m_clientVertexArray;
876
877         tcu::IVec4                                                                      m_viewport;
878
879         rc::ObjectManager<rc::Texture>                          m_textures;
880         rc::ObjectManager<rc::Framebuffer>                      m_framebuffers;
881         rc::ObjectManager<rc::Renderbuffer>                     m_renderbuffers;
882         rc::ObjectManager<rc::DataBuffer>                       m_buffers;
883         rc::ObjectManager<rc::VertexArray>                      m_vertexArrays;
884         rc::ObjectManager<rc::ShaderProgramObjectContainer>             m_programs;
885
886         int                                                                                     m_activeTexture;
887         std::vector<TextureUnit>                                        m_textureUnits;
888         rc::Texture1D                                                           m_emptyTex1D;
889         rc::Texture2D                                                           m_emptyTex2D;
890         rc::TextureCube                                                         m_emptyTexCube;
891         rc::Texture2DArray                                                      m_emptyTex2DArray;
892         rc::Texture3D                                                           m_emptyTex3D;
893         rc::TextureCubeArray                                            m_emptyTexCubeArray;
894
895         int                                                                                     m_pixelUnpackRowLength;
896         int                                                                                     m_pixelUnpackSkipRows;
897         int                                                                                     m_pixelUnpackSkipPixels;
898         int                                                                                     m_pixelUnpackImageHeight;
899         int                                                                                     m_pixelUnpackSkipImages;
900         int                                                                                     m_pixelUnpackAlignment;
901         int                                                                                     m_pixelPackAlignment;
902
903         rc::Framebuffer*                                                        m_readFramebufferBinding;
904         rc::Framebuffer*                                                        m_drawFramebufferBinding;
905         rc::Renderbuffer*                                                       m_renderbufferBinding;
906         rc::VertexArray*                                                        m_vertexArrayBinding;
907         rc::ShaderProgramObjectContainer*                       m_currentProgram;
908
909         rc::DataBuffer*                                                         m_arrayBufferBinding;
910         rc::DataBuffer*                                                         m_pixelPackBufferBinding;
911         rc::DataBuffer*                                                         m_pixelUnpackBufferBinding;
912         rc::DataBuffer*                                                         m_transformFeedbackBufferBinding;
913         rc::DataBuffer*                                                         m_uniformBufferBinding;
914         rc::DataBuffer*                                                         m_copyReadBufferBinding;
915         rc::DataBuffer*                                                         m_copyWriteBufferBinding;
916         rc::DataBuffer*                                                         m_drawIndirectBufferBinding;
917
918         tcu::Vec4                                                                       m_clearColor;
919         float                                                                           m_clearDepth;
920         int                                                                                     m_clearStencil;
921
922         bool                                                                            m_scissorEnabled;
923         tcu::IVec4                                                                      m_scissorBox;
924
925         bool                                                                            m_stencilTestEnabled;
926         StencilState                                                            m_stencil[rr::FACETYPE_LAST];
927
928         bool                                                                            m_depthTestEnabled;
929         deUint32                                                                        m_depthFunc;
930         float                                                                           m_depthRangeNear;
931         float                                                                           m_depthRangeFar;
932
933         float                                                                           m_polygonOffsetFactor;
934         float                                                                           m_polygonOffsetUnits;
935         bool                                                                            m_polygonOffsetFillEnabled;
936
937         bool                                                                            m_provokingFirstVertexConvention;
938
939         bool                                                                            m_blendEnabled;
940         deUint32                                                                        m_blendModeRGB;
941         deUint32                                                                        m_blendModeAlpha;
942         deUint32                                                                        m_blendFactorSrcRGB;
943         deUint32                                                                        m_blendFactorDstRGB;
944         deUint32                                                                        m_blendFactorSrcAlpha;
945         deUint32                                                                        m_blendFactorDstAlpha;
946         tcu::Vec4                                                                       m_blendColor;
947
948         bool                                                                            m_sRGBUpdateEnabled;
949
950         bool                                                                            m_depthClampEnabled;
951
952         tcu::BVec4                                                                      m_colorMask;
953         bool                                                                            m_depthMask;
954
955         std::vector<rr::GenericVec4>                            m_currentAttribs;
956         float                                                                           m_lineWidth;
957
958         bool                                                                            m_primitiveRestartFixedIndex;
959         bool                                                                            m_primitiveRestartSettableIndex;
960         deUint32                                                                        m_primitiveRestartIndex;
961
962         deUint32                                                                        m_lastError;
963
964         rr::FragmentProcessor                                           m_fragmentProcessor;
965         std::vector<rr::Fragment>                                       m_fragmentBuffer;
966         std::vector<float>                                                      m_fragmentDepths;
967 } DE_WARN_UNUSED_TYPE;
968
969 } // sglr
970
971 #endif // _SGLRREFERENCECONTEXT_HPP