1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef WEBGL_SHADER_VALIDATOR_H_ 7 #define WEBGL_SHADER_VALIDATOR_H_ 8 9 #include "GLSLANG/ShaderLang.h" 10 #include "GLDefs.h" 11 #include "nsString.h" 12 #include <string> 13 14 namespace mozilla { 15 namespace webgl { 16 17 class ShaderValidator final { 18 const ShHandle mHandle; 19 const ShCompileOptions mCompileOptions; 20 const int mMaxVaryingVectors; 21 bool mHasRun; 22 23 public: 24 static ShaderValidator* Create(GLenum shaderType, ShShaderSpec spec, 25 ShShaderOutput outputLanguage, 26 const ShBuiltInResources& resources, 27 ShCompileOptions compileOptions); 28 29 private: ShaderValidator(ShHandle handle,ShCompileOptions compileOptions,int maxVaryingVectors)30 ShaderValidator(ShHandle handle, ShCompileOptions compileOptions, 31 int maxVaryingVectors) 32 : mHandle(handle), 33 mCompileOptions(compileOptions), 34 mMaxVaryingVectors(maxVaryingVectors), 35 mHasRun(false) {} 36 37 public: 38 ~ShaderValidator(); 39 40 bool ValidateAndTranslate(const char* source); 41 void GetInfoLog(nsACString* out) const; 42 void GetOutput(nsACString* out) const; 43 bool CanLinkTo(const ShaderValidator* prev, nsCString* const out_log) const; 44 size_t CalcNumSamplerUniforms() const; 45 size_t NumAttributes() const; 46 47 bool FindAttribUserNameByMappedName( 48 const std::string& mappedName, 49 const std::string** const out_userName) const; 50 51 bool FindAttribMappedNameByUserName( 52 const std::string& userName, 53 const std::string** const out_mappedName) const; 54 55 bool FindVaryingMappedNameByUserName( 56 const std::string& userName, 57 const std::string** const out_mappedName) const; 58 59 bool FindVaryingByMappedName(const std::string& mappedName, 60 std::string* const out_userName, 61 bool* const out_isArray) const; 62 bool FindUniformByMappedName(const std::string& mappedName, 63 std::string* const out_userName, 64 bool* const out_isArray) const; 65 bool UnmapUniformBlockName(const nsACString& baseMappedName, 66 nsCString* const out_baseUserName) const; 67 68 void EnumerateFragOutputs( 69 std::map<nsCString, const nsCString>& out_FragOutputs) const; 70 71 bool ValidateTransformFeedback( 72 const std::vector<nsString>& userNames, uint32_t maxComponents, 73 nsCString* const out_errorText, 74 std::vector<std::string>* const out_mappedNames); 75 }; 76 77 } // namespace webgl 78 } // namespace mozilla 79 80 #endif // WEBGL_SHADER_VALIDATOR_H_ 81