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