// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_H_ #define GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_H_ #include #include "base/basictypes.h" #include "base/containers/hash_tables.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/observer_list.h" #include "gpu/gpu_export.h" #include "third_party/angle/include/GLSLANG/ShaderLang.h" namespace gpu { namespace gles2 { // Translates a GLSL ES 2.0 shader to desktop GLSL shader, or just // validates GLSL ES 2.0 shaders on a true GLSL ES implementation. class ShaderTranslatorInterface { public: enum GlslImplementationType { kGlsl, kGlslES }; struct VariableInfo { VariableInfo() : type(0), size(0), precision(SH_PRECISION_UNDEFINED), static_use(0) { } VariableInfo(int _type, int _size, int _precision, int _static_use, std::string _name) : type(_type), size(_size), precision(_precision), static_use(_static_use), name(_name) { } bool operator==( const ShaderTranslatorInterface::VariableInfo& other) const { return type == other.type && size == other.size && precision == other.precision && strcmp(name.c_str(), other.name.c_str()) == 0; } int type; int size; int precision; int static_use; std::string name; // name in the original shader source. }; // Mapping between variable name and info. typedef base::hash_map VariableMap; // Mapping between hashed name and original name. typedef base::hash_map NameMap; // Initializes the translator. // Must be called once before using the translator object. virtual bool Init( ShShaderType shader_type, ShShaderSpec shader_spec, const ShBuiltInResources* resources, GlslImplementationType glsl_implementation_type, ShCompileOptions driver_bug_workarounds) = 0; // Translates the given shader source. // Returns true if translation is successful, false otherwise. virtual bool Translate(const char* shader) = 0; // The following functions return results from the last translation. // The results are NULL/empty if the translation was unsuccessful. // A valid info-log is always returned irrespective of whether translation // was successful or not. virtual const char* translated_shader() const = 0; virtual const char* info_log() const = 0; virtual const VariableMap& attrib_map() const = 0; virtual const VariableMap& uniform_map() const = 0; virtual const VariableMap& varying_map() const = 0; virtual const NameMap& name_map() const = 0; // Return a string that is unique for a specfic set of options that would // possibly affect compilation. virtual std::string GetStringForOptionsThatWouldAffectCompilation() const = 0; protected: virtual ~ShaderTranslatorInterface() {} }; // Implementation of ShaderTranslatorInterface class GPU_EXPORT ShaderTranslator : public base::RefCounted, NON_EXPORTED_BASE(public ShaderTranslatorInterface) { public: class DestructionObserver { public: DestructionObserver(); virtual ~DestructionObserver(); virtual void OnDestruct(ShaderTranslator* translator) = 0; private: DISALLOW_COPY_AND_ASSIGN(DestructionObserver); }; ShaderTranslator(); // Overridden from ShaderTranslatorInterface. virtual bool Init( ShShaderType shader_type, ShShaderSpec shader_spec, const ShBuiltInResources* resources, GlslImplementationType glsl_implementation_type, ShCompileOptions driver_bug_workarounds) OVERRIDE; // Overridden from ShaderTranslatorInterface. virtual bool Translate(const char* shader) OVERRIDE; // Overridden from ShaderTranslatorInterface. virtual const char* translated_shader() const OVERRIDE; virtual const char* info_log() const OVERRIDE; // Overridden from ShaderTranslatorInterface. virtual const VariableMap& attrib_map() const OVERRIDE; virtual const VariableMap& uniform_map() const OVERRIDE; virtual const VariableMap& varying_map() const OVERRIDE; virtual const NameMap& name_map() const OVERRIDE; virtual std::string GetStringForOptionsThatWouldAffectCompilation() const OVERRIDE; void AddDestructionObserver(DestructionObserver* observer); void RemoveDestructionObserver(DestructionObserver* observer); private: friend class base::RefCounted; virtual ~ShaderTranslator(); void ClearResults(); int GetCompileOptions() const; ShHandle compiler_; ShBuiltInResources compiler_options_; scoped_ptr translated_shader_; scoped_ptr info_log_; VariableMap attrib_map_; VariableMap uniform_map_; VariableMap varying_map_; NameMap name_map_; bool implementation_is_glsl_es_; ShCompileOptions driver_bug_workarounds_; ObserverList destruction_observers_; DISALLOW_COPY_AND_ASSIGN(ShaderTranslator); }; } // namespace gles2 } // namespace gpu #endif // GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_H_