1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_H_
6 #define GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_H_
10 #include "base/basictypes.h"
11 #include "base/containers/hash_tables.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/observer_list.h"
15 #include "gpu/gpu_export.h"
16 #include "third_party/angle_dx11/include/GLSLANG/ShaderLang.h"
21 // Translates a GLSL ES 2.0 shader to desktop GLSL shader, or just
22 // validates GLSL ES 2.0 shaders on a true GLSL ES implementation.
23 class ShaderTranslatorInterface {
25 enum GlslImplementationType {
34 precision(SH_PRECISION_UNDEFINED),
38 VariableInfo(int _type, int _size, int _precision,
39 int _static_use, std::string _name)
42 precision(_precision),
43 static_use(_static_use),
47 const ShaderTranslatorInterface::VariableInfo& other) const {
48 return type == other.type &&
50 precision == other.precision &&
51 strcmp(name.c_str(), other.name.c_str()) == 0;
58 std::string name; // name in the original shader source.
61 // Mapping between variable name and info.
62 typedef base::hash_map<std::string, VariableInfo> VariableMap;
63 // Mapping between hashed name and original name.
64 typedef base::hash_map<std::string, std::string> NameMap;
66 // Initializes the translator.
67 // Must be called once before using the translator object.
69 ShShaderType shader_type,
70 ShShaderSpec shader_spec,
71 const ShBuiltInResources* resources,
72 GlslImplementationType glsl_implementation_type,
73 ShCompileOptions driver_bug_workarounds) = 0;
75 // Translates the given shader source.
76 // Returns true if translation is successful, false otherwise.
77 virtual bool Translate(const char* shader) = 0;
79 // The following functions return results from the last translation.
80 // The results are NULL/empty if the translation was unsuccessful.
81 // A valid info-log is always returned irrespective of whether translation
82 // was successful or not.
83 virtual const char* translated_shader() const = 0;
84 virtual const char* info_log() const = 0;
86 virtual const VariableMap& attrib_map() const = 0;
87 virtual const VariableMap& uniform_map() const = 0;
88 virtual const VariableMap& varying_map() const = 0;
89 virtual const NameMap& name_map() const = 0;
91 // Return a string that is unique for a specfic set of options that would
92 // possibly effect compilation.
93 virtual std::string GetStringForOptionsThatWouldEffectCompilation() const = 0;
96 virtual ~ShaderTranslatorInterface() {}
99 // Implementation of ShaderTranslatorInterface
100 class GPU_EXPORT ShaderTranslator
101 : public base::RefCounted<ShaderTranslator>,
102 NON_EXPORTED_BASE(public ShaderTranslatorInterface) {
104 class DestructionObserver {
106 DestructionObserver();
107 virtual ~DestructionObserver();
109 virtual void OnDestruct(ShaderTranslator* translator) = 0;
112 DISALLOW_COPY_AND_ASSIGN(DestructionObserver);
117 // Overridden from ShaderTranslatorInterface.
119 ShShaderType shader_type,
120 ShShaderSpec shader_spec,
121 const ShBuiltInResources* resources,
122 GlslImplementationType glsl_implementation_type,
123 ShCompileOptions driver_bug_workarounds) OVERRIDE;
125 // Overridden from ShaderTranslatorInterface.
126 virtual bool Translate(const char* shader) OVERRIDE;
128 // Overridden from ShaderTranslatorInterface.
129 virtual const char* translated_shader() const OVERRIDE;
130 virtual const char* info_log() const OVERRIDE;
132 // Overridden from ShaderTranslatorInterface.
133 virtual const VariableMap& attrib_map() const OVERRIDE;
134 virtual const VariableMap& uniform_map() const OVERRIDE;
135 virtual const VariableMap& varying_map() const OVERRIDE;
136 virtual const NameMap& name_map() const OVERRIDE;
138 virtual std::string GetStringForOptionsThatWouldEffectCompilation() const
141 void AddDestructionObserver(DestructionObserver* observer);
142 void RemoveDestructionObserver(DestructionObserver* observer);
145 friend class base::RefCounted<ShaderTranslator>;
147 virtual ~ShaderTranslator();
149 int GetCompileOptions() const;
152 ShBuiltInResources compiler_options_;
153 scoped_ptr<char[]> translated_shader_;
154 scoped_ptr<char[]> info_log_;
155 VariableMap attrib_map_;
156 VariableMap uniform_map_;
157 VariableMap varying_map_;
159 bool implementation_is_glsl_es_;
160 ShCompileOptions driver_bug_workarounds_;
161 ObserverList<DestructionObserver> destruction_observers_;
163 DISALLOW_COPY_AND_ASSIGN(ShaderTranslator);
169 #endif // GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_H_