Hook up ANGLE with CityHash.

This enables name hashing for shaders behind a commandline switch --enable-shader-name-hashing.

Also, this CL does not implement the post processing of compile/link error logs.

BUG=160369
TEST=webgl conformance tests, webgl demos
Review URL: https://codereview.chromium.org/11363182

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167422 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gpu/DEPS b/gpu/DEPS
index c989f54..42fcce5 100644
--- a/gpu/DEPS
+++ b/gpu/DEPS
@@ -2,6 +2,7 @@
   "+native_client/src/include",
   "+third_party/angle",
   "+third_party/amd",
+  "+third_party/smhasher",
   "+../../gpu_export.h",
   "+../command_buffer",
   "+../client",
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index 0873f0f5..7283ac2 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -81,7 +81,8 @@
       use_arb_occlusion_query2_for_occlusion_query_boolean(false),
       use_arb_occlusion_query_for_occlusion_query_boolean(false),
       native_vertex_array_object(false),
-      disable_workarounds(false) {
+      disable_workarounds(false),
+      enable_shader_name_hashing(false) {
 }
 
 FeatureInfo::Workarounds::Workarounds()
@@ -226,6 +227,11 @@
       CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kDisableGpuDriverBugWorkarounds);
 
+  feature_flags_.enable_shader_name_hashing =
+      CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnableShaderNameHashing);
+
+
   bool npot_ok = false;
 
   AddExtensionString("GL_ANGLE_translated_shader_source");
diff --git a/gpu/command_buffer/service/feature_info.h b/gpu/command_buffer/service/feature_info.h
index 076264e6..ec03789 100644
--- a/gpu/command_buffer/service/feature_info.h
+++ b/gpu/command_buffer/service/feature_info.h
@@ -41,6 +41,7 @@
     bool use_arb_occlusion_query_for_occlusion_query_boolean;
     bool native_vertex_array_object;
     bool disable_workarounds;
+    bool enable_shader_name_hashing;
   };
 
   struct Workarounds {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 075bb6b..772d6d4 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -66,11 +66,21 @@
 #define GL_DEPTH24_STENCIL8 0x88F0
 #endif
 
+// TODO(zmo): we can't include "City.h" due to type def conflicts.
+extern uint64 CityHash64(const char*, size_t);
+
 namespace gpu {
 namespace gles2 {
 
 namespace {
+
 static const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives";
+
+khronos_uint64_t CityHashForAngle(const char* name, unsigned int len) {
+  return static_cast<khronos_uint64_t>(
+      CityHash64(name, static_cast<size_t>(len)));
+}
+
 }
 
 class GLES2DecoderImpl;
@@ -2314,6 +2324,9 @@
         features().oes_egl_image_external ? 1 : 0;
   }
 
+  if (features().enable_shader_name_hashing)
+    resources.HashFunction = &CityHashForAngle;
+
   ShShaderSpec shader_spec = force_webgl_glsl_validation_ ||
       features().chromium_webglsl ? SH_WEBGL_SPEC : SH_GLES2_SPEC;
   ShaderTranslatorInterface::GlslImplementationType implementation_type =
diff --git a/gpu/command_buffer/service/gpu_switches.cc b/gpu/command_buffer/service/gpu_switches.cc
index 876ff4d..d96fd71 100644
--- a/gpu/command_buffer/service/gpu_switches.cc
+++ b/gpu/command_buffer/service/gpu_switches.cc
@@ -26,6 +26,9 @@
 // Turn on Calling GL Error after every command.
 const char kEnableGPUDebugging[]            = "enable-gpu-debugging";
 
+// Turn on user-defined name hashing in shaders.
+const char kEnableShaderNameHashing[]       = "enable-shader-name-hashing";
+
 // Turn off gpu program caching
 const char kDisableGpuProgramCache[]        = "disable-gpu-program-cache";
 
diff --git a/gpu/command_buffer/service/gpu_switches.h b/gpu/command_buffer/service/gpu_switches.h
index 535be60..90d4a97 100644
--- a/gpu/command_buffer/service/gpu_switches.h
+++ b/gpu/command_buffer/service/gpu_switches.h
@@ -17,6 +17,7 @@
 GPU_EXPORT extern const char kDisableGpuDriverBugWorkarounds[];
 GPU_EXPORT extern const char kEnableGPUCommandLogging[];
 GPU_EXPORT extern const char kEnableGPUDebugging[];
+GPU_EXPORT extern const char kEnableShaderNameHashing[];
 GPU_EXPORT extern const char kDisableGpuProgramCache[];
 GPU_EXPORT extern const char kEnforceGLMinimums[];
 GPU_EXPORT extern const char kForceGLFinishWorkaround[];
diff --git a/gpu/command_buffer_service.gypi b/gpu/command_buffer_service.gypi
index c3726ce..0876249 100644
--- a/gpu/command_buffer_service.gypi
+++ b/gpu/command_buffer_service.gypi
@@ -21,6 +21,7 @@
     '../ui/surface/surface.gyp:surface',
     '../ui/ui.gyp:ui',
     '../third_party/angle/src/build_angle.gyp:translator_glsl',
+    '../third_party/smhasher/smhasher.gyp:cityhash',
   ],
   'sources': [
     'command_buffer/service/buffer_manager.h',