15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/angle/include/GLSLANG/ShaderLang.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Translates a GLSL ES 2.0 shader to desktop GLSL shader, or just 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// validates GLSL ES 2.0 shaders on a true GLSL ES implementation. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShaderTranslatorInterface { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum GlslImplementationType { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kGlsl, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kGlslES 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct VariableInfo { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableInfo() 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(0), 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size(0), 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) precision(SH_PRECISION_UNDEFINED), 35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) static_use(0) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VariableInfo(int _type, int _size, int _precision, 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int _static_use, std::string _name) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(_type), 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size(_size), 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) precision(_precision), 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) static_use(_static_use), 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name(_name) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ShaderTranslatorInterface::VariableInfo& other) const { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return type == other.type && 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size == other.size && 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) precision == other.precision && 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcmp(name.c_str(), other.name.c_str()) == 0; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size; 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int precision; 57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int static_use; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name; // name in the original shader source. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mapping between variable name and info. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::hash_map<std::string, VariableInfo> VariableMap; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Mapping between hashed name and original name. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<std::string, std::string> NameMap; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes the translator. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called once before using the translator object. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Init( 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch sh::GLenum shader_type, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShShaderSpec shader_spec, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ShBuiltInResources* resources, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlslImplementationType glsl_implementation_type, 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ShCompileOptions driver_bug_workarounds) = 0; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Translates the given shader source. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if translation is successful, false otherwise. 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Always fill |info_log| if it's non-null. 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Upon success, fill |translated_shader|, |attrib_map|, |uniform_map|, 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |varying_map|, and |name_map| if they are non-null. 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool Translate(const std::string& shader_source, 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* info_log, 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* translated_shader, 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VariableMap* attrib_map, 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VariableMap* uniform_map, 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VariableMap* varying_map, 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NameMap* name_map) const = 0; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Return a string that is unique for a specfic set of options that would 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // possibly affect compilation. 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual std::string GetStringForOptionsThatWouldAffectCompilation() const = 0; 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ShaderTranslatorInterface() {} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation of ShaderTranslatorInterface 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GPU_EXPORT ShaderTranslator 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCounted<ShaderTranslator>, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NON_EXPORTED_BASE(public ShaderTranslatorInterface) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class DestructionObserver { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DestructionObserver(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DestructionObserver(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDestruct(ShaderTranslator* translator) = 0; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionObserver); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShaderTranslator(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ShaderTranslatorInterface. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Init( 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch sh::GLenum shader_type, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShShaderSpec shader_spec, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ShBuiltInResources* resources, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlslImplementationType glsl_implementation_type, 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ShCompileOptions driver_bug_workarounds) OVERRIDE; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ShaderTranslatorInterface. 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool Translate(const std::string& shader_source, 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* info_log, 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* translated_source, 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VariableMap* attrib_map, 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VariableMap* uniform_map, 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VariableMap* varying_map, 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NameMap* name_map) const OVERRIDE; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual std::string GetStringForOptionsThatWouldAffectCompilation() const 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OVERRIDE; 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddDestructionObserver(DestructionObserver* observer); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveDestructionObserver(DestructionObserver* observer); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<ShaderTranslator>; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ShaderTranslator(); 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int GetCompileOptions() const; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShHandle compiler_; 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShBuiltInResources compiler_options_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool implementation_is_glsl_es_; 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ShCompileOptions driver_bug_workarounds_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<DestructionObserver> destruction_observers_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShaderTranslator); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_H_ 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157