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
32namespace deqp
33{
34namespace gls
35{
36namespace RasterizationTestUtil
37{
38
39enum 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
48enum 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
56struct TriangleSceneSpec
57{
58	struct SceneTriangle
59	{
60		tcu::Vec4	positions[3];
61		tcu::Vec4	colors[3];
62		bool		sharedEdge[3]; // !< is the edge i -> i+1 shared with another scene triangle
63	};
64
65	std::vector<SceneTriangle> triangles;
66};
67
68struct LineSceneSpec
69{
70	struct SceneLine
71	{
72		tcu::Vec4	positions[2];
73		tcu::Vec4	colors[2];
74	};
75
76	std::vector<SceneLine>	lines;
77	float					lineWidth;
78};
79
80struct PointSceneSpec
81{
82	struct ScenePoint
83	{
84		tcu::Vec4	position;
85		tcu::Vec4	color;
86		float		pointSize;
87	};
88
89	std::vector<ScenePoint> points;
90};
91
92struct RasterizationArguments
93{
94	int numSamples;
95	int subpixelBits;
96	int redBits;
97	int greenBits;
98	int blueBits;
99};
100
101/*--------------------------------------------------------------------*//*!
102 * \brief Calculates triangle coverage at given pixel
103 * Calculates the coverage of a triangle given by three vertices. The
104 * triangle should not be z-clipped. If multisample is false, the pixel
105 * center is compared against the triangle. If multisample is true, the
106 * whole pixel area is compared.
107 *//*--------------------------------------------------------------------*/
108CoverageType 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);
109
110/*--------------------------------------------------------------------*//*!
111 * \brief Verify triangle rasterization result
112 * Verifies pixels in the surface are rasterized within the bounds given
113 * by RasterizationArguments. Triangles should not be z-clipped.
114 *
115 * Triangle colors are not used. The triangle is expected to be white.
116 *
117 * Returns false if invalid rasterization is found.
118 *//*--------------------------------------------------------------------*/
119bool verifyTriangleGroupRasterization (const tcu::Surface& surface, const TriangleSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log, VerificationMode mode = VERIFICATIONMODE_STRICT);
120
121/*--------------------------------------------------------------------*//*!
122 * \brief Verify line rasterization result
123 * Verifies pixels in the surface are rasterized within the bounds given
124 * by RasterizationArguments. Lines should not be z-clipped.
125 *
126 * Line colors are not used. The line is expected to be white.
127 *
128 * Returns false if invalid rasterization is found.
129 *//*--------------------------------------------------------------------*/
130bool verifyLineGroupRasterization (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log);
131
132/*--------------------------------------------------------------------*//*!
133 * \brief Verify point rasterization result
134 * Verifies points in the surface are rasterized within the bounds given
135 * by RasterizationArguments. Points should not be z-clipped.
136 *
137 * Point colors are not used. The point is expected to be white.
138 *
139 * Returns false if invalid rasterization is found.
140 *//*--------------------------------------------------------------------*/
141bool verifyPointGroupRasterization (const tcu::Surface& surface, const PointSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log);
142
143/*--------------------------------------------------------------------*//*!
144 * \brief Verify triangle color interpolation is valid
145 * Verifies the color of a fragments of a colored triangle is in the
146 * valid range. Triangles should not be z-clipped.
147 *
148 * The background is expected to be black.
149 *
150 * Returns false if invalid rasterization interpolation is found.
151 *//*--------------------------------------------------------------------*/
152bool verifyTriangleGroupInterpolation (const tcu::Surface& surface, const TriangleSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log);
153
154/*--------------------------------------------------------------------*//*!
155 * \brief Verify line color interpolation is valid
156 * Verifies the color of a fragments of a colored line is in the
157 * valid range. Lines should not be z-clipped.
158 *
159 * The background is expected to be black.
160 *
161 * Returns false if invalid rasterization interpolation is found.
162 *//*--------------------------------------------------------------------*/
163bool verifyLineGroupInterpolation (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log);
164
165} // StateQueryUtil
166} // gls
167} // deqp
168
169#endif // _GLSRASTERIZATIONTESTUTIL_HPP
170