Pull in various gpu/command_buffer fixes from chromium

This includes the //gpu portions of:

https://crrev.com/328526
https://crrev.com/327384
https://crrev.com/327344
https://crrev.com/327226
https://crrev.com/327202
https://crrev.com/327197
https://crrev.com/326845
https://crrev.com/326662
https://crrev.com/325767
https://crrev.com/325314
https://crrev.com/324736
https://crrev.com/324152
https://crrev.com/323932
https://crrev.com/323856
https://crrev.com/322503
https://crrev.com/322498
https://crrev.com/322403

R=viettrungluu@chromium.org
TBR=viettrungluu@chromium.org

Review URL: https://codereview.chromium.org/1135943002
diff --git a/ui/gl/gl_context_stub_with_extensions.cc b/ui/gl/gl_context_stub_with_extensions.cc
index 1065df7..855eaa2 100644
--- a/ui/gl/gl_context_stub_with_extensions.cc
+++ b/ui/gl/gl_context_stub_with_extensions.cc
@@ -27,4 +27,10 @@
   return version_str_;
 }
 
+bool GLContextStubWithExtensions::WasAllocatedUsingRobustnessExtension() {
+  return HasExtension("GL_ARB_robustness") ||
+         HasExtension("GL_KHR_robustness") ||
+         HasExtension("GL_EXT_robustness");
+}
+
 }  // namespace gfx
diff --git a/ui/gl/gl_context_stub_with_extensions.h b/ui/gl/gl_context_stub_with_extensions.h
index 190e03e..d9da9d5 100644
--- a/ui/gl/gl_context_stub_with_extensions.h
+++ b/ui/gl/gl_context_stub_with_extensions.h
@@ -19,6 +19,7 @@
 
   void AddExtensionsString(const char* extensions);
   void SetGLVersionString(const char* version_str);
+  bool WasAllocatedUsingRobustnessExtension() override;
 
  protected:
   std::string GetGLVersion() override;
diff --git a/ui/gl/gl_version_info.h b/ui/gl/gl_version_info.h
index d8f2730..9694475 100644
--- a/ui/gl/gl_version_info.h
+++ b/ui/gl/gl_version_info.h
@@ -19,6 +19,11 @@
                       (major_version == major && minor_version >= minor));
   }
 
+  bool IsLowerThanGL(unsigned major, unsigned minor) const {
+    return !is_es && (major_version < major ||
+                      (major_version == major && minor_version < minor));
+  }
+
   bool IsAtLeastGLES(unsigned major, unsigned minor) const {
     return is_es && (major_version > major ||
                      (major_version == major && minor_version >= minor));
diff --git a/ui/gl/gpu_timing.cc b/ui/gl/gpu_timing.cc
index a84d3f7..ee90490 100644
--- a/ui/gl/gpu_timing.cc
+++ b/ui/gl/gpu_timing.cc
@@ -44,7 +44,16 @@
 }
 
 GPUTimer::~GPUTimer() {
-  glDeleteQueries(2, queries_);
+  // Destroy() must be called before the destructor.
+  DCHECK(queries_[0] == 0);
+  DCHECK(queries_[1] == 0);
+}
+
+void GPUTimer::Destroy(bool have_context) {
+  if (have_context) {
+    glDeleteQueries(2, queries_);
+  }
+  memset(queries_, 0, sizeof(queries_));
 }
 
 void GPUTimer::Start() {
diff --git a/ui/gl/gpu_timing.h b/ui/gl/gpu_timing.h
index a749ef1..5658097 100644
--- a/ui/gl/gpu_timing.h
+++ b/ui/gl/gpu_timing.h
@@ -76,6 +76,10 @@
  public:
   ~GPUTimer();
 
+  // Destroy the timer object. This must be explicitly called before destroying
+  // this object.
+  void Destroy(bool have_context);
+
   void Start();
   void End();
   bool IsAvailable();