Waiver mechanism
authorPiotr Byszewski <piotr.byszewski@mobica.com>
Tue, 3 Mar 2020 13:51:54 +0000 (14:51 +0100)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 10 Apr 2020 09:16:21 +0000 (05:16 -0400)
Components: Framework, OpenGL, Vulkan

Affects:
 dEQP-VK.*
 cts-runner

VK-GL-CTS issue: 2222

Change-Id: I7d23400d4251f79ae3ffda80553878e95b34a5db

56 files changed:
AndroidGen.mk
CMakeLists.txt
executor/CMakeLists.txt
executor/xeDefs.cpp [deleted file]
executor/xeDefs.hpp [deleted file]
executor/xeXMLParser.cpp [deleted file]
executor/xeXMLParser.hpp [deleted file]
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl42-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl43-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl44-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl45-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl46-master.txt
external/openglcts/data/mustpass/gles/khronos_mustpass/master/waivers.xml [new file with mode: 0644]
external/openglcts/modules/common/glcSingleConfigTestPackage.cpp
external/openglcts/modules/common/glcTestPackage.cpp
external/openglcts/modules/common/glcTestPackage.hpp
external/openglcts/modules/gl/gl3cTestPackages.cpp
external/openglcts/modules/gles2/es2cTestPackage.cpp
external/openglcts/modules/gles2/es2cTestPackage.hpp
external/openglcts/modules/gles3/es3cTestPackage.cpp
external/openglcts/modules/gles3/es3cTestPackage.hpp
external/openglcts/modules/gles31/es31cTestPackage.cpp
external/openglcts/modules/gles32/es32cTestPackage.cpp
external/openglcts/modules/glesext/esextcTestPackage.cpp
external/openglcts/modules/glesext/esextcTestPackage.hpp
external/openglcts/scripts/build_mustpass.py
external/vulkancts/README.md
external/vulkancts/modules/vulkan/vktTestPackage.cpp
external/vulkancts/mustpass/AndroidTest.xml
external/vulkancts/mustpass/master/src/waivers.txt [deleted file]
external/vulkancts/mustpass/master/vk-default.txt
external/vulkancts/mustpass/master/waivers.xml [new file with mode: 0644]
external/vulkancts/scripts/build_mustpass.py
framework/CMakeLists.txt
framework/common/CMakeLists.txt
framework/common/tcuApp.cpp
framework/common/tcuCommandLine.cpp
framework/common/tcuCommandLine.hpp
framework/common/tcuResultCollector.cpp
framework/common/tcuTestSessionExecutor.cpp
framework/common/tcuTestSessionExecutor.hpp
framework/common/tcuWaiverUtil.cpp [new file with mode: 0644]
framework/common/tcuWaiverUtil.hpp [new file with mode: 0644]
framework/qphelper/qpTestLog.c
framework/qphelper/qpTestLog.h
framework/xexml/CMakeLists.txt [new file with mode: 0644]
framework/xexml/xeDefs.cpp [new file with mode: 0644]
framework/xexml/xeDefs.hpp [new file with mode: 0644]
framework/xexml/xeXMLParser.cpp [new file with mode: 0644]
framework/xexml/xeXMLParser.hpp [new file with mode: 0644]
modules/gles2/tes2TestPackage.cpp
modules/gles2/tes2TestPackage.hpp
modules/gles3/tes3TestPackage.cpp
modules/gles3/tes3TestPackage.hpp
modules/gles31/tes31TestPackage.cpp
modules/gles31/tes31TestPackage.hpp

index ea114056c603b69d21077740677fd6d1c6abc4a2..dfca23fadf91c764787a95619b669bda9af87ecc 100644 (file)
@@ -15,7 +15,6 @@ LOCAL_SRC_FILES := \
        executor/xeCallQueue.cpp \
        executor/xeCommLink.cpp \
        executor/xeContainerFormatParser.cpp \
-       executor/xeDefs.cpp \
        executor/xeLocalTcpIpLink.cpp \
        executor/xeTcpIpLink.cpp \
        executor/xeTestCase.cpp \
@@ -24,7 +23,6 @@ LOCAL_SRC_FILES := \
        executor/xeTestLogParser.cpp \
        executor/xeTestLogWriter.cpp \
        executor/xeTestResultParser.cpp \
-       executor/xeXMLParser.cpp \
        executor/xeXMLWriter.cpp \
        external/vulkancts/framework/vulkan/vkAllocationCallbackUtil.cpp \
        external/vulkancts/framework/vulkan/vkApiVersion.cpp \
@@ -494,6 +492,7 @@ LOCAL_SRC_FILES := \
        framework/common/tcuTexture.cpp \
        framework/common/tcuTextureUtil.cpp \
        framework/common/tcuThreadUtil.cpp \
+       framework/common/tcuWaiverUtil.cpp \
        framework/delibs/debase/deDefs.c \
        framework/delibs/debase/deFloat16.c \
        framework/delibs/debase/deFloat16Test.c \
index e0d7d436129d010389fce9c2ac3231630804a16a..ecb1da92137de9540cd91657c90d65f930a01a06 100644 (file)
@@ -203,6 +203,7 @@ include_directories(
        framework/randomshaders
        framework/egl
        framework/egl/wrapper
+       framework/xexml
        external/vulkancts/framework/vulkan
        )
 
