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 38using namespace glw; 39using namespace glu; 40 41namespace gl4cts 42{ 43 44/** Constructor. 45 * 46 * @param context Rendering context 47 */ 48SpirvExtensionsQueriesTestCase::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 */ 56void 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 */ 76tcu::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 */ 131SpirvExtensionsTests::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. */ 137void SpirvExtensionsTests::init() 138{ 139 addChild(new SpirvExtensionsQueriesTestCase(m_context)); 140} 141 142} /* gl4cts namespace */ 143