Home | History | Annotate | Download | only in common
      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