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. 4 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_SHADER_MANAGER_H_ 6 #define GPU_COMMAND_BUFFER_SERVICE_SHADER_MANAGER_H_ 7 8 #include <string> 9 #include "base/basictypes.h" 10 #include "base/containers/hash_tables.h" 11 #include "base/logging.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "gpu/command_buffer/service/gl_utils.h" 15 #include "gpu/command_buffer/service/shader_translator.h" 16 #include "gpu/gpu_export.h" 17 18 namespace gpu { 19 namespace gles2 { 20 21 // This is used to keep the source code for a shader. This is because in order 22 // to emluate GLES2 the shaders will have to be re-written before passed to 23 // the underlying OpenGL. But, when the user calls glGetShaderSource they 24 // should get the source they passed in, not the re-written source. 25 class GPU_EXPORT Shader : public base::RefCounted<Shader> { 26 public: 27 typedef ShaderTranslator::VariableInfo VariableInfo; 28 UpdateSource(const char * source)29 void UpdateSource(const char* source) { 30 source_.reset(source ? new std::string(source) : NULL); 31 } 32 UpdateTranslatedSource(const char * translated_source)33 void UpdateTranslatedSource(const char* translated_source) { 34 translated_source_.reset( 35 translated_source ? new std::string(translated_source) : NULL); 36 } 37 service_id()38 GLuint service_id() const { 39 return service_id_; 40 } 41 shader_type()42 GLenum shader_type() const { 43 return shader_type_; 44 } 45 source()46 const std::string* source() const { 47 return source_.get(); 48 } 49 translated_source()50 const std::string* translated_source() const { 51 return translated_source_.get(); 52 } 53 signature_source()54 const std::string* signature_source() const { 55 return signature_source_.get(); 56 } 57 58 void SetStatus( 59 bool valid, const char* log, 60 ShaderTranslatorInterface* translator); 61 62 const VariableInfo* GetAttribInfo(const std::string& name) const; 63 const VariableInfo* GetUniformInfo(const std::string& name) const; 64 65 // If the original_name is not found, return NULL. 66 const std::string* GetAttribMappedName( 67 const std::string& original_name) const; 68 69 // If the hashed_name is not found, return NULL. 70 const std::string* GetOriginalNameFromHashedName( 71 const std::string& hashed_name) const; 72 log_info()73 const std::string* log_info() const { 74 return log_info_.get(); 75 } 76 IsValid()77 bool IsValid() const { 78 return valid_; 79 } 80 IsDeleted()81 bool IsDeleted() const { 82 return service_id_ == 0; 83 } 84 InUse()85 bool InUse() const { 86 DCHECK_GE(use_count_, 0); 87 return use_count_ != 0; 88 } 89 90 // Used by program cache. attrib_map()91 const ShaderTranslator::VariableMap& attrib_map() const { 92 return attrib_map_; 93 } 94 95 // Used by program cache. uniform_map()96 const ShaderTranslator::VariableMap& uniform_map() const { 97 return uniform_map_; 98 } 99 100 // Used by program cache. varying_map()101 const ShaderTranslator::VariableMap& varying_map() const { 102 return varying_map_; 103 } 104 105 // Used by program cache. set_attrib_map(const ShaderTranslator::VariableMap & attrib_map)106 void set_attrib_map(const ShaderTranslator::VariableMap& attrib_map) { 107 // copied because cache might be cleared 108 attrib_map_ = ShaderTranslator::VariableMap(attrib_map); 109 } 110 111 // Used by program cache. set_uniform_map(const ShaderTranslator::VariableMap & uniform_map)112 void set_uniform_map(const ShaderTranslator::VariableMap& uniform_map) { 113 // copied because cache might be cleared 114 uniform_map_ = ShaderTranslator::VariableMap(uniform_map); 115 } 116 117 // Used by program cache. set_varying_map(const ShaderTranslator::VariableMap & varying_map)118 void set_varying_map(const ShaderTranslator::VariableMap& varying_map) { 119 // copied because cache might be cleared 120 varying_map_ = ShaderTranslator::VariableMap(varying_map); 121 } 122 123 private: 124 typedef ShaderTranslator::VariableMap VariableMap; 125 typedef ShaderTranslator::NameMap NameMap; 126 127 friend class base::RefCounted<Shader>; 128 friend class ShaderManager; 129 130 Shader(GLuint service_id, GLenum shader_type); 131 ~Shader(); 132 133 void IncUseCount(); 134 void DecUseCount(); 135 void MarkAsDeleted(); 136 137 int use_count_; 138 139 // The shader this Shader is tracking. 140 GLuint service_id_; 141 // Type of shader - GL_VERTEX_SHADER or GL_FRAGMENT_SHADER. 142 GLenum shader_type_; 143 144 // True if compilation succeeded. 145 bool valid_; 146 147 // The shader source as passed to glShaderSource. 148 scoped_ptr<std::string> source_; 149 150 // The source the last compile used. 151 scoped_ptr<std::string> signature_source_; 152 153 // The translated shader source. 154 scoped_ptr<std::string> translated_source_; 155 156 // The shader translation log. 157 scoped_ptr<std::string> log_info_; 158 159 // The type info when the shader was last compiled. 160 VariableMap attrib_map_; 161 VariableMap uniform_map_; 162 VariableMap varying_map_; 163 164 // The name hashing info when the shader was last compiled. 165 NameMap name_map_; 166 }; 167 168 // Tracks the Shaders. 169 // 170 // NOTE: To support shared resources an instance of this class will 171 // need to be shared by multiple GLES2Decoders. 172 class GPU_EXPORT ShaderManager { 173 public: 174 ShaderManager(); 175 ~ShaderManager(); 176 177 // Must call before destruction. 178 void Destroy(bool have_context); 179 180 // Creates a shader for the given shader ID. 181 Shader* CreateShader( 182 GLuint client_id, 183 GLuint service_id, 184 GLenum shader_type); 185 186 // Gets an existing shader info for the given shader ID. Returns NULL if none 187 // exists. 188 Shader* GetShader(GLuint client_id); 189 190 // Gets a client id for a given service id. 191 bool GetClientId(GLuint service_id, GLuint* client_id) const; 192 193 void MarkAsDeleted(Shader* shader); 194 195 // Mark a shader as used 196 void UseShader(Shader* shader); 197 198 // Unmark a shader as used. If it has been deleted and is not used 199 // then we free the shader. 200 void UnuseShader(Shader* shader); 201 202 // Check if a Shader is owned by this ShaderManager. 203 bool IsOwned(Shader* shader); 204 205 private: 206 friend class Shader; 207 208 // Info for each shader by service side shader Id. 209 typedef base::hash_map<GLuint, scoped_refptr<Shader> > ShaderMap; 210 ShaderMap shaders_; 211 212 void RemoveShader(Shader* shader); 213 214 DISALLOW_COPY_AND_ASSIGN(ShaderManager); 215 }; 216 217 } // namespace gles2 218 } // namespace gpu 219 220 #endif // GPU_COMMAND_BUFFER_SERVICE_SHADER_MANAGER_H_ 221 222