index 117515a12bcd488149a379d406745a12e8e8413e..2a9704954a37828d61e7562207459a8e6e2981b5 100644 (file)
@@ -14,8 +14,6 @@ set(XECORE_SRCS
        xeCommLink.hpp
        xeContainerFormatParser.cpp
        xeContainerFormatParser.hpp
-       xeDefs.cpp
-       xeDefs.hpp
        xeLocalTcpIpLink.cpp
        xeLocalTcpIpLink.hpp
        xeTcpIpLink.cpp
@@ -32,13 +30,12 @@ set(XECORE_SRCS
        xeTestLogWriter.hpp
        xeTestResultParser.cpp
        xeTestResultParser.hpp
-       xeXMLParser.cpp
-       xeXMLParser.hpp
        xeXMLWriter.cpp
        xeXMLWriter.hpp
        )
 
 set(XECORE_LIBS
+       xexml
        xscore
        decpp
        deutil
@@ -50,6 +47,7 @@ add_library(xecore STATIC ${XECORE_SRCS})
 target_link_libraries(xecore ${XECORE_LIBS})
 
 include_directories(.)
+include_directories(../framework/xexml)
 
 if (DE_OS_IS_WIN32 OR DE_OS_IS_UNIX OR DE_OS_IS_OSX OR DE_OS_IS_ANDROID)
        add_executable(executor tools/xeCommandLineExecutor.cpp)
diff --git a/executor/xeDefs.cpp b/executor/xeDefs.cpp
deleted file mode 100644 (file)
index e773d33..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*-------------------------------------------------------------------------
- * drawElements Quality Program Test Executor
- * ------------------------------------------
- *
- * Copyright 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *//*!
- * \file
- * \brief Executor base definitions.
- *//*--------------------------------------------------------------------*/
-
-#include "xeDefs.hpp"
-
-#include <sstream>
-
-namespace xe
-{
-
-static std::string formatError (const char* message, const char* expr, const char* file, int line)
-{
-       std::ostringstream msg;
-       msg << (message ? message : "Runtime check failed") << ": ";
-       if (expr)
-               msg << '\'' << expr << '\'';
-       msg << " at " << file << ":" << line;
-       return msg.str();
-}
-
-Error::Error (const char* message, const char* expr, const char* file, int line)
-       : std::runtime_error(formatError(message, expr, file, line))
-{
-}
-
-} // xe
diff --git a/executor/xeDefs.hpp b/executor/xeDefs.hpp
deleted file mode 100644 (file)
index 735669e..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef _XEDEFS_HPP
-#define _XEDEFS_HPP
-/*-------------------------------------------------------------------------
- * drawElements Quality Program Test Executor
- * ------------------------------------------
- *
- * Copyright 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *//*!
- * \file
- * \brief Executor base definitions.
- *//*--------------------------------------------------------------------*/
-
-#include "deDefs.hpp"
-
-#include <string>
-#include <stdexcept>
-
-namespace xe
-{
-
-class Error : public std::runtime_error
-{
-public:
-       Error (const std::string& message) : std::runtime_error(message) {}
-       Error (const char* message, const char* expr, const char* file, int line);
-};
-
-class ParseError : public Error
-{
-public:
-       ParseError (const std::string& message) : Error(message) {}
-};
-
-} // xe
-
-#define XE_FAIL(MSG)                   throw xe::Error(MSG, "", __FILE__, __LINE__)
-#define XE_CHECK(X)                            do { if ((!deGetFalse() && (X)) ? DE_FALSE : DE_TRUE) throw xe::Error(NULL, #X, __FILE__, __LINE__); } while(deGetFalse())
-#define XE_CHECK_MSG(X, MSG)   do { if ((!deGetFalse() && (X)) ? DE_FALSE : DE_TRUE) throw xe::Error(MSG, #X, __FILE__, __LINE__); } while(deGetFalse())
-
-#endif // _XEDEFS_HPP
diff --git a/executor/xeXMLParser.cpp b/executor/xeXMLParser.cpp
deleted file mode 100644 (file)
index 3c39ee8..0000000
+++ /dev/null
@@ -1,573 +0,0 @@
-/*-------------------------------------------------------------------------
- * drawElements Quality Program Test Executor
- * ------------------------------------------
- *
- * Copyright 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *//*!
- * \file
- * \brief XML Parser.
- *//*--------------------------------------------------------------------*/
-
-#include "xeXMLParser.hpp"
-#include "deInt32.h"
-
-namespace xe
-{
-namespace xml
-{
-
-enum
-{
-       TOKENIZER_INITIAL_BUFFER_SIZE   = 1024
-};
-
-static inline bool isIdentifierStartChar (int ch)
-{
-       return de::inRange<int>(ch, 'a', 'z') || de::inRange<int>(ch, 'A', 'Z');
-}
-
-static inline bool isIdentifierChar (int ch)
-{
-       return isIdentifierStartChar(ch) || de::inRange<int>(ch, '0', '9') || (ch == '-') || (ch == '_');
-}
-
-static inline bool isWhitespaceChar (int ch)
-{
-       return ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n';
-}
-
-static int getNextBufferSize (int curSize, int minNewSize)
-{
-       return de::max(curSize*2, 1<<deLog2Ceil32(minNewSize));
-}
-
-Tokenizer::Tokenizer (void)
-       : m_curToken    (TOKEN_INCOMPLETE)
-       , m_curTokenLen (0)
-       , m_state               (STATE_DATA)
-       , m_buf                 (TOKENIZER_INITIAL_BUFFER_SIZE)
-{
-}
-
-Tokenizer::~Tokenizer (void)
-{
-}
-
-void Tokenizer::clear (void)
-{
-       m_curToken              = TOKEN_INCOMPLETE;
-       m_curTokenLen   = 0;
-       m_state                 = STATE_DATA;
-       m_buf.clear();
-}
-
-void Tokenizer::error (const std::string& what)
-{
-       throw ParseError(what);
-}
-
-void Tokenizer::feed (const deUint8* bytes, int numBytes)
-{
-       // Grow buffer if necessary.
-       if (m_buf.getNumFree() < numBytes)
-       {
-               m_buf.resize(getNextBufferSize(m_buf.getSize(), m_buf.getNumElements()+numBytes));
-       }
-
-       // Append to front.
-       m_buf.pushFront(bytes, numBytes);
-
-       // If we haven't parsed complete token, re-try after data feed.
-       if (m_curToken == TOKEN_INCOMPLETE)
-               advance();
-}
-
-int Tokenizer::getChar (int offset) const
-{
-       DE_ASSERT(de::inRange(offset, 0, m_buf.getNumElements()));
-
-       if (offset < m_buf.getNumElements())
-               return m_buf.peekBack(offset);
-       else
-               return END_OF_BUFFER;
-}
-
-void Tokenizer::advance (void)
-{
-       if (m_curToken != TOKEN_INCOMPLETE)
-       {
-               // Parser should not try to advance beyond end of string.
-               DE_ASSERT(m_curToken != TOKEN_END_OF_STRING);
-
-               // If current token is tag end, change state to data.
-               if (m_curToken == TOKEN_TAG_END                                         ||
-                       m_curToken == TOKEN_EMPTY_ELEMENT_END                   ||
-                       m_curToken == TOKEN_PROCESSING_INSTRUCTION_END  ||
-                       m_curToken == TOKEN_COMMENT                                             ||
-                       m_curToken == TOKEN_ENTITY)
-                       m_state = STATE_DATA;
-
-               // Advance buffer by length of last token.
-               m_buf.popBack(m_curTokenLen);
-
-               // Reset state.
-               m_curToken              = TOKEN_INCOMPLETE;
-               m_curTokenLen   = 0;
-
-               // If we hit end of string here, report it as end of string.
-               if (getChar(0) == END_OF_STRING)
-               {
-                       m_curToken              = TOKEN_END_OF_STRING;
-                       m_curTokenLen   = 1;
-                       return;
-               }
-       }
-
-       int curChar = getChar(m_curTokenLen);
-
-       for (;;)
-       {
-               if (m_state == STATE_DATA)
-               {
-                       // Advance until we hit end of buffer or tag start and treat that as data token.
-                       if (curChar == END_OF_STRING || curChar == (int)END_OF_BUFFER || curChar == '<' || curChar == '&')
-                       {
-                               if (curChar == '<')
-                                       m_state = STATE_TAG;
-                               else if (curChar == '&')
-                                       m_state = STATE_ENTITY;
-
-                               if (m_curTokenLen > 0)
-                               {
-                                       // Report data token.
-                                       m_curToken = TOKEN_DATA;
-                                       return;
-                               }
-                               else if (curChar == END_OF_STRING || curChar == (int)END_OF_BUFFER)
-                               {
-                                       // Just return incomplete token, no data parsed.
-                                       return;
-                               }
-                               else
-                               {
-                                       DE_ASSERT(m_state == STATE_TAG || m_state == STATE_ENTITY);
-                                       continue;
-                               }
-                       }
-               }
-               else
-               {
-                       // Eat all whitespace if present.
-                       if (m_curTokenLen == 0)
-                       {
-                               while (isWhitespaceChar(curChar))
-                               {
-                                       m_buf.popBack();
-                                       curChar = getChar(0);
-                               }
-                       }
-
-                       // Handle end of string / buffer.
-                       if (curChar == END_OF_STRING)
-                               error("Unexpected end of string");
-                       else if (curChar == (int)END_OF_BUFFER)
-                       {
-                               DE_ASSERT(m_curToken == TOKEN_INCOMPLETE);
-                               return;
-                       }
-
-                       if (m_curTokenLen == 0)
-                       {
-                               // Expect start of identifier, value or special tag token.
-                               if (curChar == '\'' || curChar == '"')
-                                       m_state = STATE_VALUE;
-                               else if (isIdentifierStartChar(curChar))
-                                       m_state = STATE_IDENTIFIER;
-                               else if (curChar == '<' || curChar == '?' || curChar == '/')
-                                       m_state = STATE_TAG;
-                               else if (curChar == '&')
-                                       DE_ASSERT(m_state == STATE_ENTITY);
-                               else if (curChar == '=')
-                               {
-                                       m_curToken              = TOKEN_EQUAL;
-                                       m_curTokenLen   = 1;
-                                       return;
-                               }
-                               else if (curChar == '>')
-                               {
-                                       m_curToken              = TOKEN_TAG_END;
-                                       m_curTokenLen   = 1;
-                                       return;
-                               }
-                               else
-                                       error("Unexpected character");
-                       }
-                       else if (m_state == STATE_IDENTIFIER)
-                       {
-                               if (!isIdentifierChar(curChar))
-                               {
-                                       m_curToken = TOKEN_IDENTIFIER;
-                                       return;
-                               }
-                       }
-                       else if (m_state == STATE_VALUE)
-                       {
-                               // \todo [2012-06-07 pyry] Escapes.
-                               if (curChar == '\'' || curChar == '"')
-                               {
-                                       // \todo [2012-10-17 pyry] Should we actually do the check against getChar(0)?
-                                       if (curChar != getChar(0))
-                                               error("Mismatched quote");
-                                       m_curToken               = TOKEN_STRING;
-                                       m_curTokenLen   += 1;
-                                       return;
-                               }
-                       }
-                       else if (m_state == STATE_COMMENT)
-                       {
-                               DE_ASSERT(m_curTokenLen >= 2); // 2 characters have been parsed if we are in comment state.
-
-                               if (m_curTokenLen <= 3)
-                               {
-                                       if (curChar != '-')
-                                               error("Invalid comment start");
-                               }
-                               else
-                               {
-                                       int prev2 = m_curTokenLen > 5 ? getChar(m_curTokenLen-2) : 0;
-                                       int prev1 = m_curTokenLen > 4 ? getChar(m_curTokenLen-1) : 0;
-
-                                       if (prev2 == '-' && prev1 == '-')
-                                       {
-                                               if (curChar != '>')
-                                                       error("Invalid comment end");
-                                               m_curToken               = TOKEN_COMMENT;
-                                               m_curTokenLen   += 1;
-                                               return;
-                                       }
-                               }
-                       }
-                       else if (m_state == STATE_ENTITY)
-                       {
-                               if (m_curTokenLen >= 1)
-                               {
-                                       if (curChar == ';')
-                                       {
-                                               m_curToken               = TOKEN_ENTITY;
-                                               m_curTokenLen   += 1;
-                                               return;
-                                       }
-                                       else if (!de::inRange<int>(curChar, '0', '9')   &&
-                                                        !de::inRange<int>(curChar, 'a', 'z')   &&
-                                                        !de::inRange<int>(curChar, 'A', 'Z'))
-                                               error("Invalid entity");
-                               }
-                       }
-                       else
-                       {
-                               // Special tokens are at most 2 characters.
-                               DE_ASSERT(m_state == STATE_TAG && m_curTokenLen == 1);
-
-                               int prevChar = getChar(m_curTokenLen-1);
-
-                               if (prevChar == '<')
-                               {
-                                       // Tag start.
-                                       if (curChar == '/')
-                                       {
-                                               m_curToken              = TOKEN_END_TAG_START;
-                                               m_curTokenLen   = 2;
-                                               return;
-                                       }
-                                       else if (curChar == '?')
-                                       {
-                                               m_curToken              = TOKEN_PROCESSING_INSTRUCTION_START;
-                                               m_curTokenLen   = 2;
-                                               return;
-                                       }
-                                       else if (curChar == '!')
-                                       {
-                                               m_state = STATE_COMMENT;
-                                       }
-                                       else
-                                       {
-                                               m_curToken              = TOKEN_TAG_START;
-                                               m_curTokenLen   = 1;
-                                               return;
-                                       }
-                               }
-                               else if (prevChar == '?')
-                               {
-                                       if (curChar != '>')
-                                               error("Invalid processing instruction end");
-                                       m_curToken              = TOKEN_PROCESSING_INSTRUCTION_END;
-                                       m_curTokenLen   = 2;
-                                       return;
-                               }
-                               else if (prevChar == '/')
-                               {
-                                       if (curChar != '>')
-                                               error("Invalid empty element end");
-                                       m_curToken              = TOKEN_EMPTY_ELEMENT_END;
-                                       m_curTokenLen   = 2;
-                                       return;
-                               }
-                               else
-                                       error("Could not parse special token");
-                       }
-               }
-
-               m_curTokenLen   += 1;
-               curChar                  = getChar(m_curTokenLen);
-       }
-}
-
-void Tokenizer::getString (std::string& dst) const
-{
-       DE_ASSERT(m_curToken == TOKEN_STRING);
-       dst.resize(m_curTokenLen-2);
-       for (int ndx = 0; ndx < m_curTokenLen-2; ndx++)
-               dst[ndx] = m_buf.peekBack(ndx+1);
-}
-
-Parser::Parser (void)
-       : m_element             (ELEMENT_INCOMPLETE)
-       , m_state               (STATE_DATA)
-{
-}
-
-Parser::~Parser (void)
-{
-}
-
-void Parser::clear (void)
-{
-       m_tokenizer.clear();
-       m_elementName.clear();
-       m_attributes.clear();
-       m_attribName.clear();
-       m_entityValue.clear();
-
-       m_element       = ELEMENT_INCOMPLETE;
-       m_state         = STATE_DATA;
-}
-
-void Parser::error (const std::string& what)
-{
-       throw ParseError(what);
-}
-
-void Parser::feed (const deUint8* bytes, int numBytes)
-{
-       m_tokenizer.feed(bytes, numBytes);
-
-       if (m_element == ELEMENT_INCOMPLETE)
-               advance();
-}
-
-void Parser::advance (void)
-{
-       if (m_element == ELEMENT_START)
-               m_attributes.clear();
-
-       // \note No token is advanced when element end is reported.
-       if (m_state == STATE_YIELD_EMPTY_ELEMENT_END)
-       {
-               DE_ASSERT(m_element == ELEMENT_START);
-               m_element       = ELEMENT_END;
-               m_state         = STATE_DATA;
-               return;
-       }
-
-       if (m_element != ELEMENT_INCOMPLETE)
-       {
-               m_tokenizer.advance();
-               m_element = ELEMENT_INCOMPLETE;
-       }
-
-       for (;;)
-       {
-               Token curToken = m_tokenizer.getToken();
-
-               // Skip comments.
-               while (curToken == TOKEN_COMMENT)
-               {
-                       m_tokenizer.advance();
-                       curToken = m_tokenizer.getToken();
-               }
-
-               if (curToken == TOKEN_INCOMPLETE)
-               {
-                       DE_ASSERT(m_element == ELEMENT_INCOMPLETE);
-                       return;
-               }
-
-               switch (m_state)
-               {
-                       case STATE_ENTITY:
-                               m_state = STATE_DATA;
-                               // Fall-through
-
-                       case STATE_DATA:
-                               switch (curToken)
-                               {
-                                       case TOKEN_DATA:
-                                               m_element = ELEMENT_DATA;
-                                               return;
-
-                                       case TOKEN_END_OF_STRING:
-                                               m_element = ELEMENT_END_OF_STRING;
-                                               return;
-
-                                       case TOKEN_TAG_START:
-                                               m_state = STATE_START_TAG_OPEN;
-                                               break;
-
-                                       case TOKEN_END_TAG_START:
-                                               m_state = STATE_END_TAG_OPEN;
-                                               break;
-
-                                       case TOKEN_PROCESSING_INSTRUCTION_START:
-                                               m_state = STATE_IN_PROCESSING_INSTRUCTION;
-                                               break;
-
-                                       case TOKEN_ENTITY:
-                                               m_state         = STATE_ENTITY;
-                                               m_element       = ELEMENT_DATA;
-                                               parseEntityValue();
-                                               return;
-
-                                       default:
-                                               error("Unexpected token");
-                               }
-                               break;
-
-                       case STATE_IN_PROCESSING_INSTRUCTION:
-                               if (curToken == TOKEN_PROCESSING_INSTRUCTION_END)
-                                       m_state = STATE_DATA;
-                               else
-                                       if (curToken != TOKEN_IDENTIFIER && curToken != TOKEN_EQUAL && curToken != TOKEN_STRING)
-                                               error("Unexpected token in processing instruction");
-                               break;
-
-                       case STATE_START_TAG_OPEN:
-                               if (curToken != TOKEN_IDENTIFIER)
-                                       error("Expected identifier");
-                               m_tokenizer.getTokenStr(m_elementName);
-                               m_state = STATE_ATTRIBUTE_LIST;
-                               break;
-
-                       case STATE_END_TAG_OPEN:
-                               if (curToken != TOKEN_IDENTIFIER)
-                                       error("Expected identifier");
-                               m_tokenizer.getTokenStr(m_elementName);
-                               m_state = STATE_EXPECTING_END_TAG_CLOSE;
-                               break;
-
-                       case STATE_EXPECTING_END_TAG_CLOSE:
-                               if (curToken != TOKEN_TAG_END)
-                                       error("Expected tag end");
-                               m_state         = STATE_DATA;
-                               m_element       = ELEMENT_END;
-                               return;
-
-                       case STATE_ATTRIBUTE_LIST:
-                               if (curToken == TOKEN_IDENTIFIER)
-                               {
-                                       m_tokenizer.getTokenStr(m_attribName);
-                                       m_state = STATE_EXPECTING_ATTRIBUTE_EQ;
-                               }
-                               else if (curToken == TOKEN_EMPTY_ELEMENT_END)
-                               {
-                                       m_state         = STATE_YIELD_EMPTY_ELEMENT_END;
-                                       m_element       = ELEMENT_START;
-                                       return;
-                               }
-                               else if (curToken == TOKEN_TAG_END)
-                               {
-                                       m_state         = STATE_DATA;
-                                       m_element       = ELEMENT_START;
-                                       return;
-                               }
-                               else
-                                       error("Unexpected token");
-                               break;
-
-                       case STATE_EXPECTING_ATTRIBUTE_EQ:
-                               if (curToken != TOKEN_EQUAL)
-                                       error("Expected '='");
-                               m_state = STATE_EXPECTING_ATTRIBUTE_VALUE;
-                               break;
-
-                       case STATE_EXPECTING_ATTRIBUTE_VALUE:
-                               if (curToken != TOKEN_STRING)
-                                       error("Expected value");
-                               if (hasAttribute(m_attribName.c_str()))
-                                       error("Duplicate attribute");
-
-                               m_tokenizer.getString(m_attributes[m_attribName]);
-                               m_state = STATE_ATTRIBUTE_LIST;
-                               break;
-
-                       default:
-                               DE_ASSERT(false);
-               }
-
-               m_tokenizer.advance();
-       }
-}
-
-static char getEntityValue (const std::string& entity)
-{
-       static const struct
-       {
-               const char*             name;
-               char                    value;
-       } s_entities[] =
-       {
-                       { "&lt;",                       '<' },
-                       { "&gt;",                       '>' },
-                       { "&amp;",                      '&' },
-                       { "&apos;",                     '\''},
-                       { "&quot;",                     '"' },
-       };
-
-       for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_entities); ndx++)
-       {
-               if (entity == s_entities[ndx].name)
-                       return s_entities[ndx].value;
-       }
-
-       return 0;
-}
-
-void Parser::parseEntityValue (void)
-{
-       DE_ASSERT(m_state == STATE_ENTITY && m_tokenizer.getToken() == TOKEN_ENTITY);
-
-       std::string entity;
-       m_tokenizer.getTokenStr(entity);
-
-       const char value = getEntityValue(entity);
-       if (value == 0)
-               error("Invalid entity '" + entity + "'");
-
-       m_entityValue.resize(1);
-       m_entityValue[0] = value;
-}
-
-} // xml
-} // xe
diff --git a/executor/xeXMLParser.hpp b/executor/xeXMLParser.hpp
deleted file mode 100644 (file)
index 372b219..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-#ifndef _XEXMLPARSER_HPP
-#define _XEXMLPARSER_HPP
-/*-------------------------------------------------------------------------
- * drawElements Quality Program Test Executor
- * ------------------------------------------
- *
- * Copyright 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *//*!
- * \file
- * \brief XML Parser.
- *
- * \todo [2012-06-07 pyry] Not supported / handled properly:
- *  - xml namespaces (<ns:Element>)
- *  - backslash escapes in strings
- *  - &quot; -style escapes
- *  - utf-8
- *//*--------------------------------------------------------------------*/
-
-#include "xeDefs.hpp"
-#include "deRingBuffer.hpp"
-
-#include <string>
-#include <map>
-
-namespace xe
-{
-namespace xml
-{
-
-enum Token
-{
-       TOKEN_INCOMPLETE = 0,                                   //!< Not enough data to determine token.
-       TOKEN_END_OF_STRING,                                    //!< End of document string.
-       TOKEN_DATA,                                                             //!< Block of data (anything outside tags).
-       TOKEN_COMMENT,                                                  //!< <!-- comment -->
-       TOKEN_IDENTIFIER,                                               //!< Identifier (in tags).
-       TOKEN_STRING,                                                   //!< String (in tags).
-       TOKEN_TAG_START,                                                //!< <
-       TOKEN_TAG_END,                                                  //!< >
-       TOKEN_END_TAG_START,                                    //!< </
-       TOKEN_EMPTY_ELEMENT_END,                                //!< />
-       TOKEN_PROCESSING_INSTRUCTION_START,             //!< <?
-       TOKEN_PROCESSING_INSTRUCTION_END,               //!< ?>
-       TOKEN_EQUAL,                                                    //!< =
-       TOKEN_ENTITY,                                                   //!< Entity reference, such as &amp;
-
-       TOKEN_LAST
-};
-
-enum Element
-{
-       ELEMENT_INCOMPLETE = 0, //!< Incomplete element.
-       ELEMENT_START,                  //!< Element start.
-       ELEMENT_END,                    //!< Element end.
-       ELEMENT_DATA,                   //!< Data element.
-       ELEMENT_END_OF_STRING,  //!< End of document string.
-
-       ELEMENT_LAST
-};
-
-const char* getTokenName (Token token);
-
-// \todo [2012-10-17 pyry] Add line number etc.
-class ParseError : public xe::ParseError
-{
-public:
-       ParseError (const std::string& message) : xe::ParseError(message) {}
-};
-
-class Tokenizer
-{
-public:
-                                               Tokenizer                       (void);
-                                               ~Tokenizer                      (void);
-
-       void                            clear                           (void);         //!< Resets tokenizer to initial state.
-
-       void                            feed                            (const deUint8* bytes, int numBytes);
-       void                            advance                         (void);
-
-       Token                           getToken                        (void) const            { return m_curToken;    }
-       int                                     getTokenLen                     (void) const            { return m_curTokenLen; }
-       deUint8                         getTokenByte            (int offset) const      { DE_ASSERT(m_curToken != TOKEN_INCOMPLETE && m_curToken != TOKEN_END_OF_STRING); return m_buf.peekBack(offset); }
-       void                            getTokenStr                     (std::string& dst) const;
-       void                            appendTokenStr          (std::string& dst) const;
-
-       void                            getString                       (std::string& dst) const;
-
-private:
-                                               Tokenizer                       (const Tokenizer& other);
-       Tokenizer&                      operator=                       (const Tokenizer& other);
-
-       int                                     getChar                         (int offset) const;
-
-       void                            error                           (const std::string& what);
-
-       enum State
-       {
-               STATE_DATA = 0,
-               STATE_TAG,
-               STATE_IDENTIFIER,
-               STATE_VALUE,
-               STATE_COMMENT,
-               STATE_ENTITY,
-
-               STATE_LAST
-       };
-
-       enum
-       {
-               END_OF_STRING   = 0,                    //!< End of string (0).
-               END_OF_BUFFER   = 0xffffffff    //!< End of current data buffer.
-       };
-
-       Token                                           m_curToken;                     //!< Current token.
-       int                                                     m_curTokenLen;          //!< Length of current token.
-
-       State                                           m_state;                        //!< Tokenization state.
-
-       de::RingBuffer<deUint8>         m_buf;
-};
-
-class Parser
-{
-public:
-       typedef std::map<std::string, std::string>              AttributeMap;
-       typedef AttributeMap::const_iterator                    AttributeIter;
-
-                                               Parser                          (void);
-                                               ~Parser                         (void);
-
-       void                            clear                           (void);         //!< Resets parser to initial state.
-
-       void                            feed                            (const deUint8* bytes, int numBytes);
-       void                            advance                         (void);
-
-       Element                         getElement                      (void) const                                            { return m_element;                                                                             }
-
-       // For ELEMENT_START / ELEMENT_END.
-       const char*                     getElementName          (void) const                                            { return m_elementName.c_str();                                                 }
-
-       // For ELEMENT_START.
-       bool                            hasAttribute            (const char* name) const                        { return m_attributes.find(name) != m_attributes.end(); }
-       const char*                     getAttribute            (const char* name) const                        { return m_attributes.find(name)->second.c_str();               }
-       const AttributeMap&     attributes                      (void) const                                            { return m_attributes;                                                                  }
-
-       // For ELEMENT_DATA.
-       int                                     getDataSize                     (void) const;
-       deUint8                         getDataByte                     (int offset) const;
-       void                            getDataStr                      (std::string& dst) const;
-       void                            appendDataStr           (std::string& dst) const;
-
-private:
-                                               Parser                          (const Parser& other);
-       Parser&                         operator=                       (const Parser& other);
-
-       void                            parseEntityValue        (void);
-
-       void                            error                           (const std::string& what);
-
-       enum State
-       {
-               STATE_DATA = 0,                                         //!< Initial state - assuming data or tag open.
-               STATE_ENTITY,                                           //!< Parsed entity is stored - overrides data.
-               STATE_IN_PROCESSING_INSTRUCTION,        //!< In processing instruction.
-               STATE_START_TAG_OPEN,                           //!< Start tag open.
-               STATE_END_TAG_OPEN,                                     //!< End tag open.
-               STATE_EXPECTING_END_TAG_CLOSE,          //!< Expecting end tag close.
-               STATE_ATTRIBUTE_LIST,                           //!< Expecting attribute list.
-               STATE_EXPECTING_ATTRIBUTE_EQ,           //!< Got attribute name, expecting =.
-               STATE_EXPECTING_ATTRIBUTE_VALUE,        //!< Expecting attribute value.
-               STATE_YIELD_EMPTY_ELEMENT_END,          //!< Empty element: start has been reported but not end.
-
-               STATE_LAST
-       };
-
-       Tokenizer                       m_tokenizer;
-
-       Element                         m_element;
-       std::string                     m_elementName;
-       AttributeMap            m_attributes;
-
-       State                           m_state;
-       std::string                     m_attribName;
-       std::string                     m_entityValue;          //!< Data override, such as entity value.
-};
-
-// Inline implementations
-
-inline void Tokenizer::getTokenStr (std::string& dst) const
-{
-       DE_ASSERT(m_curToken != TOKEN_INCOMPLETE && m_curToken != TOKEN_END_OF_STRING);
-       dst.resize(m_curTokenLen);
-       for (int ndx = 0; ndx < m_curTokenLen; ndx++)
-               dst[ndx] = m_buf.peekBack(ndx);
-}
-
-inline void Tokenizer::appendTokenStr (std::string& dst) const
-{
-       DE_ASSERT(m_curToken != TOKEN_INCOMPLETE && m_curToken != TOKEN_END_OF_STRING);
-
-       size_t oldLen = dst.size();
-       dst.resize(oldLen+m_curTokenLen);
-
-       for (int ndx = 0; ndx < m_curTokenLen; ndx++)
-               dst[oldLen+ndx] = m_buf.peekBack(ndx);
-}
-
-inline int Parser::getDataSize (void) const
-{
-       if (m_state != STATE_ENTITY)
-               return m_tokenizer.getTokenLen();
-       else
-               return (int)m_entityValue.size();
-}
-
-inline deUint8 Parser::getDataByte (int offset) const
-{
-       if (m_state != STATE_ENTITY)
-               return m_tokenizer.getTokenByte(offset);
-       else
-               return (deUint8)m_entityValue[offset];
-}
-
-inline void Parser::getDataStr (std::string& dst) const
-{
-       if (m_state != STATE_ENTITY)
-               return m_tokenizer.getTokenStr(dst);
-       else
-               dst = m_entityValue;
-}
-
-inline void Parser::appendDataStr (std::string& dst) const
-{
-       if (m_state != STATE_ENTITY)
-               return m_tokenizer.appendTokenStr(dst);
-       else
-               dst += m_entityValue;
-}
-
-} // xml
-} // xe
-
-#endif // _XEXMLPARSER_HPP
index 9287485a9843826c2e2eb1db14ed3f7b995d930a..a64a7f09088dd4992045c2224f4c2cc9a66312e7 100644 (file)
@@ -4084,6 +4084,7 @@ KHR-GL42.shading_language_420pack.built_in_assignment
 KHR-GL42.texture_view.gettexparameter
 KHR-GL42.texture_view.errors
 KHR-GL42.texture_view.view_sampling
+KHR-GL42.texture_view.view_classes
 KHR-GL42.texture_view.coherency
 KHR-GL42.texture_view.base_and_max_levels
 KHR-GL42.texture_view.reference_counting
index 7411192410049a161563bee047ff2f85ac1786c2..f9a3ef655aa60eeafe7bb8e83548292408342300 100644 (file)
@@ -4084,6 +4084,7 @@ KHR-GL43.shading_language_420pack.built_in_assignment
 KHR-GL43.texture_view.gettexparameter
 KHR-GL43.texture_view.errors
 KHR-GL43.texture_view.view_sampling
+KHR-GL43.texture_view.view_classes
 KHR-GL43.texture_view.coherency
 KHR-GL43.texture_view.base_and_max_levels
 KHR-GL43.texture_view.reference_counting
index 63901ab9299e829b4b1d76c0dac753fdfb264f81..1e66a37b56ae09077a40def2328f9bc8032bdecc 100644 (file)
@@ -4084,6 +4084,7 @@ KHR-GL44.shading_language_420pack.built_in_assignment
 KHR-GL44.texture_view.gettexparameter
 KHR-GL44.texture_view.errors
 KHR-GL44.texture_view.view_sampling
+KHR-GL44.texture_view.view_classes
 KHR-GL44.texture_view.coherency
 KHR-GL44.texture_view.base_and_max_levels
 KHR-GL44.texture_view.reference_counting
index f031ddd3c9f7166a7b72c4410b384d3fbf95f177..13de73c6464807a4b172781196befe067ed39ad1 100644 (file)
@@ -4085,6 +4085,7 @@ KHR-GL45.shading_language_420pack.built_in_assignment
 KHR-GL45.texture_view.gettexparameter
 KHR-GL45.texture_view.errors
 KHR-GL45.texture_view.view_sampling
+KHR-GL45.texture_view.view_classes
 KHR-GL45.texture_view.coherency
 KHR-GL45.texture_view.base_and_max_levels
 KHR-GL45.texture_view.reference_counting
index 4f1429ddc20e8c44f11302eac5551a55656bed31..a0e7c97d9c0a2894aa8f5d7f0471271a7f8c05d8 100644 (file)
@@ -4085,6 +4085,7 @@ KHR-GL46.shading_language_420pack.built_in_assignment
 KHR-GL46.texture_view.gettexparameter
 KHR-GL46.texture_view.errors
 KHR-GL46.texture_view.view_sampling
+KHR-GL46.texture_view.view_classes
 KHR-GL46.texture_view.coherency
 KHR-GL46.texture_view.base_and_max_levels
 KHR-GL46.texture_view.reference_counting
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass/master/waivers.xml b/external/openglcts/data/mustpass/gles/khronos_mustpass/master/waivers.xml
new file mode 100644 (file)
index 0000000..460b067
--- /dev/null
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<waiver_list>
+
+       <!--/*     Copyright (C) 2020 The Khronos Group Inc
+ *
+ *     Licensed under the Apache License, Version 2.0 (the "License");
+ *     you may not use this file except in compliance with the License.
+ *     You may obtain a copy of the License at
+ *
+ *          http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+*/-->
+       <!--/*
+       Each <waiver> entry must contain vendor and url string attributes.
+       Url should be a full path to gitlab issue(s).
+       Waiver tag should contain one <description> child that describes issue.
+       Waiver tag should containing one <renderer_list> child.
+       Renderer list should have one or more <r> elements containing renderer names for which this waiver was created.
+       String in <r> tags can use wildcard *.
+       Waiver tag should contain one or more <t> elements containing test paths that should be waived.
+       String in <t> tags can use wildcard *.
+
+       <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+       <xs:element name="waiver_list">
+       <xs:complexType>
+               <xs:sequence>
+                       <xs:element name="waiver" maxOccurs="unbounded">
+                       <xs:complexType>
+                               <xs:sequence>
+                                       <xs:element name="description" type="xs:string"/>
+                                       <xs:element name="renderer_list">
+                                       <xs:complexType>
+                                               <xs:sequence>
+                                                       <xs:element name="r" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
+                                               </xs:sequence>
+                                       </xs:complexType>
+                                       </xs:element>
+                                       <xs:element name="t" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
+                               </xs:sequence>
+                               <xs:attribute name="vendor" type="xs:string" use="required"/>
+                               <xs:attribute name="url" type="xs:string" use="required"/>
+                       </xs:complexType>
+                       </xs:element>
+               </xs:sequence>
+       </xs:complexType>
+       </xs:element>
+       </xs:schema>
+*/-->
+
+       <waiver vendor="ATI Technologies Inc." url="https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/1141 , https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/1190">
+               <description></description>
+               <!--TODO: plase let me know for which renderers this waiver should be defined -->
+               <renderer_list>
+                       <r>???</r>
+               </renderer_list>
+               <t>KHR-GL42.texture_view.view_classes</t>
+               <t>KHR-GL43.texture_view.view_classes</t>
+               <t>KHR-GL44.texture_view.view_classes</t>
+               <t>KHR-GL45.texture_view.view_classes</t>
+               <t>KHR-GL46.texture_view.view_classes</t>
+       </waiver>
+
+</waiver_list>
\ No newline at end of file
index b677311685ac0ea6d3ce444cbab4f1cd85175bd8..24d258376400c72fb46547b11ca2d4e825d58997 100644 (file)
@@ -28,6 +28,7 @@
 #include "glwEnums.hpp"
 #include "glwFunctions.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuWaiverUtil.hpp"
 
 #include "subgroups/glcSubgroupsTests.hpp"
 
