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