Index: gpu/command_buffer/service/shader_translator.cc |
diff --git a/gpu/command_buffer/service/shader_translator.cc b/gpu/command_buffer/service/shader_translator.cc |
index dcacf6cb6c841e706aae95dcc0c05799e573dc2b..bc06ab349fff441748642cd0929b91b80f59f7e8 100644 |
--- a/gpu/command_buffer/service/shader_translator.cc |
+++ b/gpu/command_buffer/service/shader_translator.cc |
@@ -36,6 +36,10 @@ base::LazyInstance<ShaderTranslatorInitializer> g_translator_initializer = |
void GetVariableInfo(ShHandle compiler, ShShaderInfo var_type, |
ShaderTranslator::VariableMap* var_map) { |
+ if (!var_map) |
+ return; |
+ var_map->clear(); |
+ |
size_t name_len = 0, mapped_name_len = 0; |
switch (var_type) { |
case SH_ACTIVE_ATTRIBUTES: |
@@ -82,6 +86,10 @@ void GetVariableInfo(ShHandle compiler, ShShaderInfo var_type, |
void GetNameHashingInfo( |
ShHandle compiler, ShaderTranslator::NameMap* name_map) { |
+ if (!name_map) |
+ return; |
+ name_map->clear(); |
+ |
size_t hashed_names_count = 0; |
ShGetInfo(compiler, SH_HASHED_NAMES_COUNT, &hashed_names_count); |
if (hashed_names_count == 0) |
@@ -156,41 +164,53 @@ int ShaderTranslator::GetCompileOptions() const { |
return compile_options; |
} |
-bool ShaderTranslator::Translate(const char* shader) { |
+bool ShaderTranslator::Translate(const std::string& shader_source, |
+ std::string* info_log, |
+ std::string* translated_source, |
+ VariableMap* attrib_map, |
+ VariableMap* uniform_map, |
+ VariableMap* varying_map, |
+ NameMap* name_map) const { |
// Make sure this instance is initialized. |
DCHECK(compiler_ != NULL); |
- DCHECK(shader != NULL); |
- ClearResults(); |
bool success = false; |
{ |
TRACE_EVENT0("gpu", "ShCompile"); |
- success = !!ShCompile(compiler_, &shader, 1, GetCompileOptions()); |
+ const char* const shader_strings[] = { shader_source.c_str() }; |
+ success = !!ShCompile( |
+ compiler_, shader_strings, 1, GetCompileOptions()); |
} |
if (success) { |
- // Get translated shader. |
- size_t obj_code_len = 0; |
- ShGetInfo(compiler_, SH_OBJECT_CODE_LENGTH, &obj_code_len); |
- if (obj_code_len > 1) { |
- translated_shader_.reset(new char[obj_code_len]); |
- ShGetObjectCode(compiler_, translated_shader_.get()); |
+ if (translated_source) { |
+ translated_source->clear(); |
+ // Get translated shader. |
+ size_t obj_code_len = 0; |
+ ShGetInfo(compiler_, SH_OBJECT_CODE_LENGTH, &obj_code_len); |
+ if (obj_code_len > 1) { |
+ scoped_ptr<char[]> buffer(new char[obj_code_len]); |
+ ShGetObjectCode(compiler_, buffer.get()); |
+ *translated_source = std::string(buffer.get(), obj_code_len - 1); |
+ } |
} |
- // Get info for attribs and uniforms. |
- GetVariableInfo(compiler_, SH_ACTIVE_ATTRIBUTES, &attrib_map_); |
- GetVariableInfo(compiler_, SH_ACTIVE_UNIFORMS, &uniform_map_); |
- GetVariableInfo(compiler_, SH_VARYINGS, &varying_map_); |
+ // Get info for attribs, uniforms, and varyings. |
+ GetVariableInfo(compiler_, SH_ACTIVE_ATTRIBUTES, attrib_map); |
+ GetVariableInfo(compiler_, SH_ACTIVE_UNIFORMS, uniform_map); |
+ GetVariableInfo(compiler_, SH_VARYINGS, varying_map); |
// Get info for name hashing. |
- GetNameHashingInfo(compiler_, &name_map_); |
+ GetNameHashingInfo(compiler_, name_map); |
} |
// Get info log. |
- size_t info_log_len = 0; |
- ShGetInfo(compiler_, SH_INFO_LOG_LENGTH, &info_log_len); |
- if (info_log_len > 1) { |
- info_log_.reset(new char[info_log_len]); |
- ShGetInfoLog(compiler_, info_log_.get()); |
- } else { |
- info_log_.reset(); |
+ if (info_log) { |
+ info_log->clear(); |
+ size_t info_log_len = 0; |
+ ShGetInfo(compiler_, SH_INFO_LOG_LENGTH, &info_log_len); |
+ if (info_log_len > 1) { |
+ scoped_ptr<char[]> buffer(new char[info_log_len]); |
+ ShGetInfoLog(compiler_, buffer.get()); |
+ *info_log = std::string(buffer.get(), info_log_len - 1); |
+ } |
} |
return success; |
@@ -212,34 +232,6 @@ std::string ShaderTranslator::GetStringForOptionsThatWouldAffectCompilation() |
std::string(resource_str.get()); |
} |
-const char* ShaderTranslator::translated_shader() const { |
- return translated_shader_.get(); |
-} |
- |
-const char* ShaderTranslator::info_log() const { |
- return info_log_.get(); |
-} |
- |
-const ShaderTranslatorInterface::VariableMap& |
-ShaderTranslator::attrib_map() const { |
- return attrib_map_; |
-} |
- |
-const ShaderTranslatorInterface::VariableMap& |
-ShaderTranslator::uniform_map() const { |
- return uniform_map_; |
-} |
- |
-const ShaderTranslatorInterface::VariableMap& |
-ShaderTranslator::varying_map() const { |
- return varying_map_; |
-} |
- |
-const ShaderTranslatorInterface::NameMap& |
-ShaderTranslator::name_map() const { |
- return name_map_; |
-} |
- |
void ShaderTranslator::AddDestructionObserver( |
DestructionObserver* observer) { |
destruction_observers_.AddObserver(observer); |
@@ -259,15 +251,6 @@ ShaderTranslator::~ShaderTranslator() { |
ShDestruct(compiler_); |
} |
-void ShaderTranslator::ClearResults() { |
- translated_shader_.reset(); |
- info_log_.reset(); |
- attrib_map_.clear(); |
- uniform_map_.clear(); |
- varying_map_.clear(); |
- name_map_.clear(); |
-} |
- |
} // namespace gles2 |
} // namespace gpu |