Index: gpu/command_buffer/service/program_manager.cc |
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc |
index 6dd6ca262ee866366003e8f7a3834250f6a06108..0084581ac724634f26a185d2d401be7037cc7175 100644 |
--- a/gpu/command_buffer/service/program_manager.cc |
+++ b/gpu/command_buffer/service/program_manager.cc |
@@ -558,6 +558,10 @@ bool Program::Link(ShaderManager* manager, |
"declared in vertex shader"); |
return false; |
} |
+ if (DetectGlobalNameConflicts()) { |
+ set_log_info("Name conflicts between a varying and an attribute"); |
bajones
2013/09/07 00:00:14
varying -> uniform
|
+ return false; |
+ } |
if (!CheckVaryingsPacking()) { |
set_log_info("Varyings over maximum register limit"); |
return false; |
@@ -1072,6 +1076,27 @@ bool Program::DetectVaryingsMismatch() const { |
return false; |
} |
+bool Program::DetectGlobalNameConflicts() const { |
+ DCHECK(attached_shaders_[0] && |
+ attached_shaders_[0]->shader_type() == GL_VERTEX_SHADER && |
+ attached_shaders_[1] && |
+ attached_shaders_[1]->shader_type() == GL_FRAGMENT_SHADER); |
+ const ShaderTranslator::VariableMap* uniforms[2]; |
+ uniforms[0] = &(attached_shaders_[0]->uniform_map()); |
+ uniforms[1] = &(attached_shaders_[1]->uniform_map()); |
+ const ShaderTranslator::VariableMap* attribs = |
+ &(attached_shaders_[0]->attrib_map()); |
+ |
+ for (ShaderTranslator::VariableMap::const_iterator iter = |
+ attribs->begin(); iter != attribs->end(); ++iter) { |
+ for (int ii = 0; ii < 2; ++ii) { |
+ if (uniforms[ii]->find(iter->first) != uniforms[ii]->end()) |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
bool Program::CheckVaryingsPacking() const { |
DCHECK(attached_shaders_[0] && |
attached_shaders_[0]->shader_type() == GL_VERTEX_SHADER && |