@@ -37,7 +38,7 @@ namespace glcts
 class TestCaseWrapper : public tcu::TestCaseExecutor
 {
 public:
-       TestCaseWrapper(SingleConfigTestPackage& package);
+       TestCaseWrapper(SingleConfigTestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
        ~TestCaseWrapper(void);
 
        void init(tcu::TestCase* testCase, const std::string& path);
@@ -46,9 +47,12 @@ public:
 
 private:
        SingleConfigTestPackage& m_testPackage;
+       de::SharedPtr<tcu::WaiverUtil> m_waiverMechanism;
 };
 
-TestCaseWrapper::TestCaseWrapper(SingleConfigTestPackage& package) : m_testPackage(package)
+TestCaseWrapper::TestCaseWrapper(SingleConfigTestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
+       : m_testPackage(package)
+       , m_waiverMechanism(waiverMechanism)
 {
 }
 
@@ -56,8 +60,11 @@ TestCaseWrapper::~TestCaseWrapper(void)
 {
 }
 
-void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string&)
+void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string& path)
 {
+       if (m_waiverMechanism->isOnWaiverList(path))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        testCase->init();
 }
 
@@ -134,7 +141,7 @@ void SingleConfigTestPackage::init(void)
 
 tcu::TestCaseExecutor* SingleConfigTestPackage::createExecutor(void) const
 {
-       return new TestCaseWrapper(const_cast<SingleConfigTestPackage&>(*this));
+       return new TestCaseWrapper(const_cast<SingleConfigTestPackage&>(*this), m_waiverMechanism);
 }
 
 } // glcts
index fc7078c5f8921b3e641812d962f0698d85ec92b3..5d2be56b1461a9d90f7c84ad6a4d4c69063fa8a0 100644 (file)
  */ /*-------------------------------------------------------------------*/
 
 #include "glcTestPackage.hpp"
+#include "gluContextInfo.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
+#include "tcuWaiverUtil.hpp"
+#include "glwEnums.hpp"
 
 namespace deqp
 {
 
 PackageContext::PackageContext(tcu::TestContext& testCtx, glu::ContextType renderContextType)
-       : m_context(testCtx, renderContextType), m_caseWrapper(m_context)
+       : m_context                     (testCtx, renderContextType)
+       , m_caseWrapper         (m_context)
 {
 }
 
@@ -38,10 +44,11 @@ PackageContext::~PackageContext(void)
 
 TestPackage::TestPackage(tcu::TestContext& testCtx, const char* name, const char* description,
                                                 glu::ContextType renderContextType, const char* resourcesPath)
-       : tcu::TestPackage(testCtx, name, description)
-       , m_renderContextType(renderContextType)
-       , m_packageCtx(DE_NULL)
-       , m_archive(testCtx.getRootArchive(), resourcesPath)
+       : tcu::TestPackage              (testCtx, name, description)
+       , m_waiverMechanism             (new tcu::WaiverUtil)
+       , m_renderContextType   (renderContextType)
+       , m_packageCtx                  (DE_NULL)
+       , m_archive                             (testCtx.getRootArchive(), resourcesPath)
 {
 }
 
@@ -58,6 +65,15 @@ void TestPackage::init(void)
        {
                // Create context
                m_packageCtx = new PackageContext(m_testCtx, m_renderContextType);
+
+               // Setup waiver mechanism
+               if (m_testCtx.getCommandLine().getRunMode() == tcu::RUNMODE_EXECUTE)
+               {
+                       Context&                                context         = m_packageCtx->getContext();
+                       const glu::ContextInfo& contextInfo = context.getContextInfo();
+                       m_waiverMechanism->setup(context.getTestContext().getCommandLine().getWaiverFileName(), m_name,
+                                                                        contextInfo.getString(GL_VENDOR), contextInfo.getString(GL_RENDERER));
+               }
        }
        catch (...)
        {
index 91707880cc6975899b5c389f3085664996467c84..2e96ec7115038ff01e0cca996969c5ecb2796b0a 100644 (file)
 #include "tcuDefs.hpp"
 #include "tcuResource.hpp"
 #include "tcuTestPackage.hpp"
+#include "deSharedPtr.hpp"
+
+namespace tcu
+{
+       class WaiverUtil;
+};
 
 namespace deqp
 {
@@ -77,14 +83,16 @@ public:
                return m_packageCtx->getContext();
        }
 
+protected:
+       de::SharedPtr<tcu::WaiverUtil> m_waiverMechanism;
+
 private:
        TestPackage(const TestPackage& other);
        TestPackage& operator=(const TestPackage& other);
 
-       glu::ContextType m_renderContextType;
-
-       PackageContext*         m_packageCtx;
-       tcu::ResourcePrefix m_archive;
+       glu::ContextType                                m_renderContextType;
+       PackageContext*                                 m_packageCtx;
+       tcu::ResourcePrefix                             m_archive;
 };
 
 } // deqp
index 649824b4f9260188fb4b5b9896795017484cdfb7..88173d8a0dd49ec21dfc17d029f6be7e6eed7523 100644 (file)
@@ -49,6 +49,7 @@
 #include "glcNearestEdgeTests.hpp"
 #include "gluStateReset.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuWaiverUtil.hpp"
 
 #include "../glesext/texture_shadow_lod/esextcTextureShadowLodFunctionsTest.hpp"
 
@@ -58,7 +59,7 @@ namespace gl3cts
 class TestCaseWrapper : public tcu::TestCaseExecutor
 {
 public:
-       TestCaseWrapper(GL30TestPackage& package);
+       TestCaseWrapper(GL30TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
        ~TestCaseWrapper(void);
 
        void init(tcu::TestCase* testCase, const std::string& path);
@@ -66,10 +67,13 @@ public:
        tcu::TestNode::IterateResult iterate(tcu::TestCase* testCase);
 
 private:
-       GL30TestPackage& m_testPackage;
+       GL30TestPackage&                                m_testPackage;
+       de::SharedPtr<tcu::WaiverUtil>  m_waiverMechanism;
 };
 
-TestCaseWrapper::TestCaseWrapper(GL30TestPackage& package) : m_testPackage(package)
+TestCaseWrapper::TestCaseWrapper(GL30TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
+       : m_testPackage                 (package)
+       , m_waiverMechanism             (waiverMechanism)
 {
 }
 
@@ -77,8 +81,11 @@ TestCaseWrapper::~TestCaseWrapper(void)
 {
 }
 
-void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string&)
+void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string& path)
 {
+       if (m_waiverMechanism->isOnWaiverList(path))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        testCase->init();
 }
 
@@ -175,7 +182,7 @@ void GL30TestPackage::init(void)
 
 tcu::TestCaseExecutor* GL30TestPackage::createExecutor(void) const
 {
-       return new TestCaseWrapper(const_cast<GL30TestPackage&>(*this));
+       return new TestCaseWrapper(const_cast<GL30TestPackage&>(*this), m_waiverMechanism);
 }
 
 // GL31TestPackage
