1*35238bceSAndroid Build Coastguard Worker #ifndef _GLUSHADERLIBRARY_HPP 2*35238bceSAndroid Build Coastguard Worker #define _GLUSHADERLIBRARY_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES Utilities 5*35238bceSAndroid Build Coastguard Worker * ------------------------------------------------ 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2015 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief Shader .test file utilities. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "gluDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker #include "gluVarType.hpp" 28*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp" 29*35238bceSAndroid Build Coastguard Worker #include "tcuTestCase.hpp" 30*35238bceSAndroid Build Coastguard Worker 31*35238bceSAndroid Build Coastguard Worker #include <string> 32*35238bceSAndroid Build Coastguard Worker #include <vector> 33*35238bceSAndroid Build Coastguard Worker 34*35238bceSAndroid Build Coastguard Worker namespace glu 35*35238bceSAndroid Build Coastguard Worker { 36*35238bceSAndroid Build Coastguard Worker namespace sl 37*35238bceSAndroid Build Coastguard Worker { 38*35238bceSAndroid Build Coastguard Worker 39*35238bceSAndroid Build Coastguard Worker enum CaseType 40*35238bceSAndroid Build Coastguard Worker { 41*35238bceSAndroid Build Coastguard Worker CASETYPE_COMPLETE = 0, //!< Has all shaders specified separately. 42*35238bceSAndroid Build Coastguard Worker CASETYPE_VERTEX_ONLY, //!< "Both" case, vertex shader sub case. 43*35238bceSAndroid Build Coastguard Worker CASETYPE_FRAGMENT_ONLY, //!< "Both" case, fragment shader sub case. 44*35238bceSAndroid Build Coastguard Worker 45*35238bceSAndroid Build Coastguard Worker CASETYPE_LAST 46*35238bceSAndroid Build Coastguard Worker }; 47*35238bceSAndroid Build Coastguard Worker 48*35238bceSAndroid Build Coastguard Worker enum ExpectResult 49*35238bceSAndroid Build Coastguard Worker { 50*35238bceSAndroid Build Coastguard Worker EXPECT_PASS = 0, 51*35238bceSAndroid Build Coastguard Worker EXPECT_COMPILE_FAIL, 52*35238bceSAndroid Build Coastguard Worker EXPECT_LINK_FAIL, 53*35238bceSAndroid Build Coastguard Worker EXPECT_COMPILE_LINK_FAIL, 54*35238bceSAndroid Build Coastguard Worker EXPECT_VALIDATION_FAIL, 55*35238bceSAndroid Build Coastguard Worker EXPECT_BUILD_SUCCESSFUL, 56*35238bceSAndroid Build Coastguard Worker 57*35238bceSAndroid Build Coastguard Worker EXPECT_LAST 58*35238bceSAndroid Build Coastguard Worker }; 59*35238bceSAndroid Build Coastguard Worker 60*35238bceSAndroid Build Coastguard Worker enum OutputType 61*35238bceSAndroid Build Coastguard Worker { 62*35238bceSAndroid Build Coastguard Worker OUTPUT_RESULT = 0, 63*35238bceSAndroid Build Coastguard Worker OUTPUT_COLOR, 64*35238bceSAndroid Build Coastguard Worker 65*35238bceSAndroid Build Coastguard Worker OUTPUT_LAST 66*35238bceSAndroid Build Coastguard Worker }; 67*35238bceSAndroid Build Coastguard Worker 68*35238bceSAndroid Build Coastguard Worker struct Value 69*35238bceSAndroid Build Coastguard Worker { 70*35238bceSAndroid Build Coastguard Worker union Element 71*35238bceSAndroid Build Coastguard Worker { 72*35238bceSAndroid Build Coastguard Worker float float32; 73*35238bceSAndroid Build Coastguard Worker int32_t int32; 74*35238bceSAndroid Build Coastguard Worker int32_t bool32; 75*35238bceSAndroid Build Coastguard Worker }; 76*35238bceSAndroid Build Coastguard Worker 77*35238bceSAndroid Build Coastguard Worker VarType type; 78*35238bceSAndroid Build Coastguard Worker std::string name; 79*35238bceSAndroid Build Coastguard Worker std::vector<Element> elements; // Scalar values (variable.varType.getScalarSize() * #values). 80*35238bceSAndroid Build Coastguard Worker }; 81*35238bceSAndroid Build Coastguard Worker 82*35238bceSAndroid Build Coastguard Worker struct ValueBlock 83*35238bceSAndroid Build Coastguard Worker { 84*35238bceSAndroid Build Coastguard Worker std::vector<Value> inputs; 85*35238bceSAndroid Build Coastguard Worker std::vector<Value> outputs; 86*35238bceSAndroid Build Coastguard Worker std::vector<Value> uniforms; 87*35238bceSAndroid Build Coastguard Worker }; 88*35238bceSAndroid Build Coastguard Worker 89*35238bceSAndroid Build Coastguard Worker enum CapabilityType 90*35238bceSAndroid Build Coastguard Worker { 91*35238bceSAndroid Build Coastguard Worker CAPABILITY_LIMIT = 0, 92*35238bceSAndroid Build Coastguard Worker CAPABILITY_FLAG, 93*35238bceSAndroid Build Coastguard Worker 94*35238bceSAndroid Build Coastguard Worker CAPABILITY_LAST 95*35238bceSAndroid Build Coastguard Worker }; 96*35238bceSAndroid Build Coastguard Worker 97*35238bceSAndroid Build Coastguard Worker enum CapabilityFlag 98*35238bceSAndroid Build Coastguard Worker { 99*35238bceSAndroid Build Coastguard Worker CAPABILITY_FULL_GLSL_ES_100_SUPPORT, 100*35238bceSAndroid Build Coastguard Worker CAPABILITY_ONLY_GLSL_ES_100_SUPPORT, // only ES2, no ES3 capability 101*35238bceSAndroid Build Coastguard Worker CAPABILITY_EXACTLY_ONE_DRAW_BUFFER // gl_MaxDrawBuffers is exactly 1 102*35238bceSAndroid Build Coastguard Worker }; 103*35238bceSAndroid Build Coastguard Worker 104*35238bceSAndroid Build Coastguard Worker struct RequiredCapability 105*35238bceSAndroid Build Coastguard Worker { 106*35238bceSAndroid Build Coastguard Worker CapabilityType type; 107*35238bceSAndroid Build Coastguard Worker 108*35238bceSAndroid Build Coastguard Worker union 109*35238bceSAndroid Build Coastguard Worker { 110*35238bceSAndroid Build Coastguard Worker CapabilityFlag flagName; 111*35238bceSAndroid Build Coastguard Worker uint32_t enumName; 112*35238bceSAndroid Build Coastguard Worker }; 113*35238bceSAndroid Build Coastguard Worker 114*35238bceSAndroid Build Coastguard Worker int referenceValue; 115*35238bceSAndroid Build Coastguard Worker RequiredCapabilityglu::sl::RequiredCapability116*35238bceSAndroid Build Coastguard Worker RequiredCapability(CapabilityFlag flagName_) 117*35238bceSAndroid Build Coastguard Worker : type(CAPABILITY_FLAG) 118*35238bceSAndroid Build Coastguard Worker , flagName(flagName_) 119*35238bceSAndroid Build Coastguard Worker , referenceValue(0) // not used 120*35238bceSAndroid Build Coastguard Worker { 121*35238bceSAndroid Build Coastguard Worker } 122*35238bceSAndroid Build Coastguard Worker RequiredCapabilityglu::sl::RequiredCapability123*35238bceSAndroid Build Coastguard Worker RequiredCapability(uint32_t enumName_, int referenceValue_) 124*35238bceSAndroid Build Coastguard Worker : type(CAPABILITY_LIMIT) 125*35238bceSAndroid Build Coastguard Worker , enumName(enumName_) 126*35238bceSAndroid Build Coastguard Worker , referenceValue(referenceValue_) 127*35238bceSAndroid Build Coastguard Worker { 128*35238bceSAndroid Build Coastguard Worker } 129*35238bceSAndroid Build Coastguard Worker }; 130*35238bceSAndroid Build Coastguard Worker 131*35238bceSAndroid Build Coastguard Worker struct RequiredExtension 132*35238bceSAndroid Build Coastguard Worker { 133*35238bceSAndroid Build Coastguard Worker std::vector<std::string> alternatives; // One or more extensions, at least one (but not all) must be supported 134*35238bceSAndroid Build Coastguard Worker uint32_t effectiveStages; // Bitfield of shader stages requiring this extension 135*35238bceSAndroid Build Coastguard Worker RequiredExtensionglu::sl::RequiredExtension136*35238bceSAndroid Build Coastguard Worker RequiredExtension(const std::vector<std::string> &alternatives_, uint32_t effectiveStages_) 137*35238bceSAndroid Build Coastguard Worker : alternatives(alternatives_) 138*35238bceSAndroid Build Coastguard Worker , effectiveStages(effectiveStages_) 139*35238bceSAndroid Build Coastguard Worker { 140*35238bceSAndroid Build Coastguard Worker } 141*35238bceSAndroid Build Coastguard Worker RequiredExtensionglu::sl::RequiredExtension142*35238bceSAndroid Build Coastguard Worker RequiredExtension(const std::string &extension, uint32_t effectiveStages_) : effectiveStages(effectiveStages_) 143*35238bceSAndroid Build Coastguard Worker { 144*35238bceSAndroid Build Coastguard Worker alternatives.push_back(extension); 145*35238bceSAndroid Build Coastguard Worker } 146*35238bceSAndroid Build Coastguard Worker RequiredExtensionglu::sl::RequiredExtension147*35238bceSAndroid Build Coastguard Worker RequiredExtension(void) : effectiveStages(0u) 148*35238bceSAndroid Build Coastguard Worker { 149*35238bceSAndroid Build Coastguard Worker } 150*35238bceSAndroid Build Coastguard Worker }; 151*35238bceSAndroid Build Coastguard Worker 152*35238bceSAndroid Build Coastguard Worker struct ProgramSpecification 153*35238bceSAndroid Build Coastguard Worker { 154*35238bceSAndroid Build Coastguard Worker glu::ProgramSources sources; 155*35238bceSAndroid Build Coastguard Worker std::vector<RequiredExtension> requiredExtensions; 156*35238bceSAndroid Build Coastguard Worker uint32_t activeStages; // Has an effect only if sources.separable == true, must be 0 otherwise 157*35238bceSAndroid Build Coastguard Worker ProgramSpecificationglu::sl::ProgramSpecification158*35238bceSAndroid Build Coastguard Worker ProgramSpecification(void) : activeStages(0u) 159*35238bceSAndroid Build Coastguard Worker { 160*35238bceSAndroid Build Coastguard Worker } 161*35238bceSAndroid Build Coastguard Worker }; 162*35238bceSAndroid Build Coastguard Worker 163*35238bceSAndroid Build Coastguard Worker struct ShaderCaseSpecification 164*35238bceSAndroid Build Coastguard Worker { 165*35238bceSAndroid Build Coastguard Worker CaseType caseType; 166*35238bceSAndroid Build Coastguard Worker ExpectResult expectResult; 167*35238bceSAndroid Build Coastguard Worker OutputType outputType; 168*35238bceSAndroid Build Coastguard Worker DataType outputFormat; 169*35238bceSAndroid Build Coastguard Worker glu::GLSLVersion targetVersion; 170*35238bceSAndroid Build Coastguard Worker 171*35238bceSAndroid Build Coastguard Worker std::vector<RequiredCapability> requiredCaps; 172*35238bceSAndroid Build Coastguard Worker 173*35238bceSAndroid Build Coastguard Worker ValueBlock values; 174*35238bceSAndroid Build Coastguard Worker std::vector<ProgramSpecification> programs; 175*35238bceSAndroid Build Coastguard Worker ShaderCaseSpecificationglu::sl::ShaderCaseSpecification176*35238bceSAndroid Build Coastguard Worker ShaderCaseSpecification(void) 177*35238bceSAndroid Build Coastguard Worker : caseType(CASETYPE_LAST) 178*35238bceSAndroid Build Coastguard Worker , expectResult(EXPECT_LAST) 179*35238bceSAndroid Build Coastguard Worker , outputType(OUTPUT_RESULT) 180*35238bceSAndroid Build Coastguard Worker , outputFormat(TYPE_LAST) 181*35238bceSAndroid Build Coastguard Worker , targetVersion(glu::GLSL_VERSION_LAST) 182*35238bceSAndroid Build Coastguard Worker { 183*35238bceSAndroid Build Coastguard Worker } 184*35238bceSAndroid Build Coastguard Worker }; 185*35238bceSAndroid Build Coastguard Worker 186*35238bceSAndroid Build Coastguard Worker bool isValid(const ValueBlock &block); 187*35238bceSAndroid Build Coastguard Worker bool isValid(const ShaderCaseSpecification &spec); 188*35238bceSAndroid Build Coastguard Worker 189*35238bceSAndroid Build Coastguard Worker bool isCapabilityRequired(CapabilityFlag capabilityFlag, const ShaderCaseSpecification &spec); 190*35238bceSAndroid Build Coastguard Worker 191*35238bceSAndroid Build Coastguard Worker class ShaderCaseFactory 192*35238bceSAndroid Build Coastguard Worker { 193*35238bceSAndroid Build Coastguard Worker public: ~ShaderCaseFactory()194*35238bceSAndroid Build Coastguard Worker virtual ~ShaderCaseFactory() 195*35238bceSAndroid Build Coastguard Worker { 196*35238bceSAndroid Build Coastguard Worker } 197*35238bceSAndroid Build Coastguard Worker virtual tcu::TestCaseGroup *createGroup(const std::string &name, const std::string &description, 198*35238bceSAndroid Build Coastguard Worker const std::vector<tcu::TestNode *> &children) = 0; 199*35238bceSAndroid Build Coastguard Worker virtual tcu::TestCase *createCase(const std::string &name, const std::string &description, 200*35238bceSAndroid Build Coastguard Worker const ShaderCaseSpecification &spec) = 0; 201*35238bceSAndroid Build Coastguard Worker }; 202*35238bceSAndroid Build Coastguard Worker 203*35238bceSAndroid Build Coastguard Worker std::vector<tcu::TestNode *> parseFile(const tcu::Archive &archive, const std::string &filename, 204*35238bceSAndroid Build Coastguard Worker ShaderCaseFactory *caseFactory); 205*35238bceSAndroid Build Coastguard Worker 206*35238bceSAndroid Build Coastguard Worker // Specialization utilties 207*35238bceSAndroid Build Coastguard Worker 208*35238bceSAndroid Build Coastguard Worker struct ProgramSpecializationParams 209*35238bceSAndroid Build Coastguard Worker { 210*35238bceSAndroid Build Coastguard Worker const ShaderCaseSpecification &caseSpec; 211*35238bceSAndroid Build Coastguard Worker const std::vector<RequiredExtension> requiredExtensions; // Extensions, must be resolved to single ext per entry 212*35238bceSAndroid Build Coastguard Worker const int maxPatchVertices; // Used by tess shaders only 213*35238bceSAndroid Build Coastguard Worker ProgramSpecializationParamsglu::sl::ProgramSpecializationParams214*35238bceSAndroid Build Coastguard Worker ProgramSpecializationParams(const ShaderCaseSpecification &caseSpec_, 215*35238bceSAndroid Build Coastguard Worker const std::vector<RequiredExtension> &requiredExtensions_, int maxPatchVertices_) 216*35238bceSAndroid Build Coastguard Worker : caseSpec(caseSpec_) 217*35238bceSAndroid Build Coastguard Worker , requiredExtensions(requiredExtensions_) 218*35238bceSAndroid Build Coastguard Worker , maxPatchVertices(maxPatchVertices_) 219*35238bceSAndroid Build Coastguard Worker { 220*35238bceSAndroid Build Coastguard Worker } 221*35238bceSAndroid Build Coastguard Worker }; 222*35238bceSAndroid Build Coastguard Worker 223*35238bceSAndroid Build Coastguard Worker void genCompareFunctions(std::ostringstream &stream, const ValueBlock &valueBlock, bool useFloatTypes); 224*35238bceSAndroid Build Coastguard Worker std::string injectExtensionRequirements(const std::string &baseCode, const std::vector<RequiredExtension> &extensions, 225*35238bceSAndroid Build Coastguard Worker ShaderType shaderType); 226*35238bceSAndroid Build Coastguard Worker 227*35238bceSAndroid Build Coastguard Worker // Other utilities 228*35238bceSAndroid Build Coastguard Worker 229*35238bceSAndroid Build Coastguard Worker void dumpValues(tcu::TestLog &log, const ValueBlock &values, int arrayNdx); 230*35238bceSAndroid Build Coastguard Worker 231*35238bceSAndroid Build Coastguard Worker } // namespace sl 232*35238bceSAndroid Build Coastguard Worker } // namespace glu 233*35238bceSAndroid Build Coastguard Worker 234*35238bceSAndroid Build Coastguard Worker #endif // _GLUSHADERLIBRARY_HPP 235