/*------------------------------------------------------------------------- * OpenGL Conformance Test Suite * ----------------------------- * * Copyright (c) 2017 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 */ /*-------------------------------------------------------------------*/ /** */ /*! * \file gl4cSpirvExtensionsTests.cpp * \brief Conformance tests for the GL_ARB_spirv_extensions functionality. */ /*-------------------------------------------------------------------*/ #include "gl4cSpirvExtensionsTests.hpp" #include "gluContextInfo.hpp" #include "gluDefs.hpp" #include "gluStrUtil.hpp" #include "glwEnums.hpp" #include "glwFunctions.hpp" #include "tcuTestLog.hpp" using namespace glw; using namespace glu; namespace gl4cts { /** Constructor. * * @param context Rendering context */ SpirvExtensionsQueriesTestCase::SpirvExtensionsQueriesTestCase(deqp::Context& context) : TestCase(context, "spirv_extensions_queries", "Verifies if queries for GL_ARB_spirv_extension tokens works as expected") { /* Left blank intentionally */ } /** Stub init method */ void SpirvExtensionsQueriesTestCase::init() { glu::ContextType contextType = m_context.getRenderContext().getType(); if (!glu::contextSupports(contextType, glu::ApiType::core(4, 6)) && !m_context.getContextInfo().isExtensionSupported("GL_ARB_spirv_extensions")) { TCU_THROW(NotSupportedError, "GL_ARB_spirv_extensions not supported"); } if (!glu::contextSupports(contextType, glu::ApiType::core(4, 6)) && !m_context.getContextInfo().isExtensionSupported("GL_ARB_gl_spirv")) { TCU_THROW(NotSupportedError, "GL_ARB_gl_spirv not supported"); } } /** Executes test iteration. * * @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed. */ tcu::TestNode::IterateResult SpirvExtensionsQueriesTestCase::iterate() { const Functions& gl = m_context.getRenderContext().getFunctions(); GLint numSpirvExtensions; gl.getIntegerv(GL_NUM_SPIR_V_EXTENSIONS, &numSpirvExtensions); GLU_EXPECT_NO_ERROR(gl.getError(), "getIntegerv"); m_testCtx.getLog() << tcu::TestLog::Message << "GL_NUM_SPIR_V_EXTENSIONS = " << numSpirvExtensions << "\n" << tcu::TestLog::EndMessage; for (GLint i = 0; i < numSpirvExtensions; ++i) { const GLubyte* spirvExtension = DE_NULL; spirvExtension = gl.getStringi(GL_SPIR_V_EXTENSIONS, i); GLU_EXPECT_NO_ERROR(gl.getError(), "getStringi"); if (!spirvExtension || strlen((const char*)spirvExtension) == 0) { m_testCtx.getLog() << tcu::TestLog::Message << "Failed to fetch GL_SPIRV_EXTENSIONS string for index: " << i << "\n" << tcu::TestLog::EndMessage; m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); return STOP; } else { m_testCtx.getLog() << tcu::TestLog::Message << "GL_SPIR_V_EXTENSION " << i << ": " << spirvExtension << "\n" << tcu::TestLog::EndMessage; } } // Test out of bound query gl.getStringi(GL_SPIR_V_EXTENSIONS, numSpirvExtensions); GLenum err = gl.getError(); if (err != GL_INVALID_VALUE) { m_testCtx.getLog() << tcu::TestLog::Message << "GetStringi query for GL_SPIRV_EXTENSIONS with index: " << numSpirvExtensions << " should generate INVALID_VALUE error instead of " << glu::getErrorName(err) << "\n" << tcu::TestLog::EndMessage; m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); return STOP; } m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); return STOP; } /** Constructor. * * @param context Rendering context. */ SpirvExtensionsTests::SpirvExtensionsTests(deqp::Context& context) : TestCaseGroup(context, "spirv_extensions", "Verify conformance of GL_ARB_spirv_extensions implementation") { } /** Initializes the test group contents. */ void SpirvExtensionsTests::init() { addChild(new SpirvExtensionsQueriesTestCase(m_context)); } } /* gl4cts namespace */