Index: gpu/command_buffer/service/shader_manager.cc |
diff --git a/gpu/command_buffer/service/shader_manager.cc b/gpu/command_buffer/service/shader_manager.cc |
index 89f21f924d936c760a45ae1861b7e443cfc7d4ee..189d78bf0a2c4d94a941e0fb062465a18a0a2850 100644 |
--- a/gpu/command_buffer/service/shader_manager.cc |
+++ b/gpu/command_buffer/service/shader_manager.cc |
@@ -22,6 +22,66 @@ Shader::Shader(GLuint service_id, GLenum shader_type) |
Shader::~Shader() { |
} |
+void Shader::DoCompile(ShaderTranslatorInterface* translator, |
+ TranslatedShaderSourceType type) { |
+ // Translate GL ES 2.0 shader to Desktop GL shader and pass that to |
+ // glShaderSource and then glCompileShader. |
+ const char* source_for_driver = source_.c_str(); |
+ if (translator) { |
+ valid_ = translator->Translate(source_, |
+ &log_info_, |
+ &translated_source_, |
+ &attrib_map_, |
+ &uniform_map_, |
+ &varying_map_, |
+ &name_map_); |
+ if (!valid_) { |
+ return; |
+ } |
+ signature_source_ = source_; |
+ source_for_driver = translated_source_.c_str(); |
+ } |
+ |
+ glShaderSource(service_id_, 1, &source_for_driver, NULL); |
+ glCompileShader(service_id_); |
+ if (type == kANGLE) { |
+ GLint max_len = 0; |
+ glGetShaderiv(service_id_, |
+ GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, |
+ &max_len); |
+ scoped_ptr<char[]> buffer(new char[max_len]); |
+ GLint len = 0; |
+ glGetTranslatedShaderSourceANGLE( |
+ service_id_, max_len, &len, buffer.get()); |
+ DCHECK(max_len == 0 || len < max_len); |
+ DCHECK(len == 0 || buffer[len] == '\0'); |
+ translated_source_ = std::string(buffer.get(), len); |
+ } |
+ |
+ GLint status = GL_FALSE; |
+ glGetShaderiv(service_id_, GL_COMPILE_STATUS, &status); |
+ if (status != GL_TRUE) { |
+ // We cannot reach here if we are using the shader translator. |
+ // All invalid shaders must be rejected by the translator. |
+ // All translated shaders must compile. |
+ GLint max_len = 0; |
+ glGetShaderiv(service_id_, GL_INFO_LOG_LENGTH, &max_len); |
+ scoped_ptr<char[]> buffer(new char[max_len]); |
+ GLint len = 0; |
+ glGetShaderInfoLog(service_id_, max_len, &len, buffer.get()); |
+ DCHECK(max_len == 0 || len < max_len); |
+ DCHECK(len == 0 || buffer[len] == '\0'); |
+ valid_ = false; |
+ log_info_ = std::string(buffer.get(), len); |
+ LOG_IF(ERROR, translator) |
+ << "Shader translator allowed/produced an invalid shader " |
+ << "unless the driver is buggy:" |
+ << "\n--original-shader--\n" << source_ |
+ << "\n--translated-shader--\n" << source_for_driver |
+ << "\n--info-log--\n" << log_info_; |
+ } |
+} |
+ |
void Shader::IncUseCount() { |
++use_count_; |
} |
@@ -36,31 +96,8 @@ void Shader::MarkAsDeleted() { |
service_id_ = 0; |
} |
-void Shader::SetStatus( |
- bool valid, const char* log, ShaderTranslatorInterface* translator) { |
- valid_ = valid; |
- log_info_.reset(log ? new std::string(log) : NULL); |
- if (translator && valid) { |
- attrib_map_ = translator->attrib_map(); |
- uniform_map_ = translator->uniform_map(); |
- varying_map_ = translator->varying_map(); |
- name_map_ = translator->name_map(); |
- } else { |
- attrib_map_.clear(); |
- uniform_map_.clear(); |
- varying_map_.clear(); |
- name_map_.clear(); |
- } |
- if (valid && source_.get()) { |
- signature_source_.reset(new std::string(source_->c_str())); |
- } else { |
- signature_source_.reset(); |
- } |
-} |
- |
-const Shader::VariableInfo* |
- Shader::GetAttribInfo( |
- const std::string& name) const { |
+const Shader::VariableInfo* Shader::GetAttribInfo( |
+ const std::string& name) const { |
VariableMap::const_iterator it = attrib_map_.find(name); |
return it != attrib_map_.end() ? &it->second : NULL; |
} |
@@ -83,13 +120,18 @@ const std::string* Shader::GetOriginalNameFromHashedName( |
return NULL; |
} |
-const Shader::VariableInfo* |
- Shader::GetUniformInfo( |
- const std::string& name) const { |
+const Shader::VariableInfo* Shader::GetUniformInfo( |
+ const std::string& name) const { |
VariableMap::const_iterator it = uniform_map_.find(name); |
return it != uniform_map_.end() ? &it->second : NULL; |
} |
+const Shader::VariableInfo* Shader::GetVaryingInfo( |
+ const std::string& name) const { |
+ VariableMap::const_iterator it = varying_map_.find(name); |
+ return it != varying_map_.end() ? &it->second : NULL; |
+} |
+ |
ShaderManager::ShaderManager() {} |
ShaderManager::~ShaderManager() { |