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 177