1 /*------------------------------------------------------------------------- 2 * OpenGL Conformance Test Suite 3 * ----------------------------- 4 * 5 * Copyright (c) 2017 The Khronos Group Inc. 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 */ /*! 20 * \file 21 * \brief 22 */ /*-------------------------------------------------------------------*/ 23 24 /** 25 */ /*! 26 * \file gl4cSpirvExtensionsTests.cpp 27 * \brief Conformance tests for the GL_ARB_spirv_extensions functionality. 28 */ /*-------------------------------------------------------------------*/ 29 30 #include "gl4cSpirvExtensionsTests.hpp" 31 #include "gluContextInfo.hpp" 32 #include "gluDefs.hpp" 33 #include "gluStrUtil.hpp" 34 #include "glwEnums.hpp" 35 #include "glwFunctions.hpp" 36 #include "tcuTestLog.hpp" 37 38 using namespace glw; 39 using namespace glu; 40 41 namespace gl4cts 42 { 43 44 /** Constructor. 45 * 46 * @param context Rendering context 47 */ 48 SpirvExtensionsQueriesTestCase::SpirvExtensionsQueriesTestCase(deqp::Context& context) 49 : TestCase(context, "spirv_extensions_queries", 50 "Verifies if queries for GL_ARB_spirv_extension tokens works as expected") 51 { 52 /* Left blank intentionally */ 53 } 54 55 /** Stub init method */ 56 void SpirvExtensionsQueriesTestCase::init() 57 { 58 glu::ContextType contextType = m_context.getRenderContext().getType(); 59 if (!glu::contextSupports(contextType, glu::ApiType::core(4, 6)) && 60 !m_context.getContextInfo().isExtensionSupported("GL_ARB_spirv_extensions")) 61 { 62 TCU_THROW(NotSupportedError, "GL_ARB_spirv_extensions not supported"); 63 } 64 65 if (!glu::contextSupports(contextType, glu::ApiType::core(4, 6)) && 66 !m_context.getContextInfo().isExtensionSupported("GL_ARB_gl_spirv")) 67 { 68 TCU_THROW(NotSupportedError, "GL_ARB_gl_spirv not supported"); 69 } 70 } 71 72 /** Executes test iteration. 73 * 74 * @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed. 75 */ 76 tcu::TestNode::IterateResult SpirvExtensionsQueriesTestCase::iterate() 77 { 78 const Functions& gl = m_context.getRenderContext().getFunctions(); 79 80 GLint numSpirvExtensions; 81 gl.getIntegerv(GL_NUM_SPIR_V_EXTENSIONS, &numSpirvExtensions); 82 GLU_EXPECT_NO_ERROR(gl.getError(), "getIntegerv"); 83 84 m_testCtx.getLog() << tcu::TestLog::Message << "GL_NUM_SPIR_V_EXTENSIONS = " << numSpirvExtensions << "\n" 85 << tcu::TestLog::EndMessage; 86 for (GLint i = 0; i < numSpirvExtensions; ++i) 87 { 88 const GLubyte* spirvExtension = DE_NULL; 89 90 spirvExtension = gl.getStringi(GL_SPIR_V_EXTENSIONS, i); 91 GLU_EXPECT_NO_ERROR(gl.getError(), "getStringi"); 92 93 if (!spirvExtension || strlen((const char*)spirvExtension) == 0) 94 { 95 m_testCtx.getLog() << tcu::TestLog::Message << "Failed to fetch GL_SPIRV_EXTENSIONS string for index: " << i 96 << "\n" 97 << tcu::TestLog::EndMessage; 98 99 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 100 return STOP; 101 } 102 else 103 { 104 m_testCtx.getLog() << tcu::TestLog::Message << "GL_SPIR_V_EXTENSION " << i << ": " << spirvExtension << "\n" 105 << tcu::TestLog::EndMessage; 106 } 107 } 108 109 // Test out of bound query 110 gl.getStringi(GL_SPIR_V_EXTENSIONS, numSpirvExtensions); 111 GLenum err = gl.getError(); 112 if (err != GL_INVALID_VALUE) 113 { 114 m_testCtx.getLog() << tcu::TestLog::Message 115 << "GetStringi query for GL_SPIRV_EXTENSIONS with index: " << numSpirvExtensions 116 << " should generate INVALID_VALUE error instead of " << glu::getErrorName(err) << "\n" 117 << tcu::TestLog::EndMessage; 118 119 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 120 return STOP; 121 } 122 123 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 124 return STOP; 125 } 126 127 /** Constructor. 128 * 129 * @param context Rendering context. 130 */ 131 SpirvExtensionsTests::SpirvExtensionsTests(deqp::Context& context) 132 : TestCaseGroup(context, "spirv_extensions", "Verify conformance of GL_ARB_spirv_extensions implementation") 133 { 134 } 135 136 /** Initializes the test group contents. */ 137 void SpirvExtensionsTests::init() 138 { 139 addChild(new SpirvExtensionsQueriesTestCase(m_context)); 140 } 141 142 } /* gl4cts namespace */ 143