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
32namespace tcu
33{
34
35enum 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
44enum 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
52enum 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
59struct 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
71struct 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
83struct 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
95struct 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 *//*--------------------------------------------------------------------*/
111CoverageType 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 *//*--------------------------------------------------------------------*/
122bool 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 *//*--------------------------------------------------------------------*/
133bool 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 *//*--------------------------------------------------------------------*/
146bool 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 *//*--------------------------------------------------------------------*/
157bool 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 *//*--------------------------------------------------------------------*/
168bool 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 *//*--------------------------------------------------------------------*/
179LineInterpolationMethod 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 *//*--------------------------------------------------------------------*/
191bool verifyTriangulatedLineGroupInterpolation (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log);
192
193} // tcu
194
195#endif // _TCURASTERIZATIONVERIFIER_HPP
196