Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Unified Diff: gpu/command_buffer/service/shader_manager.cc

Issue 566023002: Clean up interfaces between Shader / ShaderTranslator / ANGLE side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/shader_manager.h ('k') | gpu/command_buffer/service/shader_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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() {
« no previous file with comments | « gpu/command_buffer/service/shader_manager.h ('k') | gpu/command_buffer/service/shader_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698