Merge branch 'vulkan-cts-1.0' into vulkan-cts-1.0-dev
[platform/upstream/VK-GL-CTS.git] / modules / glshared / glsRasterizationTestUtil.hpp
1 #ifndef _GLSRASTERIZATIONTESTUTIL_HPP
2 #define _GLSRASTERIZATIONTESTUTIL_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 rasterization test utils.
24  *//*--------------------------------------------------------------------*/
25
26 #include "deMath.h"
27 #include "tcuDefs.hpp"
28 #include "tcuTestLog.hpp"
29
30 #include <vector>
31
32 namespace deqp
33 {
34 namespace gls
35 {
36 namespace RasterizationTestUtil
37 {
38
39 enum CoverageType
40 {
41         COVERAGE_FULL = 0,              // !< primitive fully covers the queried area
42         COVERAGE_PARTIAL,               // !< primitive coverage is either partial, or could be full, partial or none depending on rounding and/or fill rules
43         COVERAGE_NONE,                  // !< primitive does not cover area at all
44
45         COVERAGE_LAST
46 };
47
48 enum VerificationMode
49 {
50         VERIFICATIONMODE_STRICT = 0,    // !< do not allow even a single bad pixel
51         VERIFICATIONMODE_WEAK,                  // !< allow some bad pixels
52
53         VERIFICATIONMODE_LAST
54 };
55
56 enum LineInterpolationMethod
57 {
58         LINEINTERPOLATION_STRICTLY_CORRECT = 0, // !< line interpolation matches the specification
59         LINEINTERPOLATION_PROJECTED,                    // !< line interpolation weights are otherwise correct, but they are projected onto major axis
60         LINEINTERPOLATION_INCORRECT                             // !< line interpolation is incorrect
61 };
62
63 struct TriangleSceneSpec
64 {
65         struct SceneTriangle
66         {
67                 tcu::Vec4       positions[3];
68                 tcu::Vec4       colors[3];
69                 bool            sharedEdge[3]; // !< is the edge i -> i+1 shared with another scene triangle
70         };
71
72         std::vector<SceneTriangle> triangles;
73 };
74
75 struct LineSceneSpec
76 {
77         struct SceneLine
78         {
79                 tcu::Vec4       positions[2];
80                 tcu::Vec4       colors[2];
81         };
82
83         std::vector<SceneLine>  lines;
84         float                                   lineWidth;
85 };
86
87 struct PointSceneSpec
88 {
89         struct ScenePoint
90         {
91                 tcu::Vec4       position;
92                 tcu::Vec4       color;
93                 float           pointSize;
94         };
95
96         std::vector<ScenePoint> points;
97 };
98
99 struct RasterizationArguments
100 {
101         int numSamples;
102         int subpixelBits;
103         int redBits;
104         int greenBits;
105         int blueBits;
106 };
107
108 /*--------------------------------------------------------------------*//*!
109  * \brief Calculates triangle coverage at given pixel
110  * Calculates the coverage of a triangle given by three vertices. The
111  * triangle should not be z-clipped. If multisample is false, the pixel
112  * center is compared against the triangle. If multisample is true, the
113  * whole pixel area is compared.
114  *//*--------------------------------------------------------------------*/
115 CoverageType calculateTriangleCoverage (const tcu::Vec4& p0, const tcu::Vec4& p1, const tcu::Vec4& p2, const tcu::IVec2& pixel, const tcu::IVec2& viewportSize, int subpixelBits, bool multisample);
116
117 /*--------------------------------------------------------------------*//*!
118  * \brief Verify triangle rasterization result
119  * Verifies pixels in the surface are rasterized within the bounds given
120  * by RasterizationArguments. Triangles should not be z-clipped.
121  *
122  * Triangle colors are not used. The triangle is expected to be white.
123  *
124  * Returns false if invalid rasterization is found.
125  *//*--------------------------------------------------------------------*/
126 bool verifyTriangleGroupRasterization (const tcu::Surface& surface, const TriangleSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log, VerificationMode mode = VERIFICATIONMODE_STRICT);
127
128 /*--------------------------------------------------------------------*//*!
129  * \brief Verify line rasterization result
130  * Verifies pixels in the surface are rasterized within the bounds given
131  * by RasterizationArguments. Lines should not be z-clipped.
132  *
133  * Line colors are not used. The line is expected to be white.
134  *
135  * Returns false if invalid rasterization is found.
136  *//*--------------------------------------------------------------------*/
137 bool verifyLineGroupRasterization (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log);
138
139 /*--------------------------------------------------------------------*//*!
140  * \brief Verify point rasterization result
141  * Verifies points in the surface are rasterized within the bounds given
142  * by RasterizationArguments. Points should not be z-clipped.
143  *
144  * Point colors are not used. The point is expected to be white.
145  *
146  * Returns false if invalid rasterization is found.
147  *//*--------------------------------------------------------------------*/
148 bool verifyPointGroupRasterization (const tcu::Surface& surface, const PointSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log);
149
150 /*--------------------------------------------------------------------*//*!
151  * \brief Verify triangle color interpolation is valid
152  * Verifies the color of a fragments of a colored triangle is in the
153  * valid range. Triangles should not be z-clipped.
154  *
155  * The background is expected to be black.
156  *
157  * Returns false if invalid rasterization interpolation is found.
158  *//*--------------------------------------------------------------------*/
159 bool verifyTriangleGroupInterpolation (const tcu::Surface& surface, const TriangleSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log);
160
161 /*--------------------------------------------------------------------*//*!
162  * \brief Verify line color interpolation is valid
163  * Verifies the color of a fragments of a colored line is in the
164  * valid range. Lines should not be z-clipped.
165  *
166  * The background is expected to be black.
167  *
168  * Returns the detected interpolation method of the input image.
169  *//*--------------------------------------------------------------------*/
170 LineInterpolationMethod verifyLineGroupInterpolation (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log);
171
172 } // StateQueryUtil
173 } // gls
174 } // deqp
175
176 #endif // _GLSRASTERIZATIONTESTUTIL_HPP