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/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 sh::GLenum 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 // Always fill |info_log| if it's non-null.
78 // Upon success, fill |translated_shader|, |attrib_map|, |uniform_map|,
79 // |varying_map|, and |name_map| if they are non-null.
80 virtual bool Translate(const std::string
& shader_source
,
81 std::string
* info_log
,
82 std::string
* translated_shader
,
83 VariableMap
* attrib_map
,
84 VariableMap
* uniform_map
,
85 VariableMap
* varying_map
,
86 NameMap
* name_map
) const = 0;
88 // Return a string that is unique for a specfic set of options that would
89 // possibly affect compilation.
90 virtual std::string
GetStringForOptionsThatWouldAffectCompilation() const = 0;
93 virtual ~ShaderTranslatorInterface() {}
96 // Implementation of ShaderTranslatorInterface
97 class GPU_EXPORT ShaderTranslator
98 : public base::RefCounted
<ShaderTranslator
>,
99 NON_EXPORTED_BASE(public ShaderTranslatorInterface
) {
101 class DestructionObserver
{
103 DestructionObserver();
104 virtual ~DestructionObserver();
106 virtual void OnDestruct(ShaderTranslator
* translator
) = 0;
109 DISALLOW_COPY_AND_ASSIGN(DestructionObserver
);
114 // Overridden from ShaderTranslatorInterface.
116 sh::GLenum shader_type
,
117 ShShaderSpec shader_spec
,
118 const ShBuiltInResources
* resources
,
119 GlslImplementationType glsl_implementation_type
,
120 ShCompileOptions driver_bug_workarounds
) OVERRIDE
;
122 // Overridden from ShaderTranslatorInterface.
123 virtual bool Translate(const std::string
& shader_source
,
124 std::string
* info_log
,
125 std::string
* translated_source
,
126 VariableMap
* attrib_map
,
127 VariableMap
* uniform_map
,
128 VariableMap
* varying_map
,
129 NameMap
* name_map
) const OVERRIDE
;
131 virtual std::string
GetStringForOptionsThatWouldAffectCompilation() const
134 void AddDestructionObserver(DestructionObserver
* observer
);
135 void RemoveDestructionObserver(DestructionObserver
* observer
);
138 friend class base::RefCounted
<ShaderTranslator
>;
140 virtual ~ShaderTranslator();
141 int GetCompileOptions() const;
144 ShBuiltInResources compiler_options_
;
145 bool implementation_is_glsl_es_
;
146 ShCompileOptions driver_bug_workarounds_
;
147 ObserverList
<DestructionObserver
> destruction_observers_
;
149 DISALLOW_COPY_AND_ASSIGN(ShaderTranslator
);
155 #endif // GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_H_