1 #ifndef _GLCSHADERLIBRARYCASE_HPP 2 #define _GLCSHADERLIBRARYCASE_HPP 3 /*------------------------------------------------------------------------- 4 * OpenGL Conformance Test Suite 5 * ----------------------------- 6 * 7 * Copyright (c) 2016 Google Inc. 8 * Copyright (c) 2016 The Khronos Group Inc. 9 * 10 * Licensed under the Apache License, Version 2.0 (the "License"); 11 * you may not use this file except in compliance with the License. 12 * You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software 17 * distributed under the License is distributed on an "AS IS" BASIS, 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 * See the License for the specific language governing permissions and 20 * limitations under the License. 21 * 22 */ /*! 23 * \file 24 * \brief Shader test case. 25 */ /*-------------------------------------------------------------------*/ 26 27 #include "glcTestCase.hpp" 28 #include "gluDefs.hpp" 29 #include "gluRenderContext.hpp" 30 #include "gluShaderUtil.hpp" 31 #include "tcuSurface.hpp" 32 33 #include <string> 34 #include <vector> 35 36 namespace deqp 37 { 38 namespace sl 39 { 40 41 // ShaderCase node. 42 43 class ShaderCase : public tcu::TestCase 44 { 45 public: 46 enum CaseType 47 { 48 CASETYPE_COMPLETE = 0, //!< Has both shaders. 49 CASETYPE_VERTEX_ONLY, //!< Has only vertex shader. 50 CASETYPE_FRAGMENT_ONLY, //!< Has only fragment shader. 51 52 CASETYPE_LAST 53 }; 54 55 enum ExpectResult 56 { 57 EXPECT_PASS = 0, 58 EXPECT_COMPILE_FAIL, 59 EXPECT_LINK_FAIL, 60 61 EXPECT_LAST 62 }; 63 64 struct Value 65 { 66 enum StorageType 67 { 68 STORAGE_UNIFORM, 69 STORAGE_INPUT, 70 STORAGE_OUTPUT, 71 72 STORAGE_LAST 73 }; 74 75 /* \todo [2010-03-31 petri] Replace with another vector to allow a) arrays, b) compact representation */ 76 union Element 77 { 78 float float32; 79 int32_t int32; 80 int32_t bool32; 81 }; 82 83 StorageType storageType; 84 std::string valueName; 85 glu::DataType dataType; 86 int arrayLength; // Number of elements in array (currently always 1). 87 std::vector<Element> elements; // Scalar values (length dataType.scalarSize * arrayLength). 88 }; 89 90 struct ValueBlock 91 { 92 int arrayLength; // Combined array length of each value (lengths must be same, or one). 93 std::vector<Value> values; ValueBlockdeqp::sl::ShaderCase::ValueBlock94 ValueBlock(void) 95 { 96 arrayLength = 0; 97 } 98 }; 99 100 // Methods. 101 ShaderCase(tcu::TestContext &testCtx, glu::RenderContext &renderCtx, const char *caseName, const char *description, 102 ExpectResult expectResult, const std::vector<ValueBlock> &valueBlocks, glu::GLSLVersion targetVersion, 103 const char *vertexSource, const char *fragmentSource); 104 105 virtual ~ShaderCase(void); 106 getCaseType(void) const107 CaseType getCaseType(void) const 108 { 109 return m_caseType; 110 } getValueBlocks(void) const111 const std::vector<ValueBlock> &getValueBlocks(void) const 112 { 113 return m_valueBlocks; 114 } getVertexSource(void) const115 const char *getVertexSource(void) const 116 { 117 return m_vertexSource.c_str(); 118 } getFragmentSource(void) const119 const char *getFragmentSource(void) const 120 { 121 return m_fragmentSource.c_str(); 122 } 123 124 bool execute(void); 125 IterateResult iterate(void); 126 127 private: 128 ShaderCase(const ShaderCase &); // not allowed! 129 ShaderCase &operator=(const ShaderCase &); // not allowed! 130 131 std::string genVertexShader(const ValueBlock &valueBlock); 132 std::string genFragmentShader(const ValueBlock &valueBlock); 133 std::string specializeVertexShader(const char *src, const ValueBlock &valueBlock); 134 std::string specializeFragmentShader(const char *src, const ValueBlock &valueBlock); 135 136 void specializeShaders(const char *vertexSource, const char *fragmentSource, std::string &outVertexSource, 137 std::string &outFragmentSource, const ValueBlock &valueBlock); 138 139 void dumpValues(const ValueBlock &valueBlock, int arrayNdx); 140 141 bool checkPixels(tcu::Surface &surface, int minX, int maxX, int minY, int maxY); 142 143 // Member variables. 144 glu::RenderContext &m_renderCtx; 145 CaseType m_caseType; 146 ExpectResult m_expectResult; 147 std::vector<ValueBlock> m_valueBlocks; 148 glu::GLSLVersion m_targetVersion; 149 std::string m_vertexSource; 150 std::string m_fragmentSource; 151 }; 152 153 } // namespace sl 154 } // namespace deqp 155 156 #endif // _GLCSHADERLIBRARYCASE_HPP 157