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