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 float float32; 78 deInt32 int32; 79 deInt32 bool32; 80 }; 81 82 StorageType storageType; 83 std::string valueName; 84 glu::DataType dataType; 85 int arrayLength; // Number of elements in array (currently always 1). 86 std::vector<Element> elements; // Scalar values (length dataType.scalarSize * arrayLength). 87 }; 88 89 struct ValueBlock 90 { 91 int arrayLength; // Combined array length of each value (lengths must be same, or one). 92 std::vector<Value> values; ValueBlockdeqp::sl::ShaderCase::ValueBlock93 ValueBlock(void) 94 { 95 arrayLength = 0; 96 values.empty(); 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 } // sl 154 } // deqp 155 156 #endif // _GLCSHADERLIBRARYCASE_HPP 157