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