Add CTS_ARB_gl_spirv test implementation
[platform/upstream/VK-GL-CTS.git] / framework / referencerenderer / rrRenderState.hpp
1 #ifndef _RRRENDERSTATE_HPP
2 #define _RRRENDERSTATE_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Reference Renderer
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 renderer render state.
24  *//*--------------------------------------------------------------------*/
25
26 #include "rrDefs.hpp"
27 #include "rrMultisamplePixelBufferAccess.hpp"
28 #include "tcuTexture.hpp"
29
30 namespace rr
31 {
32
33 //! Horizontal fill rule
34 enum HorizontalFill
35 {
36         FILL_LEFT,
37         FILL_RIGHT
38 };
39
40 //! Vertical fill rule
41 enum VerticalFill
42 {
43         FILL_TOP,
44         FILL_BOTTOM,
45 };
46
47 //! Winding mode
48 enum Winding
49 {
50         WINDING_CCW = 0,        //!< Counter-clockwise winding
51         WINDING_CW,                     //!< Clockwise winding
52
53         WINDING_LAST
54 };
55
56 //! Triangle cull mode
57 enum CullMode
58 {
59         CULLMODE_NONE,
60         CULLMODE_BACK,
61         CULLMODE_FRONT,
62
63         CULLMODE_LAST
64 };
65
66 //! Viewport Orientation of renderer this will be compared against
67 enum ViewportOrientation
68 {
69         VIEWPORTORIENTATION_LOWER_LEFT = 0,     //<! Corresponds to GL
70         VIEWPORTORIENTATION_UPPER_LEFT,         //<! Corresponds to Vulkan
71
72         VIEWPORTORIENTATION_LAST
73 };
74
75 struct RasterizationState
76 {
77         RasterizationState (void)
78                 : winding                               (WINDING_CCW)
79                 , horizontalFill                (FILL_LEFT)
80                 , verticalFill                  (FILL_BOTTOM)
81                 , viewportOrientation   (VIEWPORTORIENTATION_LAST)
82         {
83         }
84
85         Winding                                 winding;
86         HorizontalFill                  horizontalFill;
87         VerticalFill                    verticalFill;
88         ViewportOrientation             viewportOrientation;
89 };
90
91 enum TestFunc
92 {
93         TESTFUNC_NEVER = 0,
94         TESTFUNC_ALWAYS,
95         TESTFUNC_LESS,
96         TESTFUNC_LEQUAL,
97         TESTFUNC_GREATER,
98         TESTFUNC_GEQUAL,
99         TESTFUNC_EQUAL,
100         TESTFUNC_NOTEQUAL,
101
102         TESTFUNC_LAST
103 };
104
105 enum StencilOp
106 {
107         STENCILOP_KEEP = 0,
108         STENCILOP_ZERO,
109         STENCILOP_REPLACE,
110         STENCILOP_INCR, //!< Increment with saturation.
111         STENCILOP_DECR, //!< Decrement with saturation.
112         STENCILOP_INCR_WRAP,
113         STENCILOP_DECR_WRAP,
114         STENCILOP_INVERT,
115
116         STENCILOP_LAST
117 };
118
119 enum BlendMode
120 {
121         BLENDMODE_NONE = 0,             //!< No blending.
122         BLENDMODE_STANDARD,             //!< Standard blending.
123         BLENDMODE_ADVANCED,             //!< Advanced blending mode, as defined in GL_KHR_blend_equation_advanced.
124
125         BLENDMODE_LAST
126 };
127
128 enum BlendEquation
129 {
130         BLENDEQUATION_ADD = 0,
131         BLENDEQUATION_SUBTRACT,
132         BLENDEQUATION_REVERSE_SUBTRACT,
133         BLENDEQUATION_MIN,
134         BLENDEQUATION_MAX,
135
136         BLENDEQUATION_LAST
137 };
138
139 enum BlendEquationAdvanced
140 {
141         BLENDEQUATION_ADVANCED_MULTIPLY = 0,
142         BLENDEQUATION_ADVANCED_SCREEN,
143         BLENDEQUATION_ADVANCED_OVERLAY,
144         BLENDEQUATION_ADVANCED_DARKEN,
145         BLENDEQUATION_ADVANCED_LIGHTEN,
146         BLENDEQUATION_ADVANCED_COLORDODGE,
147         BLENDEQUATION_ADVANCED_COLORBURN,
148         BLENDEQUATION_ADVANCED_HARDLIGHT,
149         BLENDEQUATION_ADVANCED_SOFTLIGHT,
150         BLENDEQUATION_ADVANCED_DIFFERENCE,
151         BLENDEQUATION_ADVANCED_EXCLUSION,
152         BLENDEQUATION_ADVANCED_HSL_HUE,
153         BLENDEQUATION_ADVANCED_HSL_SATURATION,
154         BLENDEQUATION_ADVANCED_HSL_COLOR,
155         BLENDEQUATION_ADVANCED_HSL_LUMINOSITY,
156
157         BLENDEQUATION_ADVANCED_LAST
158 };
159
160 enum BlendFunc
161 {
162         BLENDFUNC_ZERO = 0,
163         BLENDFUNC_ONE,
164         BLENDFUNC_SRC_COLOR,
165         BLENDFUNC_ONE_MINUS_SRC_COLOR,
166         BLENDFUNC_DST_COLOR,
167         BLENDFUNC_ONE_MINUS_DST_COLOR,
168         BLENDFUNC_SRC_ALPHA,
169         BLENDFUNC_ONE_MINUS_SRC_ALPHA,
170         BLENDFUNC_DST_ALPHA,
171         BLENDFUNC_ONE_MINUS_DST_ALPHA,
172         BLENDFUNC_CONSTANT_COLOR,
173         BLENDFUNC_ONE_MINUS_CONSTANT_COLOR,
174         BLENDFUNC_CONSTANT_ALPHA,
175         BLENDFUNC_ONE_MINUS_CONSTANT_ALPHA,
176         BLENDFUNC_SRC_ALPHA_SATURATE,
177         BLENDFUNC_SRC1_COLOR,
178         BLENDFUNC_ONE_MINUS_SRC1_COLOR,
179         BLENDFUNC_SRC1_ALPHA,
180         BLENDFUNC_ONE_MINUS_SRC1_ALPHA,
181
182         BLENDFUNC_LAST
183 };
184
185 struct StencilState
186 {
187         TestFunc        func;
188         int                     ref;
189         deUint32        compMask;
190         StencilOp       sFail;
191         StencilOp       dpFail;
192         StencilOp       dpPass;
193         deUint32        writeMask;
194
195         StencilState (void)
196                 : func          (TESTFUNC_ALWAYS)
197                 , ref           (0)
198                 , compMask      (~0U)
199                 , sFail         (STENCILOP_KEEP)
200                 , dpFail        (STENCILOP_KEEP)
201                 , dpPass        (STENCILOP_KEEP)
202                 , writeMask     (~0U)
203         {
204         }
205 };
206
207 struct BlendState
208 {
209         BlendEquation   equation;
210         BlendFunc               srcFunc;
211         BlendFunc               dstFunc;
212
213         BlendState (void)
214                 : equation      (BLENDEQUATION_ADD)
215                 , srcFunc       (BLENDFUNC_ONE)
216                 , dstFunc       (BLENDFUNC_ZERO)
217         {
218         }
219 };
220
221 struct WindowRectangle
222 {
223         int left;
224         int bottom;
225         int width;
226         int height;
227
228         WindowRectangle (int left_, int bottom_, int width_, int height_)
229                 : left          (left_)
230                 , bottom        (bottom_)
231                 , width         (width_)
232                 , height        (height_)
233         {
234         }
235 };
236
237 struct FragmentOperationState
238 {
239         // Variables corresponding to GL state variables.
240
241         bool                                            scissorTestEnabled;
242         WindowRectangle                         scissorRectangle;
243
244         bool                                            stencilTestEnabled;
245         StencilState                            stencilStates[2];       //!< Indexed with FACETYPE_FRONT and FACETYPE_BACK.
246
247         bool                                            depthTestEnabled;
248         TestFunc                                        depthFunc;
249         bool                                            depthMask;
250
251         BlendMode                                       blendMode;
252
253         // Standard blending state
254         BlendState                                      blendRGBState;
255         BlendState                                      blendAState;
256         tcu::Vec4                                       blendColor;                     //!< Components should be in range [0, 1].
257
258         BlendEquationAdvanced           blendEquationAdvaced;
259
260         bool                                            sRGBEnabled;
261
262         bool                                            depthClampEnabled;
263
264         bool                                            polygonOffsetEnabled;
265         float                                           polygonOffsetFactor;
266         float                                           polygonOffsetUnits;
267
268         tcu::BVec4                                      colorMask;
269
270         // Variables not corresponding to configurable GL state, but other GL variables.
271
272         int                                                     numStencilBits;
273
274         FragmentOperationState (void)
275                 : scissorTestEnabled    (false)
276                 , scissorRectangle              (0, 0, 1, 1)
277
278                 , stencilTestEnabled    (false)
279                 // \note stencilStates[] members get default-constructed.
280
281                 , depthTestEnabled              (false)
282                 , depthFunc                             (TESTFUNC_LESS)
283                 , depthMask                             (true)
284
285                 , blendMode                             (BLENDMODE_NONE)
286                 , blendRGBState                 ()
287                 , blendAState                   ()
288                 , blendColor                    (0.0f)
289                 , blendEquationAdvaced  (BLENDEQUATION_ADVANCED_LAST)
290
291                 , sRGBEnabled                   (true)
292
293                 , depthClampEnabled             (false)
294
295                 , polygonOffsetEnabled  (false)
296                 , polygonOffsetFactor   (0.0f)
297                 , polygonOffsetUnits    (0.0f)
298
299                 , colorMask                             (true)
300
301                 , numStencilBits                (8)
302         {
303         }
304 };
305
306 struct PointState
307 {
308         float   pointSize;
309
310         PointState (void)
311                 : pointSize(1.0f)
312         {
313         }
314 };
315
316 struct LineState
317 {
318         float   lineWidth;
319
320         LineState (void)
321                 : lineWidth(1.0f)
322         {
323         }
324 };
325
326
327 struct ViewportState
328 {
329         WindowRectangle rect;
330         float                   zn;
331         float                   zf;
332
333         explicit ViewportState (const WindowRectangle& rect_)
334                 : rect  (rect_)
335                 , zn    (0.0f)
336                 , zf    (1.0f)
337         {
338         }
339
340         explicit ViewportState (const rr::MultisampleConstPixelBufferAccess& multisampleBuffer)
341                 : rect  (0, 0, multisampleBuffer.raw().getHeight(), multisampleBuffer.raw().getDepth())
342                 , zn    (0.0f)
343                 , zf    (1.0f)
344         {
345         }
346 };
347
348 struct RestartState
349 {
350         bool            enabled;
351         deUint32        restartIndex;
352
353         RestartState (void)
354                 : enabled               (false)
355                 , restartIndex  (0xFFFFFFFFul)
356         {
357         }
358 };
359
360 struct RenderState
361 {
362         explicit RenderState (const ViewportState& viewport_, ViewportOrientation viewportOrientation_ = VIEWPORTORIENTATION_LOWER_LEFT)
363                 : cullMode                                      (CULLMODE_NONE)
364                 , provokingVertexConvention     (PROVOKINGVERTEX_LAST)
365                 , viewport                                      (viewport_)
366                 , viewportOrientation           (viewportOrientation_)
367         {
368                 rasterization.viewportOrientation = viewportOrientation;
369         }
370
371         CullMode                                        cullMode;
372         ProvokingVertex                         provokingVertexConvention;
373         RasterizationState                      rasterization;
374         FragmentOperationState          fragOps;
375         PointState                                      point;
376         ViewportState                           viewport;
377         LineState                                       line;
378         RestartState                            restart;
379         ViewportOrientation                     viewportOrientation;
380 };
381
382 } // rr
383
384 #endif // _RRRENDERSTATE_HPP