13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Internal Test Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Miscellaneous framework tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "ditFrameworkTests.hpp"
25e2145884f87cdca749a754abfd246cdfe01ea2c1Pyry Haulos#include "ditTextureFormatTests.hpp"
26efb83e1354edd463650ad0404b18e9a7efc307e4Pyry Haulos#include "ditAstcTests.hpp"
270820e8d122596ff51f723f8a4f32fa755fbbda23Pyry Haulos#include "ditVulkanTests.hpp"
280820e8d122596ff51f723f8a4f32fa755fbbda23Pyry Haulos
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuFloatFormat.hpp"
30f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi#include "tcuEither.hpp"
31ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos#include "tcuTestLog.hpp"
32ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos#include "tcuCommandLine.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos#include "rrRenderer.hpp"
35f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos#include "tcuTextureUtil.hpp"
36f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos#include "tcuVectorUtil.hpp"
37f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos#include "tcuFloat.hpp"
38f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
39d6148171f88da1301f053e2e0236afc69416137cJarkko Pöyry#include "deRandom.hpp"
40d6148171f88da1301f053e2e0236afc69416137cJarkko Pöyry#include "deArrayUtil.hpp"
41d6148171f88da1301f053e2e0236afc69416137cJarkko Pöyry
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace dit
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosnamespace
46ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
47ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
48ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosusing std::string;
49ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosusing std::vector;
50ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosusing tcu::TestLog;
51ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
52ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosstruct MatchCase
53ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
54ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	enum Expected { NO_MATCH, MATCH_GROUP, MATCH_CASE, EXPECTED_LAST };
55ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
56ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	const char*	path;
57ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	Expected	expected;
58ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
59ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
60ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosconst char* getMatchCaseExpectedDesc (MatchCase::Expected expected)
61ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
62ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	static const char* descs[] =
63ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
64ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		"no match",
65ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		"group to match",
66ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		"case to match"
67ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	};
68ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	return de::getSizedArrayElement<MatchCase::EXPECTED_LAST>(descs, expected);
69ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos}
70ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
71ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosclass CaseListParserCase : public tcu::TestCase
72ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
73ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulospublic:
74ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	CaseListParserCase (tcu::TestContext& testCtx, const char* name, const char* caseList, const MatchCase* subCases, int numSubCases)
75ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		: tcu::TestCase	(testCtx, name, "")
76ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		, m_caseList	(caseList)
77ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		, m_subCases	(subCases)
78ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		, m_numSubCases	(numSubCases)
79ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
80ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
81ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
82ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	IterateResult iterate (void)
83ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
84ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		TestLog&			log		= m_testCtx.getLog();
85ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		tcu::CommandLine	cmdLine;
86ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		int					numPass	= 0;
87ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
88ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		log << TestLog::Message << "Input:\n\"" << m_caseList << "\"" << TestLog::EndMessage;
89ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
90ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
91ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			const char* argv[] =
92ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
93ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"deqp",
94ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"--deqp-caselist",
95ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				m_caseList
96ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
97ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
98ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			if (!cmdLine.parse(DE_LENGTH_OF_ARRAY(argv), argv))
99ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				TCU_FAIL("Failed to parse case list");
100ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
101ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
102ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		for (int subCaseNdx = 0; subCaseNdx < m_numSubCases; subCaseNdx++)
103ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
104ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			const MatchCase&	curCase		= m_subCases[subCaseNdx];
105ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			bool				matchGroup;
106ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			bool				matchCase;
107ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
108ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			log << TestLog::Message << "Checking \"" << curCase.path << "\""
109ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos									<< ", expecting " << getMatchCaseExpectedDesc(curCase.expected)
110ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				<< TestLog::EndMessage;
111ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
112ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			matchGroup	= cmdLine.checkTestGroupName(curCase.path);
113ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			matchCase	= cmdLine.checkTestCaseName(curCase.path);
114ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
115ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			if ((matchGroup	== (curCase.expected == MatchCase::MATCH_GROUP)) &&
116ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				(matchCase	== (curCase.expected == MatchCase::MATCH_CASE)))
117ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
118ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				log << TestLog::Message << "   pass" << TestLog::EndMessage;
119ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				numPass += 1;
120ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			}
121ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			else
122ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				log << TestLog::Message << "   FAIL!" << TestLog::EndMessage;
123ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
124ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
125ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		m_testCtx.setTestResult((numPass == m_numSubCases) ? QP_TEST_RESULT_PASS	: QP_TEST_RESULT_FAIL,
126ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos								(numPass == m_numSubCases) ? "All passed"			: "Unexpected match result");
127ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
128ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		return STOP;
129ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
130ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
131ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosprivate:
132ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	const char* const			m_caseList;
133ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	const MatchCase* const		m_subCases;
134ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	const int					m_numSubCases;
135ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
136ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
137ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosclass NegativeCaseListCase : public tcu::TestCase
138ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
139ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulospublic:
140ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	NegativeCaseListCase (tcu::TestContext& testCtx, const char* name, const char* caseList)
141ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		: tcu::TestCase	(testCtx, name, "")
142ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		, m_caseList	(caseList)
143ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
144ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
145ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
146ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	IterateResult iterate (void)
147ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
148ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		TestLog&			log		= m_testCtx.getLog();
149ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		tcu::CommandLine	cmdLine;
150ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
151ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		log << TestLog::Message << "Input:\n\"" << m_caseList << "\"" << TestLog::EndMessage;
152ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
153ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
154ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			const char* argv[] =
155ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
156ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"deqp",
157ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"--deqp-caselist",
158ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				m_caseList
159ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
160ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
161ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			if (cmdLine.parse(DE_LENGTH_OF_ARRAY(argv), argv))
162ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Parsing passed, should have failed");
163ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			else
164ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Parsing failed as expected");
165ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
166ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
167ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		return STOP;
168ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
169ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
170ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosprivate:
171ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	const char* const	m_caseList;
172ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
173ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
174ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosclass TrieParserTests : public tcu::TestCaseGroup
175ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
176ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulospublic:
177ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	TrieParserTests (tcu::TestContext& testCtx)
178ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		: tcu::TestCaseGroup(testCtx, "trie", "Test case trie parser tests")
179ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
180ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
181ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
182ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	void init (void)
183ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
184ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
185ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{test}";
186ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
187ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
188ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "test",		MatchCase::MATCH_CASE	},
189ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "test.cd",	MatchCase::NO_MATCH		},
190ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
191ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "single_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
192ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
193ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
194ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{a{b}}";
195ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
196ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
197ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
198ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
199ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
200ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
201ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
202ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "simple_group_1", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
203ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
204ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
205ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{a{b,c}}";
206ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
207ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
208ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
209ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
210ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
211ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
212ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
213ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
214ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "simple_group_2", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
215ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
216ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
217ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{a{b},c{d,e}}";
218ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
219ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
220ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
221ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
222ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
223ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
224ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
225ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
226ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
227ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
228ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
229ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
230ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
231ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "two_groups", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
232ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
233ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
234ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{a,c{d,e}}";
235ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
236ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
237ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_CASE	},
238ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
239ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::NO_MATCH		},
240ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
241ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
242ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
243ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
244ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
245ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
246ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
247ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
248ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "case_group", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
249ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
250ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
251ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{c{d,e},a}";
252ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
253ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
254ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_CASE	},
255ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
256ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::NO_MATCH		},
257ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
258ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
259ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
260ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
261ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
262ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
263ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
264ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
265ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "group_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
266ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
267831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		{
268831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const char* const	caseList	= "{test}\r";
269831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const MatchCase		subCases[]	=
270831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			{
271831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test",		MatchCase::MATCH_CASE	},
272831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test.cd",	MatchCase::NO_MATCH		},
273831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			};
274831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			addChild(new CaseListParserCase(m_testCtx, "trailing_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
275831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		}
276831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		{
277831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const char* const	caseList	= "{test}\n";
278831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const MatchCase		subCases[]	=
279831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			{
280831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test",		MatchCase::MATCH_CASE	},
281831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test.cd",	MatchCase::NO_MATCH		},
282831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			};
283831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			addChild(new CaseListParserCase(m_testCtx, "trailing_lf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
284831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		}
285831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		{
286831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const char* const	caseList	= "{test}\r\n";
287831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const MatchCase		subCases[]	=
288831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			{
289831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test",		MatchCase::MATCH_CASE	},
290831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test.cd",	MatchCase::NO_MATCH		},
291831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			};
292831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			addChild(new CaseListParserCase(m_testCtx, "trailing_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
293831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		}
294ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
295ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		// Negative tests
296ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_string",			""));
297831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "empty_line",				"\n"));
298ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_root",				"{}"));
299ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_group",				"{test{}}"));
300ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name_1",		"{{}}"));
301ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name_2",		"{{test}}"));
302ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_1",		"{"));
303ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_2",		"{test"));
304ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_3",		"{test,"));
305ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_4",		"{test{a}"));
306ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_5",		"{a,b"));
307ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_1",	"{test{"));
308ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_2",	"{test{a"));
309ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_3",	"{test{a,"));
310ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_4",	"{test{a,b"));
311ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_1",		"{a,,b}"));
312ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_2",		"{,b}"));
313ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_3",		"{a,}"));
314ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "no_separator",			"{a{b}c}"));
315ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "invalid_char_1",			"{a.b}"));
316ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "invalid_char_2",			"{a[]}"));
317ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "trailing_char_1",			"{a}}"));
318ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "trailing_char_2",			"{a}x"));
319831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_1",		"{\na}"));
320831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_2",		"{a\n,b}"));
321831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_3",		"{a,\nb}"));
322831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_4",		"{a{b\n}}"));
323831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_5",		"{a{b}\n}"));
324ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
325ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
326ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
327ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosclass ListParserTests : public tcu::TestCaseGroup
328ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
329ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulospublic:
330ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	ListParserTests (tcu::TestContext& testCtx)
331ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		: tcu::TestCaseGroup(testCtx, "list", "Test case list parser tests")
332ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
333ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
334ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
335ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	void init (void)
336ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
337ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
338ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "test";
339ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
340ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
341ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "test",		MatchCase::MATCH_CASE	},
342ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "test.cd",	MatchCase::NO_MATCH		},
343ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
344ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "single_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
345ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
346ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
347ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b";
348ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
349ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
350ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
351ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
352ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
353ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
354ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
355ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "simple_group_1", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
356ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
357ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
358ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\na.c";
359ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
360ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
361ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
362ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
363ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
364ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
365ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
366ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
367ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "simple_group_2", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
368ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
369ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
370ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\na.c";
371ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
372ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
373ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
374ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
375ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
376ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
377ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
378ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
379ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "separator_ln", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
380ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
381ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
382ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\ra.c";
383ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
384ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
385ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
386ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
387ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
388ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
389ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
390ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
391ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "separator_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
392ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
393ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
394ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\r\na.c";
395ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
396ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
397ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
398ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
399ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
400ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
401ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
402ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
403ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "separator_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
404ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
405ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
406ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\na.c\n";
407ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
408ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
409ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
410ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
411ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
412ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
413ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
414ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
415ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "end_ln", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
416ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
417ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
418ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\na.c\r";
419ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
420ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
421ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
422ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
423ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
424ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
425ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
426ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
427ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "end_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
428ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
429ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
430ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\na.c\r\n";
431ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
432ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
433ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
434ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
435ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
436ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
437ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
438ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
439ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "end_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
440ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
441ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
442ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\nc.d\nc.e";
443ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
444ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
445ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
446ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
447ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
448ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
449ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
450ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
451ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
452ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
453ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
454ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
455ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
456ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "two_groups", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
457ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
458ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
459ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a\nc.d\nc.e";
460ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
461ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
462ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_CASE	},
463ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
464ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::NO_MATCH		},
465ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
466ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
467ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
468ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
469ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
470ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
471ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
472ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
473ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "case_group", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
474ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
475ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
476ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "c.d\nc.e\na";
477ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
478ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
479ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_CASE	},
480ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
481ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::NO_MATCH		},
482ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
483ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
484ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
485ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
486ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
487ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
488ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
489ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
490ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "group_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
491ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
492ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
493ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.x";
494ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
495ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
496ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",												MatchCase::MATCH_GROUP	},
497ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",												MatchCase::NO_MATCH		},
498ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",											MatchCase::MATCH_GROUP	},
499ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.x",	MatchCase::MATCH_CASE	},
500ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
501ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "long_name", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
502ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
503ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
504ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	=
505ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.b.c.d.e\n"
506ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.b.c.f\n"
507ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"x.y.z\n"
508ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.b.c.d.g\n"
509ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.b.c.x\n";
510ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
511ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
512ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",				MatchCase::MATCH_GROUP	},
513ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",			MatchCase::MATCH_GROUP	},
514ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.d.e",		MatchCase::MATCH_CASE	},
515ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.d.g",		MatchCase::MATCH_CASE	},
516ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "x.y",			MatchCase::MATCH_GROUP	},
517ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "x.y.z",			MatchCase::MATCH_CASE	},
518ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.f",		MatchCase::MATCH_CASE	},
519ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.x",		MatchCase::MATCH_CASE	},
520ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
521ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "partial_prefix", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
522ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
523ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
524ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	=
525ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.a.c.d\n"
526ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.b.c.d\n";
527ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
528ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
529ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",				MatchCase::MATCH_GROUP	},
530ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",			MatchCase::MATCH_GROUP	},
531ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.d",		MatchCase::MATCH_CASE	},
532ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.d",		MatchCase::MATCH_CASE	},
533ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
534ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "reparenting", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
535ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
536ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
537ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		// Negative tests
538ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_string",			""));
539ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_line",				"\n"));
540ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name",		".test"));
541ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name",			"test."));
542ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
543ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
544ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
545ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosclass CaseListParserTests : public tcu::TestCaseGroup
546ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
547ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulospublic:
548ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	CaseListParserTests (tcu::TestContext& testCtx)
549ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		: tcu::TestCaseGroup(testCtx, "case_list_parser", "Test case list parser tests")
550ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
551ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
552ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
553ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	void init (void)
554ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
555ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new TrieParserTests(m_testCtx));
556ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new ListParserTests(m_testCtx));
557ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
558ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
559ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
560f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulosinline deUint32 ulpDiff (float a, float b)
561f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos{
562f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	const deUint32 ab = tcu::Float32(a).bits();
563f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	const deUint32 bb = tcu::Float32(b).bits();
564f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	return de::max(ab, bb) - de::min(ab, bb);
565f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos}
566f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
567f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulostemplate<int Size>
568f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulosinline tcu::Vector<deUint32, Size> ulpDiff (const tcu::Vector<float, Size>& a, const tcu::Vector<float,  Size>& b)
569f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos{
570f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	tcu::Vector<deUint32, Size> res;
571f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	for (int ndx = 0; ndx < Size; ndx++)
572f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		res[ndx] = ulpDiff(a[ndx], b[ndx]);
573f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	return res;
574f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos}
575f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
576f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulosclass ConstantInterpolationTest : public tcu::TestCase
577f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos{
578f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulospublic:
579f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	ConstantInterpolationTest (tcu::TestContext& testCtx)
580f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		: tcu::TestCase(testCtx, "const_interpolation", "Constant value interpolation")
581f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
582f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const int supportedMsaaLevels[] = {1, 2, 4, 8, 16};
583f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
584f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		for (int msaaNdx = 0; msaaNdx < DE_LENGTH_OF_ARRAY(supportedMsaaLevels); msaaNdx++)
585f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		{
586f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const int numSamples = supportedMsaaLevels[msaaNdx];
587f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
588f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				SubCase c;
589f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize	= tcu::IVec3(128, 128, numSamples);
590f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[0]	= tcu::Vec4(-1.0f, -1.0f, 0.5f, 1.0f);
591f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[1]	= tcu::Vec4(-1.0f, +1.0f, 0.5f, 1.0f);
592f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[2]	= tcu::Vec4(+1.0f, -1.0f, 0.5f, 1.0f);
593f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.varying	= tcu::Vec4(0.0f, 1.0f, 8.0f, -8.0f);
594f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_cases.push_back(c);
595f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
596f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
597f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
598f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				SubCase c;
599f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize	= tcu::IVec3(128, 128, numSamples);
600f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[0]	= tcu::Vec4(-1.0f, +1.0f, 0.5f, 1.0f);
601f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[1]	= tcu::Vec4(+1.0f, -1.0f, 0.5f, 1.0f);
602f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[2]	= tcu::Vec4(+1.0f, +1.0f, 0.5f, 1.0f);
603f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.varying	= tcu::Vec4(0.0f, 1.0f, 8.0f, -8.0f);
604f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_cases.push_back(c);
605f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
606f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
607f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				SubCase c;
608f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize	= tcu::IVec3(129, 113, numSamples);
609f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[0]	= tcu::Vec4(-1.0f, -1.0f, 0.5f, 1.0f);
610f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[1]	= tcu::Vec4(-1.0f, +1.0f, 0.5f, 1.0f);
611f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[2]	= tcu::Vec4(+1.0f, -1.0f, 0.5f, 1.0f);
612f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.varying	= tcu::Vec4(0.0f, 1.0f, 8.0f, -8.0f);
613f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_cases.push_back(c);
614f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
615f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
616f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				SubCase c;
617f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize	= tcu::IVec3(107, 131, numSamples);
618f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[0]	= tcu::Vec4(-1.0f, +1.0f, 0.5f, 1.0f);
619f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[1]	= tcu::Vec4(+1.0f, -1.0f, 0.5f, 1.0f);
620f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[2]	= tcu::Vec4(+1.0f, +1.0f, 0.5f, 1.0f);
621f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.varying	= tcu::Vec4(0.0f, 1.0f, 8.0f, -8.0f);
622f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_cases.push_back(c);
623f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
624f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		}
625f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
626f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		{
627f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			de::Random rnd(0x89423f);
628f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			for (int ndx = 0; ndx < 25; ndx++)
629f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
630f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				const float	depth	= rnd.getFloat()*2.0f - 1.0f;
631f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				SubCase		c;
632f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
633f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize.x() = rnd.getInt(16, 256);
634f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize.y() = rnd.getInt(16, 256);
635f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize.z() = rnd.choose<int>(DE_ARRAY_BEGIN(supportedMsaaLevels), DE_ARRAY_END(supportedMsaaLevels));
636f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
637f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				for (int vtxNdx = 0; vtxNdx < DE_LENGTH_OF_ARRAY(c.vtx); vtxNdx++)
638f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
639f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					c.vtx[vtxNdx].x() = rnd.getFloat()*2.0f - 1.0f;
640f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					c.vtx[vtxNdx].y() = rnd.getFloat()*2.0f - 1.0f;
641f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					c.vtx[vtxNdx].z() = depth;
642f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					c.vtx[vtxNdx].w() = 1.0f;
643f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
644f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
645f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				for (int compNdx = 0; compNdx < 4; compNdx++)
646f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
647f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					float v;
648f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					do
649f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					{
650f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						v = tcu::Float32(rnd.getUint32()).asFloat();
651f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					} while (deFloatIsInf(v) || deFloatIsNaN(v));
652f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					c.varying[compNdx] = v;
653f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
654f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_cases.push_back(c);
655f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
656f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		}
657f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
658f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
659f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	void init (void)
660f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
661f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		m_caseIter = m_cases.begin();
662f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "All iterations passed");
663f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
664f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
665f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	IterateResult iterate (void)
666f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
667f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		{
668f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			tcu::ScopedLogSection section(m_testCtx.getLog(), "SubCase", "");
669f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			runCase(*m_caseIter);
670f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		}
671f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		return (++m_caseIter != m_cases.end()) ? CONTINUE : STOP;
672f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
673f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
674f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulosprotected:
675f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	struct SubCase
676f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
677f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		tcu::IVec3	rtSize;	// (width, height, samples)
678f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		tcu::Vec4	vtx[3];
679f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		tcu::Vec4	varying;
680f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	};
681f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
682f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	void runCase (const SubCase& subCase)
683f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
684f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		using namespace tcu;
685f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
686f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const deUint32	maxColorUlpDiff	= 2;
687f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const deUint32	maxDepthUlpDiff	= 0;
688f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
689f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const int		width			= subCase.rtSize.x();
690f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const int		height			= subCase.rtSize.y();
691f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const int		numSamples		= subCase.rtSize.z();
692f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const float		zn				= 0.0f;
693f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const float		zf				= 1.0f;
694f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
695f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		TextureLevel	interpolated	(TextureFormat(TextureFormat::RGBA, TextureFormat::FLOAT), numSamples, width, height);
696f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		TextureLevel	depthStencil	(TextureFormat(TextureFormat::DS, TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV), numSamples, width, height);
697f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
698f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		m_testCtx.getLog() << TestLog::Message
699f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << "RT size (w, h, #samples) = " << subCase.rtSize << "\n"
700f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << "vtx[0] = " << subCase.vtx[0] << "\n"
701f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << "vtx[1] = " << subCase.vtx[1] << "\n"
702f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << "vtx[2] = " << subCase.vtx[2] << "\n"
703f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << "color = " << subCase.varying
704f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << TestLog::EndMessage;
705f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
706f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		clear			(interpolated.getAccess(), subCase.varying - Vec4(0.0f, 0.0f, 0.0f, 1.0f));
707f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		clearDepth		(depthStencil.getAccess(), 0.0f);
708f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		clearStencil	(depthStencil.getAccess(), 0);
709f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
710f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		{
711f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			class VtxShader : public rr::VertexShader
712f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
713f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			public:
714f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				VtxShader (void)
715f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					: rr::VertexShader(2, 1)
716f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
717f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_inputs[0].type	= rr::GENERICVECTYPE_FLOAT;
718f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_inputs[1].type	= rr::GENERICVECTYPE_FLOAT;
719f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_outputs[0].type	= rr::GENERICVECTYPE_FLOAT;
720f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
721f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
722f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const
723f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
724f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					for (int packetNdx = 0; packetNdx < numPackets; packetNdx++)
725f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					{
726f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						rr::readVertexAttrib(packets[packetNdx]->position, inputs[0], packets[packetNdx]->instanceNdx, packets[packetNdx]->vertexNdx);
727f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						packets[packetNdx]->outputs[0] = rr::readVertexAttribFloat(inputs[1], packets[packetNdx]->instanceNdx, packets[packetNdx]->vertexNdx);
728f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					}
729f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
730f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			} vtxShader;
731f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
732f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			class FragShader : public rr::FragmentShader
733f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
734f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			public:
735f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				FragShader (void)
736f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					: rr::FragmentShader(1, 1)
737f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
738f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_inputs[0].type	= rr::GENERICVECTYPE_FLOAT;
739f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_outputs[0].type	= rr::GENERICVECTYPE_FLOAT;
740f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
741f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
742f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				void shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const
743f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
744f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					for (int packetNdx = 0; packetNdx < numPackets; packetNdx++)
745f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					{
746f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						for (int fragNdx = 0; fragNdx < rr::NUM_FRAGMENTS_PER_PACKET; fragNdx++)
747f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						{
748f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const tcu::Vec4 interp = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx);
749f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, interp);
750f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						}
751f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					}
752f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
753f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			} fragShader;
754f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
755f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::Program						program			(&vtxShader, &fragShader);
756f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
757f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::MultisamplePixelBufferAccess	colorAccess		= rr::MultisamplePixelBufferAccess::fromMultisampleAccess(interpolated.getAccess());
758f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::MultisamplePixelBufferAccess	dsAccess		= rr::MultisamplePixelBufferAccess::fromMultisampleAccess(depthStencil.getAccess());
759f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::RenderTarget					renderTarget	(colorAccess, dsAccess, dsAccess);
760f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::VertexAttrib					vertexAttribs[]	=
761f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
762f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				rr::VertexAttrib(rr::VERTEXATTRIBTYPE_FLOAT, 4, 0, 0, subCase.vtx),
763f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				rr::VertexAttrib(subCase.varying)
764f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			};
765f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			rr::ViewportState						viewport		(colorAccess);
766f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			rr::RenderState							state			(viewport);
767f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::DrawCommand					drawCmd			(state, renderTarget, program, DE_LENGTH_OF_ARRAY(vertexAttribs), vertexAttribs, rr::PrimitiveList(rr::PRIMITIVETYPE_TRIANGLES, 3, 0));
768f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::Renderer						renderer;
769f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
770f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			viewport.zn	= zn;
771f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			viewport.zf	= zf;
772f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
773f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.depthTestEnabled							= true;
774f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.depthFunc									= rr::TESTFUNC_ALWAYS;
775f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.stencilTestEnabled						= true;
776f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.stencilStates[rr::FACETYPE_BACK].func		= rr::TESTFUNC_ALWAYS;
777f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.stencilStates[rr::FACETYPE_BACK].dpPass	= rr::STENCILOP_INCR;
778f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.stencilStates[rr::FACETYPE_FRONT]			= state.fragOps.stencilStates[rr::FACETYPE_BACK];
779f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
780f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			renderer.draw(drawCmd);
781f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		}
782f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
783f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		// Verify interpolated values
784f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		{
785f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			TextureLevel					resolvedColor			(interpolated.getFormat(), width, height); // For debugging
786f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			TextureLevel					resolvedDepthStencil	(depthStencil.getFormat(), width, height); // For debugging
787f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			TextureLevel					errorMask				(TextureFormat(TextureFormat::RGB, TextureFormat::UNORM_INT8), width, height);
788f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const ConstPixelBufferAccess	interpAccess			= interpolated.getAccess();
789f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const ConstPixelBufferAccess	dsAccess				= depthStencil.getAccess();
790f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const PixelBufferAccess			errorAccess				= errorMask.getAccess();
791f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			int								numCoveredSamples		= 0;
792f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			int								numFailedColorSamples	= 0;
793f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			int								numFailedDepthSamples	= 0;
794f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const bool						verifyDepth				= (subCase.vtx[0].z() == subCase.vtx[1].z()) &&
795f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos																	  (subCase.vtx[1].z() == subCase.vtx[2].z());
796f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const float						refDepth				= subCase.vtx[0].z()*(zf - zn)/2.0f + (zn + zf)/2.0f;
797f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
798fcbb91dc538f174f8798417e5a44f74ec2b092c0Jarkko Pöyry			rr::resolveMultisampleBuffer(resolvedColor.getAccess(), rr::MultisampleConstPixelBufferAccess::fromMultisampleAccess(interpolated.getAccess()));
799fcbb91dc538f174f8798417e5a44f74ec2b092c0Jarkko Pöyry			rr::resolveMultisampleBuffer(resolvedDepthStencil.getAccess(), rr::MultisampleConstPixelBufferAccess::fromMultisampleAccess(depthStencil.getAccess()));
800f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			clear(errorAccess, Vec4(0.0f, 1.0f, 0.0f, 1.0f));
801f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
802f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			for (int y = 0; y < height; y++)
803f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
804f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				for (int x = 0; x < width; x++)
805f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
806f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					for (int sampleNdx = 0; sampleNdx < numSamples; sampleNdx++)
807f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					{
808f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						if (dsAccess.getPixStencil(sampleNdx, x, y) != 0)
809f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						{
810f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const Vec4		color		= interpAccess.getPixel(sampleNdx, x, y);
811f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const UVec4		colorDiff	= ulpDiff(color, subCase.varying);
812f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const bool		colorOk		= boolAll(lessThanEqual(colorDiff, tcu::UVec4(maxColorUlpDiff)));
813f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
814f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const float		depth		= dsAccess.getPixDepth(sampleNdx, x, y);
815f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const deUint32	depthDiff	= ulpDiff(depth, refDepth);
816f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const bool		depthOk		= verifyDepth && (depthDiff <= maxDepthUlpDiff);
817f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
818f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const int		maxMsgs		= 10;
819f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
820f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							numCoveredSamples += 1;
821f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
822f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							if (!colorOk)
823f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							{
824f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos								numFailedColorSamples += 1;
825f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
826f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos								if (numFailedColorSamples <= maxMsgs)
827f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos									m_testCtx.getLog() << TestLog::Message
828f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos													   << "FAIL: " << tcu::IVec3(x, y, sampleNdx)
829f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos													   << " color ulp diff = " << colorDiff
830f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos													   << TestLog::EndMessage;
831f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							}
832f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
833f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							if (!depthOk)
834f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos								numFailedDepthSamples += 1;
835f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
836f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							if (!colorOk || !depthOk)
837f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos								errorAccess.setPixel(errorAccess.getPixel(x, y) + Vec4(1.0f, -1.0f, 0.0f, 0.0f) / float(numSamples-1), x, y);
838f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						}
839f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					}
840f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
841f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
842f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
843f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			m_testCtx.getLog() << TestLog::Image("ResolvedColor", "Resolved colorbuffer", resolvedColor)
844f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							   << TestLog::Image("ResolvedDepthStencil", "Resolved depth- & stencilbuffer", resolvedDepthStencil);
845f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
846f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			if (numFailedColorSamples != 0 || numFailedDepthSamples != 0)
847f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
848f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_testCtx.getLog() << TestLog::Image("ErrorMask", "Error mask", errorMask);
849f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
850f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				if (numFailedColorSamples != 0)
851f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_testCtx.getLog() << TestLog::Message << "FAIL: Found " << numFailedColorSamples << " invalid color samples!" << TestLog::EndMessage;
852f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
853f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				if (numFailedDepthSamples != 0)
854f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_testCtx.getLog() << TestLog::Message << "FAIL: Found " << numFailedDepthSamples << " invalid depth samples!" << TestLog::EndMessage;
855f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
856f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
857f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid samples found");
858f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
859f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
860f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			m_testCtx.getLog() << TestLog::Message << (numCoveredSamples-numFailedColorSamples) << " / " << numCoveredSamples << " color samples passed" << TestLog::EndMessage;
861f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			m_testCtx.getLog() << TestLog::Message << (numCoveredSamples-numFailedDepthSamples) << " / " << numCoveredSamples << " depth samples passed" << TestLog::EndMessage;
862f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		}
863f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
864f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
865f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	vector<SubCase>					m_cases;
866f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	vector<SubCase>::const_iterator	m_caseIter;
867f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos};
868f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CommonFrameworkTests : public tcu::TestCaseGroup
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CommonFrameworkTests (tcu::TestContext& testCtx)
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: tcu::TestCaseGroup(testCtx, "common", "Tests for the common utility framework")
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void init (void)
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new SelfCheckCase(m_testCtx, "float_format","tcu::FloatFormat_selfTest()",
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								   tcu::FloatFormat_selfTest));
881f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi		addChild(new SelfCheckCase(m_testCtx, "either","tcu::Either_selfTest()",
882f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi								   tcu::Either_selfTest));
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
886f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulosclass ReferenceRendererTests : public tcu::TestCaseGroup
887f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos{
888f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulospublic:
889f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	ReferenceRendererTests (tcu::TestContext& testCtx)
890f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		: tcu::TestCaseGroup(testCtx, "reference_renderer", "Reference renderer tests")
891f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
892f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
893f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
894f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	void init (void)
895f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
896f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		addChild(new ConstantInterpolationTest(m_testCtx));
897f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
898f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos};
899f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
900ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos} // anonymous
901ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
9023c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFrameworkTests::FrameworkTests (tcu::TestContext& testCtx)
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::TestCaseGroup(testCtx, "framework", "Miscellaneous framework tests")
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9073c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFrameworkTests::~FrameworkTests (void)
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FrameworkTests::init (void)
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
913ee2e92c10d529b2be9ef1279655f9b65a3f1a407Jarkko Pöyry	addChild(new CommonFrameworkTests	(m_testCtx));
914ee2e92c10d529b2be9ef1279655f9b65a3f1a407Jarkko Pöyry	addChild(new CaseListParserTests	(m_testCtx));
915f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	addChild(new ReferenceRendererTests	(m_testCtx));
916e2145884f87cdca749a754abfd246cdfe01ea2c1Pyry Haulos	addChild(createTextureFormatTests	(m_testCtx));
917efb83e1354edd463650ad0404b18e9a7efc307e4Pyry Haulos	addChild(createAstcTests			(m_testCtx));
9180820e8d122596ff51f723f8a4f32fa755fbbda23Pyry Haulos	addChild(createVulkanTests			(m_testCtx));
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
921e2145884f87cdca749a754abfd246cdfe01ea2c1Pyry Haulos} // dit
922