index d6421b0dcf3c7cf301bfab9d0cadd5963d2e2e0d..2ff3317e189d0e2f083d23d48e9b6d751303bd9d 100644 (file)
@@ -33,6 +33,7 @@
 #include "glwEnums.hpp"
 #include "glwFunctions.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuWaiverUtil.hpp"
 
 namespace es2cts
 {
@@ -40,7 +41,7 @@ namespace es2cts
 class TestCaseWrapper : public tcu::TestCaseExecutor
 {
 public:
-       TestCaseWrapper(TestPackage& package);
+       TestCaseWrapper(TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
        ~TestCaseWrapper(void);
 
        void init(tcu::TestCase* testCase, const std::string& path);
@@ -49,9 +50,12 @@ public:
 
 private:
        es2cts::TestPackage& m_testPackage;
+       de::SharedPtr<tcu::WaiverUtil> m_waiverMechanism;
 };
 
-TestCaseWrapper::TestCaseWrapper(TestPackage& package) : m_testPackage(package)
+TestCaseWrapper::TestCaseWrapper(TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
+       : m_testPackage(package)
+       , m_waiverMechanism(waiverMechanism)
 {
 }
 
@@ -59,8 +63,11 @@ TestCaseWrapper::~TestCaseWrapper(void)
 {
 }
 
-void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string&)
+void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string& path)
 {
+       if (m_waiverMechanism->isOnWaiverList(path))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        glu::resetState(m_testPackage.getContext().getRenderContext(), m_testPackage.getContext().getContextInfo());
 
        testCase->init();
@@ -156,7 +163,7 @@ void TestPackage::init(void)
 
 tcu::TestCaseExecutor* TestPackage::createExecutor(void) const
 {
-       return new TestCaseWrapper(const_cast<TestPackage&>(*this));
+       return new TestCaseWrapper(const_cast<TestPackage&>(*this), m_waiverMechanism);
 }
 
 } // es2cts
index a310a2c87cb4bf0870dd0a6c5f20b0d010480637..7a0639ed30e19f3eac100f3d6ccbe1cf6f5d7e51 100644 (file)
 #ifndef _GLCTESTPACKAGE_HPP
 #include "glcTestPackage.hpp"
 #endif
+#ifndef _DESHAREDPTR_HPP
+#include "deSharedPtr.hpp"
+#endif
+
+namespace tcu
+{
+       class WaiverUtil;
+};
 
 namespace es2cts
 {
index b6aa9ae12e92fe7d8e6a7d18eb0039c9c3941631..1971b094452e43156a17d4fa61909233f72dd241 100644 (file)
@@ -49,6 +49,7 @@
 #include "glwEnums.hpp"
 #include "glwFunctions.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuWaiverUtil.hpp"
 
 namespace es3cts
 {
@@ -56,7 +57,7 @@ namespace es3cts
 class TestCaseWrapper : public tcu::TestCaseExecutor
 {
 public:
-       TestCaseWrapper(ES30TestPackage& package);
+       TestCaseWrapper(ES30TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
        ~TestCaseWrapper(void);
 
        void init(tcu::TestCase* testCase, const std::string& path);
@@ -65,9 +66,11 @@ public:
 
 private:
        ES30TestPackage& m_testPackage;
+       de::SharedPtr<tcu::WaiverUtil> m_waiverMechanism;
 };
 
-TestCaseWrapper::TestCaseWrapper(ES30TestPackage& package) : m_testPackage(package)
+TestCaseWrapper::TestCaseWrapper(ES30TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
+       : m_testPackage(package), m_waiverMechanism(waiverMechanism)
 {
 }
 
@@ -75,8 +78,11 @@ TestCaseWrapper::~TestCaseWrapper(void)
 {
 }
 
-void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string&)
+void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string& path)
 {
+       if (m_waiverMechanism->isOnWaiverList(path))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        glu::resetState(m_testPackage.getContext().getRenderContext(), m_testPackage.getContext().getContextInfo());
 
        testCase->init();
@@ -192,7 +198,7 @@ void ES30TestPackage::init(void)
 
 tcu::TestCaseExecutor* ES30TestPackage::createExecutor(void) const
 {
-       return new TestCaseWrapper(const_cast<ES30TestPackage&>(*this));
+       return new TestCaseWrapper(const_cast<ES30TestPackage&>(*this), m_waiverMechanism);
 }
 
 } // es3cts
index def8500342c184f55f973fb03172e66515f1932f..9b6f369b300cb4ba58b3f8e1edd09af0509a501e 100644 (file)
 
 #include "glcTestPackage.hpp"
 #include "tcuDefs.hpp"
+#include "deSharedPtr.hpp"
+
+namespace tcu
+{
+       class WaiverUtil;
+};
 
 namespace es3cts
 {
index 2a84ce7a1c868e36a8db9b7a4e654161bbae94ea..3ed6536572db7ea7ff5e08cfe542d033c33519d7 100644 (file)
 #include "glcNearestEdgeTests.hpp"
 
 #include "gluStateReset.hpp"
+#include "gluContextInfo.hpp"
+#include "tcuCommandLine.hpp"
+#include "tcuWaiverUtil.hpp"
+#include "glwEnums.hpp"
 
 #include "../glesext/draw_buffers_indexed/esextcDrawBuffersIndexedTests.hpp"
 #include "../glesext/geometry_shader/esextcGeometryShaderTests.hpp"
@@ -74,7 +78,7 @@ namespace es31cts
 class TestCaseWrapper : public tcu::TestCaseExecutor
 {
 public:
-       TestCaseWrapper(ES31TestPackage& package);
+       TestCaseWrapper(ES31TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
        ~TestCaseWrapper(void);
 
        void init(tcu::TestCase* testCase, const std::string& path);
@@ -83,9 +87,11 @@ public:
 
 private:
        ES31TestPackage& m_testPackage;
+       de::SharedPtr<tcu::WaiverUtil> m_waiverMechanism;
 };
 
-TestCaseWrapper::TestCaseWrapper(ES31TestPackage& package) : m_testPackage(package)
+TestCaseWrapper::TestCaseWrapper(ES31TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
+       : m_testPackage(package), m_waiverMechanism(waiverMechanism)
 {
 }
 
@@ -93,8 +99,11 @@ TestCaseWrapper::~TestCaseWrapper(void)
 {
 }
 
-void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string&)
+void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string& path)
 {
+       if (m_waiverMechanism->isOnWaiverList(path))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        glu::resetState(m_testPackage.getContext().getRenderContext(), m_testPackage.getContext().getContextInfo());
 
        testCase->init();
@@ -228,7 +237,7 @@ void ES31TestPackage::init(void)
 
 tcu::TestCaseExecutor* ES31TestPackage::createExecutor(void) const
 {
-       return new TestCaseWrapper(const_cast<ES31TestPackage&>(*this));
+       return new TestCaseWrapper(const_cast<ES31TestPackage&>(*this), m_waiverMechanism);
 }
 
 } // es31cts
index db3e6713a9dee04710abf3ac8b0618941bfb3e34..ab4fd0e0b0c36f4dbe169e23ea2a88044fd21ecd 100644 (file)
@@ -45,6 +45,7 @@
 #include "glwEnums.hpp"
 #include "glwFunctions.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuWaiverUtil.hpp"
 
 #include "../glesext/draw_buffers_indexed/esextcDrawBuffersIndexedTests.hpp"
 #include "../glesext/geometry_shader/esextcGeometryShaderTests.hpp"
@@ -61,7 +62,7 @@ namespace es32cts
 class TestCaseWrapper : public tcu::TestCaseExecutor
 {
 public:
-       TestCaseWrapper(ES32TestPackage& package);
+       TestCaseWrapper(ES32TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
        ~TestCaseWrapper(void);
 
        void init(tcu::TestCase* testCase, const std::string& path);
@@ -69,10 +70,13 @@ public:
        tcu::TestNode::IterateResult iterate(tcu::TestCase* testCase);
 
 private:
-       ES32TestPackage& m_testPackage;
+       ES32TestPackage&                                m_testPackage;
+       de::SharedPtr<tcu::WaiverUtil>  m_waiverMechanism;
 };
 
-TestCaseWrapper::TestCaseWrapper(ES32TestPackage& package) : m_testPackage(package)
+TestCaseWrapper::TestCaseWrapper(ES32TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
+       : m_testPackage         (package)
+       , m_waiverMechanism     (waiverMechanism)
 {
 }
 
@@ -80,8 +84,11 @@ TestCaseWrapper::~TestCaseWrapper(void)
 {
 }
 
-void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string&)
+void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string& path)
 {
+       if (m_waiverMechanism->isOnWaiverList(path))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        testCase->init();
 }
 
@@ -181,7 +188,7 @@ void ES32TestPackage::init(void)
 
 tcu::TestCaseExecutor* ES32TestPackage::createExecutor(void) const
 {
-       return new TestCaseWrapper(const_cast<ES32TestPackage&>(*this));
+       return new TestCaseWrapper(const_cast<ES32TestPackage&>(*this), m_waiverMechanism);
 }
 
 } // es32cts
index 87f65e40c3982d65e1f048d0edc135475d32305b..4e507c558a1764bfec4334ef09eea03ee1111a54 100644 (file)
@@ -36,6 +36,7 @@
 #include "glcViewportArrayTests.hpp"
 #include "gluStateReset.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuWaiverUtil.hpp"
 
 namespace esextcts
 {
@@ -43,7 +44,7 @@ namespace esextcts
 class TestCaseWrapper : public tcu::TestCaseExecutor
 {
 public:
-       TestCaseWrapper(ESEXTTestPackage& package);
+       TestCaseWrapper(ESEXTTestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
        ~TestCaseWrapper(void);
 
        void init(tcu::TestCase* testCase, const std::string& path);
@@ -52,9 +53,11 @@ public:
 
 private:
        ESEXTTestPackage& m_testPackage;
+       de::SharedPtr<tcu::WaiverUtil> m_waiverMechanism;
 };
 
-TestCaseWrapper::TestCaseWrapper(ESEXTTestPackage& package) : m_testPackage(package)
+TestCaseWrapper::TestCaseWrapper(ESEXTTestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
+       : m_testPackage(package), m_waiverMechanism(waiverMechanism)
 {
 }
 
@@ -62,8 +65,11 @@ TestCaseWrapper::~TestCaseWrapper(void)
 {
 }
 
-void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string&)
+void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string& path)
 {
+       if (m_waiverMechanism->isOnWaiverList(path))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        glu::resetState(m_testPackage.getContext().getRenderContext(), m_testPackage.getContext().getContextInfo());
 
        testCase->init();
@@ -149,7 +155,7 @@ void ESEXTTestPackage::init(void)
 
 tcu::TestCaseExecutor* ESEXTTestPackage::createExecutor(void) const
 {
-       return new TestCaseWrapper(const_cast<ESEXTTestPackage&>(*this));
+       return new TestCaseWrapper(const_cast<ESEXTTestPackage&>(*this), m_waiverMechanism);
 }
 
 } // esextcts
index 3302d8d2fd23b1d4e5c09d744ac1171e9538062d..8aa80322072b79bf098aa162caed6ce03e22d11b 100644 (file)
 #include "glcTestCase.hpp"
 #include "glcTestPackage.hpp"
 #include "tcuDefs.hpp"
+#include "deSharedPtr.hpp"
+
+namespace tcu
+{
+class WaiverUtil;
+};
 
 namespace esextcts
 {
index 2137a0076e9c07f34a92335510faaca41c7c05d5..217a735ab8203bc7e712a0d7e6ff06669ec22f24 100644 (file)
@@ -1074,13 +1074,13 @@ GL_CTS_KHR_MP_SINGLE_DEVICE_DIR         = "gl_cts/data/mustpass/gl/khronos_mustpass_sin
 GL_CTS_KHR_SINGLE_PROJECT                      = Project(name = "Khronos Mustpass GL Single Config", path = GL_CTS_KHR_MP_SINGLE_DATA_DIR, incpath = GL_CTS_MP_INC_DIR, devicepath = GL_CTS_KHR_MP_SINGLE_DEVICE_DIR, copyright = COPYRIGHT_DECLARATION)
 
 GL_MODULES                                                     = OrderedDict([
-                       ('KHR-GL46',            ['master',              [include('gl46-master.txt'), exclude('gl46-test-issues.txt'), exclude('gl46-waivers.txt')]]),
-                       ('KHR-GL45',            ['master',              [include('gl45-master.txt'), exclude('gl45-test-issues.txt'), exclude('gl45-waivers.txt')]]),
-                       ('KHR-GL44',            ['master',              [include('gl44-master.txt'), exclude('gl44-test-issues.txt'), exclude('gl44-waivers.txt')]]),
-                       ('KHR-GL43',            ['master',              [include('gl43-master.txt'), exclude('gl43-test-issues.txt'), exclude('gl43-waivers.txt')]]),
-                       ('KHR-GL42',            ['master',              [include('gl42-master.txt'), exclude('gl42-test-issues.txt'), exclude('gl42-waivers.txt')]]),
-                       ('KHR-GL41',            ['master',              [include('gl41-master.txt'), exclude('gl41-test-issues.txt'), exclude('gl41-waivers.txt')]]),
-                       ('KHR-GL40',            ['master',              [include('gl40-master.txt'), exclude('gl40-test-issues.txt'), exclude('gl40-waivers.txt')]]),
+                       ('KHR-GL46',            ['master',              [include('gl46-master.txt'), exclude('gl46-test-issues.txt')]]),
+                       ('KHR-GL45',            ['master',              [include('gl45-master.txt'), exclude('gl45-test-issues.txt')]]),
+                       ('KHR-GL44',            ['master',              [include('gl44-master.txt'), exclude('gl44-test-issues.txt')]]),
+                       ('KHR-GL43',            ['master',              [include('gl43-master.txt'), exclude('gl43-test-issues.txt')]]),
+                       ('KHR-GL42',            ['master',              [include('gl42-master.txt'), exclude('gl42-test-issues.txt')]]),
+                       ('KHR-GL41',            ['master',              [include('gl41-master.txt'), exclude('gl41-test-issues.txt')]]),
+                       ('KHR-GL40',            ['master',              [include('gl40-master.txt'), exclude('gl40-test-issues.txt')]]),
                        ('KHR-GL33',            ['master',              [include('gl33-master.txt'), exclude('gl33-test-issues.txt')]]),
                        ('KHR-GL32',            ['master',              [include('gl32-master.txt'), exclude('gl32-test-issues.txt')]]),
                        ('KHR-GL31',            ['master',              [include('gl31-master.txt'), exclude('gl31-test-issues.txt')]]),
index 3876334a7e8aa6e72b6bf6790d2253d7d682dbe0..ccc8c862732778483d93baa92707cbbd54fe1e7d 100644 (file)
@@ -165,6 +165,11 @@ and a list of mandatory information tests for each fraction must be supplied:
 
        --deqp-fraction-mandatory-caselist-file=<vulkancts>external/vulkancts/mustpass/master/vk-fraction-mandatory-tests.txt
 
+To specify file containing waived tests that are omitted only by specified vendor and renderer/device
+the following command line option may be used:
+
+       --deqp-waiver-file=<path>
+
 No other command line options are allowed.
 
 ### Win32
@@ -315,6 +320,7 @@ codes are allowed:
        NotSupported
        QualityWarning
        CompatibilityWarning
+       Waiver
 
 Submission package can be verified using `external/vulkancts/scripts/verify_submission.py`
 script. The script takes two arguments: path to extracted submission package
index 9c4c92338f9292d392fd899c122a470ea1e3b812..30405832466ba1c638e2ad33201c3dcdf097a71f 100644 (file)
@@ -27,6 +27,7 @@
 #include "tcuTestCase.hpp"
 #include "tcuTestLog.hpp"
 #include "tcuCommandLine.hpp"
+#include "tcuWaiverUtil.hpp"
 
 #include "vkPlatform.hpp"
 #include "vkPrograms.hpp"
@@ -98,6 +99,7 @@
 #include "vktImagelessFramebufferTests.hpp"
 #include "vktFragmentShaderInterlockTests.hpp"
 #include "vktShaderClockTests.hpp"
+#include "vktShaderClockTests.hpp"
 
 #include <vector>
 #include <sstream>
@@ -211,6 +213,8 @@ private:
 
        const UniquePtr<vk::DebugReportRecorder>        m_debugReportRecorder;
        const UniquePtr<vk::RenderDocUtil>                      m_renderDoc;
+       vk::VkPhysicalDeviceProperties                          m_deviceProperties;
+       tcu::WaiverUtil                                                         m_waiverMechanism;
 
        TestInstance*                                                           m_instance;                     //!< Current test case instance
 };
@@ -220,6 +224,16 @@ static MovePtr<vk::Library> createLibrary (tcu::TestContext& testCtx)
        return MovePtr<vk::Library>(testCtx.getPlatform().getVulkanPlatform().createLibrary());
 }
 
+static vk::VkPhysicalDeviceProperties getPhysicalDeviceProperties(vkt::Context& context)
+{
+       const vk::InstanceInterface&    vki                             = context.getInstanceInterface();
+       const vk::VkPhysicalDevice              physicalDevice  = context.getPhysicalDevice();
+
+       vk::VkPhysicalDeviceProperties  properties;
+       vki.getPhysicalDeviceProperties(physicalDevice, &properties);
+       return properties;
+}
+
 TestCaseExecutor::TestCaseExecutor (tcu::TestContext& testCtx)
        : m_prebuiltBinRegistry (testCtx.getArchive(), "vulkan/prebuilt")
        , m_library                             (createLibrary(testCtx))
@@ -232,8 +246,11 @@ TestCaseExecutor::TestCaseExecutor (tcu::TestContext& testCtx)
        , m_renderDoc                   (testCtx.getCommandLine().isRenderDocEnabled()
                                                         ? MovePtr<vk::RenderDocUtil>(new vk::RenderDocUtil())
                                                         : MovePtr<vk::RenderDocUtil>(DE_NULL))
+       , m_deviceProperties    (getPhysicalDeviceProperties(m_context))
        , m_instance                    (DE_NULL)
 {
+       m_waiverMechanism.setup(testCtx.getCommandLine().getWaiverFileName(), "dEQP-VK",
+                                                       m_deviceProperties.vendorID, m_deviceProperties.deviceID);
 }
 
 TestCaseExecutor::~TestCaseExecutor (void)
@@ -259,6 +276,9 @@ void TestCaseExecutor::init (tcu::TestCase* testCase, const std::string& casePat
        if (!vktCase)
                TCU_THROW(InternalError, "Test node not an instance of vkt::TestCase");
 
+       if (m_waiverMechanism.isOnWaiverList(casePath))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        vktCase->checkSupport(m_context);
 
        vktCase->delayedInit();
index 63fbf686a5c3cf0d240480d266ccd9a01ce5400d..be4eece3e35f719eb0e14e8abd8e750a62ce5174 100644 (file)
                <option name="deqp-package" value="dEQP-VK"/>
                <option name="deqp-caselist-file" value="vk-default.txt"/>
        </test>
-       <test class="com.drawelements.deqp.runner.DeqpTestRunner">
-               <option name="deqp-package" value="dEQP-VK"/>
-               <option name="deqp-caselist-file" value="vk-default-no-waivers.txt"/>
-       </test>
        <test class="com.drawelements.deqp.runner.DeqpTestRunner">
                <option name="deqp-package" value="dEQP-VK"/>
                <option name="deqp-caselist-file" value="vk-fraction-mandatory-tests.txt"/>
diff --git a/external/vulkancts/mustpass/master/src/waivers.txt b/external/vulkancts/mustpass/master/src/waivers.txt
deleted file mode 100644 (file)
index c82dc69..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-#
-# VK-GL-CTS Issue #336
-#
-# This occurs on some versions of Imagination Technologies G6200, G6230, G6400, and G6430
-# Rogue Series 6 GPU's.
-#
-# The affected GPU's are unable to correctly filter CEM corners with F32 textures, this
-# includes the ability to gather texels for texel gather instructions.
-#
-# An application using gather on an F32 texture would obtain incorrect texel values around
-# the corners of the cubemap.
-#
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.clamp_to_edge_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.sparse_clamp_to_edge_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.repeat_mirrored_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.sparse_repeat_mirrored_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.sparse_mirrored_repeat_clamp_to_edge
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.sparse_clamp_to_edge_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.sparse_repeat_mirrored_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.sparse_mirrored_repeat_clamp_to_edge
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.clamp_to_edge_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.sparse_clamp_to_edge_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.repeat_mirrored_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.sparse_repeat_mirrored_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.sparse_mirrored_repeat_clamp_to_edge
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.sparse_clamp_to_edge_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.sparse_repeat_mirrored_repeat
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.sparse_mirrored_repeat_clamp_to_edge
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_linear_mag_linear
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_linear_mag_linear
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_nearest_mipmap_nearest_mag_linear
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_nearest_mipmap_linear_mag_linear
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_linear_mipmap_nearest_mag_linear
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_linear_mipmap_linear_mag_linear
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.level_1
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.sparse_level_1
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.level_2
-dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.sparse_level_2
-
-
-#
-# VK-GL-CTS Issue #757
-#
-# This occurs on some versions of Broadcom's Videocore GPUs. On affected devices depth clipping
-# is incorrectly disabled when the viewport minDepth is equal to maxDepth.
-#
-dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_deltazero
-
-#
-# VK-GL-CTS Issue #1356
-#
-# This occurs on NVIDIA Kepler GPUs. The affected GPUs are unable to reliably synchronize memory
-# accesses at device scope.
-#
-dEQP-VK.memory_model.*core11*.device.*
-
index 38ead4a7800c0ff3f868a1cafe0b3146c94f7cce..13c65567c7eaa0368bcd7f02d763927d34d0bea2 100644 (file)
@@ -353666,6 +353666,30 @@ dEQP-VK.glsl.texture_gather.basic.cube.rgba8i.base_level.level_1
 dEQP-VK.glsl.texture_gather.basic.cube.rgba8i.base_level.sparse_level_1
 dEQP-VK.glsl.texture_gather.basic.cube.rgba8i.base_level.level_2
 dEQP-VK.glsl.texture_gather.basic.cube.rgba8i.base_level.sparse_level_2
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.clamp_to_edge_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.sparse_clamp_to_edge_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.repeat_mirrored_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.sparse_repeat_mirrored_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.sparse_mirrored_repeat_clamp_to_edge
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.sparse_clamp_to_edge_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.sparse_repeat_mirrored_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.sparse_mirrored_repeat_clamp_to_edge
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.clamp_to_edge_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.sparse_clamp_to_edge_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.repeat_mirrored_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.sparse_repeat_mirrored_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.sparse_mirrored_repeat_clamp_to_edge
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.sparse_clamp_to_edge_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.sparse_repeat_mirrored_repeat
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.sparse_mirrored_repeat_clamp_to_edge
 dEQP-VK.glsl.texture_gather.basic.cube.depth32f.no_corners.size_pot.compare_less.clamp_to_edge_repeat
 dEQP-VK.glsl.texture_gather.basic.cube.depth32f.no_corners.size_pot.compare_less.sparse_clamp_to_edge_repeat
 dEQP-VK.glsl.texture_gather.basic.cube.depth32f.no_corners.size_pot.compare_less.repeat_mirrored_repeat
@@ -353690,6 +353714,20 @@ dEQP-VK.glsl.texture_gather.basic.cube.depth32f.no_corners.size_npot.compare_gre
 dEQP-VK.glsl.texture_gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.sparse_repeat_mirrored_repeat
 dEQP-VK.glsl.texture_gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-VK.glsl.texture_gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.sparse_mirrored_repeat_clamp_to_edge
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_linear_mag_linear
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_linear_mag_linear
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_nearest_mipmap_nearest_mag_linear
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_nearest_mipmap_linear_mag_linear
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_linear_mipmap_nearest_mag_linear
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_linear_mipmap_linear_mag_linear
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.level_1
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.sparse_level_1
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.level_2
+dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.sparse_level_2
 dEQP-VK.glsl.texture_gather.offset.min_required_offset.2d.rgba8.size_pot.clamp_to_edge_repeat
 dEQP-VK.glsl.texture_gather.offset.min_required_offset.2d.rgba8.size_pot.sparse_clamp_to_edge_repeat
 dEQP-VK.glsl.texture_gather.offset.min_required_offset.2d.rgba8.size_pot.repeat_mirrored_repeat
@@ -416493,6 +416531,7 @@ dEQP-VK.draw.inverted_depth_ranges.depthclamp_deltazero
 dEQP-VK.draw.inverted_depth_ranges.depthclamp_deltasmall
 dEQP-VK.draw.inverted_depth_ranges.depthclamp_deltaone
 dEQP-VK.draw.inverted_depth_ranges.depthclamp_depth_range_unrestricted
+dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_deltazero
 dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_deltasmall
 dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_deltaone
 dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_depth_range_unrestricted
@@ -574141,6 +574180,63 @@ dEQP-VK.device_group.sfr_tessellated
 dEQP-VK.device_group.sfr_tessellated_linefill
 dEQP-VK.device_group.afr_tessellated
 dEQP-VK.device_group.afr_tessellated_linefill
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.buffer.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.buffer.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.buffer.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.image.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.image.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.image.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.workgroup.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.buffer.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.buffer.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.buffer.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.image.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.image.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.image.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.buffer.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.buffer.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.buffer.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.image.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.image.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.image.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.workgroup.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.buffer.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.buffer.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.buffer.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.image.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.image.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.image.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_nonlocal.buffer.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_nonlocal.image.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_nonlocal.workgroup.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_local.buffer.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_local.image.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.buffer.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.buffer.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.buffer.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.image.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.image.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.image.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.workgroup.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.buffer.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.buffer.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.buffer.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.image.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.image.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.image.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.buffer.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.buffer.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.buffer.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.image.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.image.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.image.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.workgroup.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.buffer.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.buffer.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.buffer.frag
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.image.comp
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.image.vert
+dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.image.frag
 dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.workgroup.payload_nonlocal.buffer.guard_nonlocal.buffer.comp
 dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.workgroup.payload_nonlocal.buffer.guard_nonlocal.image.comp
 dEQP-VK.memory_model.message_passing.core11.u32.coherent.fence_fence.atomicwrite.workgroup.payload_nonlocal.buffer.guard_nonlocal.workgroup.comp
@@ -579907,6 +580003,63 @@ dEQP-VK.memory_model.message_passing.ext.u64.noncoherent.atomic_atomic.atomicrmw
 dEQP-VK.memory_model.message_passing.ext.u64.noncoherent.atomic_atomic.atomicrmw.subgroup.payload_local.physbuffer.guard_local.physbuffer.comp
 dEQP-VK.memory_model.message_passing.ext.u64.noncoherent.atomic_atomic.atomicrmw.subgroup.payload_local.physbuffer.guard_local.physbuffer.vert
 dEQP-VK.memory_model.message_passing.ext.u64.noncoherent.atomic_atomic.atomicrmw.subgroup.payload_local.physbuffer.guard_local.physbuffer.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.buffer.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.buffer.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.buffer.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.image.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.image.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.image.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.workgroup.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.buffer.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.buffer.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.buffer.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.image.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.image.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.buffer.guard_local.image.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.buffer.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.buffer.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.buffer.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.image.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.image.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.image.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_nonlocal.workgroup.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.buffer.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.buffer.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.buffer.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.image.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.image.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.image.guard_local.image.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_nonlocal.buffer.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_nonlocal.image.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_nonlocal.workgroup.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_local.buffer.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_nonlocal.workgroup.guard_local.image.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.buffer.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.buffer.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.buffer.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.image.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.image.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.image.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_nonlocal.workgroup.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.buffer.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.buffer.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.buffer.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.image.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.image.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.buffer.guard_local.image.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.buffer.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.buffer.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.buffer.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.image.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.image.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.image.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_nonlocal.workgroup.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.buffer.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.buffer.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.buffer.frag
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.image.comp
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.image.vert
+dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.device.payload_local.image.guard_local.image.frag
 dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.workgroup.payload_nonlocal.buffer.guard_nonlocal.buffer.comp
 dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.workgroup.payload_nonlocal.buffer.guard_nonlocal.image.comp
 dEQP-VK.memory_model.write_after_read.core11.u32.coherent.fence_fence.atomicwrite.workgroup.payload_nonlocal.buffer.guard_nonlocal.workgroup.comp
diff --git a/external/vulkancts/mustpass/master/waivers.xml b/external/vulkancts/mustpass/master/waivers.xml
new file mode 100644 (file)
index 0000000..d0101f2
--- /dev/null
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="utf-8"?>
+<waiver_list>
+
+       <!--/*     Copyright (C) 2020 The Khronos Group Inc
+ *
+ *     Licensed under the Apache License, Version 2.0 (the "License");
+ *     you may not use this file except in compliance with the License.
+ *     You may obtain a copy of the License at
+ *
+ *          http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+*/-->
+       <!--/*
+       Each <waiver> entry must contain three attributes: vendorName, vendorId and url.
+       Url should be a full path to gitlab issue(s).
+       Waiver tag should have one <description> child that describes issue.
+       Waiver tag should have one <device_list> child.
+       Device list should have one or more <d> elements containing device ids for which this waiver was created.
+       Waiver tag should contain one or more <t> elements containing test paths that should be waived.
+       String in <t> can use wildcard *.
+
+       <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+       <xs:element name="waiver_list">
+       <xs:complexType>
+               <xs:sequence>
+                       <xs:element name="waiver" maxOccurs="unbounded">
+                       <xs:complexType>
+                               <xs:sequence>
+                                       <xs:element name="description" type="xs:string"/>
+                                       <xs:element name="device_list">
+                                       <xs:complexType>
+                                               <xs:sequence>
+                                                       <xs:element name="d" type="xs:integer" minOccurs="1" maxOccurs="unbounded"/>
+                                               </xs:sequence>
+                                       </xs:complexType>
+                                       </xs:element>
+                                       <xs:element name="t" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
+                               </xs:sequence>
+                               <xs:attribute name="vendorName" type="xs:string" use="required"/>
+                               <xs:attribute name="vendorId" type="xs:string" use="required"/>
+                               <xs:attribute name="url" type="xs:string" use="required"/>
+                       </xs:complexType>
+                       </xs:element>
+               </xs:sequence>
+       </xs:complexType>
+       </xs:element>
+       </xs:schema>
+*/-->
+
+       <waiver vendorName="Imagination Technologies" vendorId="0x1010" url="https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/336">
+               <description>GPU's are unable to correctly filter CEM corners with F32 textures, this includes the ability to gather texels for texel gather instructions.</description>
+               <device_list>
+                       <!--TODO: plase let me know for which deviceIds this waiver should be defined -->
+                       <d>6200</d>
+               </device_list>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.clamp_to_edge_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.sparse_clamp_to_edge_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.repeat_mirrored_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.sparse_repeat_mirrored_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_less.sparse_mirrored_repeat_clamp_to_edge</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.clamp_to_edge_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.sparse_clamp_to_edge_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.repeat_mirrored_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.sparse_repeat_mirrored_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_pot.compare_greater.sparse_mirrored_repeat_clamp_to_edge</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.clamp_to_edge_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.sparse_clamp_to_edge_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.repeat_mirrored_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.sparse_repeat_mirrored_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_less.sparse_mirrored_repeat_clamp_to_edge</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.clamp_to_edge_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.sparse_clamp_to_edge_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.repeat_mirrored_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.sparse_repeat_mirrored_repeat</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.size_npot.compare_greater.sparse_mirrored_repeat_clamp_to_edge</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_linear_mag_linear</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_linear_mag_linear</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_nearest_mipmap_nearest_mag_linear</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_nearest_mipmap_linear_mag_linear</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_linear_mipmap_nearest_mag_linear</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.filter_mode.sparse_min_linear_mipmap_linear_mag_linear</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.level_1</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.sparse_level_1</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.level_2</t>
+               <t>dEQP-VK.glsl.texture_gather.basic.cube.depth32f.base_level.sparse_level_2</t>
+       </waiver>
+
+       <waiver vendorName="Broadcom" vendorId="0x14E4" url="https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/757">
+               <description>On affected devices depth clipping is incorrectly disabled when the viewport minDepth is equal to maxDepth.</description>
+               <device_list>
+                       <d>0x8E002214</d>
+                       <d>0x001E43CB</d>
+                       <d>0xBE485FD3</d>
+               </device_list>
+               <t>dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_deltazero</t>
+       </waiver>
+
+       <waiver vendorName="NVIDIA" vendorId="0x10DE" url="https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/1356">
+               <description>The affected GPUs are unable to reliably synchronize memory accesses at device scope.</description>
+               <device_list>
+                       <d>0x0CE0</d>
+                       <d>0x0E0D</d>
+                       <d>0x0E16</d>
+                       <d>0x0FA0</d>
+                       <d>0x0FA7</d>
+                       <d>0x0FC0</d>
+                       <d>0x0FC1</d>
+                       <d>0x0FC2</d>
+                       <d>0x0FC4</d>
+                       <d>0x0FC5</d>
+                       <d>0x0FC6</d>
+                       <d>0x0FC7</d>
+                       <d>0x0FC8</d>
+                       <d>0x0FC9</d>
+                       <d>0x0FCA</d>
+                       <d>0x0FCB</d>
+                       <d>0x0FCC</d>
+                       <d>0x0FCD</d>
+                       <d>0x0FCE</d>
+                       <d>0x0FCF</d>
+                       <d>0x0FD0</d>
+                       <d>0x0FD1</d>
+                       <d>0x0FD2</d>
+                       <d>0x0FD3</d>
+                       <d>0x0FD4</d>
+                       <d>0x0FD5</d>
+                       <d>0x0FD6</d>
+                       <d>0x0FD7</d>
+                       <d>0x0FD8</d>
+                       <d>0x0FD9</d>
+                       <d>0x0FDA</d>
+                       <d>0x0FDB</d>
+                       <d>0x0FDC</d>
+                       <d>0x0FDD</d>
+                       <d>0x0FDE</d>
+                       <d>0x0FDF</d>
+                       <d>0x0FE0</d>
+                       <d>0x0FE1</d>
+                       <d>0x0FE2</d>
+                       <d>0x0FE3</d>
+                       <d>0x0FE4</d>
+                       <d>0x0FE5</d>
+                       <d>0x0FE6</d>
+                       <d>0x0FE7</d>
+                       <d>0x0FE8</d>
+                       <d>0x0FE9</d>
+                       <d>0x0FEA</d>
+                       <d>0x0FEC</d>
+                       <d>0x0FED</d>
+                       <d>0x0FEE</d>
+                       <d>0x0FEF</d>
+                       <d>0x0FF0</d>
+                       <d>0x0FF1</d>
+                       <d>0x0FF2</d>
+                       <d>0x0FF3</d>
+                       <d>0x0FF5</d>
+                       <d>0x0FF6</d>
+                       <d>0x0FF7</d>
+                       <d>0x0FF8</d>
+                       <d>0x0FF9</d>
+                       <d>0x0FFA</d>
+                       <d>0x0FFB</d>
+                       <d>0x0FFC</d>
+                       <d>0x0FFD</d>
+                       <d>0x0FFE</d>
+                       <d>0x0FFF</d>
+                       <d>0x1001</d>
+                       <d>0x1003</d>
+                       <d>0x1004</d>
+                       <d>0x1005</d>
+                       <d>0x1007</d>
+                       <d>0x1008</d>
+                       <d>0x100A</d>
+                       <d>0x100B</d>
+                       <d>0x100C</d>
+                       <d>0x101E</d>
+                       <d>0x101F</d>
+                       <d>0x1020</d>
+                       <d>0x1021</d>
+                       <d>0x1022</d>
+                       <d>0x1023</d>
+                       <d>0x1024</d>
+                       <d>0x1026</d>
+                       <d>0x1027</d>
+                       <d>0x1028</d>
+                       <d>0x1029</d>
+                       <d>0x102A</d>
+                       <d>0x102B</d>
+                       <d>0x102C</d>
+                       <d>0x102D</d>
+                       <d>0x102E</d>
+                       <d>0x102F</d>
+                       <d>0x1030</d>
+                       <d>0x103A</d>
+                       <d>0x103B</d>
+                       <d>0x103C</d>
+                       <d>0x103F</d>
+                       <d>0x1180</d>
+                       <d>0x1182</d>
+                       <d>0x1183</d>
+                       <d>0x1184</d>
+                       <d>0x1185</d>
+                       <d>0x1187</d>
+                       <d>0x1188</d>
+                       <d>0x1189</d>
+                       <d>0x118A</d>
+                       <d>0x118B</d>
+                       <d>0x118C</d>
+                       <d>0x118D</d>
+                       <d>0x118E</d>
+                       <d>0x118F</d>
+                       <d>0x1191</d>
+                       <d>0x1192</d>
+                       <d>0x1193</d>
+                       <d>0x1194</d>
+                       <d>0x1195</d>
+                       <d>0x1198</d>
+                       <d>0x1199</d>
+                       <d>0x119A</d>
+                       <d>0x119D</d>
+                       <d>0x119E</d>
+                       <d>0x119F</d>
+                       <d>0x11A0</d>
+                       <d>0x11A1</d>
+                       <d>0x11A2</d>
+                       <d>0x11A3</d>
+                       <d>0x11A4</d>
+                       <d>0x11A5</d>
+                       <d>0x11A7</d>
+                       <d>0x11AA</d>
+                       <d>0x11AC</d>
+                       <d>0x11AD</d>
+                       <d>0x11AE</d>
+                       <d>0x11AF</d>
+                       <d>0x11B0</d>
+                       <d>0x11B1</d>
+                       <d>0x11B4</d>
+                       <d>0x11B6</d>
+                       <d>0x11B7</d>
+                       <d>0x11B8</d>
+                       <d>0x11BA</d>
+                       <d>0x11BB</d>
+                       <d>0x11BC</d>
+                       <d>0x11BD</d>
+                       <d>0x11BE</d>
+                       <d>0x11BF</d>
+                       <d>0x11C0</d>
+                       <d>0x11C1</d>
+                       <d>0x11C2</d>
+                       <d>0x11C3</d>
+                       <d>0x11C4</d>
+                       <d>0x11C5</d>
+                       <d>0x11C6</d>
+                       <d>0x11C7</d>
+                       <d>0x11C8</d>
+                       <d>0x11CB</d>
+                       <d>0x11D0</d>
+                       <d>0x11D1</d>
+                       <d>0x11D2</d>
+                       <d>0x11D3</d>
+                       <d>0x11E0</d>
+                       <d>0x11E1</d>
+                       <d>0x11E2</d>
+                       <d>0x11E3</d>
+                       <d>0x11F0</d>
+                       <d>0x11F8</d>
+                       <d>0x11FA</d>
+                       <d>0x11FC</d>
+                       <d>0x11FF</d>
+                       <d>0x1280</d>
+                       <d>0x1281</d>
+                       <d>0x1282</d>
+                       <d>0x1283</d>
+                       <d>0x1284</d>
+                       <d>0x1285</d>
+                       <d>0x1286</d>
+                       <d>0x1287</d>
+                       <d>0x1288</d>
+                       <d>0x1289</d>
+                       <d>0x128A</d>
+                       <d>0x128B</d>
+                       <d>0x1290</d>
+                       <d>0x1291</d>
+                       <d>0x1292</d>
+                       <d>0x1293</d>
+                       <d>0x1294</d>
+                       <d>0x1295</d>
+                       <d>0x1296</d>
+                       <d>0x1297</d>
+                       <d>0x1298</d>
+                       <d>0x1299</d>
+                       <d>0x129A</d>
+                       <d>0x129B</d>
+                       <d>0x12A0</d>
+                       <d>0x12AD</d>
+                       <d>0x12AE</d>
+                       <d>0x12AF</d>
+                       <d>0x12B0</d>
+                       <d>0x12B1</d>
+                       <d>0x12B9</d>
+                       <d>0x12BA</d>
+               </device_list>
+               <t>dEQP-VK.memory_model.*core11*.device.*</t>
+       </waiver>
+
+</waiver_list>
\ No newline at end of file
index 5702d42979901ecd269e6e24e8593021d83e3038..e928ad1f823f413f2b1f276cc48af0c4eeffeead 100644 (file)
@@ -54,12 +54,6 @@ BUILD_CONFIG         = getBuildConfig(DEFAULT_BUILD_DIR, DEFAULT_TARGET, "Debug")
 VULKAN_MASTER_PKG      = Package(module = VULKAN_MODULE, configurations = [
                  # Master
                  Configuration(name            = "default",
-                                               filters         = [include("master.txt"),
-                                                                          exclude("test-issues.txt"),
-                                                                          exclude("excluded-tests.txt"),
-                                                                          exclude("android-tests.txt"),
-                                                                          exclude("waivers.txt")]),
-                 Configuration(name            = "default-no-waivers",
                                                filters         = [include("master.txt"),
                                                                           exclude("test-issues.txt"),
                                                                           exclude("excluded-tests.txt"),
index f2ac7d38faaafdaf8b71046d7e1699331bf9a17d..c639fddf7456f7569f1bd4cacf82719d40f37164 100644 (file)
@@ -12,6 +12,9 @@ add_subdirectory(opengl)
 # EGL utilities
 add_subdirectory(egl)
 
+# XE xml util
+add_subdirectory(xexml)
+
 if (IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/randomshaders)
        add_subdirectory(randomshaders)
 endif ()
index 36d9b9dd4aaf3c3eb6a18a9de9fdbd4f0a019011..dfd8fadb0b34cd2ff4417dbbd84a367087a78cff 100644 (file)
@@ -93,12 +93,15 @@ set(TCUTIL_SRCS
        tcuAstcUtil.hpp
        tcuRasterizationVerifier.cpp
        tcuRasterizationVerifier.hpp
+       tcuWaiverUtil.cpp
+       tcuWaiverUtil.hpp
        )
 
 set(TCUTIL_LIBS
        decpp
        qphelper
        dethread
+       xexml
        ${PNG_LIBRARY}
        )
 
index 9015b0037192f4d5e84de024df27c04aa2261950..cf4f97c8604681e476dde2edb9e59f2594f14f3f 100644 (file)
@@ -196,6 +196,7 @@ bool App::iterate (void)
                        print("  Failed:        %d/%d (%.1f%%)\n", result.numFailed,            result.numExecuted, (result.numExecuted > 0 ? (100.0f * (float)result.numFailed                 / (float)result.numExecuted) : 0.0f));
                        print("  Not supported: %d/%d (%.1f%%)\n", result.numNotSupported,      result.numExecuted, (result.numExecuted > 0 ? (100.0f * (float)result.numNotSupported   / (float)result.numExecuted) : 0.0f));
                        print("  Warnings:      %d/%d (%.1f%%)\n", result.numWarnings,          result.numExecuted, (result.numExecuted > 0 ? (100.0f * (float)result.numWarnings               / (float)result.numExecuted) : 0.0f));
+                       print("  Waived:        %d/%d (%.1f%%)\n", result.numWaived,            result.numExecuted, (result.numExecuted > 0 ? (100.0f * (float)result.numWaived                 / (float)result.numExecuted) : 0.0f));
                        if (!result.isComplete)
                                print("Test run was ABORTED!\n");
                }
index de9c33704325b2a28ef451b51a84bf1d2f0e6b84..b94b6a5c3ced035091b6c4c35fd334b94ab0f9e5 100644 (file)
@@ -99,6 +99,7 @@ DE_DECLARE_COMMAND_LINE_OPT(ShaderCacheTruncate,              bool);
 DE_DECLARE_COMMAND_LINE_OPT(RenderDoc,                                 bool);
 DE_DECLARE_COMMAND_LINE_OPT(CaseFraction,                              std::vector<int>);
 DE_DECLARE_COMMAND_LINE_OPT(CaseFractionMandatoryTests,        std::string);
+DE_DECLARE_COMMAND_LINE_OPT(WaiverFile,                                        std::string);
 
 static void parseIntList (const char* src, std::vector<int>* dst)
 {
@@ -196,7 +197,8 @@ void registerOptions (de::cmdline::Parser& parser)
                << Option<ShaderCacheTruncate>                  (DE_NULL,       "deqp-shadercache-truncate",                            "Truncate shader cache before running tests",           s_enableNames,          "enable")
                << Option<RenderDoc>                                    (DE_NULL,       "deqp-renderdoc",                                                       "Enable RenderDoc frame markers",                                       s_enableNames,          "disable")
                << Option<CaseFraction>                                 (DE_NULL,       "deqp-fraction",                                                        "Run a fraction of the test cases (e.g. N,M means run group%M==N)",     parseIntList,   "")
-               << Option<CaseFractionMandatoryTests>   (DE_NULL,       "deqp-fraction-mandatory-caselist-file",        "Case list file that must be run for each fraction",                                    "");
+               << Option<CaseFractionMandatoryTests>   (DE_NULL,       "deqp-fraction-mandatory-caselist-file",        "Case list file that must be run for each fraction",                                    "")
+               << Option<WaiverFile>                                   (DE_NULL,       "deqp-waiver-file",                                                     "Read waived tests from given file",                                                                    "");
 }
 
 void registerLegacyOptions (de::cmdline::Parser& parser)
@@ -554,9 +556,9 @@ static CaseTreeNode* parseCaseList (std::istream& in)
 class CasePaths
 {
 public:
-                                                       CasePaths       (const string& pathList);
-                                                       CasePaths       (const vector<string>& pathList);
-       bool                                    matches         (const string& caseName, bool allowPrefix=false) const;
+       CasePaths(const string& pathList);
+       CasePaths(const vector<string>& pathList);
+       bool                                    matches(const string& caseName, bool allowPrefix = false) const;
 
 private:
        const vector<string>    m_casePatterns;
@@ -573,11 +575,11 @@ CasePaths::CasePaths(const vector<string>& pathList)
 }
 
 // Match a single path component against a pattern component that may contain *-wildcards.
-static bool matchWildcards(string::const_iterator      patternStart,
-                                                  string::const_iterator       patternEnd,
-                                                  string::const_iterator       pathStart,
-                                                  string::const_iterator       pathEnd,
-                                                  bool                                         allowPrefix)
+bool matchWildcards(string::const_iterator     patternStart,
+                                       string::const_iterator  patternEnd,
+                                       string::const_iterator  pathStart,
+                                       string::const_iterator  pathEnd,
+                                       bool                                    allowPrefix)
 {
        string::const_iterator  pattern = patternStart;
        string::const_iterator  path    = pathStart;
@@ -824,6 +826,7 @@ bool                                        CommandLine::isShaderCacheTruncateEnabled       (void) const    { return m_cmdLi
 int                                            CommandLine::getOptimizationRecipe                      (void) const    { return m_cmdLine.getOption<opt::Optimization>();                                                      }
 bool                                   CommandLine::isSpirvOptimizationEnabled         (void) const    { return m_cmdLine.getOption<opt::OptimizeSpirv>();                                                     }
 bool                                   CommandLine::isRenderDocEnabled                         (void) const    { return m_cmdLine.getOption<opt::RenderDoc>();                                                         }
+const char*                            CommandLine::getWaiverFileName                          (void) const    { return m_cmdLine.getOption<opt::WaiverFile>().c_str();                                        }
 const std::vector<int>&        CommandLine::getCaseFraction                            (void) const    { return m_cmdLine.getOption<opt::CaseFraction>();                                                      }
 const char*                            CommandLine::getCaseFractionMandatoryTests      (void) const    { return m_cmdLine.getOption<opt::CaseFractionMandatoryTests>().c_str();        }
 const char*                            CommandLine::getArchiveDir                                      (void) const    { return m_cmdLine.getOption<opt::ArchiveDir>().c_str();                                        }
index 88527f2187d68bf2eb7177ae260dc17272133d11..fbef41dd78b98c349728860b3589cc9e5214fa28 100644 (file)
@@ -91,6 +91,13 @@ class CaseTreeNode;
 class CasePaths;
 class Archive;
 
+// Match a single path component against a pattern component that may contain *-wildcards.
+bool matchWildcards(std::string::const_iterator                patternStart,
+                                       std::string::const_iterator             patternEnd,
+                                       std::string::const_iterator             pathStart,
+                                       std::string::const_iterator             pathEnd,
+                                       bool                                                    allowPrefix);
+
 class CaseListFilter
 {
 public:
@@ -234,6 +241,9 @@ public:
        //! Enable RenderDoc frame markers (--deqp-renderdoc)
        bool                                                    isRenderDocEnabled                      (void) const;
 
+       //! Get waiver file name (--deqp-waiver-file)
+       const char*                                             getWaiverFileName                       (void) const;
+
        //! Get case list fraction
        const std::vector<int>&                 getCaseFraction                         (void) const;
 
index 939f4d8651a8e6f238382c8f6a851ee7d17ea672..b12357a1d2ee4e02c1be51b573988d3ea8f32d67 100644 (file)
@@ -39,6 +39,7 @@ static int testResultSeverity (qpTestResult testResult)
                case QP_TEST_RESULT_QUALITY_WARNING:            return 30;
                case QP_TEST_RESULT_COMPATIBILITY_WARNING:      return 40;
                case QP_TEST_RESULT_TIMEOUT:                            return 50;
+               case QP_TEST_RESULT_WAIVER:                                     return 60;
                case QP_TEST_RESULT_FAIL:                                       return 100;
                case QP_TEST_RESULT_RESOURCE_ERROR:                     return 110;
                case QP_TEST_RESULT_INTERNAL_ERROR:                     return 120;
index bf7eb2456b839dd0d5568c5155a207f3f5bb43d0..c7524f8455b3076ef3bbe2fc0dc0bdc6f415725e 100644 (file)
@@ -275,6 +275,7 @@ void TestSessionExecutor::leaveTestCase (TestCase* testCase)
                        case QP_TEST_RESULT_NOT_SUPPORTED:                      m_status.numNotSupported        += 1;   break;
                        case QP_TEST_RESULT_QUALITY_WARNING:            m_status.numWarnings            += 1;   break;
                        case QP_TEST_RESULT_COMPATIBILITY_WARNING:      m_status.numWarnings            += 1;   break;
+                       case QP_TEST_RESULT_WAIVER:                                     m_status.numWaived                      += 1;   break;
                        default:                                                                        m_status.numFailed                      += 1;   break;
                }
 
index b793ea75bc03f64d4fe20224b4db4b1a0f798e2b..0edd99b6001c684fe21cb2f5222b3aecfdbfd3ab 100644 (file)
@@ -47,6 +47,7 @@ public:
                numFailed               = 0;
                numNotSupported = 0;
                numWarnings             = 0;
+               numWaived               = 0;
                isComplete              = false;
        }
 
@@ -55,6 +56,7 @@ public:
        int             numFailed;                      //!< Number of cases failed.
        int             numNotSupported;        //!< Number of cases not supported.
        int             numWarnings;            //!< Number of QualityWarning / CompatibilityWarning results.
+       int             numWaived;                      //!< Number of waived tests.
        bool    isComplete;                     //!< Is run complete.
 };
 
diff --git a/framework/common/tcuWaiverUtil.cpp b/framework/common/tcuWaiverUtil.cpp
new file mode 100644 (file)
index 0000000..a35e79d
--- /dev/null
@@ -0,0 +1,496 @@
+/*-------------------------------------------------------------------------
+ * Vulkan CTS Framework
+ * --------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Waiver mechanism implementation.
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuWaiverUtil.hpp"
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include "deString.h"
+#include "deStringUtil.hpp"
+#include "xeXMLParser.hpp"
+#include "tcuCommandLine.hpp"
+
+namespace tcu
+{
+
+// Base class for GL and VK waiver tree builders
+class WaiverTreeBuilder
+{
+public:
+
+       typedef WaiverUtil::WaiverComponent WaiverComponent;
+
+public:
+                                                                               WaiverTreeBuilder               (const std::string&                             waiverFile,
+                                                                                                                                const std::string&                             packageName,
+                                                                                                                                const char*                                    vendorTag,
+                                                                                                                                const char*                                    deviceTag,
+                                                                                                                                std::vector<WaiverComponent>&  waiverTree);
+
+       virtual                                                         ~WaiverTreeBuilder();
+
+       void                                                            build                                   (void);
+
+protected:
+
+       // structure representing component during tree construction
+       struct BuilComponent
+       {
+               std::string                             name;
+               deUint32                                parentIndex;    // index in allComponents vector
+               std::vector<deUint32>   childrenIndex;  // index in allComponents vector
+
+               BuilComponent(std::string n, deUint32 p)
+                       : name(std::move(n))
+                       , parentIndex(p)
+               {}
+       };
+
+       // parse waiver.xml and read list of waived tests defined
+       // specificly for current device id and current vendor id
+       void                    readWaivedTestsFromXML  (void);
+
+       // use list of paths to build a temporary tree which
+       // consists of BuilComponents that help with tree construction
+       void                    buildTreeFromPathList   (void);
+
+       // use temporary tree to create final tree containing
+       // only things that are needed during searches
+       void                    constructFinalTree              (void);
+
+       // helper methods used to identify if proper waiver for vendor was found
+       virtual bool    matchVendor                             (const std::string& vendor) const = 0;
+
+       // helper methods used after waiver for current vendor was found to check
+       // if it is defined also for currend deviceId/renderer
+       virtual bool    matchDevice                             (const std::string& device) const = 0;
+
+       // helper method used in buildTreeFromPathList; returns index
+       // of component having same ancestors as the component specified
+       // in the argument or 0 when build tree does not include this component
+       deUint32                findComponentInBuildTree(const std::vector<std::string>& pathComponents, deUint32 index) const;
+
+private:
+       const std::string&                              m_waiverFile;
+       const std::string&                              m_packageName;
+
+       const char*                                             m_vendorTag;
+       const char*                                             m_deviceTag;
+
+       // helper attributes used during construction
+       std::vector<std::string>                m_testList;
+       std::vector<BuilComponent>              m_buildTree;
+
+       // reference to vector containing final tree
+       std::vector<WaiverComponent>&   m_finalTree;
+};
+
+WaiverTreeBuilder::WaiverTreeBuilder(const std::string&                                waiverFile,
+                                                                        const std::string&                             packageName,
+                                                                        const char*                                    vendorTag,
+                                                                        const char*                                    deviceTag,
+                                                                        std::vector<WaiverComponent>&  waiverTree)
+       : m_waiverFile          (waiverFile)
+       , m_packageName         (packageName)
+       , m_vendorTag           (vendorTag)
+       , m_deviceTag           (deviceTag)
+       , m_finalTree           (waiverTree)
+{
+}
+
+WaiverTreeBuilder::~WaiverTreeBuilder()
+{
+}
+
+void WaiverTreeBuilder::build(void)
+{
+       readWaivedTestsFromXML();
+       buildTreeFromPathList();
+       constructFinalTree();
+}
+
+void WaiverTreeBuilder::readWaivedTestsFromXML()
+{
+       std::ifstream iStream(m_waiverFile);
+       if (!iStream.is_open())
+               return;
+
+       // get whole waiver file content
+       std::stringstream buffer;
+       buffer << iStream.rdbuf();
+       std::string wholeContent = buffer.str();
+
+       // feed parser with xml content
+       xe::xml::Parser xmlParser;
+       xmlParser.feed(reinterpret_cast<const deUint8*>(wholeContent.c_str()), static_cast<int>(wholeContent.size()));
+       xmlParser.advance();
+
+       // first we find matching vendor, then search for matching device/renderer and then memorize cases
+       bool                                            vendorFound             = false;
+       bool                                            deviceFound             = false;
+       bool                                            scanDevice              = false;
+       bool                                            memorizeCase    = false;
+       std::vector<std::string>        waiverTestList;
+
+       while (true)
+       {
+               // we are grabing elements one by one - depth-first traversal in pre-order
+               xe::xml::Element currElement = xmlParser.getElement();
+
+               // stop if there is parsing error or we didnt found
+               // waiver for current vendor id and device id/renderer
+               if (currElement == xe::xml::ELEMENT_INCOMPLETE ||
+                       currElement == xe::xml::ELEMENT_END_OF_STRING)
+                       break;
+
+               const char* elemName = xmlParser.getElementName();
+               switch (currElement)
+               {
+               case xe::xml::ELEMENT_START:
+                       if (vendorFound)
+                       {
+                               if (!deviceFound)
+                               {
+                                       // if we found proper vendor and are reading deviceIds/rendererers list then allow it
+                                       scanDevice = deStringEqual(elemName, m_deviceTag); // e.g. "d"
+                                       if (scanDevice)
+                                               break;
+                               }
+
+                               // if we found waiver for current vendor and are reading test case names then allow it
+                               memorizeCase = deStringEqual(elemName, "t");
+                               break;
+                       }
+
+                       // we are searching for waiver definition for current vendor, till we find
+                       // it we skip everythingh; we also skip tags that we don't need eg. description
+                       if (!deStringEqual(elemName, "waiver"))
+                               break;
+
+                       // we found waiver tag, check if it is deffined for current vendor
+                       waiverTestList.clear();
+                       if (xmlParser.hasAttribute(m_vendorTag))
+                               vendorFound = matchVendor(xmlParser.getAttribute(m_vendorTag));
+                       break;
+
+               case xe::xml::ELEMENT_DATA:
+                       if (scanDevice)
+                       {
+                               // check if device read from xml matches current device/renderer
+                               std::string waivedDevice;
+                               xmlParser.getDataStr(waivedDevice);
+                               deviceFound = matchDevice(waivedDevice);
+                       }
+                       else if (memorizeCase)
+                       {
+                               // memorize whats betwean <t></t> tags when case name starts with current package name
+                               // note: waiver tree is constructed per package
+                               std::string waivedCaseName;
+                               xmlParser.getDataStr(waivedCaseName);
+                               if (waivedCaseName.find(m_packageName) == 0)
+                                       waiverTestList.push_back(waivedCaseName);
+                       }
+                       break;
+
+               case xe::xml::ELEMENT_END:
+                       memorizeCase    = false;
+                       scanDevice              = false;
+                       if (deStringEqual(elemName, "waiver"))
+                       {
+                               // when we found proper waiver we can copy memorized cases
+                               if(vendorFound && deviceFound)
+                                       m_testList.insert(m_testList.end(), waiverTestList.begin(), waiverTestList.end());
+                               vendorFound = false;
+                               deviceFound = false;
+                       }
+                       break;
+
+               default:
+                       DE_ASSERT(false);
+               }
+
+               xmlParser.advance();
+       }
+}
+
+deUint32 WaiverTreeBuilder::findComponentInBuildTree(const std::vector<std::string>& pathComponents, deUint32 index) const
+{
+       const std::string& checkedName = pathComponents[index];
+
+       // check if same component is already in the build tree; we start from 1 - skiping root
+       for (deUint32 componentIndex = 1 ; componentIndex < m_buildTree.size() ; ++componentIndex)
+       {
+               const BuilComponent& componentInTree = m_buildTree[componentIndex];
+               if (componentInTree.name != checkedName)
+                       continue;
+
+               // names match so we need to make sure that all their ancestors match too;
+               deUint32 reverseLevel                   = index;
+               deUint32 ancestorInTreeIndex    = componentInTree.parentIndex;
+
+               // if this component is the next after root then there is no ancestors to check
+               if (reverseLevel == 1)
+                       return componentIndex;
+
+               while (--reverseLevel > 0)
+               {
+                       // names dont match - we can move to searching other build tree items
+                       if (pathComponents[reverseLevel] != m_buildTree[ancestorInTreeIndex].name)
+                               break;
+
+                       // when previous path component matches ancestor name then we need do check earlier path component
+                       ancestorInTreeIndex = m_buildTree[ancestorInTreeIndex].parentIndex;
+
+                       // we reached root
+                       if (ancestorInTreeIndex == 0)
+                       {
+                               // if next level would be root then ancestors match
+                               if (reverseLevel == 1)
+                                       return componentIndex;
+                               // if next level is not root then ancestors dont match
+                               break;
+                       }
+               }
+       }
+
+       // searched path component is not in the tree
+       return 0;
+}
+
+void WaiverTreeBuilder::buildTreeFromPathList(void)
+{
+       if (m_testList.empty())
+               return;
+
+       deUint32 parentIndex = 0;
+
+       // construct root node
+       m_buildTree.emplace_back("root", DE_NULL);
+
+       for (const auto& path : m_testList)
+       {
+               const std::vector<std::string> pathComponents = de::splitString(path, '.');
+
+               // first component is parented to root
+               parentIndex = 0;
+
+               // iterate over all components of current path, but skip first one (e.g. "dEQP-VK", "KHR-GLES31")
+               for (deUint32 level = 1 ; level < pathComponents.size() ; ++level)
+               {
+                       // check if same component is already in the tree and we dont need to add it
+                       deUint32 componentIndex = findComponentInBuildTree(pathComponents, level);
+                       if (componentIndex)
+                       {
+                               parentIndex = componentIndex;
+                               continue;
+                       }
+
+                       // component is not in the tree, add it
+                       const std::string componentName = pathComponents[level];
+                       m_buildTree.emplace_back(componentName, parentIndex);
+
+                       // add current component as a child to its parent and assume
+                       // that this component will be parent of next component
+                       componentIndex = static_cast<deUint32>(m_buildTree.size() - 1);
+                       m_buildTree[parentIndex].childrenIndex.push_back(componentIndex);
+                       parentIndex = componentIndex;
+               }
+       }
+}
+
+void WaiverTreeBuilder::constructFinalTree(void)
+{
+       if (m_buildTree.empty())
+               return;
+
+       // translate vector of BuilComponents to vector of WaiverComponents
+       m_finalTree.resize(m_buildTree.size());
+       for (deUint32 i = 0; i < m_finalTree.size(); ++i)
+       {
+               BuilComponent&          buildCmponent   = m_buildTree[i];
+               WaiverComponent&        waiverComponent = m_finalTree[i];
+
+               waiverComponent.name = std::move(buildCmponent.name);
+               waiverComponent.children.resize(buildCmponent.childrenIndex.size());
+
+               // set pointers for children
+               for (deUint32 j = 0; j < buildCmponent.childrenIndex.size(); ++j)
+               {
+                       deUint32 childIndexInTree = buildCmponent.childrenIndex[j];
+                       waiverComponent.children[j] = &m_finalTree[childIndexInTree];
+               }
+       }
+}
+
+// Class that builds a tree out of waiver definitions for OpenGL tests.
+// Most of functionalities are shared betwean VK and GL builders and they
+// were extracted to WaiverTreeBuilder base class.
+class GLWaiverTreeBuilder : public WaiverTreeBuilder
+{
+public:
+                                               GLWaiverTreeBuilder             (const std::string&                             waiverFile,
+                                                                                                const std::string&                             packageName,
+                                                                                                const std::string&                             currentVendor,
+                                                                                                const std::string&                             currentRenderer,
+                                                                                                std::vector<WaiverComponent>&  waiverTree);
+
+       bool                            matchVendor                             (const std::string& vendor) const override;
+       bool                            matchDevice                             (const std::string& device) const override;
+
+private:
+
+       const std::string       m_currentVendor;
+       const std::string       m_currentRenderer;
+};
+
+GLWaiverTreeBuilder::GLWaiverTreeBuilder(const std::string&                            waiverFile,
+                                                                                const std::string&                             packageName,
+                                                                                const std::string&                             currentVendor,
+                                                                                const std::string&                             currentRenderer,
+                                                                                std::vector<WaiverComponent>&  waiverTree)
+       : WaiverTreeBuilder     (waiverFile, packageName, "vendor", "r", waiverTree)
+       , m_currentVendor       (currentVendor)
+       , m_currentRenderer     (currentRenderer)
+{
+}
+
+bool GLWaiverTreeBuilder::matchVendor(const std::string& vendor) const
+{
+       return m_currentVendor == vendor;
+}
+
+bool GLWaiverTreeBuilder::matchDevice(const std::string& device) const
+{
+       // make sure that renderer name in .xml is not within "", those extra characters should be removed
+       DE_ASSERT(device[0] != '\"');
+
+       return tcu::matchWildcards(device.cbegin(),
+                                                          device.cend(),
+                                                          m_currentRenderer.cbegin(),
+                                                          m_currentRenderer.cend(),
+                                                          false);
+}
+
+// Class that builds a tree out of waiver definitions for Vulkan tests.
+// Most of functionalities are shared betwean VK and GL builders and they
+// were extracted to WaiverTreeBuilder base class.
+class VKWaiverTreeBuilder : public WaiverTreeBuilder
+{
+public:
+                                               VKWaiverTreeBuilder             (const std::string&                             waiverFile,
+                                                                                                const std::string&                             packageName,
+                                                                                                const deUint32                                 currentVendor,
+                                                                                                const deUint32                                 currentRenderer,
+                                                                                                std::vector<WaiverComponent>&  waiverTree);
+
+       bool                            matchVendor                             (const std::string& vendor) const override;
+       bool                            matchDevice                             (const std::string& device) const override;
+
+private:
+
+       const deUint32  m_currentVendorId;
+       const deUint32  m_currentDeviceId;
+};
+
+VKWaiverTreeBuilder::VKWaiverTreeBuilder(const std::string&                            waiverFile,
+                                                                                const std::string&                             packageName,
+                                                                                const deUint32                                 currentVendor,
+                                                                                const deUint32                                 currentRenderer,
+                                                                                std::vector<WaiverComponent>&  waiverTree)
+       : WaiverTreeBuilder(waiverFile, packageName, "vendorId", "d", waiverTree)
+       , m_currentVendorId(currentVendor)
+       , m_currentDeviceId(currentRenderer)
+{
+}
+
+bool VKWaiverTreeBuilder::matchVendor(const std::string& vendor) const
+{
+       return (m_currentVendorId == static_cast<deUint32>(std::stoul(vendor, 0, 0)));
+}
+
+bool VKWaiverTreeBuilder::matchDevice(const std::string& device) const
+{
+       return (m_currentDeviceId == static_cast<deUint32>(std::stoul(device, 0, 0)));
+}
+
+void WaiverUtil::setup(const std::string waiverFile, std::string packageName, deUint32 vendorId, deUint32 deviceId)
+{
+       VKWaiverTreeBuilder(waiverFile, packageName, vendorId, deviceId, m_waiverTree).build();
+}
+
+void WaiverUtil::setup(const std::string waiverFile, std::string packageName, std::string vendor, std::string renderer)
+{
+       GLWaiverTreeBuilder(waiverFile, packageName, vendor, renderer, m_waiverTree).build();
+}
+
+bool WaiverUtil::isOnWaiverList(const std::string& casePath) const
+{
+       if (m_waiverTree.empty())
+               return false;
+
+       // skip root e.g. "dEQP-VK"
+       size_t                                          firstDotPos             = casePath.find('.');
+       std::string::const_iterator     componentStart  = casePath.cbegin() + firstDotPos + 1;
+       std::string::const_iterator     componentEnd    = componentStart;
+       std::string::const_iterator     pathEnd                 = casePath.cend();
+       const WaiverComponent*          waiverComponent = m_waiverTree.data();
+
+       // check path component by component
+       while (true)
+       {
+               // find the last character of next component
+               ++componentEnd;
+               for (; componentEnd < pathEnd ; ++componentEnd)
+               {
+                       if (*componentEnd == '.')
+                               break;
+               }
+
+               // check if one of children has the same component name
+               for (const auto& c : waiverComponent->children)
+               {
+                       bool matchFound = tcu::matchWildcards(c->name.cbegin(),
+                                                                                                 c->name.cend(),
+                                                                                                 componentStart,
+                                                                                                 componentEnd,
+                                                                                                 false);
+
+                       // current waiver component matches curent path component - go to next component
+                       if (matchFound)
+                       {
+                               waiverComponent = c;
+                               break;
+                       }
+               }
+
+               // we checked all components - if our pattern was a leaf then this test should be waived
+               if (componentEnd == pathEnd)
+                       return waiverComponent->children.empty();
+
+               // go to next test path component
+               componentStart = componentEnd + 1;
+       }
+       return false;
+}
+
+} // vk
diff --git a/framework/common/tcuWaiverUtil.hpp b/framework/common/tcuWaiverUtil.hpp
new file mode 100644 (file)
index 0000000..d59bdfd
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef _TCUWAIVERUTIL_HPP
+#define _TCUWAIVERUTIL_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan CTS Framework
+ * --------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Waiver mechanism implementation.
+ *//*--------------------------------------------------------------------*/
+
+#include "deDefs.h"
+#include <string>
+#include <vector>
+
+namespace tcu
+{
+
+class WaiverUtil
+{
+public:
+                       WaiverUtil              () = default;
+
+       void    setup                   (const std::string waiverFile, std::string packageName, deUint32 vendorId, deUint32 deviceId);
+       void    setup                   (const std::string waiverFile, std::string packageName, std::string vendor, std::string renderer);
+
+       bool    isOnWaiverList  (const std::string& casePath) const;
+
+public:
+
+       struct WaiverComponent
+       {
+               std::string                                             name;
+               std::vector<WaiverComponent*>   children;
+       };
+
+private:
+
+       std::vector<WaiverComponent> m_waiverTree;
+};
+
+} // tcu
+
+#endif // _TCUWAIVERUTIL_HPP
index d970bcfb9f37b6c78f8be450df04fc4bea64578f..3b1f488510b4b22d71487c46b48a9a5567172120 100644 (file)
@@ -171,6 +171,7 @@ static const qpKeyStringMap s_qpTestResultMap[] =
        { QP_TEST_RESULT_INTERNAL_ERROR,                        "InternalError"                 },
        { QP_TEST_RESULT_CRASH,                                         "Crash"                                 },
        { QP_TEST_RESULT_TIMEOUT,                                       "Timeout"                               },
+       { QP_TEST_RESULT_WAIVER,                                        "Waiver"                                },
 
        /* Add new values here if needed, remember to update qpTestResult enumeration. */
 
index 7c24ed98efb2435ee2a43d8b2e6d28f59881b930..a5c8c6e3fed2a9f340c1d214ace6fc8ce56a4ab7 100644 (file)
@@ -61,6 +61,7 @@ typedef enum qpTestResult_e
        QP_TEST_RESULT_INTERNAL_ERROR,                  /*!< Error occurred within Tester Core                                                                                                  */
        QP_TEST_RESULT_CRASH,                                   /*!< Crash occurred in test execution.                                                                                                  */
        QP_TEST_RESULT_TIMEOUT,                                 /*!< Timeout occurred in test execution.                                                                                                */
+       QP_TEST_RESULT_WAIVER,                                  /*!< Status code reported by waived test.                                                                                               */
 
        QP_TEST_RESULT_LAST
 } qpTestResult;
diff --git a/framework/xexml/CMakeLists.txt b/framework/xexml/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3af27a6
--- /dev/null
@@ -0,0 +1,18 @@
+# XML parser
+
+set(XEXML_SRCS
+       xeDefs.cpp
+       xeDefs.hpp
+       xeXMLParser.cpp
+       xeXMLParser.hpp
+       )
+
+set(XEXML_LIBS
+       decpp
+       deutil
+       debase
+       )
+
+add_library(xexml STATIC ${XEXML_SRCS})
+target_link_libraries(xexml ${XEXML_LIBS})
+
diff --git a/framework/xexml/xeDefs.cpp b/framework/xexml/xeDefs.cpp
new file mode 100644 (file)
index 0000000..e773d33
--- /dev/null
@@ -0,0 +1,46 @@
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program Test Executor
+ * ------------------------------------------
+ *
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Executor base definitions.
+ *//*--------------------------------------------------------------------*/
+
+#include "xeDefs.hpp"
+
+#include <sstream>
+
+namespace xe
+{
+
+static std::string formatError (const char* message, const char* expr, const char* file, int line)
+{
+       std::ostringstream msg;
+       msg << (message ? message : "Runtime check failed") << ": ";
+       if (expr)
+               msg << '\'' << expr << '\'';
+       msg << " at " << file << ":" << line;
+       return msg.str();
+}
+
+Error::Error (const char* message, const char* expr, const char* file, int line)
+       : std::runtime_error(formatError(message, expr, file, line))
+{
+}
+
+} // xe
diff --git a/framework/xexml/xeDefs.hpp b/framework/xexml/xeDefs.hpp
new file mode 100644 (file)
index 0000000..735669e
--- /dev/null
@@ -0,0 +1,53 @@
+#ifndef _XEDEFS_HPP
+#define _XEDEFS_HPP
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program Test Executor
+ * ------------------------------------------
+ *
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Executor base definitions.
+ *//*--------------------------------------------------------------------*/
+
+#include "deDefs.hpp"
+
+#include <string>
+#include <stdexcept>
+
+namespace xe
+{
+
+class Error : public std::runtime_error
+{
+public:
+       Error (const std::string& message) : std::runtime_error(message) {}
+       Error (const char* message, const char* expr, const char* file, int line);
+};
+
+class ParseError : public Error
+{
+public:
+       ParseError (const std::string& message) : Error(message) {}
+};
+
+} // xe
+
+#define XE_FAIL(MSG)                   throw xe::Error(MSG, "", __FILE__, __LINE__)
+#define XE_CHECK(X)                            do { if ((!deGetFalse() && (X)) ? DE_FALSE : DE_TRUE) throw xe::Error(NULL, #X, __FILE__, __LINE__); } while(deGetFalse())
+#define XE_CHECK_MSG(X, MSG)   do { if ((!deGetFalse() && (X)) ? DE_FALSE : DE_TRUE) throw xe::Error(MSG, #X, __FILE__, __LINE__); } while(deGetFalse())
+
+#endif // _XEDEFS_HPP
diff --git a/framework/xexml/xeXMLParser.cpp b/framework/xexml/xeXMLParser.cpp
new file mode 100644 (file)
index 0000000..3c39ee8
--- /dev/null
@@ -0,0 +1,573 @@
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program Test Executor
+ * ------------------------------------------
+ *
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief XML Parser.
+ *//*--------------------------------------------------------------------*/
+
+#include "xeXMLParser.hpp"
+#include "deInt32.h"
+
+namespace xe
+{
+namespace xml
+{
+
+enum
+{
+       TOKENIZER_INITIAL_BUFFER_SIZE   = 1024
+};
+
+static inline bool isIdentifierStartChar (int ch)
+{
+       return de::inRange<int>(ch, 'a', 'z') || de::inRange<int>(ch, 'A', 'Z');
+}
+
+static inline bool isIdentifierChar (int ch)
+{
+       return isIdentifierStartChar(ch) || de::inRange<int>(ch, '0', '9') || (ch == '-') || (ch == '_');
+}
+
+static inline bool isWhitespaceChar (int ch)
+{
+       return ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n';
+}
+
+static int getNextBufferSize (int curSize, int minNewSize)
+{
+       return de::max(curSize*2, 1<<deLog2Ceil32(minNewSize));
+}
+
+Tokenizer::Tokenizer (void)
+       : m_curToken    (TOKEN_INCOMPLETE)
+       , m_curTokenLen (0)
+       , m_state               (STATE_DATA)
+       , m_buf                 (TOKENIZER_INITIAL_BUFFER_SIZE)
+{
+}
+
+Tokenizer::~Tokenizer (void)
+{
+}
+
+void Tokenizer::clear (void)
+{
+       m_curToken              = TOKEN_INCOMPLETE;
+       m_curTokenLen   = 0;
+       m_state                 = STATE_DATA;
+       m_buf.clear();
+}
+
+void Tokenizer::error (const std::string& what)
+{
+       throw ParseError(what);
+}
+
+void Tokenizer::feed (const deUint8* bytes, int numBytes)
+{
+       // Grow buffer if necessary.
+       if (m_buf.getNumFree() < numBytes)
+       {
+               m_buf.resize(getNextBufferSize(m_buf.getSize(), m_buf.getNumElements()+numBytes));
+       }
+
+       // Append to front.
+       m_buf.pushFront(bytes, numBytes);
+
+       // If we haven't parsed complete token, re-try after data feed.
+       if (m_curToken == TOKEN_INCOMPLETE)
+               advance();
+}
+
+int Tokenizer::getChar (int offset) const
+{
+       DE_ASSERT(de::inRange(offset, 0, m_buf.getNumElements()));
+
+       if (offset < m_buf.getNumElements())
+               return m_buf.peekBack(offset);
+       else
+               return END_OF_BUFFER;
+}
+
+void Tokenizer::advance (void)
+{
+       if (m_curToken != TOKEN_INCOMPLETE)
+       {
+               // Parser should not try to advance beyond end of string.
+               DE_ASSERT(m_curToken != TOKEN_END_OF_STRING);
+
+               // If current token is tag end, change state to data.
+               if (m_curToken == TOKEN_TAG_END                                         ||
+                       m_curToken == TOKEN_EMPTY_ELEMENT_END                   ||
+                       m_curToken == TOKEN_PROCESSING_INSTRUCTION_END  ||
+                       m_curToken == TOKEN_COMMENT                                             ||
+                       m_curToken == TOKEN_ENTITY)
+                       m_state = STATE_DATA;
+
+               // Advance buffer by length of last token.
+               m_buf.popBack(m_curTokenLen);
+
+               // Reset state.
+               m_curToken              = TOKEN_INCOMPLETE;
+               m_curTokenLen   = 0;
+
+               // If we hit end of string here, report it as end of string.
+               if (getChar(0) == END_OF_STRING)
+               {
+                       m_curToken              = TOKEN_END_OF_STRING;
+                       m_curTokenLen   = 1;
+                       return;
+               }
+       }
+
+       int curChar = getChar(m_curTokenLen);
+
+       for (;;)
+       {
+               if (m_state == STATE_DATA)
+               {
+                       // Advance until we hit end of buffer or tag start and treat that as data token.
+                       if (curChar == END_OF_STRING || curChar == (int)END_OF_BUFFER || curChar == '<' || curChar == '&')
+                       {
+                               if (curChar == '<')
+                                       m_state = STATE_TAG;
+                               else if (curChar == '&')
+                                       m_state = STATE_ENTITY;
+
+                               if (m_curTokenLen > 0)
+                               {
+                                       // Report data token.
+                                       m_curToken = TOKEN_DATA;
+                                       return;
+                               }
+                               else if (curChar == END_OF_STRING || curChar == (int)END_OF_BUFFER)
+                               {
+                                       // Just return incomplete token, no data parsed.
+                                       return;
+                               }
+                               else
+                               {
+                                       DE_ASSERT(m_state == STATE_TAG || m_state == STATE_ENTITY);
+                                       continue;
+                               }
+                       }
+               }
+               else
+               {
+                       // Eat all whitespace if present.
+                       if (m_curTokenLen == 0)
+                       {
+                               while (isWhitespaceChar(curChar))
+                               {
+                                       m_buf.popBack();
+                                       curChar = getChar(0);
+                               }
+                       }
+
+                       // Handle end of string / buffer.
+                       if (curChar == END_OF_STRING)
+                               error("Unexpected end of string");
+                       else if (curChar == (int)END_OF_BUFFER)
+                       {
+                               DE_ASSERT(m_curToken == TOKEN_INCOMPLETE);
+                               return;
+                       }
+
+                       if (m_curTokenLen == 0)
+                       {
+                               // Expect start of identifier, value or special tag token.
+                               if (curChar == '\'' || curChar == '"')
+                                       m_state = STATE_VALUE;
+                               else if (isIdentifierStartChar(curChar))
+                                       m_state = STATE_IDENTIFIER;
+                               else if (curChar == '<' || curChar == '?' || curChar == '/')
+                                       m_state = STATE_TAG;
+                               else if (curChar == '&')
+                                       DE_ASSERT(m_state == STATE_ENTITY);
+                               else if (curChar == '=')
+                               {
+                                       m_curToken              = TOKEN_EQUAL;
+                                       m_curTokenLen   = 1;
+                                       return;
+                               }
+                               else if (curChar == '>')
+                               {
+                                       m_curToken              = TOKEN_TAG_END;
+                                       m_curTokenLen   = 1;
+                                       return;
+                               }
+                               else
+                                       error("Unexpected character");
+                       }
+                       else if (m_state == STATE_IDENTIFIER)
+                       {
+                               if (!isIdentifierChar(curChar))
+                               {
+                                       m_curToken = TOKEN_IDENTIFIER;
+                                       return;
+                               }
+                       }
+                       else if (m_state == STATE_VALUE)
+                       {
+                               // \todo [2012-06-07 pyry] Escapes.
+                               if (curChar == '\'' || curChar == '"')
+                               {
+                                       // \todo [2012-10-17 pyry] Should we actually do the check against getChar(0)?
+                                       if (curChar != getChar(0))
+                                               error("Mismatched quote");
+                                       m_curToken               = TOKEN_STRING;
+                                       m_curTokenLen   += 1;
+                                       return;
+                               }
+                       }
+                       else if (m_state == STATE_COMMENT)
+                       {
+                               DE_ASSERT(m_curTokenLen >= 2); // 2 characters have been parsed if we are in comment state.
+
+                               if (m_curTokenLen <= 3)
+                               {
+                                       if (curChar != '-')
+                                               error("Invalid comment start");
+                               }
+                               else
+                               {
+                                       int prev2 = m_curTokenLen > 5 ? getChar(m_curTokenLen-2) : 0;
+                                       int prev1 = m_curTokenLen > 4 ? getChar(m_curTokenLen-1) : 0;
+
+                                       if (prev2 == '-' && prev1 == '-')
+                                       {
+                                               if (curChar != '>')
+                                                       error("Invalid comment end");
+                                               m_curToken               = TOKEN_COMMENT;
+                                               m_curTokenLen   += 1;
+                                               return;
+                                       }
+                               }
+                       }
+                       else if (m_state == STATE_ENTITY)
+                       {
+                               if (m_curTokenLen >= 1)
+                               {
+                                       if (curChar == ';')
+                                       {
+                                               m_curToken               = TOKEN_ENTITY;
+                                               m_curTokenLen   += 1;
+                                               return;
+                                       }
+                                       else if (!de::inRange<int>(curChar, '0', '9')   &&
+                                                        !de::inRange<int>(curChar, 'a', 'z')   &&
+                                                        !de::inRange<int>(curChar, 'A', 'Z'))
+                                               error("Invalid entity");
+                               }
+                       }
+                       else
+                       {
+                               // Special tokens are at most 2 characters.
+                               DE_ASSERT(m_state == STATE_TAG && m_curTokenLen == 1);
+
+                               int prevChar = getChar(m_curTokenLen-1);
+
+                               if (prevChar == '<')
+                               {
+                                       // Tag start.
+                                       if (curChar == '/')
+                                       {
+                                               m_curToken              = TOKEN_END_TAG_START;
+                                               m_curTokenLen   = 2;
+                                               return;
+                                       }
+                                       else if (curChar == '?')
+                                       {
+                                               m_curToken              = TOKEN_PROCESSING_INSTRUCTION_START;
+                                               m_curTokenLen   = 2;
+                                               return;
+                                       }
+                                       else if (curChar == '!')
+                                       {
+                                               m_state = STATE_COMMENT;
+                                       }
+                                       else
+                                       {
+                                               m_curToken              = TOKEN_TAG_START;
+                                               m_curTokenLen   = 1;
+                                               return;
+                                       }
+                               }
+                               else if (prevChar == '?')
+                               {
+                                       if (curChar != '>')
+                                               error("Invalid processing instruction end");
+                                       m_curToken              = TOKEN_PROCESSING_INSTRUCTION_END;
+                                       m_curTokenLen   = 2;
+                                       return;
+                               }
+                               else if (prevChar == '/')
+                               {
+                                       if (curChar != '>')
+                                               error("Invalid empty element end");
+                                       m_curToken              = TOKEN_EMPTY_ELEMENT_END;
+                                       m_curTokenLen   = 2;
+                                       return;
+                               }
+                               else
+                                       error("Could not parse special token");
+                       }
+               }
+
+               m_curTokenLen   += 1;
+               curChar                  = getChar(m_curTokenLen);
+       }
+}
+
+void Tokenizer::getString (std::string& dst) const
+{
+       DE_ASSERT(m_curToken == TOKEN_STRING);
+       dst.resize(m_curTokenLen-2);
+       for (int ndx = 0; ndx < m_curTokenLen-2; ndx++)
+               dst[ndx] = m_buf.peekBack(ndx+1);
+}
+
+Parser::Parser (void)
+       : m_element             (ELEMENT_INCOMPLETE)
+       , m_state               (STATE_DATA)
+{
+}
+
+Parser::~Parser (void)
+{
+}
+
+void Parser::clear (void)
+{
+       m_tokenizer.clear();
+       m_elementName.clear();
+       m_attributes.clear();
+       m_attribName.clear();
+       m_entityValue.clear();
+
+       m_element       = ELEMENT_INCOMPLETE;
+       m_state         = STATE_DATA;
+}
+
+void Parser::error (const std::string& what)
+{
+       throw ParseError(what);
+}
+
+void Parser::feed (const deUint8* bytes, int numBytes)
+{
+       m_tokenizer.feed(bytes, numBytes);
+
+       if (m_element == ELEMENT_INCOMPLETE)
+               advance();
+}
+
+void Parser::advance (void)
+{
+       if (m_element == ELEMENT_START)
+               m_attributes.clear();
+
+       // \note No token is advanced when element end is reported.
+       if (m_state == STATE_YIELD_EMPTY_ELEMENT_END)
+       {
+               DE_ASSERT(m_element == ELEMENT_START);
+               m_element       = ELEMENT_END;
+               m_state         = STATE_DATA;
+               return;
+       }
+
+       if (m_element != ELEMENT_INCOMPLETE)
+       {
+               m_tokenizer.advance();
+               m_element = ELEMENT_INCOMPLETE;
+       }
+
+       for (;;)
+       {
+               Token curToken = m_tokenizer.getToken();
+
+               // Skip comments.
+               while (curToken == TOKEN_COMMENT)
+               {
+                       m_tokenizer.advance();
+                       curToken = m_tokenizer.getToken();
+               }
+
+               if (curToken == TOKEN_INCOMPLETE)
+               {
+                       DE_ASSERT(m_element == ELEMENT_INCOMPLETE);
+                       return;
+               }
+
+               switch (m_state)
+               {
+                       case STATE_ENTITY:
+                               m_state = STATE_DATA;
+                               // Fall-through
+
+                       case STATE_DATA:
+                               switch (curToken)
+                               {
+                                       case TOKEN_DATA:
+                                               m_element = ELEMENT_DATA;
+                                               return;
+
+                                       case TOKEN_END_OF_STRING:
+                                               m_element = ELEMENT_END_OF_STRING;
+                                               return;
+
+                                       case TOKEN_TAG_START:
+                                               m_state = STATE_START_TAG_OPEN;
+                                               break;
+
+                                       case TOKEN_END_TAG_START:
+                                               m_state = STATE_END_TAG_OPEN;
+                                               break;
+
+                                       case TOKEN_PROCESSING_INSTRUCTION_START:
+                                               m_state = STATE_IN_PROCESSING_INSTRUCTION;
+                                               break;
+
+                                       case TOKEN_ENTITY:
+                                               m_state         = STATE_ENTITY;
+                                               m_element       = ELEMENT_DATA;
+                                               parseEntityValue();
+                                               return;
+
+                                       default:
+                                               error("Unexpected token");
+                               }
+                               break;
+
+                       case STATE_IN_PROCESSING_INSTRUCTION:
+                               if (curToken == TOKEN_PROCESSING_INSTRUCTION_END)
+                                       m_state = STATE_DATA;
+                               else
+                                       if (curToken != TOKEN_IDENTIFIER && curToken != TOKEN_EQUAL && curToken != TOKEN_STRING)
+                                               error("Unexpected token in processing instruction");
+                               break;
+
+                       case STATE_START_TAG_OPEN:
+                               if (curToken != TOKEN_IDENTIFIER)
+                                       error("Expected identifier");
+                               m_tokenizer.getTokenStr(m_elementName);
+                               m_state = STATE_ATTRIBUTE_LIST;
+                               break;
+
+                       case STATE_END_TAG_OPEN:
+                               if (curToken != TOKEN_IDENTIFIER)
+                                       error("Expected identifier");
+                               m_tokenizer.getTokenStr(m_elementName);
+                               m_state = STATE_EXPECTING_END_TAG_CLOSE;
+                               break;
+
+                       case STATE_EXPECTING_END_TAG_CLOSE:
+                               if (curToken != TOKEN_TAG_END)
+                                       error("Expected tag end");
+                               m_state         = STATE_DATA;
+                               m_element       = ELEMENT_END;
+                               return;
+
+                       case STATE_ATTRIBUTE_LIST:
+                               if (curToken == TOKEN_IDENTIFIER)
+                               {
+                                       m_tokenizer.getTokenStr(m_attribName);
+                                       m_state = STATE_EXPECTING_ATTRIBUTE_EQ;
+                               }
+                               else if (curToken == TOKEN_EMPTY_ELEMENT_END)
+                               {
+                                       m_state         = STATE_YIELD_EMPTY_ELEMENT_END;
+                                       m_element       = ELEMENT_START;
+                                       return;
+                               }
+                               else if (curToken == TOKEN_TAG_END)
+                               {
+                                       m_state         = STATE_DATA;
+                                       m_element       = ELEMENT_START;
+                                       return;
+                               }
+                               else
+                                       error("Unexpected token");
+                               break;
+
+                       case STATE_EXPECTING_ATTRIBUTE_EQ:
+                               if (curToken != TOKEN_EQUAL)
+                                       error("Expected '='");
+                               m_state = STATE_EXPECTING_ATTRIBUTE_VALUE;
+                               break;
+
+                       case STATE_EXPECTING_ATTRIBUTE_VALUE:
+                               if (curToken != TOKEN_STRING)
+                                       error("Expected value");
+                               if (hasAttribute(m_attribName.c_str()))
+                                       error("Duplicate attribute");
+
+                               m_tokenizer.getString(m_attributes[m_attribName]);
+                               m_state = STATE_ATTRIBUTE_LIST;
+                               break;
+
+                       default:
+                               DE_ASSERT(false);
+               }
+
+               m_tokenizer.advance();
+       }
+}
+
+static char getEntityValue (const std::string& entity)
+{
+       static const struct
+       {
+               const char*             name;
+               char                    value;
+       } s_entities[] =
+       {
+                       { "&lt;",                       '<' },
+                       { "&gt;",                       '>' },
+                       { "&amp;",                      '&' },
+                       { "&apos;",                     '\''},
+                       { "&quot;",                     '"' },
+       };
+
+       for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_entities); ndx++)
+       {
+               if (entity == s_entities[ndx].name)
+                       return s_entities[ndx].value;
+       }
+
+       return 0;
+}
+
+void Parser::parseEntityValue (void)
+{
+       DE_ASSERT(m_state == STATE_ENTITY && m_tokenizer.getToken() == TOKEN_ENTITY);
+
+       std::string entity;
+       m_tokenizer.getTokenStr(entity);
+
+       const char value = getEntityValue(entity);
+       if (value == 0)
+               error("Invalid entity '" + entity + "'");
+
+       m_entityValue.resize(1);
+       m_entityValue[0] = value;
+}
+
+} // xml
+} // xe
diff --git a/framework/xexml/xeXMLParser.hpp b/framework/xexml/xeXMLParser.hpp
new file mode 100644 (file)
index 0000000..372b219
--- /dev/null
@@ -0,0 +1,257 @@
+#ifndef _XEXMLPARSER_HPP
+#define _XEXMLPARSER_HPP
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program Test Executor
+ * ------------------------------------------
+ *
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief XML Parser.
+ *
+ * \todo [2012-06-07 pyry] Not supported / handled properly:
+ *  - xml namespaces (<ns:Element>)
+ *  - backslash escapes in strings
+ *  - &quot; -style escapes
+ *  - utf-8
+ *//*--------------------------------------------------------------------*/
+
+#include "xeDefs.hpp"
+#include "deRingBuffer.hpp"
+
+#include <string>
+#include <map>
+
+namespace xe
+{
+namespace xml
+{
+
+enum Token
+{
+       TOKEN_INCOMPLETE = 0,                                   //!< Not enough data to determine token.
+       TOKEN_END_OF_STRING,                                    //!< End of document string.
+       TOKEN_DATA,                                                             //!< Block of data (anything outside tags).
+       TOKEN_COMMENT,                                                  //!< <!-- comment -->
+       TOKEN_IDENTIFIER,                                               //!< Identifier (in tags).
+       TOKEN_STRING,                                                   //!< String (in tags).
+       TOKEN_TAG_START,                                                //!< <
+       TOKEN_TAG_END,                                                  //!< >
+       TOKEN_END_TAG_START,                                    //!< </
+       TOKEN_EMPTY_ELEMENT_END,                                //!< />
+       TOKEN_PROCESSING_INSTRUCTION_START,             //!< <?
+       TOKEN_PROCESSING_INSTRUCTION_END,               //!< ?>
+       TOKEN_EQUAL,                                                    //!< =
+       TOKEN_ENTITY,                                                   //!< Entity reference, such as &amp;
+
+       TOKEN_LAST
+};
+
+enum Element
+{
+       ELEMENT_INCOMPLETE = 0, //!< Incomplete element.
+       ELEMENT_START,                  //!< Element start.
+       ELEMENT_END,                    //!< Element end.
+       ELEMENT_DATA,                   //!< Data element.
+       ELEMENT_END_OF_STRING,  //!< End of document string.
+
+       ELEMENT_LAST
+};
+
+const char* getTokenName (Token token);
+
+// \todo [2012-10-17 pyry] Add line number etc.
+class ParseError : public xe::ParseError
+{
+public:
+       ParseError (const std::string& message) : xe::ParseError(message) {}
+};
+
+class Tokenizer
+{
+public:
+                                               Tokenizer                       (void);
+                                               ~Tokenizer                      (void);
+
+       void                            clear                           (void);         //!< Resets tokenizer to initial state.
+
+       void                            feed                            (const deUint8* bytes, int numBytes);
+       void                            advance                         (void);
+
+       Token                           getToken                        (void) const            { return m_curToken;    }
+       int                                     getTokenLen                     (void) const            { return m_curTokenLen; }
+       deUint8                         getTokenByte            (int offset) const      { DE_ASSERT(m_curToken != TOKEN_INCOMPLETE && m_curToken != TOKEN_END_OF_STRING); return m_buf.peekBack(offset); }
+       void                            getTokenStr                     (std::string& dst) const;
+       void                            appendTokenStr          (std::string& dst) const;
+
+       void                            getString                       (std::string& dst) const;
+
+private:
+                                               Tokenizer                       (const Tokenizer& other);
+       Tokenizer&                      operator=                       (const Tokenizer& other);
+
+       int                                     getChar                         (int offset) const;
+
+       void                            error                           (const std::string& what);
+
+       enum State
+       {
+               STATE_DATA = 0,
+               STATE_TAG,
+               STATE_IDENTIFIER,
+               STATE_VALUE,
+               STATE_COMMENT,
+               STATE_ENTITY,
+
+               STATE_LAST
+       };
+
+       enum
+       {
+               END_OF_STRING   = 0,                    //!< End of string (0).
+               END_OF_BUFFER   = 0xffffffff    //!< End of current data buffer.
+       };
+
+       Token                                           m_curToken;                     //!< Current token.
+       int                                                     m_curTokenLen;          //!< Length of current token.
+
+       State                                           m_state;                        //!< Tokenization state.
+
+       de::RingBuffer<deUint8>         m_buf;
+};
+
+class Parser
+{
+public:
+       typedef std::map<std::string, std::string>              AttributeMap;
+       typedef AttributeMap::const_iterator                    AttributeIter;
+
+                                               Parser                          (void);
+                                               ~Parser                         (void);
+
+       void                            clear                           (void);         //!< Resets parser to initial state.
+
+       void                            feed                            (const deUint8* bytes, int numBytes);
+       void                            advance                         (void);
+
+       Element                         getElement                      (void) const                                            { return m_element;                                                                             }
+
+       // For ELEMENT_START / ELEMENT_END.
+       const char*                     getElementName          (void) const                                            { return m_elementName.c_str();                                                 }
+
+       // For ELEMENT_START.
+       bool                            hasAttribute            (const char* name) const                        { return m_attributes.find(name) != m_attributes.end(); }
+       const char*                     getAttribute            (const char* name) const                        { return m_attributes.find(name)->second.c_str();               }
+       const AttributeMap&     attributes                      (void) const                                            { return m_attributes;                                                                  }
+
+       // For ELEMENT_DATA.
+       int                                     getDataSize                     (void) const;
+       deUint8                         getDataByte                     (int offset) const;
+       void                            getDataStr                      (std::string& dst) const;
+       void                            appendDataStr           (std::string& dst) const;
+
+private:
+                                               Parser                          (const Parser& other);
+       Parser&                         operator=                       (const Parser& other);
+
+       void                            parseEntityValue        (void);
+
+       void                            error                           (const std::string& what);
+
+       enum State
+       {
+               STATE_DATA = 0,                                         //!< Initial state - assuming data or tag open.
+               STATE_ENTITY,                                           //!< Parsed entity is stored - overrides data.
+               STATE_IN_PROCESSING_INSTRUCTION,        //!< In processing instruction.
+               STATE_START_TAG_OPEN,                           //!< Start tag open.
+               STATE_END_TAG_OPEN,                                     //!< End tag open.
+               STATE_EXPECTING_END_TAG_CLOSE,          //!< Expecting end tag close.
+               STATE_ATTRIBUTE_LIST,                           //!< Expecting attribute list.
+               STATE_EXPECTING_ATTRIBUTE_EQ,           //!< Got attribute name, expecting =.
+               STATE_EXPECTING_ATTRIBUTE_VALUE,        //!< Expecting attribute value.
+               STATE_YIELD_EMPTY_ELEMENT_END,          //!< Empty element: start has been reported but not end.
+
+               STATE_LAST
+       };
+
+       Tokenizer                       m_tokenizer;
+
+       Element                         m_element;
+       std::string                     m_elementName;
+       AttributeMap            m_attributes;
+
+       State                           m_state;
+       std::string                     m_attribName;
+       std::string                     m_entityValue;          //!< Data override, such as entity value.
+};
+
+// Inline implementations
+
+inline void Tokenizer::getTokenStr (std::string& dst) const
+{
+       DE_ASSERT(m_curToken != TOKEN_INCOMPLETE && m_curToken != TOKEN_END_OF_STRING);
+       dst.resize(m_curTokenLen);
+       for (int ndx = 0; ndx < m_curTokenLen; ndx++)
+               dst[ndx] = m_buf.peekBack(ndx);
+}
+
+inline void Tokenizer::appendTokenStr (std::string& dst) const
+{
+       DE_ASSERT(m_curToken != TOKEN_INCOMPLETE && m_curToken != TOKEN_END_OF_STRING);
+
+       size_t oldLen = dst.size();
+       dst.resize(oldLen+m_curTokenLen);
+
+       for (int ndx = 0; ndx < m_curTokenLen; ndx++)
+               dst[oldLen+ndx] = m_buf.peekBack(ndx);
+}
+
+inline int Parser::getDataSize (void) const
+{
+       if (m_state != STATE_ENTITY)
+               return m_tokenizer.getTokenLen();
+       else
+               return (int)m_entityValue.size();
+}
+
+inline deUint8 Parser::getDataByte (int offset) const
+{
+       if (m_state != STATE_ENTITY)
+               return m_tokenizer.getTokenByte(offset);
+       else
+               return (deUint8)m_entityValue[offset];
+}
+
+inline void Parser::getDataStr (std::string& dst) const
+{
+       if (m_state != STATE_ENTITY)
+               return m_tokenizer.getTokenStr(dst);
+       else
+               dst = m_entityValue;
+}
+
+inline void Parser::appendDataStr (std::string& dst) const
+{
+       if (m_state != STATE_ENTITY)
+               return m_tokenizer.appendTokenStr(dst);
+       else
+               dst += m_entityValue;
+}
+
+} // xml
+} // xe
+
+#endif // _XEXMLPARSER_HPP
index d32cb8af8d7bcbd20a7e5a94bab62123edb34509..bab00dc83c72b8d9b411a2d8af67148cab171de9 100644 (file)
 #include "es2aAccuracyTests.hpp"
 #include "es2sStressTests.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuTestContext.hpp"
+#include "tcuWaiverUtil.hpp"
+#include "tcuCommandLine.hpp"
+#include "gluContextInfo.hpp"
 #include "gluRenderContext.hpp"
 #include "gluStateReset.hpp"
 #include "glwFunctions.hpp"
@@ -42,7 +46,7 @@ namespace gles2
 class TestCaseWrapper : public tcu::TestCaseExecutor
 {
 public:
-                                                                       TestCaseWrapper         (TestPackage& package);
+                                                                       TestCaseWrapper         (TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
                                                                        ~TestCaseWrapper        (void);
 
        void                                                    init                            (tcu::TestCase* testCase, const std::string& path);
@@ -51,10 +55,12 @@ public:
 
 private:
        TestPackage&                                    m_testPackage;
+       de::SharedPtr<tcu::WaiverUtil>  m_waiverMechanism;
 };
 
-TestCaseWrapper::TestCaseWrapper (TestPackage& package)
+TestCaseWrapper::TestCaseWrapper (TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
        : m_testPackage(package)
+       , m_waiverMechanism(waiverMechanism)
 {
 }
 
@@ -62,8 +68,11 @@ TestCaseWrapper::~TestCaseWrapper (void)
 {
 }
 
-void TestCaseWrapper::init (tcu::TestCase* testCase, const std::string&)
+void TestCaseWrapper::init (tcu::TestCase* testCase, const std::string& path)
 {
+       if (m_waiverMechanism->isOnWaiverList(path))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        testCase->init();
 }
 
@@ -115,6 +124,7 @@ TestPackage::TestPackage (tcu::TestContext& testCtx)
        : tcu::TestPackage      (testCtx, "dEQP-GLES2", "dEQP OpenGL ES 2.0 Tests")
        , m_archive                     (testCtx.getRootArchive(), "gles2/")
        , m_context                     (DE_NULL)
+       , m_waiverMechanism(new tcu::WaiverUtil)
 {
 }
 
@@ -132,6 +142,14 @@ void TestPackage::init (void)
                // Create context
                m_context = new Context(m_testCtx);
 
+               // Setup waiver mechanism
+               if (m_testCtx.getCommandLine().getRunMode() == tcu::RUNMODE_EXECUTE)
+               {
+                       const glu::ContextInfo& contextInfo = m_context->getContextInfo();
+                       m_waiverMechanism->setup(m_context->getTestContext().getCommandLine().getWaiverFileName(), m_name,
+                                                                        contextInfo.getString(GL_VENDOR), contextInfo.getString(GL_RENDERER));
+               }
+
                // Add main test groups
                addChild(new InfoTests                                          (*m_context));
                addChild(new CapabilityTests                            (*m_context));
@@ -158,7 +176,7 @@ void TestPackage::deinit (void)
 
 tcu::TestCaseExecutor* TestPackage::createExecutor (void) const
 {
-       return new TestCaseWrapper(const_cast<TestPackage&>(*this));
+       return new TestCaseWrapper(const_cast<TestPackage&>(*this), m_waiverMechanism);
 }
 
 } // gles2
index 55eadd11a1d8150121c8505e87ecfe5dc091a3e4..5de5c71499198f0af586defd317117d2dd18e83a 100644 (file)
 #include "tcuTestPackage.hpp"
 #include "tes2Context.hpp"
 #include "tcuResource.hpp"
+#include "deSharedPtr.hpp"
+
+namespace tcu
+{
+       class WaiverUtil;
+};
 
 namespace deqp
 {
@@ -50,6 +56,7 @@ public:
 private:
        tcu::ResourcePrefix                             m_archive;
        Context*                                                m_context;
+       de::SharedPtr<tcu::WaiverUtil>  m_waiverMechanism;
 };
 
 } // gles2
index 7f088e176957f205716b5086b4a6fc605d9998ae..9caafaecddc1bf439d51e11c6e689fc27aad054f 100644 (file)
@@ -28,6 +28,9 @@
 #include "es3sStressTests.hpp"
 #include "es3pPerformanceTests.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuWaiverUtil.hpp"
+#include "tcuCommandLine.hpp"
+#include "gluContextInfo.hpp"
 #include "gluRenderContext.hpp"
 #include "gluStateReset.hpp"
 #include "glwFunctions.hpp"
@@ -41,7 +44,7 @@ namespace gles3
 class TestCaseWrapper : public tcu::TestCaseExecutor
 {
 public:
-                                                                       TestCaseWrapper         (TestPackage& package);
+                                                                       TestCaseWrapper         (TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
                                                                        ~TestCaseWrapper        (void);
 
        void                                                    init                            (tcu::TestCase* testCase, const std::string& path);
@@ -50,10 +53,12 @@ public:
 
 private:
        TestPackage&                                    m_testPackage;
+       de::SharedPtr<tcu::WaiverUtil>  m_waiverMechanism;
 };
 
-TestCaseWrapper::TestCaseWrapper (TestPackage& package)
+TestCaseWrapper::TestCaseWrapper (TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
        : m_testPackage(package)
+       , m_waiverMechanism(waiverMechanism)
 {
 }
 
@@ -61,8 +66,11 @@ TestCaseWrapper::~TestCaseWrapper (void)
 {
 }
 
-void TestCaseWrapper::init (tcu::TestCase* testCase, const std::string&)
+void TestCaseWrapper::init (tcu::TestCase* testCase, const std::string& path)
 {
+       if (m_waiverMechanism->isOnWaiverList(path))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        testCase->init();
 }
 
@@ -131,6 +139,14 @@ void TestPackage::init (void)
                // Create context
                m_context = new Context(m_testCtx);
 
+               // Setup waiver mechanism
+               if (m_testCtx.getCommandLine().getRunMode() == tcu::RUNMODE_EXECUTE)
+               {
+                       const glu::ContextInfo& contextInfo = m_context->getContextInfo();
+                       m_waiverMechanism->setup(m_context->getTestContext().getCommandLine().getWaiverFileName(), m_name,
+                                                                        contextInfo.getString(GL_VENDOR), contextInfo.getString(GL_RENDERER));
+               }
+
                // Add main test groups
                addChild(new InfoTests                                          (*m_context));
                addChild(new Functional::FunctionalTests        (*m_context));
@@ -156,7 +172,7 @@ void TestPackage::deinit (void)
 
 tcu::TestCaseExecutor* TestPackage::createExecutor (void) const
 {
-       return new TestCaseWrapper(const_cast<TestPackage&>(*this));
+       return new TestCaseWrapper(const_cast<TestPackage&>(*this), m_waiverMechanism);
 }
 
 } // gles3
index 68c8cbf2dec7a9c53b472b5aba23d5a5720f5466..12fd987759a80253cbed93acd7ac05b0b92794c3 100644 (file)
 #include "tcuTestPackage.hpp"
 #include "tes3Context.hpp"
 #include "tcuResource.hpp"
+#include "deSharedPtr.hpp"
+
+namespace tcu
+{
+       class WaiverUtil;
+};
 
 namespace deqp
 {
@@ -50,6 +56,7 @@ public:
 private:
        tcu::ResourcePrefix                             m_archive;
        Context*                                                m_context;
+       de::SharedPtr<tcu::WaiverUtil>  m_waiverMechanism;
 };
 
 } // gles3
index 225cf94fcaf41afa8ffecdc3daeb54fcf775eed8..c618795e238285ff7efa28a875d1ce4ae81a535b 100644 (file)
 #include "es31sStressTests.hpp"
 #include "gluStateReset.hpp"
 #include "gluRenderContext.hpp"
+#include "gluContextInfo.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
+#include "tcuWaiverUtil.hpp"
+#include "glwEnums.hpp"
 
 namespace deqp
 {
@@ -37,7 +41,7 @@ namespace gles31
 class TestCaseWrapper : public tcu::TestCaseExecutor
 {
 public:
-                                                                       TestCaseWrapper         (TestPackage& package);
+                                                                       TestCaseWrapper         (TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
                                                                        ~TestCaseWrapper        (void);
 
        void                                                    init                            (tcu::TestCase* testCase, const std::string& path);
@@ -46,10 +50,12 @@ public:
 
 private:
        TestPackage&                                    m_testPackage;
+       de::SharedPtr<tcu::WaiverUtil>  m_waiverMechanism;
 };
 
-TestCaseWrapper::TestCaseWrapper (TestPackage& package)
-       : m_testPackage(package)
+TestCaseWrapper::TestCaseWrapper (TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
+       : m_testPackage         (package)
+       , m_waiverMechanism     (waiverMechanism)
 {
 }
 
@@ -57,8 +63,11 @@ TestCaseWrapper::~TestCaseWrapper (void)
 {
 }
 
-void TestCaseWrapper::init (tcu::TestCase* testCase, const std::string&)
+void TestCaseWrapper::init (tcu::TestCase* testCase, const std::string& path)
 {
+       if (m_waiverMechanism->isOnWaiverList(path))
+               throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
        testCase->init();
 }
 
@@ -100,6 +109,7 @@ TestPackage::TestPackage (tcu::TestContext& testCtx)
        : tcu::TestPackage      (testCtx, "dEQP-GLES31", "dEQP OpenGL ES 3.1 Tests")
        , m_archive                     (testCtx.getRootArchive(), "gles31/")
        , m_context                     (DE_NULL)
+       , m_waiverMechanism (new tcu::WaiverUtil)
 {
 }
 
@@ -117,6 +127,16 @@ void TestPackage::init (void)
                // Create context
                m_context = new Context(m_testCtx);
 
+               // Setup waiver mechanism
+               if (m_testCtx.getCommandLine().getRunMode() == tcu::RUNMODE_EXECUTE)
+               {
+                       const glu::ContextInfo& contextInfo = m_context->getContextInfo();
+                       m_waiverMechanism->setup(m_context->getTestContext().getCommandLine().getWaiverFileName(),
+                                                                        m_name,
+                                                                        contextInfo.getString(GL_VENDOR),
+                                                                        contextInfo.getString(GL_RENDERER));
+               }
+
                // Add main test groups
                addChild(new InfoTests                                          (*m_context));
                addChild(new Functional::FunctionalTests        (*m_context));
@@ -140,7 +160,7 @@ void TestPackage::deinit (void)
 
 tcu::TestCaseExecutor* TestPackage::createExecutor (void) const
 {
-       return new TestCaseWrapper(const_cast<TestPackage&>(*this));
+       return new TestCaseWrapper(const_cast<TestPackage&>(*this), m_waiverMechanism);
 }
 
 } // gles31
index 1372f83dece323e14121341682317b83a6eb72f9..a42c418cca14833b8e857735996d4fce3cf4afc4 100644 (file)
 #include "tcuTestPackage.hpp"
 #include "tes31Context.hpp"
 #include "tcuResource.hpp"
+#include "deSharedPtr.hpp"
+
+namespace tcu
+{
+       class WaiverUtil;
+};
 
 namespace deqp
 {
@@ -50,6 +56,7 @@ public:
 private:
        tcu::ResourcePrefix                             m_archive;
        Context*                                                m_context;
+       de::SharedPtr<tcu::WaiverUtil>  m_waiverMechanism;
 };
 
 } // gles31