Lower correlation threshold in flush-finish tests again am: 6455e6f987 am: 2e18b48b04...
[platform/upstream/VK-GL-CTS.git] / modules / glshared / glsDrawTest.hpp
1 #ifndef _GLSDRAWTEST_HPP
2 #define _GLSDRAWTEST_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program OpenGL (ES) Module
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 Draw tests
24  *//*--------------------------------------------------------------------*/
25
26 #include "tcuTestCase.hpp"
27 #include "tcuResultCollector.hpp"
28 #include "gluRenderContext.hpp"
29
30 namespace sglr
31 {
32
33 class ReferenceContextBuffers;
34 class ReferenceContext;
35 class Context;
36
37 } // sglr
38
39 namespace deqp
40 {
41 namespace gls
42 {
43
44 class AttributePack;
45
46 struct DrawTestSpec
47 {
48         enum Target
49         {
50                 TARGET_ELEMENT_ARRAY = 0,
51                 TARGET_ARRAY,
52
53                 TARGET_LAST
54         };
55
56         enum InputType
57         {
58                 INPUTTYPE_FLOAT = 0,
59                 INPUTTYPE_FIXED,
60                 INPUTTYPE_DOUBLE,
61
62                 INPUTTYPE_BYTE,
63                 INPUTTYPE_SHORT,
64
65                 INPUTTYPE_UNSIGNED_BYTE,
66                 INPUTTYPE_UNSIGNED_SHORT,
67
68                 INPUTTYPE_INT,
69                 INPUTTYPE_UNSIGNED_INT,
70                 INPUTTYPE_HALF,
71                 INPUTTYPE_UNSIGNED_INT_2_10_10_10,
72                 INPUTTYPE_INT_2_10_10_10,
73
74                 INPUTTYPE_LAST
75         };
76
77         enum OutputType
78         {
79                 OUTPUTTYPE_FLOAT = 0,
80                 OUTPUTTYPE_VEC2,
81                 OUTPUTTYPE_VEC3,
82                 OUTPUTTYPE_VEC4,
83
84                 OUTPUTTYPE_INT,
85                 OUTPUTTYPE_UINT,
86
87                 OUTPUTTYPE_IVEC2,
88                 OUTPUTTYPE_IVEC3,
89                 OUTPUTTYPE_IVEC4,
90
91                 OUTPUTTYPE_UVEC2,
92                 OUTPUTTYPE_UVEC3,
93                 OUTPUTTYPE_UVEC4,
94
95                 OUTPUTTYPE_LAST
96         };
97
98         enum Usage
99         {
100                 USAGE_DYNAMIC_DRAW = 0,
101                 USAGE_STATIC_DRAW,
102                 USAGE_STREAM_DRAW,
103
104                 USAGE_STREAM_READ,
105                 USAGE_STREAM_COPY,
106
107                 USAGE_STATIC_READ,
108                 USAGE_STATIC_COPY,
109
110                 USAGE_DYNAMIC_READ,
111                 USAGE_DYNAMIC_COPY,
112
113                 USAGE_LAST
114         };
115
116         enum Storage
117         {
118                 STORAGE_USER = 0,
119                 STORAGE_BUFFER,
120
121                 STORAGE_LAST
122         };
123
124         enum Primitive
125         {
126                 PRIMITIVE_POINTS = 0,
127                 PRIMITIVE_TRIANGLES,
128                 PRIMITIVE_TRIANGLE_FAN,
129                 PRIMITIVE_TRIANGLE_STRIP,
130                 PRIMITIVE_LINES,
131                 PRIMITIVE_LINE_STRIP,
132                 PRIMITIVE_LINE_LOOP,
133
134                 PRIMITIVE_LINES_ADJACENCY,
135                 PRIMITIVE_LINE_STRIP_ADJACENCY,
136                 PRIMITIVE_TRIANGLES_ADJACENCY,
137                 PRIMITIVE_TRIANGLE_STRIP_ADJACENCY,
138
139                 PRIMITIVE_LAST
140         };
141
142         enum IndexType
143         {
144                 INDEXTYPE_BYTE = 0,
145                 INDEXTYPE_SHORT,
146                 INDEXTYPE_INT,
147
148                 INDEXTYPE_LAST
149         };
150
151         enum DrawMethod
152         {
153                 DRAWMETHOD_DRAWARRAYS = 0,
154                 DRAWMETHOD_DRAWARRAYS_INSTANCED,
155                 DRAWMETHOD_DRAWARRAYS_INDIRECT,
156                 DRAWMETHOD_DRAWELEMENTS,
157                 DRAWMETHOD_DRAWELEMENTS_RANGED,
158                 DRAWMETHOD_DRAWELEMENTS_INSTANCED,
159                 DRAWMETHOD_DRAWELEMENTS_INDIRECT,
160                 DRAWMETHOD_DRAWELEMENTS_BASEVERTEX,
161                 DRAWMETHOD_DRAWELEMENTS_INSTANCED_BASEVERTEX,
162                 DRAWMETHOD_DRAWELEMENTS_RANGED_BASEVERTEX,
163
164                 DRAWMETHOD_LAST
165         };
166
167         enum CompatibilityTestType
168         {
169                 COMPATIBILITY_NONE = 0,
170                 COMPATIBILITY_UNALIGNED_OFFSET,
171                 COMPATIBILITY_UNALIGNED_STRIDE,
172
173                 COMPATIBILITY_LAST
174         };
175
176         static std::string                      targetToString          (Target target);
177         static std::string                      inputTypeToString       (InputType type);
178         static std::string                      outputTypeToString      (OutputType type);
179         static std::string                      usageTypeToString       (Usage usage);
180         static std::string                      storageToString         (Storage storage);
181         static std::string                      primitiveToString       (Primitive primitive);
182         static std::string                      indexTypeToString       (IndexType type);
183         static std::string                      drawMethodToString      (DrawMethod method);
184         static int                                      inputTypeSize           (InputType type);
185         static int                                      indexTypeSize           (IndexType type);
186
187         struct AttributeSpec
188         {
189                 static AttributeSpec    createAttributeArray    (InputType inputType, OutputType outputType, Storage storage, Usage usage, int componentCount, int offset, int stride, bool normalize, int instanceDivisor);
190                 static AttributeSpec    createDefaultAttribute  (InputType inputType, OutputType outputType, int componentCount);       //!< allowed inputType values: INPUTTYPE_INT, INPUTTYPE_UNSIGNED_INT, INPUTTYPE_FLOAT
191
192                 InputType                               inputType;
193                 OutputType                              outputType;
194                 Storage                                 storage;
195                 Usage                                   usage;
196                 int                                             componentCount;
197                 int                                             offset;
198                 int                                             stride;
199                 bool                                    normalize;
200                 int                                             instanceDivisor;                                //!< used only if drawMethod = Draw*Instanced
201                 bool                                    useDefaultAttribute;
202
203                 bool                                    additionalPositionAttribute;    //!< treat this attribute as position attribute. Attribute at index 0 is alway treated as such. False by default
204                 bool                                    bgraComponentOrder;                             //!< component order of this attribute is bgra, valid only for 4-component targets. False by default.
205
206                                                                 AttributeSpec                   (void);
207
208                 int                                             hash                                    (void) const;
209                 bool                                    valid                                   (glu::ApiType apiType) const;
210                 bool                                    isBufferAligned                 (void) const;
211                 bool                                    isBufferStrideAligned   (void) const;
212         };
213
214         std::string                                     getName                         (void) const;
215         std::string                                     getDesc                         (void) const;
216         std::string                                     getMultilineDesc        (void) const;
217
218         glu::ApiType                            apiType;                        //!< needed in spec validation
219         Primitive                                       primitive;
220         int                                                     primitiveCount;         //!< number of primitives to draw (per instance)
221
222         DrawMethod                                      drawMethod;
223         IndexType                                       indexType;                      //!< used only if drawMethod = DrawElements*
224         int                                                     indexPointerOffset;     //!< used only if drawMethod = DrawElements*
225         Storage                                         indexStorage;           //!< used only if drawMethod = DrawElements*
226         int                                                     first;                          //!< used only if drawMethod = DrawArrays*
227         int                                                     indexMin;                       //!< used only if drawMethod = Draw*Ranged
228         int                                                     indexMax;                       //!< used only if drawMethod = Draw*Ranged
229         int                                                     instanceCount;          //!< used only if drawMethod = Draw*Instanced or Draw*Indirect
230         int                                                     indirectOffset;         //!< used only if drawMethod = Draw*Indirect
231         int                                                     baseVertex;                     //!< used only if drawMethod = DrawElementsIndirect or *BaseVertex
232
233         std::vector<AttributeSpec>      attribs;
234
235                                                                 DrawTestSpec            (void);
236
237         int                                                     hash                            (void) const;
238         bool                                            valid                           (void) const;
239         CompatibilityTestType           isCompatibilityTest     (void) const;
240 };
241
242 class DrawTest : public tcu::TestCase
243 {
244 public:
245                                                                         DrawTest                                (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const DrawTestSpec& spec, const char* name, const char* desc);
246                                                                         DrawTest                                (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc);
247         virtual                                                 ~DrawTest                               (void);
248
249         void                                                    addIteration                    (const DrawTestSpec& spec, const char* description = DE_NULL);
250
251 private:
252         void                                                    init                                    (void);
253         void                                                    deinit                                  (void);
254         IterateResult                                   iterate                                 (void);
255
256         bool                                                    compare                                 (gls::DrawTestSpec::Primitive primitiveType);
257         float                                                   getCoordScale                   (const DrawTestSpec& spec) const;
258         float                                                   getColorScale                   (const DrawTestSpec& spec) const;
259
260         glu::RenderContext&                             m_renderCtx;
261
262         sglr::ReferenceContextBuffers*  m_refBuffers;
263         sglr::ReferenceContext*                 m_refContext;
264         sglr::Context*                                  m_glesContext;
265
266         AttributePack*                                  m_glArrayPack;
267         AttributePack*                                  m_rrArrayPack;
268
269         int                                                             m_maxDiffRed;
270         int                                                             m_maxDiffGreen;
271         int                                                             m_maxDiffBlue;
272
273         std::vector<DrawTestSpec>               m_specs;
274         std::vector<std::string>                m_iteration_descriptions;
275         int                                                             m_iteration;
276         tcu::ResultCollector                    m_result;
277 };
278
279 } // gls
280 } // deqp
281
282 #endif // _GLSDRAWTEST_HPP