1e5c31af7Sopenharmony_ci#ifndef _GL4CGLSPIRVTESTS_HPP 2e5c31af7Sopenharmony_ci#define _GL4CGLSPIRVTESTS_HPP 3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 4e5c31af7Sopenharmony_ci * OpenGL Conformance Test Suite 5e5c31af7Sopenharmony_ci * ----------------------------- 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Copyright (c) 2017 The Khronos Group Inc. 8e5c31af7Sopenharmony_ci * 9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci * 15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci * limitations under the License. 20e5c31af7Sopenharmony_ci * 21e5c31af7Sopenharmony_ci */ /*! 22e5c31af7Sopenharmony_ci * \file 23e5c31af7Sopenharmony_ci * \brief 24e5c31af7Sopenharmony_ci */ /*-------------------------------------------------------------------*/ 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci/** 27e5c31af7Sopenharmony_ci */ /*! 28e5c31af7Sopenharmony_ci * \file gl4cGlSpirvTests.hpp 29e5c31af7Sopenharmony_ci * \brief Conformance tests for the GL_ARB_gl_spirv functionality. 30e5c31af7Sopenharmony_ci */ /*-------------------------------------------------------------------*/ 31e5c31af7Sopenharmony_ci 32e5c31af7Sopenharmony_ci#include "../common/glcSpirvUtils.hpp" 33e5c31af7Sopenharmony_ci#include "glcTestCase.hpp" 34e5c31af7Sopenharmony_ci#include "gluShaderProgram.hpp" 35e5c31af7Sopenharmony_ci#include "glwDefs.hpp" 36e5c31af7Sopenharmony_ci#include "tcuDefs.hpp" 37e5c31af7Sopenharmony_ci#include <map> 38e5c31af7Sopenharmony_ci#include <vector> 39e5c31af7Sopenharmony_ci 40e5c31af7Sopenharmony_ciusing namespace glu; 41e5c31af7Sopenharmony_ciusing namespace glw; 42e5c31af7Sopenharmony_ciusing namespace glc; 43e5c31af7Sopenharmony_ci 44e5c31af7Sopenharmony_cinamespace gl4cts 45e5c31af7Sopenharmony_ci{ 46e5c31af7Sopenharmony_ci 47e5c31af7Sopenharmony_citypedef std::vector<std::string> CapabilitiesVec; 48e5c31af7Sopenharmony_ci 49e5c31af7Sopenharmony_ci/** Verifies if using SPIR-V modules for each shader stage works as expected. */ 50e5c31af7Sopenharmony_ciclass SpirvModulesPositiveTest : public deqp::TestCase 51e5c31af7Sopenharmony_ci{ 52e5c31af7Sopenharmony_cipublic: 53e5c31af7Sopenharmony_ci /* Public methods */ 54e5c31af7Sopenharmony_ci SpirvModulesPositiveTest(deqp::Context& context); 55e5c31af7Sopenharmony_ci 56e5c31af7Sopenharmony_ci void init(); 57e5c31af7Sopenharmony_ci void deinit(); 58e5c31af7Sopenharmony_ci 59e5c31af7Sopenharmony_ci tcu::TestNode::IterateResult iterate(); 60e5c31af7Sopenharmony_ci 61e5c31af7Sopenharmony_ciprivate: 62e5c31af7Sopenharmony_ci /* Private methods */ 63e5c31af7Sopenharmony_ci 64e5c31af7Sopenharmony_ci /* Private members */ 65e5c31af7Sopenharmony_ci GLuint m_texture; 66e5c31af7Sopenharmony_ci GLuint m_fbo; 67e5c31af7Sopenharmony_ci 68e5c31af7Sopenharmony_ci std::string m_vertex; 69e5c31af7Sopenharmony_ci std::string m_tesselationCtrl; 70e5c31af7Sopenharmony_ci std::string m_tesselationEval; 71e5c31af7Sopenharmony_ci std::string m_geometry; 72e5c31af7Sopenharmony_ci std::string m_fragment; 73e5c31af7Sopenharmony_ci}; 74e5c31af7Sopenharmony_ci 75e5c31af7Sopenharmony_ci/** Verifies if one binary module can be associated with multiple shader objects. */ 76e5c31af7Sopenharmony_ciclass SpirvShaderBinaryMultipleShaderObjectsTest : public deqp::TestCase 77e5c31af7Sopenharmony_ci{ 78e5c31af7Sopenharmony_cipublic: 79e5c31af7Sopenharmony_ci /* Public methods */ 80e5c31af7Sopenharmony_ci SpirvShaderBinaryMultipleShaderObjectsTest(deqp::Context& context); 81e5c31af7Sopenharmony_ci 82e5c31af7Sopenharmony_ci void init(); 83e5c31af7Sopenharmony_ci void deinit(); 84e5c31af7Sopenharmony_ci 85e5c31af7Sopenharmony_ci tcu::TestNode::IterateResult iterate(); 86e5c31af7Sopenharmony_ci 87e5c31af7Sopenharmony_ciprivate: 88e5c31af7Sopenharmony_ci /* Private methods */ 89e5c31af7Sopenharmony_ci 90e5c31af7Sopenharmony_ci /* Private members */ 91e5c31af7Sopenharmony_ci std::string m_spirv; 92e5c31af7Sopenharmony_ci}; 93e5c31af7Sopenharmony_ci 94e5c31af7Sopenharmony_ci/** Verifies if state queries for new features added by ARB_gl_spirv works as expected. */ 95e5c31af7Sopenharmony_ciclass SpirvModulesStateQueriesTest : public deqp::TestCase 96e5c31af7Sopenharmony_ci{ 97e5c31af7Sopenharmony_cipublic: 98e5c31af7Sopenharmony_ci /* Public methods */ 99e5c31af7Sopenharmony_ci SpirvModulesStateQueriesTest(deqp::Context& context); 100e5c31af7Sopenharmony_ci 101e5c31af7Sopenharmony_ci void init(); 102e5c31af7Sopenharmony_ci void deinit(); 103e5c31af7Sopenharmony_ci 104e5c31af7Sopenharmony_ci tcu::TestNode::IterateResult iterate(); 105e5c31af7Sopenharmony_ci 106e5c31af7Sopenharmony_ciprivate: 107e5c31af7Sopenharmony_ci /* Private methods */ 108e5c31af7Sopenharmony_ci 109e5c31af7Sopenharmony_ci /* Private members */ 110e5c31af7Sopenharmony_ci std::string m_vertex; 111e5c31af7Sopenharmony_ci}; 112e5c31af7Sopenharmony_ci 113e5c31af7Sopenharmony_ci/** Verifies if new features added by ARB_gl_spirv generate error messages as expected. */ 114e5c31af7Sopenharmony_ciclass SpirvModulesErrorVerificationTest : public deqp::TestCase 115e5c31af7Sopenharmony_ci{ 116e5c31af7Sopenharmony_cipublic: 117e5c31af7Sopenharmony_ci /* Public methods */ 118e5c31af7Sopenharmony_ci SpirvModulesErrorVerificationTest(deqp::Context& context); 119e5c31af7Sopenharmony_ci 120e5c31af7Sopenharmony_ci void init(); 121e5c31af7Sopenharmony_ci void deinit(); 122e5c31af7Sopenharmony_ci 123e5c31af7Sopenharmony_ci tcu::TestNode::IterateResult iterate(); 124e5c31af7Sopenharmony_ci 125e5c31af7Sopenharmony_ciprivate: 126e5c31af7Sopenharmony_ci /* Private methods */ 127e5c31af7Sopenharmony_ci 128e5c31af7Sopenharmony_ci /* Private members */ 129e5c31af7Sopenharmony_ci std::string m_vertex; 130e5c31af7Sopenharmony_ci 131e5c31af7Sopenharmony_ci GLuint m_glslShaderId; 132e5c31af7Sopenharmony_ci GLuint m_spirvShaderId; 133e5c31af7Sopenharmony_ci GLuint m_programId; 134e5c31af7Sopenharmony_ci GLuint m_textureId; 135e5c31af7Sopenharmony_ci}; 136e5c31af7Sopenharmony_ci 137e5c31af7Sopenharmony_ci/** Verifies if GLSL to Spir-V converter supports Spir-V features. */ 138e5c31af7Sopenharmony_ciclass SpirvGlslToSpirVEnableTest : public deqp::TestCase 139e5c31af7Sopenharmony_ci{ 140e5c31af7Sopenharmony_cipublic: 141e5c31af7Sopenharmony_ci /* Public methods */ 142e5c31af7Sopenharmony_ci SpirvGlslToSpirVEnableTest(deqp::Context& context); 143e5c31af7Sopenharmony_ci 144e5c31af7Sopenharmony_ci void init(); 145e5c31af7Sopenharmony_ci void deinit(); 146e5c31af7Sopenharmony_ci 147e5c31af7Sopenharmony_ci tcu::TestNode::IterateResult iterate(); 148e5c31af7Sopenharmony_ci 149e5c31af7Sopenharmony_ciprivate: 150e5c31af7Sopenharmony_ci /* Private methods */ 151e5c31af7Sopenharmony_ci 152e5c31af7Sopenharmony_ci /* Private members */ 153e5c31af7Sopenharmony_ci std::string m_vertex; 154e5c31af7Sopenharmony_ci}; 155e5c31af7Sopenharmony_ci 156e5c31af7Sopenharmony_ci/** Verifies if GLSL built-in functions are supported by Spir-V. */ 157e5c31af7Sopenharmony_ciclass SpirvGlslToSpirVBuiltInFunctionsTest : public deqp::TestCase 158e5c31af7Sopenharmony_ci{ 159e5c31af7Sopenharmony_cipublic: 160e5c31af7Sopenharmony_ci /* Public methods */ 161e5c31af7Sopenharmony_ci SpirvGlslToSpirVBuiltInFunctionsTest(deqp::Context& context); 162e5c31af7Sopenharmony_ci 163e5c31af7Sopenharmony_ci void init(); 164e5c31af7Sopenharmony_ci void deinit(); 165e5c31af7Sopenharmony_ci 166e5c31af7Sopenharmony_ci tcu::TestNode::IterateResult iterate(); 167e5c31af7Sopenharmony_ci 168e5c31af7Sopenharmony_ciprivate: 169e5c31af7Sopenharmony_ci /* Private methods */ 170e5c31af7Sopenharmony_ci void initMappings(); 171e5c31af7Sopenharmony_ci 172e5c31af7Sopenharmony_ci /* Private members */ 173e5c31af7Sopenharmony_ci SpirVMapping m_mappings; 174e5c31af7Sopenharmony_ci 175e5c31af7Sopenharmony_ci std::string m_commonVertex; 176e5c31af7Sopenharmony_ci std::string m_commonTessEval; 177e5c31af7Sopenharmony_ci std::vector<ShaderSource> m_sources; 178e5c31af7Sopenharmony_ci}; 179e5c31af7Sopenharmony_ci 180e5c31af7Sopenharmony_ci/** Verifies if constant specialization feature works as expected. */ 181e5c31af7Sopenharmony_ciclass SpirvGlslToSpirVSpecializationConstantsTest : public deqp::TestCase 182e5c31af7Sopenharmony_ci{ 183e5c31af7Sopenharmony_cipublic: 184e5c31af7Sopenharmony_ci /* Public methods */ 185e5c31af7Sopenharmony_ci SpirvGlslToSpirVSpecializationConstantsTest(deqp::Context& context); 186e5c31af7Sopenharmony_ci 187e5c31af7Sopenharmony_ci void init(); 188e5c31af7Sopenharmony_ci void deinit(); 189e5c31af7Sopenharmony_ci 190e5c31af7Sopenharmony_ci tcu::TestNode::IterateResult iterate(); 191e5c31af7Sopenharmony_ci 192e5c31af7Sopenharmony_ciprivate: 193e5c31af7Sopenharmony_ci /* Private methods */ 194e5c31af7Sopenharmony_ci 195e5c31af7Sopenharmony_ci /* Private members */ 196e5c31af7Sopenharmony_ci GLuint m_texture; 197e5c31af7Sopenharmony_ci GLuint m_fbo; 198e5c31af7Sopenharmony_ci 199e5c31af7Sopenharmony_ci std::string m_vertex; 200e5c31af7Sopenharmony_ci std::string m_fragment; 201e5c31af7Sopenharmony_ci}; 202e5c31af7Sopenharmony_ci 203e5c31af7Sopenharmony_ci/** Verifies if Spir-V built in variable decorations works as expected. */ 204e5c31af7Sopenharmony_ciclass SpirvValidationBuiltInVariableDecorationsTest : public deqp::TestCase 205e5c31af7Sopenharmony_ci{ 206e5c31af7Sopenharmony_cipublic: 207e5c31af7Sopenharmony_ci /* Public methods */ 208e5c31af7Sopenharmony_ci SpirvValidationBuiltInVariableDecorationsTest(deqp::Context& context); 209e5c31af7Sopenharmony_ci 210e5c31af7Sopenharmony_ci void init(); 211e5c31af7Sopenharmony_ci void deinit(); 212e5c31af7Sopenharmony_ci 213e5c31af7Sopenharmony_ci tcu::TestNode::IterateResult iterate(); 214e5c31af7Sopenharmony_ci 215e5c31af7Sopenharmony_ciprivate: /* Private structs */ 216e5c31af7Sopenharmony_ci struct ValidationOutputStruct 217e5c31af7Sopenharmony_ci { 218e5c31af7Sopenharmony_ci GLubyte x, y, z; 219e5c31af7Sopenharmony_ci GLuint value; 220e5c31af7Sopenharmony_ci 221e5c31af7Sopenharmony_ci ValidationOutputStruct() : x(0), y(0), z(0), value(0) 222e5c31af7Sopenharmony_ci { 223e5c31af7Sopenharmony_ci } 224e5c31af7Sopenharmony_ci 225e5c31af7Sopenharmony_ci ValidationOutputStruct(GLubyte _x, GLubyte _y, GLuint _value) : x(_x), y(_y), z(0), value(_value) 226e5c31af7Sopenharmony_ci { 227e5c31af7Sopenharmony_ci } 228e5c31af7Sopenharmony_ci 229e5c31af7Sopenharmony_ci ValidationOutputStruct(GLubyte _x, GLubyte _y, GLubyte _z, GLuint _value) : x(_x), y(_y), z(_z), value(_value) 230e5c31af7Sopenharmony_ci { 231e5c31af7Sopenharmony_ci } 232e5c31af7Sopenharmony_ci }; 233e5c31af7Sopenharmony_ci 234e5c31af7Sopenharmony_ci typedef std::vector<ValidationOutputStruct> ValidationOutputVec; 235e5c31af7Sopenharmony_ci 236e5c31af7Sopenharmony_ci typedef bool (SpirvValidationBuiltInVariableDecorationsTest::*ValidationFuncPtr)(ValidationOutputVec& outputs); 237e5c31af7Sopenharmony_ci 238e5c31af7Sopenharmony_ci struct ValidationStruct 239e5c31af7Sopenharmony_ci { 240e5c31af7Sopenharmony_ci std::vector<ShaderSource> shaders; 241e5c31af7Sopenharmony_ci ValidationOutputVec outputs; 242e5c31af7Sopenharmony_ci ValidationFuncPtr validationFuncPtr; 243e5c31af7Sopenharmony_ci 244e5c31af7Sopenharmony_ci ValidationStruct() : validationFuncPtr(DE_NULL) 245e5c31af7Sopenharmony_ci { 246e5c31af7Sopenharmony_ci } 247e5c31af7Sopenharmony_ci 248e5c31af7Sopenharmony_ci ValidationStruct(ValidationFuncPtr funcPtr) : validationFuncPtr(funcPtr) 249e5c31af7Sopenharmony_ci { 250e5c31af7Sopenharmony_ci } 251e5c31af7Sopenharmony_ci }; 252e5c31af7Sopenharmony_ci 253e5c31af7Sopenharmony_ci /* Private methods */ 254e5c31af7Sopenharmony_ci bool validComputeFunc(ValidationOutputVec& outputs); 255e5c31af7Sopenharmony_ci bool validPerVertexFragFunc(ValidationOutputVec& outputs); 256e5c31af7Sopenharmony_ci bool validPerVertexPointFunc(ValidationOutputVec& outputs); 257e5c31af7Sopenharmony_ci bool validTesselationGeometryFunc(ValidationOutputVec& outputs); 258e5c31af7Sopenharmony_ci bool validMultiSamplingFunc(ValidationOutputVec& outputs); 259e5c31af7Sopenharmony_ci 260e5c31af7Sopenharmony_ci /* Private members */ 261e5c31af7Sopenharmony_ci SpirVMapping m_mappings; 262e5c31af7Sopenharmony_ci 263e5c31af7Sopenharmony_ci std::vector<ValidationStruct> m_validations; 264e5c31af7Sopenharmony_ci 265e5c31af7Sopenharmony_ci std::string m_compute; 266e5c31af7Sopenharmony_ci std::string m_vertex; 267e5c31af7Sopenharmony_ci std::string m_tesselationCtrl; 268e5c31af7Sopenharmony_ci std::string m_tesselationEval; 269e5c31af7Sopenharmony_ci std::string m_geometry; 270e5c31af7Sopenharmony_ci std::string m_fragment; 271e5c31af7Sopenharmony_ci}; 272e5c31af7Sopenharmony_ci 273e5c31af7Sopenharmony_ci/** Verifies if Spir-V capabilities works as expected. */ 274e5c31af7Sopenharmony_ciclass SpirvValidationCapabilitiesTest : public deqp::TestCase 275e5c31af7Sopenharmony_ci{ 276e5c31af7Sopenharmony_cipublic: 277e5c31af7Sopenharmony_ci /* Public methods */ 278e5c31af7Sopenharmony_ci SpirvValidationCapabilitiesTest(deqp::Context& context); 279e5c31af7Sopenharmony_ci 280e5c31af7Sopenharmony_ci void init(); 281e5c31af7Sopenharmony_ci void deinit(); 282e5c31af7Sopenharmony_ci 283e5c31af7Sopenharmony_ci tcu::TestNode::IterateResult iterate(); 284e5c31af7Sopenharmony_ci 285e5c31af7Sopenharmony_ci int spirVCapabilityCutOff(std::string spirVSrcInput, std::string& spirVSrcOutput, CapabilitiesVec& capabilities, 286e5c31af7Sopenharmony_ci int& currentCapability); 287e5c31af7Sopenharmony_ci 288e5c31af7Sopenharmony_ciprivate: 289e5c31af7Sopenharmony_ci typedef std::map<glu::ShaderType, CapabilitiesVec> CapabilitiesMap; 290e5c31af7Sopenharmony_ci 291e5c31af7Sopenharmony_ci struct ShaderStage 292e5c31af7Sopenharmony_ci { 293e5c31af7Sopenharmony_ci std::string name; 294e5c31af7Sopenharmony_ci ShaderSource source; 295e5c31af7Sopenharmony_ci ShaderBinary binary; 296e5c31af7Sopenharmony_ci CapabilitiesVec caps; 297e5c31af7Sopenharmony_ci 298e5c31af7Sopenharmony_ci ShaderStage() 299e5c31af7Sopenharmony_ci { 300e5c31af7Sopenharmony_ci } 301e5c31af7Sopenharmony_ci 302e5c31af7Sopenharmony_ci ShaderStage(std::string _name) : name(_name) 303e5c31af7Sopenharmony_ci { 304e5c31af7Sopenharmony_ci } 305e5c31af7Sopenharmony_ci }; 306e5c31af7Sopenharmony_ci 307e5c31af7Sopenharmony_ci typedef std::vector<ShaderStage> Pipeline; 308e5c31af7Sopenharmony_ci 309e5c31af7Sopenharmony_ci /* Private methods */ 310e5c31af7Sopenharmony_ci 311e5c31af7Sopenharmony_ci /* Private members */ 312e5c31af7Sopenharmony_ci std::vector<Pipeline> m_pipelines; 313e5c31af7Sopenharmony_ci}; 314e5c31af7Sopenharmony_ci 315e5c31af7Sopenharmony_ci/** Test group which encapsulates all sparse buffer conformance tests */ 316e5c31af7Sopenharmony_ciclass GlSpirvTests : public deqp::TestCaseGroup 317e5c31af7Sopenharmony_ci{ 318e5c31af7Sopenharmony_cipublic: 319e5c31af7Sopenharmony_ci /* Public methods */ 320e5c31af7Sopenharmony_ci GlSpirvTests(deqp::Context& context); 321e5c31af7Sopenharmony_ci 322e5c31af7Sopenharmony_ci void init(); 323e5c31af7Sopenharmony_ci 324e5c31af7Sopenharmony_ciprivate: 325e5c31af7Sopenharmony_ci GlSpirvTests(const GlSpirvTests& other); 326e5c31af7Sopenharmony_ci GlSpirvTests& operator=(const GlSpirvTests& other); 327e5c31af7Sopenharmony_ci}; 328e5c31af7Sopenharmony_ci 329e5c31af7Sopenharmony_ci} /* glcts namespace */ 330e5c31af7Sopenharmony_ci 331e5c31af7Sopenharmony_ci#endif // _GL4CGLSPIRVTESTS_HPP 332