add __FILE__, __LINE__ to GL error functions

BUG=none


Review URL: https://chromiumcodereview.appspot.com/12534005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187389 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 61f4caab..0763ca8c 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -86,6 +86,24 @@
 
 class GLES2DecoderImpl;
 
+// Local versions of the SET_GL_ERROR macros
+#define LOCAL_SET_GL_ERROR(error, function_name, msg) \
+    GLESDECODER_SET_GL_ERROR(this, error, function_name, msg)
+#define LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, value, label) \
+    GLESDECODER_SET_GL_ERROR_INVALID_ENUM(this, function_name, value, label)
+#define LOCAL_SET_GL_ERROR_INVALID_PARAM(error, function_name, pname) \
+    GLESDECODER_SET_GL_ERROR_INVALID_PARAM(this, error, function_name, pname)
+#define LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(function_name) \
+    GLESDECODER_COPY_REAL_GL_ERRORS_TO_WRAPPER(this, function_name)
+#define LOCAL_PEEK_GL_ERROR(function_name) \
+    GLESDECODER_PEEK_GL_ERROR(this, function_name)
+#define LOCAL_CLEAR_REAL_GL_ERRORS(function_name) \
+    GLESDECODER_CLEARREAL_GL_ERRORS(this, function_name)
+#define LOCAL_PERFORMANCE_WARNING(msg) \
+    PerformanceWarning(__FILE__, __LINE__, msg)
+#define LOCAL_RENDER_WARNING(msg) \
+    RenderWarning(__FILE__, __LINE__, msg)
+
 // Check that certain assumptions the code makes are true. There are places in
 // the code where shared memory is passed direclty to GL. Example, glUniformiv,
 // glShaderSource. The command buffer code assumes GLint and GLsizei (and maybe
@@ -276,9 +294,11 @@
 // being reported to the client.
 class ScopedGLErrorSuppressor {
  public:
-  explicit ScopedGLErrorSuppressor(GLES2DecoderImpl* decoder);
+  explicit ScopedGLErrorSuppressor(
+      const char* function_name, GLES2DecoderImpl* decoder);
   ~ScopedGLErrorSuppressor();
  private:
+  const char* function_name_;
   GLES2DecoderImpl* decoder_;
   DISALLOW_COPY_AND_ASSIGN(ScopedGLErrorSuppressor);
 };
@@ -915,10 +935,10 @@
     Program* program = GetProgram(client_id);
     if (!program) {
       if (GetShader(client_id)) {
-        SetGLError(
+        LOCAL_SET_GL_ERROR(
             GL_INVALID_OPERATION, function_name, "shader passed for program");
       } else {
-        SetGLError(GL_INVALID_VALUE, function_name, "unknown program");
+        LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown program");
       }
     }
     LogClientServiceForInfo(program, client_id, function_name);
@@ -947,10 +967,10 @@
     Shader* shader = GetShader(client_id);
     if (!shader) {
       if (GetProgram(client_id)) {
-        SetGLError(
+        LOCAL_SET_GL_ERROR(
             GL_INVALID_OPERATION, function_name, "program passed for shader");
       } else {
-        SetGLError(
+        LOCAL_SET_GL_ERROR(
             GL_INVALID_VALUE, function_name, "unknown shader");
       }
     }
@@ -1339,22 +1359,33 @@
   // false if pname is unknown.
   bool GetNumValuesReturnedForGLGet(GLenum pname, GLsizei* num_values);
 
-  virtual void SetGLError(unsigned error,
-                          const char* function_name,
-                          const char* msg) OVERRIDE;
-  virtual void SetGLErrorInvalidEnum(const char* function_name,
-                                     unsigned value,
-                                     const char* label) OVERRIDE;
+  virtual void SetGLError(
+      const char* filename,
+      int line,
+      unsigned error,
+      const char* function_name,
+      const char* msg) OVERRIDE;
+  virtual void SetGLErrorInvalidEnum(
+      const char* filename,
+      int line,
+      const char* function_name,
+      unsigned value,
+      const char* label) OVERRIDE;
   // Generates a GL error for a bad parameter.
   virtual void SetGLErrorInvalidParam(
+      const char* filename,
+      int line,
       unsigned error,
       const char* function_name,
       unsigned pname,
       int param) OVERRIDE;
 
-  virtual unsigned PeekGLError() OVERRIDE;
-  virtual void CopyRealGLErrorsToWrapper() OVERRIDE;
-  virtual void ClearRealGLErrors() OVERRIDE;
+  virtual unsigned PeekGLError(
+      const char* filename, int line, const char* function_name) OVERRIDE;
+  virtual void CopyRealGLErrorsToWrapper(
+      const char* filename, int line, const char* function_name) OVERRIDE;
+  virtual void ClearRealGLErrors(
+      const char* filename, int line, const char* function_name) OVERRIDE;
 
   // Checks if the current program and vertex attributes are valid for drawing.
   bool IsDrawValid(
@@ -1526,9 +1557,10 @@
     GLsizei width, GLsizei height, GLenum format,
     Texture* texture);
 
-  void LogMessage(const std::string& msg);
-  void RenderWarning(const std::string& msg);
-  void PerformanceWarning(const std::string& msg);
+  void LogMessage(const char* filename, int line, const std::string& msg);
+  void RenderWarning(const char* filename, int line, const std::string& msg);
+  void PerformanceWarning(
+      const char* filename, int line, const std::string& msg);
   const std::string& GetLogPrefix() const;
 
   const FeatureInfo::FeatureFlags& features() const {
@@ -1734,19 +1766,22 @@
   DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl);
 };
 
-ScopedGLErrorSuppressor::ScopedGLErrorSuppressor(GLES2DecoderImpl* decoder)
-    : decoder_(decoder) {
-  decoder_->CopyRealGLErrorsToWrapper();
+ScopedGLErrorSuppressor::ScopedGLErrorSuppressor(
+    const char* function_name, GLES2DecoderImpl* decoder)
+    : function_name_(function_name),
+      decoder_(decoder) {
+  GLESDECODER_COPY_REAL_GL_ERRORS_TO_WRAPPER(decoder_, function_name_);
 }
 
 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() {
-  decoder_->ClearRealGLErrors();
+  GLESDECODER_CLEAR_REAL_GL_ERRORS(decoder_, function_name_);
 }
 
 ScopedTexture2DBinder::ScopedTexture2DBinder(GLES2DecoderImpl* decoder,
                                              GLuint id)
     : decoder_(decoder) {
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "ScopedTexture2DBinder::ctor", decoder_);
 
   // TODO(apatrick): Check if there are any other states that need to be reset
   // before binding a new texture.
@@ -1755,32 +1790,37 @@
 }
 
 ScopedTexture2DBinder::~ScopedTexture2DBinder() {
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "ScopedTexture2DBinder::dtor", decoder_);
   decoder_->RestoreCurrentTexture2DBindings();
 }
 
 ScopedRenderBufferBinder::ScopedRenderBufferBinder(GLES2DecoderImpl* decoder,
                                                    GLuint id)
     : decoder_(decoder) {
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "ScopedRenderBufferBinder::ctor", decoder_);
   glBindRenderbufferEXT(GL_RENDERBUFFER, id);
 }
 
 ScopedRenderBufferBinder::~ScopedRenderBufferBinder() {
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "ScopedRenderBufferBinder::dtor", decoder_);
   decoder_->RestoreCurrentRenderbufferBindings();
 }
 
 ScopedFrameBufferBinder::ScopedFrameBufferBinder(GLES2DecoderImpl* decoder,
                                                  GLuint id)
     : decoder_(decoder) {
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "ScopedFrameBufferBinder::ctor", decoder_);
   glBindFramebufferEXT(GL_FRAMEBUFFER, id);
   decoder->OnFboChanged();
 }
 
 ScopedFrameBufferBinder::~ScopedFrameBufferBinder() {
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "ScopedFrameBufferBinder::dtor", decoder_);
   decoder_->RestoreCurrentFramebufferBindings();
 }
 
@@ -1794,7 +1834,8 @@
   if (!resolve_and_bind_)
     return;
 
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "ScopedResolvedFrameBufferBinder::ctor", decoder_);
   glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT,
                        decoder_->offscreen_target_frame_buffer_->id());
   GLuint targetid;
@@ -1842,7 +1883,8 @@
   if (!resolve_and_bind_)
     return;
 
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "ScopedResolvedFrameBufferBinder::dtor", decoder_);
   decoder_->RestoreCurrentFramebufferBindings();
   if (decoder_->state_.enable_flags.scissor_test) {
     glEnable(GL_SCISSOR_TEST);
@@ -1875,7 +1917,7 @@
 }
 
 void BackTexture::Create() {
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor("BackTexture::Create", decoder_);
   Destroy();
   glGenTextures(1, &id_);
   ScopedTexture2DBinder binder(decoder_, id_);
@@ -1900,7 +1942,7 @@
 bool BackTexture::AllocateStorage(
     const gfx::Size& size, GLenum format, bool zero) {
   DCHECK_NE(id_, 0u);
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor("BackTexture::AllocateStorage", decoder_);
   ScopedTexture2DBinder binder(decoder_, id_);
   uint32 image_size = 0;
   GLES2Util::ComputeImageDataSizes(
@@ -1940,7 +1982,7 @@
 
 void BackTexture::Copy(const gfx::Size& size, GLenum format) {
   DCHECK_NE(id_, 0u);
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor("BackTexture::Copy", decoder_);
   ScopedTexture2DBinder binder(decoder_, id_);
   glCopyTexImage2D(GL_TEXTURE_2D,
                    0,  // level
@@ -1953,7 +1995,7 @@
 
 void BackTexture::Destroy() {
   if (id_ != 0) {
-    ScopedGLErrorSuppressor suppressor(decoder_);
+    ScopedGLErrorSuppressor suppressor("BackTexture::Destroy", decoder_);
     glDeleteTextures(1, &id_);
     id_ = 0;
   }
@@ -1980,14 +2022,15 @@
 }
 
 void BackRenderbuffer::Create() {
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor("BackRenderbuffer::Create", decoder_);
   Destroy();
   glGenRenderbuffersEXT(1, &id_);
 }
 
 bool BackRenderbuffer::AllocateStorage(const gfx::Size& size, GLenum format,
                                        GLsizei samples) {
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "BackRenderbuffer::AllocateStorage", decoder_);
   ScopedRenderBufferBinder binder(decoder_, id_);
 
   uint32 estimated_size = 0;
@@ -2031,7 +2074,7 @@
 
 void BackRenderbuffer::Destroy() {
   if (id_ != 0) {
-    ScopedGLErrorSuppressor suppressor(decoder_);
+    ScopedGLErrorSuppressor suppressor("BackRenderbuffer::Destroy", decoder_);
     glDeleteRenderbuffersEXT(1, &id_);
     id_ = 0;
   }
@@ -2056,14 +2099,15 @@
 }
 
 void BackFramebuffer::Create() {
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor("BackFramebuffer::Create", decoder_);
   Destroy();
   glGenFramebuffersEXT(1, &id_);
 }
 
 void BackFramebuffer::AttachRenderTexture(BackTexture* texture) {
   DCHECK_NE(id_, 0u);
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "BackFramebuffer::AttachRenderTexture", decoder_);
   ScopedFrameBufferBinder binder(decoder_, id_);
   GLuint attach_id = texture ? texture->id() : 0;
   glFramebufferTexture2DEXT(GL_FRAMEBUFFER,
@@ -2076,7 +2120,8 @@
 void BackFramebuffer::AttachRenderBuffer(GLenum target,
                                          BackRenderbuffer* render_buffer) {
   DCHECK_NE(id_, 0u);
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor(
+      "BackFramebuffer::AttachRenderBuffer", decoder_);
   ScopedFrameBufferBinder binder(decoder_, id_);
   GLuint attach_id = render_buffer ? render_buffer->id() : 0;
   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER,
@@ -2087,7 +2132,7 @@
 
 void BackFramebuffer::Destroy() {
   if (id_ != 0) {
-    ScopedGLErrorSuppressor suppressor(decoder_);
+    ScopedGLErrorSuppressor suppressor("BackFramebuffer::Destroy", decoder_);
     glDeleteFramebuffersEXT(1, &id_);
     id_ = 0;
   }
@@ -2099,7 +2144,7 @@
 
 GLenum BackFramebuffer::CheckStatus() {
   DCHECK_NE(id_, 0u);
-  ScopedGLErrorSuppressor suppressor(decoder_);
+  ScopedGLErrorSuppressor suppressor("BackFramebuffer::CheckStatus", decoder_);
   ScopedFrameBufferBinder binder(decoder_, id_);
   return glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);
 }
@@ -2872,7 +2917,7 @@
 
   GLenum completeness = framebuffer->IsPossiblyComplete();
   if (completeness != GL_FRAMEBUFFER_COMPLETE) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_FRAMEBUFFER_OPERATION, func_name, "framebuffer incomplete");
     return false;
   }
@@ -2884,7 +2929,7 @@
       // Can we clear them?
       if (framebuffer->GetStatus(texture_manager(), target) !=
           GL_FRAMEBUFFER_COMPLETE) {
-        SetGLError(
+        LOCAL_SET_GL_ERROR(
             GL_INVALID_FRAMEBUFFER_OPERATION, func_name,
             "framebuffer incomplete (clear)");
         return false;
@@ -2896,7 +2941,7 @@
   if (!framebuffer_manager()->IsComplete(framebuffer)) {
     if (framebuffer->GetStatus(texture_manager(), target) !=
         GL_FRAMEBUFFER_COMPLETE) {
-      SetGLError(
+      LOCAL_SET_GL_ERROR(
           GL_INVALID_FRAMEBUFFER_OPERATION, func_name,
           "framebuffer incomplete (check)");
       return false;
@@ -3483,7 +3528,7 @@
           LOG(ERROR) << "[" << GetLogPrefix() << "] "
                      << "GL ERROR: " << GLES2Util::GetStringEnum(error) << " : "
                      << GetCommandName(command);
-          SetGLError(error, "DoCommand", "GL error from driver");
+          LOCAL_SET_GL_ERROR(error, "DoCommand", "GL error from driver");
         }
       }
     } else {
@@ -3538,7 +3583,7 @@
 void GLES2DecoderImpl::DoActiveTexture(GLenum texture_unit) {
   GLuint texture_index = texture_unit - GL_TEXTURE0;
   if (texture_index >= state_.texture_units.size()) {
-    SetGLErrorInvalidEnum(
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(
         "glActiveTexture", texture_unit, "texture_unit");
     return;
   }
@@ -3570,8 +3615,9 @@
   LogClientServiceForInfo(buffer, client_id, "glBindBuffer");
   if (buffer) {
     if (!buffer_manager()->SetTarget(buffer, target)) {
-      SetGLError(GL_INVALID_OPERATION,
-                 "glBindBuffer", "buffer bound to more than 1 target");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_OPERATION,
+          "glBindBuffer", "buffer bound to more than 1 target");
       return;
     }
     service_id = buffer->service_id();
@@ -3801,13 +3847,15 @@
   // Check the texture exists
   // Check that we are not trying to bind it to a different target.
   if (texture->target() != 0 && texture->target() != target) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glBindTexture", "texture bound to more than 1 target.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glBindTexture", "texture bound to more than 1 target.");
     return;
   }
   if (texture->IsStreamTexture() && target != GL_TEXTURE_EXTERNAL_OES) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glBindTexture", "illegal target for stream texture.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glBindTexture", "illegal target for stream texture.");
     return;
   }
   LogClientServiceForInfo(texture, client_id, "glBindTexture");
@@ -3851,8 +3899,9 @@
       glDisableVertexAttribArray(index);
     }
   } else {
-    SetGLError(GL_INVALID_VALUE,
-               "glDisableVertexAttribArray", "index out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glDisableVertexAttribArray", "index out of range");
   }
 }
 
@@ -3869,9 +3918,8 @@
         !validators_->attachment.IsValid(attachments[i])) ||
        (!framebuffer &&
         !validators_->backbuffer_attachment.IsValid(attachments[i]))) {
-      SetGLErrorInvalidEnum("glDiscardFramebufferEXT",
-                           attachments[i],
-                           "attachments");
+      LOCAL_SET_GL_ERROR_INVALID_ENUM(
+          "glDiscardFramebufferEXT", attachments[i], "attachments");
       return;
     }
   }
@@ -3907,8 +3955,8 @@
   if (state_.vertex_attrib_manager->Enable(index, true)) {
     glEnableVertexAttribArray(index);
   } else {
-    SetGLError(GL_INVALID_VALUE,
-               "glEnableVertexAttribArray", "index out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glEnableVertexAttribArray", "index out of range");
   }
 }
 
@@ -3916,8 +3964,8 @@
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture ||
       !texture_manager()->CanGenerateMipmaps(texture)) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glGenerateMipmaps", "Can not generate mips");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, "glGenerateMipmap", "Can not generate mips");
     return;
   }
 
@@ -3925,18 +3973,20 @@
     for (int i = 0; i < 6; ++i) {
       GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i;
       if (!texture_manager()->ClearTextureLevel(this, texture, face, 0)) {
-        SetGLError(GL_OUT_OF_MEMORY, "glGenerateMipmaps", "dimensions too big");
+        LOCAL_SET_GL_ERROR(
+            GL_OUT_OF_MEMORY, "glGenerateMipmap", "dimensions too big");
         return;
       }
     }
   } else {
     if (!texture_manager()->ClearTextureLevel(this, texture, target, 0)) {
-      SetGLError(GL_OUT_OF_MEMORY, "glGenerateMipmaps", "dimensions too big");
+      LOCAL_SET_GL_ERROR(
+          GL_OUT_OF_MEMORY, "glGenerateMipmap", "dimensions too big");
       return;
     }
   }
 
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glGenerateMipmap");
   // Workaround for Mac driver bug. In the large scheme of things setting
   // glTexParamter twice for glGenerateMipmap is probably not a lage performance
   // hit so there's probably no need to make this conditional. The bug appears
@@ -3950,7 +4000,7 @@
   if (workarounds().set_texture_filter_before_generating_mipmap) {
     glTexParameteri(target, GL_TEXTURE_MIN_FILTER, texture->min_filter());
   }
-  GLenum error = PeekGLError();
+  GLenum error = LOCAL_PEEK_GL_ERROR("glGenerateMipmap");
   if (error == GL_NO_ERROR) {
     texture_manager()->MarkMipmapsGenerated(texture);
   }
@@ -4327,7 +4377,7 @@
     GLenum target, GLenum pname, GLint* params) {
   Buffer* buffer = GetBufferInfoForTarget(target);
   if (!buffer) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION, "glGetBufferParameteriv",
         "no buffer bound for target");
     return;
@@ -4347,15 +4397,18 @@
 void GLES2DecoderImpl::DoBindAttribLocation(
     GLuint program_id, GLuint index, const char* name) {
   if (!StringIsValidForGLES(name)) {
-    SetGLError(GL_INVALID_VALUE, "glBindAttribLocation", "Invalid character");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glBindAttribLocation", "Invalid character");
     return;
   }
   if (ProgramManager::IsInvalidPrefix(name, strlen(name))) {
-    SetGLError(GL_INVALID_OPERATION, "glBindAttribLocation", "reserved prefix");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, "glBindAttribLocation", "reserved prefix");
     return;
   }
   if (index >= group_->max_vertex_attribs()) {
-    SetGLError(GL_INVALID_VALUE, "glBindAttribLocation", "index out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glBindAttribLocation", "index out of range");
     return;
   }
   Program* program = GetProgramInfoNotShader(
@@ -4416,20 +4469,23 @@
 void GLES2DecoderImpl::DoBindUniformLocationCHROMIUM(
     GLuint program_id, GLint location, const char* name) {
   if (!StringIsValidForGLES(name)) {
-    SetGLError(GL_INVALID_VALUE,
-               "glBindUniformLocationCHROMIUM", "Invalid character");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glBindUniformLocationCHROMIUM", "Invalid character");
     return;
   }
   if (ProgramManager::IsInvalidPrefix(name, strlen(name))) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glBindUniformLocationCHROMIUM", "reserved prefix");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glBindUniformLocationCHROMIUM", "reserved prefix");
     return;
   }
   if (location < 0 || static_cast<uint32>(location) >=
       (group_->max_fragment_uniform_vectors() +
        group_->max_vertex_uniform_vectors()) * 4) {
-    SetGLError(GL_INVALID_VALUE,
-               "glBindUniformLocationCHROMIUM", "location out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glBindUniformLocationCHROMIUM", "location out of range");
     return;
   }
   Program* program = GetProgramInfoNotShader(
@@ -4438,8 +4494,9 @@
     return;
   }
   if (!program->SetUniformLocationBinding(name, location)) {
-    SetGLError(GL_INVALID_VALUE,
-               "glBindUniformLocationCHROMIUM", "location out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glBindUniformLocationCHROMIUM", "location out of range");
   }
 }
 
@@ -4502,7 +4559,7 @@
         shader_manager()->MarkAsDeleted(shader);
       }
     } else {
-      SetGLError(GL_INVALID_VALUE, "glDeleteShader", "unknown shader");
+      LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glDeleteShader", "unknown shader");
     }
   }
   return error::kNoError;
@@ -4518,7 +4575,8 @@
         program_manager()->MarkAsDeleted(shader_manager(), program);
       }
     } else {
-      SetGLError(GL_INVALID_VALUE, "glDeleteProgram", "unknown program");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_VALUE, "glDeleteProgram", "unknown program");
     }
   }
   return error::kNoError;
@@ -4543,7 +4601,7 @@
   const GLuint* ids = GetSharedMemoryAs<const GLuint*>(
       c.ids_shm_id, c.ids_shm_offset, data_size);
   if (n < 0) {
-    SetGLError(GL_INVALID_VALUE, "DeleteSharedIdsCHROMIUM", "n < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "DeleteSharedIdsCHROMIUM", "n < 0");
     return error::kNoError;
   }
   if (ids == NULL) {
@@ -4580,7 +4638,7 @@
   GLuint* ids = GetSharedMemoryAs<GLuint*>(
       c.ids_shm_id, c.ids_shm_offset, data_size);
   if (n < 0) {
-    SetGLError(GL_INVALID_VALUE, "GenSharedIdsCHROMIUM", "n < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "GenSharedIdsCHROMIUM", "n < 0");
     return error::kNoError;
   }
   if (ids == NULL) {
@@ -4598,7 +4656,7 @@
       for (GLsizei jj = 0; jj < ii; ++jj) {
         id_allocator->FreeID(ids[jj]);
       }
-      SetGLError(
+      LOCAL_SET_GL_ERROR(
           GL_INVALID_VALUE, "RegisterSharedIdsCHROMIUM",
           "attempt to register id that already exists");
       return;
@@ -4617,7 +4675,7 @@
   GLuint* ids = GetSharedMemoryAs<GLuint*>(
       c.ids_shm_id, c.ids_shm_offset, data_size);
   if (n < 0) {
-    SetGLError(GL_INVALID_VALUE, "RegisterSharedIdsCHROMIUM", "n < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "RegisterSharedIdsCHROMIUM", "n < 0");
     return error::kNoError;
   }
   if (ids == NULL) {
@@ -4645,8 +4703,9 @@
     GLuint client_renderbuffer_id) {
   Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
   if (!framebuffer) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glFramebufferRenderbuffer", "no framebuffer bound");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glFramebufferRenderbuffer", "no framebuffer bound");
     return;
   }
   GLuint service_id = 0;
@@ -4654,16 +4713,17 @@
   if (client_renderbuffer_id) {
     renderbuffer = GetRenderbuffer(client_renderbuffer_id);
     if (!renderbuffer) {
-      SetGLError(GL_INVALID_OPERATION,
-                 "glFramebufferRenderbuffer", "unknown renderbuffer");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_OPERATION,
+          "glFramebufferRenderbuffer", "unknown renderbuffer");
       return;
     }
     service_id = renderbuffer->service_id();
   }
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glFramebufferRenderbuffer");
   glFramebufferRenderbufferEXT(
       target, attachment, renderbuffertarget, service_id);
-  GLenum error = PeekGLError();
+  GLenum error = LOCAL_PEEK_GL_ERROR("glFramebufferRenderbuffer");
   if (error == GL_NO_ERROR) {
     framebuffer->AttachRenderbuffer(attachment, renderbuffer);
   }
@@ -4794,8 +4854,9 @@
     GLuint client_texture_id, GLint level) {
   Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
   if (!framebuffer) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glFramebufferTexture2D", "no framebuffer bound.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glFramebufferTexture2D", "no framebuffer bound.");
     return;
   }
   GLuint service_id = 0;
@@ -4803,22 +4864,24 @@
   if (client_texture_id) {
     texture = GetTexture(client_texture_id);
     if (!texture) {
-      SetGLError(GL_INVALID_OPERATION,
-                 "glFramebufferTexture2D", "unknown texture");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_OPERATION,
+          "glFramebufferTexture2D", "unknown texture");
       return;
     }
     service_id = texture->service_id();
   }
 
   if (!texture_manager()->ValidForTarget(textarget, level, 0, 0, 1)) {
-    SetGLError(GL_INVALID_VALUE,
-               "glFramebufferTexture2D", "level out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glFramebufferTexture2D", "level out of range");
     return;
   }
 
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glFramebufferTexture2D");
   glFramebufferTexture2DEXT(target, attachment, textarget, service_id, level);
-  GLenum error = PeekGLError();
+  GLenum error = LOCAL_PEEK_GL_ERROR("glFramebufferTexture2D");
   if (error == GL_NO_ERROR) {
     framebuffer->AttachTexture(attachment, texture, textarget, level);
   }
@@ -4831,8 +4894,9 @@
     GLenum target, GLenum attachment, GLenum pname, GLint* params) {
   Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
   if (!framebuffer) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glFramebufferAttachmentParameteriv", "no framebuffer bound");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glFramebufferAttachmentParameteriv", "no framebuffer bound");
     return;
   }
   glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params);
@@ -4862,8 +4926,9 @@
   Renderbuffer* renderbuffer =
       GetRenderbufferInfoForTarget(GL_RENDERBUFFER);
   if (!renderbuffer) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glGetRenderbufferParameteriv", "no renderbuffer bound");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glGetRenderbufferParameteriv", "no renderbuffer bound");
     return;
   }
   switch (pname) {
@@ -4888,8 +4953,9 @@
     GLbitfield mask, GLenum filter) {
   DCHECK(!ShouldDeferReads() && !ShouldDeferDraws());
   if (!features().chromium_framebuffer_multisample) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glBlitFramebufferEXT", "function not available");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glBlitFramebufferEXT", "function not available");
   }
 
   if (!CheckBoundFramebuffersValid("glBlitFramebufferEXT")) {
@@ -4912,49 +4978,55 @@
     GLenum target, GLsizei samples, GLenum internalformat,
     GLsizei width, GLsizei height) {
   if (!features().chromium_framebuffer_multisample) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glRenderbufferStorageMultisampleEXT", "function not available");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glRenderbufferStorageMultisample", "function not available");
     return;
   }
 
   Renderbuffer* renderbuffer =
       GetRenderbufferInfoForTarget(GL_RENDERBUFFER);
   if (!renderbuffer) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glRenderbufferStorageMultisampleEXT", "no renderbuffer bound");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glRenderbufferStorageMultisample", "no renderbuffer bound");
     return;
   }
 
   if (samples > renderbuffer_manager()->max_samples()) {
-    SetGLError(GL_INVALID_VALUE,
-               "glRenderbufferStorageMultisampleEXT", "samples too large");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glRenderbufferStorageMultisample", "samples too large");
     return;
   }
 
   if (width > renderbuffer_manager()->max_renderbuffer_size() ||
       height > renderbuffer_manager()->max_renderbuffer_size()) {
-    SetGLError(GL_INVALID_VALUE,
-               "glRenderbufferStorageMultisample", "dimensions too large");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glRenderbufferStorageMultisample", "dimensions too large");
     return;
   }
 
   uint32 estimated_size = 0;
   if (!RenderbufferManager::ComputeEstimatedRenderbufferSize(
       width, height, samples, internalformat, &estimated_size)) {
-    SetGLError(GL_OUT_OF_MEMORY,
-               "glRenderbufferStorageMultsampleEXT", "dimensions too large");
+    LOCAL_SET_GL_ERROR(
+        GL_OUT_OF_MEMORY,
+        "glRenderbufferStorageMultsample", "dimensions too large");
     return;
   }
 
   if (!EnsureGPUMemoryAvailable(estimated_size)) {
-    SetGLError(GL_OUT_OF_MEMORY,
-               "glRenderbufferStorageMultsampleEXT", "out of memory");
+    LOCAL_SET_GL_ERROR(
+        GL_OUT_OF_MEMORY,
+        "glRenderbufferStorageMultsample", "out of memory");
     return;
   }
 
   GLenum impl_format = RenderbufferManager::
       InternalRenderbufferFormatToImplFormat(internalformat);
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glRenderbufferStorageMultisample");
   if (IsAngle()) {
     glRenderbufferStorageMultisampleANGLE(
         target, samples, impl_format, width, height);
@@ -4962,7 +5034,7 @@
     glRenderbufferStorageMultisampleEXT(
         target, samples, impl_format, width, height);
   }
-  GLenum error = PeekGLError();
+  GLenum error = LOCAL_PEEK_GL_ERROR("glRenderbufferStorageMultisample");
   if (error == GL_NO_ERROR) {
     // TODO(gman): If renderbuffers tracked which framebuffers they were
     // attached to we could just mark those framebuffers as not complete.
@@ -4977,37 +5049,39 @@
   Renderbuffer* renderbuffer =
       GetRenderbufferInfoForTarget(GL_RENDERBUFFER);
   if (!renderbuffer) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glRenderbufferStorage", "no renderbuffer bound");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glRenderbufferStorage", "no renderbuffer bound");
     return;
   }
 
   if (width > renderbuffer_manager()->max_renderbuffer_size() ||
       height > renderbuffer_manager()->max_renderbuffer_size()) {
-    SetGLError(GL_INVALID_VALUE,
-               "glRenderbufferStorage", "dimensions too large");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glRenderbufferStorage", "dimensions too large");
     return;
   }
 
   uint32 estimated_size = 0;
   if (!RenderbufferManager::ComputeEstimatedRenderbufferSize(
       width, height, 1, internalformat, &estimated_size)) {
-    SetGLError(GL_OUT_OF_MEMORY, "glRenderbufferStorage",
-               "dimensions too large");
+    LOCAL_SET_GL_ERROR(
+        GL_OUT_OF_MEMORY, "glRenderbufferStorage", "dimensions too large");
     return;
   }
 
   if (!EnsureGPUMemoryAvailable(estimated_size)) {
-    SetGLError(GL_OUT_OF_MEMORY, "glRenderbufferStorage", "out of memory");
+    LOCAL_SET_GL_ERROR(
+        GL_OUT_OF_MEMORY, "glRenderbufferStorage", "out of memory");
     return;
   }
 
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glRenderbufferStorage");
   glRenderbufferStorageEXT(
       target, RenderbufferManager::
           InternalRenderbufferFormatToImplFormat(internalformat),
       width, height);
-  GLenum error = PeekGLError();
+  GLenum error = LOCAL_PEEK_GL_ERROR("glRenderbufferStorage");
   if (error == GL_NO_ERROR) {
     // TODO(gman): If tetxures tracked which framebuffers they were attached to
     // we could just mark those framebuffers as not complete.
@@ -5049,7 +5123,7 @@
     GLenum target, GLenum pname, GLfloat param) {
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_VALUE, "glTexParameterf", "unknown texture");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexParameterf", "unknown texture");
     return;
   }
 
@@ -5061,7 +5135,7 @@
     GLenum target, GLenum pname, GLint param) {
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_VALUE, "glTexParameteri", "unknown texture");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexParameteri", "unknown texture");
     return;
   }
 
@@ -5073,7 +5147,7 @@
     GLenum target, GLenum pname, const GLfloat* params) {
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_VALUE, "glTexParameterfv", "unknown texture");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexParameterfv", "unknown texture");
     return;
   }
 
@@ -5085,7 +5159,8 @@
   GLenum target, GLenum pname, const GLint* params) {
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_VALUE, "glTexParameteriv", "unknown texture");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glTexParameteriv", "unknown texture");
     return;
   }
 
@@ -5096,11 +5171,13 @@
 bool GLES2DecoderImpl::CheckCurrentProgram(const char* function_name) {
   if (!state_.current_program) {
     // The program does not exist.
-    SetGLError(GL_INVALID_OPERATION, function_name, "no program in use");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name, "no program in use");
     return false;
   }
   if (!state_.current_program->InUse()) {
-    SetGLError(GL_INVALID_OPERATION, function_name, "program not linked");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name, "program not linked");
     return false;
   }
   return true;
@@ -5245,7 +5322,8 @@
       state_.current_program->GetUniformInfoByFakeLocation(
           fake_location, real_location, &array_index);
   if (!info) {
-    SetGLError(GL_INVALID_OPERATION, function_name, "unknown location");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name, "unknown location");
     return false;
   }
   bool okay = false;
@@ -5256,12 +5334,13 @@
     }
   }
   if (!okay) {
-    SetGLError(
-        GL_INVALID_OPERATION, function_name, "wrong uniform function for type");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name,
+        "wrong uniform function for type");
     return false;
   }
   if (*count > 1 && !info->is_array) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION, function_name, "count > 1 for non-array");
     return false;
   }
@@ -5284,7 +5363,8 @@
   }
   if (!state_.current_program->SetSamplers(
       state_.texture_units.size(), fake_location, 1, &v0)) {
-    SetGLError(GL_INVALID_VALUE, "glUniform1i", "texture unit out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glUniform1i", "texture unit out of range");
     return;
   }
   glUniform1i(real_location, v0);
@@ -5303,7 +5383,8 @@
       type == GL_SAMPLER_CUBE || type == GL_SAMPLER_EXTERNAL_OES) {
     if (!state_.current_program->SetSamplers(
           state_.texture_units.size(), fake_location, count, value)) {
-      SetGLError(GL_INVALID_VALUE, "glUniform1iv", "texture unit out of range");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_VALUE, "glUniform1iv", "texture unit out of range");
       return;
     }
   }
@@ -5478,7 +5559,8 @@
     }
     if (!program->IsValid()) {
       // Program was not linked successfully. (ie, glLinkProgram)
-      SetGLError(GL_INVALID_OPERATION, "glUseProgram", "program not linked");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_OPERATION, "glUseProgram", "program not linked");
       return;
     }
     service_id = program->service_id();
@@ -5513,19 +5595,22 @@
   return error;
 }
 
-unsigned GLES2DecoderImpl::PeekGLError() {
+unsigned GLES2DecoderImpl::PeekGLError(
+    const char* filename, int line, const char* function_name) {
   GLenum error = glGetError();
   if (error != GL_NO_ERROR) {
-    SetGLError(error, "", "");
+    SetGLError(filename, line, error, function_name, "");
   }
   return error;
 }
 
 void GLES2DecoderImpl::SetGLError(
+    const char* filename, int line,
     unsigned error, const char* function_name, const char* msg) {
   if (msg) {
     last_error_ = msg;
-    LogMessage(GetLogPrefix() + ": " + std::string("GL ERROR :") +
+    LogMessage(filename, line,
+               GetLogPrefix() + ": " + std::string("GL ERROR :") +
                GLES2Util::GetStringEnum(error) + " : " +
                function_name + ": " + msg);
   }
@@ -5533,26 +5618,29 @@
 }
 
 void GLES2DecoderImpl::SetGLErrorInvalidEnum(
+    const char* filename, int line,
     const char* function_name, unsigned value, const char* label) {
-  SetGLError(GL_INVALID_ENUM, function_name,
+  SetGLError(filename, line, GL_INVALID_ENUM, function_name,
              (std::string(label) + " was " +
               GLES2Util::GetStringEnum(value)).c_str());
 }
 
 void GLES2DecoderImpl::SetGLErrorInvalidParam(
+    const char* filename,
+    int line,
     unsigned error,
     const char* function_name,
     unsigned pname,
     int param) {
   if (error == GL_INVALID_ENUM) {
     SetGLError(
-        GL_INVALID_ENUM, function_name,
+        filename, line, GL_INVALID_ENUM, function_name,
         (std::string("trying to set ") +
          GLES2Util::GetStringEnum(pname) + " to " +
          GLES2Util::GetStringEnum(param)).c_str());
   } else {
     SetGLError(
-        error, function_name,
+        filename, line, error, function_name,
         (std::string("trying to set ") +
          GLES2Util::GetStringEnum(pname) + " to " +
          base::StringPrintf("%d", param)).c_str());
@@ -5564,7 +5652,8 @@
   return prefix.empty() ? this_in_hex_ : prefix;
 }
 
-void GLES2DecoderImpl::LogMessage(const std::string& msg) {
+void GLES2DecoderImpl::LogMessage(
+    const char* filename, int line, const std::string& msg) {
   if (log_message_count_ < kMaxLogMessages ||
       CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kDisableGLErrorLimit)) {
@@ -5572,7 +5661,8 @@
     // LOG this unless logging is turned off as any chromium code that
     // generates these errors probably has a bug.
     if (log_synthesized_gl_errors()) {
-      LOG(ERROR) << msg;
+      ::logging::LogMessage(
+          filename, line, ::logging::LOG_ERROR).stream() << msg;
     }
     if (!msg_callback_.is_null()) {
       msg_callback_.Run(0, msg);
@@ -5587,12 +5677,14 @@
   }
 }
 
-void GLES2DecoderImpl::RenderWarning(const std::string& msg) {
-  LogMessage(std::string("RENDER WARNING: ") + msg);
+void GLES2DecoderImpl::RenderWarning(
+    const char* filename, int line, const std::string& msg) {
+  LogMessage(filename, line, std::string("RENDER WARNING: ") + msg);
 }
 
-void GLES2DecoderImpl::PerformanceWarning(const std::string& msg) {
-  LogMessage(std::string("PERFORMANCE WARNING: ") + msg);
+void GLES2DecoderImpl::PerformanceWarning(
+    const char* filename, int line, const std::string& msg) {
+  LogMessage(filename, line, std::string("PERFORMANCE WARNING: ") + msg);
 }
 
 void GLES2DecoderImpl::ForceCompileShaderIfPending(Shader* shader) {
@@ -5612,18 +5704,25 @@
   }
 }
 
-void GLES2DecoderImpl::CopyRealGLErrorsToWrapper() {
+void GLES2DecoderImpl::CopyRealGLErrorsToWrapper(
+    const char* filename, int line, const char* function_name) {
   GLenum error;
   while ((error = glGetError()) != GL_NO_ERROR) {
-    SetGLError(error, "", NULL);
+    SetGLError(filename, line, error, function_name,
+               "<- error from previous GL command");
   }
 }
 
-void GLES2DecoderImpl::ClearRealGLErrors() {
+void GLES2DecoderImpl::ClearRealGLErrors(
+    const char* filename, int line, const char* function_name) {
   GLenum error;
   while ((error = glGetError()) != GL_NO_ERROR) {
     if (error != GL_OUT_OF_MEMORY) {
       // GL_OUT_OF_MEMORY can legally happen on lost device.
+      LogMessage(filename, line,
+                 GetLogPrefix() + ": " + std::string("GL ERROR :") +
+                 GLES2Util::GetStringEnum(error) + " : " +
+                 function_name + ": was unhandled");
       NOTREACHED() << "GL error " << error << " was unhandled.";
     }
   }
@@ -5654,7 +5753,7 @@
           glBindTexture(
               GetBindTargetForSamplerType(uniform_info->type),
               texture_manager()->black_texture_id(uniform_info->type));
-          RenderWarning(
+          LOCAL_RENDER_WARNING(
               std::string("texture bound to texture unit ") +
               base::IntToString(texture_unit_index) +
               " is not renderable. It maybe non-power-of-2 and have "
@@ -5740,7 +5839,7 @@
   if (!state_.current_program) {
     // The program does not exist.
     // But GL says no ERROR.
-    RenderWarning("Drawing with no current shader program.");
+    LOCAL_RENDER_WARNING("Drawing with no current shader program.");
     return false;
   }
 
@@ -5779,14 +5878,14 @@
   if (num_vertices == 0 ||
       !SafeMultiplyUint32(num_vertices, sizeof(Vec4), &size_needed) ||
       size_needed > 0x7FFFFFFFU) {
-    SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0");
+    LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0");
     return false;
   }
 
-  PerformanceWarning(
+  LOCAL_PERFORMANCE_WARNING(
       "Attribute 0 is disabled. This has signficant performance penalty");
 
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(function_name);
   glBindBuffer(GL_ARRAY_BUFFER, attrib_0_buffer_id_);
 
   bool new_buffer = static_cast<GLsizei>(size_needed) > attrib_0_size_;
@@ -5794,7 +5893,8 @@
     glBufferData(GL_ARRAY_BUFFER, size_needed, NULL, GL_DYNAMIC_DRAW);
     GLenum error = glGetError();
     if (error != GL_NO_ERROR) {
-      SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0");
+      LOCAL_SET_GL_ERROR(
+          GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0");
       return false;
     }
   }
@@ -5863,7 +5963,7 @@
     return true;
   }
 
-  PerformanceWarning(
+  LOCAL_PERFORMANCE_WARNING(
       "GL_FIXED attributes have a signficant performance penalty");
 
   // NOTE: we could be smart and try to check if a buffer is used
@@ -5884,7 +5984,8 @@
                                                     max_vertex_accessed);
     GLuint num_vertices = max_accessed + 1;
     if (num_vertices == 0) {
-      SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0");
+      LOCAL_SET_GL_ERROR(
+          GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0");
       return false;
     }
     if (attrib_info &&
@@ -5893,7 +5994,7 @@
       uint32 elements_used = 0;
       if (!SafeMultiplyUint32(num_vertices, attrib->size(), &elements_used) ||
           !SafeAddUint32(elements_needed, elements_used, &elements_needed)) {
-        SetGLError(
+        LOCAL_SET_GL_ERROR(
             GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs");
         return false;
       }
@@ -5904,18 +6005,19 @@
   uint32 size_needed = 0;
   if (!SafeMultiplyUint32(elements_needed, kSizeOfFloat, &size_needed) ||
       size_needed > 0x7FFFFFFFU) {
-    SetGLError(GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs");
+    LOCAL_SET_GL_ERROR(
+        GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs");
     return false;
   }
 
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(function_name);
 
   glBindBuffer(GL_ARRAY_BUFFER, fixed_attrib_buffer_id_);
   if (static_cast<GLsizei>(size_needed) > fixed_attrib_buffer_size_) {
     glBufferData(GL_ARRAY_BUFFER, size_needed, NULL, GL_DYNAMIC_DRAW);
     GLenum error = glGetError();
     if (error != GL_NO_ERROR) {
-      SetGLError(
+      LOCAL_SET_GL_ERROR(
           GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs");
       return false;
     }
@@ -5932,7 +6034,8 @@
                                                   max_vertex_accessed);
     GLuint num_vertices = max_accessed + 1;
     if (num_vertices == 0) {
-      SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0");
+      LOCAL_SET_GL_ERROR(
+          GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0");
       return false;
     }
     if (attrib_info &&
@@ -5977,15 +6080,15 @@
   if (ShouldDeferDraws())
     return error::kDeferCommandUntilLater;
   if (!validators_->draw_mode.IsValid(mode)) {
-    SetGLErrorInvalidEnum(function_name, mode, "mode");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, mode, "mode");
     return error::kNoError;
   }
   if (count < 0) {
-    SetGLError(GL_INVALID_VALUE, function_name, "count < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "count < 0");
     return error::kNoError;
   }
   if (primcount < 0) {
-    SetGLError(GL_INVALID_VALUE, function_name, "primcount < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "primcount < 0");
     return error::kNoError;
   }
   if (!CheckBoundFramebuffersValid(function_name)) {
@@ -5994,19 +6097,19 @@
   // We have to check this here because the prototype for glDrawArrays
   // is GLint not GLsizei.
   if (first < 0) {
-    SetGLError(GL_INVALID_VALUE, function_name, "first < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "first < 0");
     return error::kNoError;
   }
 
   if (count == 0 || (instanced && primcount == 0)) {
-    RenderWarning("Render count or primcount is 0.");
+    LOCAL_RENDER_WARNING("Render count or primcount is 0.");
     return error::kNoError;
   }
 
   GLuint max_vertex_accessed = first + count - 1;
   if (IsDrawValid(function_name, max_vertex_accessed, primcount)) {
     if (!ClearUnclearedTextures()) {
-      SetGLError(GL_INVALID_VALUE, function_name, "out of memory");
+      LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "out of memory");
       return error::kNoError;
     }
     bool simulated_attrib_0 = false;
@@ -6053,8 +6156,9 @@
 error::Error GLES2DecoderImpl::HandleDrawArraysInstancedANGLE(
     uint32 immediate_data_size, const cmds::DrawArraysInstancedANGLE& c) {
   if (!features().angle_instanced_arrays) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glDrawArraysInstancedANGLE", "function not available");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glDrawArraysInstancedANGLE", "function not available");
     return error::kNoError;
   }
   return DoDrawArrays("glDrawArraysIntancedANGLE",
@@ -6076,29 +6180,29 @@
   if (ShouldDeferDraws())
     return error::kDeferCommandUntilLater;
   if (!state_.vertex_attrib_manager->element_array_buffer()) {
-    SetGLError(GL_INVALID_OPERATION,
-               function_name, "No element array buffer bound");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name, "No element array buffer bound");
     return error::kNoError;
   }
 
   if (count < 0) {
-    SetGLError(GL_INVALID_VALUE, function_name, "count < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "count < 0");
     return error::kNoError;
   }
   if (offset < 0) {
-    SetGLError(GL_INVALID_VALUE, function_name, "offset < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "offset < 0");
     return error::kNoError;
   }
   if (!validators_->draw_mode.IsValid(mode)) {
-    SetGLErrorInvalidEnum(function_name, mode, "mode");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, mode, "mode");
     return error::kNoError;
   }
   if (!validators_->index_type.IsValid(type)) {
-    SetGLErrorInvalidEnum(function_name, type, "type");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, type, "type");
     return error::kNoError;
   }
   if (primcount < 0) {
-    SetGLError(GL_INVALID_VALUE, function_name, "primcount < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "primcount < 0");
     return error::kNoError;
   }
 
@@ -6116,14 +6220,14 @@
 
   if (!element_array_buffer->GetMaxValueForRange(
       offset, count, type, &max_vertex_accessed)) {
-    SetGLError(GL_INVALID_OPERATION,
-               function_name, "range out of bounds for buffer");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name, "range out of bounds for buffer");
     return error::kNoError;
   }
 
   if (IsDrawValid(function_name, max_vertex_accessed, primcount)) {
     if (!ClearUnclearedTextures()) {
-      SetGLError(GL_INVALID_VALUE, function_name, "out of memory");
+      LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "out of memory");
       return error::kNoError;
     }
     bool simulated_attrib_0 = false;
@@ -6187,8 +6291,9 @@
 error::Error GLES2DecoderImpl::HandleDrawElementsInstancedANGLE(
     uint32 immediate_data_size, const cmds::DrawElementsInstancedANGLE& c) {
   if (!features().angle_instanced_arrays) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glDrawElementsInstancedANGLE", "function not available");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glDrawElementsInstancedANGLE", "function not available");
     return error::kNoError;
   }
   return DoDrawElements("glDrawElementsInstancedANGLE",
@@ -6206,13 +6311,13 @@
   Buffer* buffer = GetBuffer(buffer_id);
   if (!buffer) {
     // TODO(gman): Should this be a GL error or a command buffer error?
-    SetGLError(GL_INVALID_VALUE,
-               "GetMaxValueInBufferCHROMIUM", "unknown buffer");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "GetMaxValueInBufferCHROMIUM", "unknown buffer");
   } else {
     if (!buffer->GetMaxValueForRange(
         offset, count, type, &max_vertex_accessed)) {
       // TODO(gman): Should this be a GL error or a command buffer error?
-      SetGLError(
+      LOCAL_SET_GL_ERROR(
           GL_INVALID_OPERATION,
           "GetMaxValueInBufferCHROMIUM", "range out of bounds for buffer");
     }
@@ -6426,9 +6531,10 @@
     return;
   }
   if (!program->AttachShader(shader_manager(), shader)) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glAttachShader", "can not attach more than"
-               " one shader of the same type.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glAttachShader",
+        "can not attach more than one shader of the same type.");
     return;
   }
   glAttachShader(program->service_id(), shader->service_id());
@@ -6446,8 +6552,9 @@
     return;
   }
   if (!program->DetachShader(shader_manager(), shader)) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glDetachShader", "shader not attached to program");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glDetachShader", "shader not attached to program");
     return;
   }
   glDetachShader(program->service_id(), shader->service_id());
@@ -6502,7 +6609,8 @@
     GLuint index, GLenum pname, GLfloat* params) {
   VertexAttrib* attrib = state_.vertex_attrib_manager->GetVertexAttrib(index);
   if (!attrib) {
-    SetGLError(GL_INVALID_VALUE, "glGetVertexAttribfv", "index out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glGetVertexAttribfv", "index out of range");
     return;
   }
   switch (pname) {
@@ -6527,7 +6635,8 @@
     GLuint index, GLenum pname, GLint* params) {
   VertexAttrib* attrib = state_.vertex_attrib_manager->GetVertexAttrib(index);
   if (!attrib) {
-    SetGLError(GL_INVALID_VALUE, "glGetVertexAttribiv", "index out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glGetVertexAttribiv", "index out of range");
     return;
   }
   switch (pname) {
@@ -6548,7 +6657,7 @@
 bool GLES2DecoderImpl::SetVertexAttribValue(
     const char* function_name, GLuint index, const GLfloat* value) {
   if (index >= state_.attrib_values.size()) {
-    SetGLError(GL_INVALID_VALUE, function_name, "index out of range");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "index out of range");
     return false;
   }
   Vec4& v = state_.attrib_values[index];
@@ -6621,12 +6730,13 @@
 
   if (!state_.bound_array_buffer || state_.bound_array_buffer->IsDeleted()) {
     if (state_.vertex_attrib_manager == default_vertex_attrib_manager_) {
-      SetGLError(GL_INVALID_VALUE,
-                "glVertexAttribPointer", "no array buffer bound");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_VALUE, "glVertexAttribPointer", "no array buffer bound");
       return error::kNoError;
     } else if (c.offset != 0) {
-      SetGLError(GL_INVALID_VALUE,
-                "glVertexAttribPointer", "client side arrays are not allowed");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_VALUE,
+          "glVertexAttribPointer", "client side arrays are not allowed");
       return error::kNoError;
     }
   }
@@ -6639,43 +6749,46 @@
   GLsizei offset = c.offset;
   const void* ptr = reinterpret_cast<const void*>(offset);
   if (!validators_->vertex_attrib_type.IsValid(type)) {
-    SetGLErrorInvalidEnum("glVertexAttribPointer", type, "type");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM("glVertexAttribPointer", type, "type");
     return error::kNoError;
   }
   if (!validators_->vertex_attrib_size.IsValid(size)) {
-    SetGLError(GL_INVALID_VALUE,
-               "glVertexAttribPointer", "size GL_INVALID_VALUE");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glVertexAttribPointer", "size GL_INVALID_VALUE");
     return error::kNoError;
   }
   if (indx >= group_->max_vertex_attribs()) {
-    SetGLError(GL_INVALID_VALUE, "glVertexAttribPointer", "index out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glVertexAttribPointer", "index out of range");
     return error::kNoError;
   }
   if (stride < 0) {
-    SetGLError(GL_INVALID_VALUE,
-               "glVertexAttribPointer", "stride < 0");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glVertexAttribPointer", "stride < 0");
     return error::kNoError;
   }
   if (stride > 255) {
-    SetGLError(GL_INVALID_VALUE,
-               "glVertexAttribPointer", "stride > 255");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glVertexAttribPointer", "stride > 255");
     return error::kNoError;
   }
   if (offset < 0) {
-    SetGLError(GL_INVALID_VALUE,
-               "glVertexAttribPointer", "offset < 0");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glVertexAttribPointer", "offset < 0");
     return error::kNoError;
   }
   GLsizei component_size =
       GLES2Util::GetGLTypeSizeForTexturesAndBuffers(type);
   if (offset % component_size > 0) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glVertexAttribPointer", "offset not valid for type");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glVertexAttribPointer", "offset not valid for type");
     return error::kNoError;
   }
   if (stride % component_size > 0) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glVertexAttribPointer", "stride not valid for type");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glVertexAttribPointer", "stride not valid for type");
     return error::kNoError;
   }
   state_.vertex_attrib_manager->SetAttribInfo(
@@ -6705,14 +6818,16 @@
 error::Error GLES2DecoderImpl::HandleVertexAttribDivisorANGLE(
     uint32 immediate_data_size, const cmds::VertexAttribDivisorANGLE& c) {
   if (!features().angle_instanced_arrays) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glVertexAttribDivisorANGLE", "function not available");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glVertexAttribDivisorANGLE", "function not available");
   }
   GLuint index = c.index;
   GLuint divisor = c.divisor;
   if (index >= group_->max_vertex_attribs()) {
-    SetGLError(GL_INVALID_VALUE,
-               "glVertexAttribDivisorANGLE", "index out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glVertexAttribDivisorANGLE", "index out of range");
     return error::kNoError;
   }
 
@@ -6734,7 +6849,7 @@
   GLenum format = c.format;
   GLenum type = c.type;
   if (width < 0 || height < 0) {
-    SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glReadPixels", "dimensions < 0");
     return error::kNoError;
   }
   typedef cmds::ReadPixels::Result Result;
@@ -6753,11 +6868,11 @@
   }
 
   if (!validators_->read_pixel_format.IsValid(format)) {
-    SetGLErrorInvalidEnum("glReadPixels", format, "format");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadPixels", format, "format");
     return error::kNoError;
   }
   if (!validators_->pixel_type.IsValid(type)) {
-    SetGLErrorInvalidEnum("glReadPixels", type, "type");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadPixels", type, "type");
     return error::kNoError;
   }
   if (width == 0 || height == 0) {
@@ -6770,7 +6885,8 @@
   int32 max_x;
   int32 max_y;
   if (!SafeAddInt32(x, width, &max_x) || !SafeAddInt32(y, height, &max_y)) {
-    SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glReadPixels", "dimensions out of range");
     return error::kNoError;
   }
 
@@ -6778,7 +6894,7 @@
     return error::kNoError;
   }
 
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glReadPixel");
 
   ScopedResolvedFrameBufferBinder binder(this, false, true);
 
@@ -6791,7 +6907,8 @@
     if (!GLES2Util::ComputeImageDataSizes(
         width, 2, format, type, state_.pack_alignment, &temp_size,
         &unpadded_row_size, &padded_row_size)) {
-      SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions out of range");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_VALUE, "glReadPixels", "dimensions out of range");
       return error::kNoError;
     }
 
@@ -6800,7 +6917,8 @@
     if (!GLES2Util::ComputeImageDataSizes(
         dest_x_offset, 1, format, type, state_.pack_alignment, &dest_row_offset,
         NULL, NULL)) {
-      SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions out of range");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_VALUE, "glReadPixels", "dimensions out of range");
       return error::kNoError;
     }
 
@@ -6825,7 +6943,7 @@
   } else {
     glReadPixels(x, y, width, height, format, type, pixels);
   }
-  GLenum error = PeekGLError();
+  GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels");
   if (error == GL_NO_ERROR) {
     *result = true;
 
@@ -6841,13 +6959,14 @@
       if (!GLES2Util::ComputeImageDataSizes(
           width, 2, format, type, state_.pack_alignment, &temp_size,
           &unpadded_row_size, &padded_row_size)) {
-        SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions out of range");
+        LOCAL_SET_GL_ERROR(
+            GL_INVALID_VALUE, "glReadPixels", "dimensions out of range");
         return error::kNoError;
       }
       // NOTE: Assumes the type is GL_UNSIGNED_BYTE which was true at the time
       // of this implementation.
       if (type != GL_UNSIGNED_BYTE) {
-        SetGLError(
+        LOCAL_SET_GL_ERROR(
             GL_INVALID_OPERATION, "glReadPixels",
             "unsupported readPixel format");
         return error::kNoError;
@@ -6882,15 +7001,15 @@
   GLenum pname = c.pname;
   GLenum param = c.param;
   if (!validators_->pixel_store.IsValid(pname)) {
-    SetGLErrorInvalidEnum("glPixelStorei", pname, "pname");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM("glPixelStorei", pname, "pname");
     return error::kNoError;
   }
   switch (pname) {
     case GL_PACK_ALIGNMENT:
     case GL_UNPACK_ALIGNMENT:
         if (!validators_->pixel_store_alignment.IsValid(param)) {
-            SetGLError(GL_INVALID_VALUE,
-                       "glPixelStore", "param GL_INVALID_VALUE");
+            LOCAL_SET_GL_ERROR(
+                GL_INVALID_VALUE, "glPixelStore", "param GL_INVALID_VALUE");
             return error::kNoError;
         }
         break;
@@ -6929,8 +7048,9 @@
     uint32 immediate_data_size, const cmds::PostSubBufferCHROMIUM& c) {
   TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandlePostSubBufferCHROMIUM");
   if (!surface_->HasExtension("GL_CHROMIUM_post_sub_buffer")) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glPostSubBufferCHROMIUM", "command not supported by surface");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glPostSubBufferCHROMIUM", "command not supported by surface");
     return error::kNoError;
   }
   if (surface_->PostSubBuffer(c.x, c.y, c.width, c.height)) {
@@ -6945,7 +7065,8 @@
     GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset,
     const std::string& name_str) {
   if (!StringIsValidForGLES(name_str.c_str())) {
-    SetGLError(GL_INVALID_VALUE, "glGetAttribLocation", "Invalid character");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glGetAttribLocation", "Invalid character");
     return error::kNoError;
   }
   Program* program = GetProgramInfoNotShader(
@@ -6954,7 +7075,7 @@
     return error::kNoError;
   }
   if (!program->IsValid()) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION, "glGetAttribLocation", "program not linked");
     return error::kNoError;
   }
@@ -7016,7 +7137,8 @@
     GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset,
     const std::string& name_str) {
   if (!StringIsValidForGLES(name_str.c_str())) {
-    SetGLError(GL_INVALID_VALUE, "glGetUniformLocation", "Invalid character");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glGetUniformLocation", "Invalid character");
     return error::kNoError;
   }
   Program* program = GetProgramInfoNotShader(
@@ -7025,7 +7147,7 @@
     return error::kNoError;
   }
   if (!program->IsValid()) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION, "glGetUniformLocation", "program not linked");
     return error::kNoError;
   }
@@ -7087,7 +7209,7 @@
     uint32 immediate_data_size, const cmds::GetString& c) {
   GLenum name = static_cast<GLenum>(c.name);
   if (!validators_->string_type.IsValid(name)) {
-    SetGLErrorInvalidEnum("glGetString", name, "name");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetString", name, "name");
     return error::kNoError;
   }
   const char* gl_str = reinterpret_cast<const char*>(glGetString(name));
@@ -7140,25 +7262,25 @@
 void GLES2DecoderImpl::DoBufferData(
     GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) {
   if (!validators_->buffer_target.IsValid(target)) {
-    SetGLErrorInvalidEnum("glBufferData", target, "target");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBufferData", target, "target");
     return;
   }
   if (!validators_->buffer_usage.IsValid(usage)) {
-    SetGLErrorInvalidEnum("glBufferData", usage, "usage");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBufferData", usage, "usage");
     return;
   }
   if (size < 0) {
-    SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glBufferData", "size < 0");
     return;
   }
   Buffer* buffer = GetBufferInfoForTarget(target);
   if (!buffer) {
-    SetGLError(GL_INVALID_VALUE, "glBufferData", "unknown buffer");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glBufferData", "unknown buffer");
     return;
   }
 
   if (!EnsureGPUMemoryAvailable(size)) {
-    SetGLError(GL_OUT_OF_MEMORY, "glBufferData", "out of memory");
+    LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glBufferData", "out of memory");
     return;
   }
 
@@ -7201,7 +7323,7 @@
   GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) {
   Buffer* buffer = GetBufferInfoForTarget(target);
   if (!buffer) {
-    SetGLError(GL_INVALID_VALUE, "glBufferSubData", "unknown buffer");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glBufferSubData", "unknown buffer");
     return;
   }
 
@@ -7360,12 +7482,12 @@
         break;
       }
     default:
-      SetGLErrorInvalidEnum(function_name, format, "format");
+      LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, format, "format");
       return false;
   }
 
   if (size != bytes_required) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_VALUE, function_name, "size is not correct for dimensions");
     return false;
   }
@@ -7382,7 +7504,7 @@
     case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
     case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: {
       if (!IsValidDXTSize(level, width) || !IsValidDXTSize(level, height)) {
-        SetGLError(
+        LOCAL_SET_GL_ERROR(
             GL_INVALID_OPERATION, function_name,
             "width or height invalid for level");
         return false;
@@ -7391,7 +7513,7 @@
     }
     case GL_ETC1_RGB8_OES:
       if (width <= 0 || height <= 0) {
-        SetGLError(
+        LOCAL_SET_GL_ERROR(
             GL_INVALID_OPERATION, function_name,
             "width or height invalid for level");
         return false;
@@ -7408,7 +7530,7 @@
     GLsizei width, GLsizei height, GLenum format,
     Texture* texture) {
   if (xoffset < 0 || yoffset < 0) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_VALUE, function_name, "xoffset or yoffset < 0");
     return false;
   }
@@ -7421,7 +7543,7 @@
       const int kBlockWidth = 4;
       const int kBlockHeight = 4;
       if ((xoffset % kBlockWidth) || (yoffset % kBlockHeight)) {
-        SetGLError(
+        LOCAL_SET_GL_ERROR(
             GL_INVALID_OPERATION, function_name,
             "xoffset or yoffset not multiple of 4");
         return false;
@@ -7431,7 +7553,7 @@
       if (!texture->GetLevelSize(target, level, &tex_width, &tex_height) ||
           width - xoffset > tex_width ||
           height - yoffset > tex_height) {
-        SetGLError(
+        LOCAL_SET_GL_ERROR(
             GL_INVALID_OPERATION, function_name, "dimensions out of range");
         return false;
       }
@@ -7439,7 +7561,7 @@
           function_name, level, width, height, format);
     }
     case GL_ETC1_RGB8_OES: {
-      SetGLError(
+      LOCAL_SET_GL_ERROR(
           GL_INVALID_OPERATION, function_name,
           "TexsubImage2d not supported for ECT1_RGB8_OES textures");
       return false;
@@ -7460,30 +7582,34 @@
   const void* data) {
   // TODO(gman): Validate image_size is correct for width, height and format.
   if (!validators_->texture_target.IsValid(target)) {
-    SetGLErrorInvalidEnum("glCompressedTexImage2D", target, "target");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(
+        "glCompressedTexImage2D", target, "target");
     return error::kNoError;
   }
   if (!validators_->compressed_texture_format.IsValid(
       internal_format)) {
-    SetGLErrorInvalidEnum(
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(
         "glCompressedTexImage2D", internal_format, "internal_format");
     return error::kNoError;
   }
   if (!texture_manager()->ValidForTarget(target, level, width, height, 1) ||
       border != 0) {
-    SetGLError(GL_INVALID_VALUE,
-               "glCompressedTexImage2D", "dimensions out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glCompressedTexImage2D", "dimensions out of range");
     return error::kNoError;
   }
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_VALUE,
-               "glCompressedTexImage2D", "unknown texture target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glCompressedTexImage2D", "unknown texture target");
     return error::kNoError;
   }
   if (texture->IsImmutable()) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glCompressedTexImage2D", "texture is immutable");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glCompressedTexImage2D", "texture is immutable");
     return error::kNoError;
   }
 
@@ -7495,7 +7621,8 @@
   }
 
   if (!EnsureGPUMemoryAvailable(image_size)) {
-    SetGLError(GL_OUT_OF_MEMORY, "glCompressedTexImage2D", "out of memory");
+    LOCAL_SET_GL_ERROR(
+        GL_OUT_OF_MEMORY, "glCompressedTexImage2D", "out of memory");
     return error::kNoError;
   }
 
@@ -7512,10 +7639,10 @@
     memset(zero.get(), 0, image_size);
     data = zero.get();
   }
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D");
   glCompressedTexImage2D(
       target, level, internal_format, width, height, border, image_size, data);
-  GLenum error = PeekGLError();
+  GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D");
   if (error == GL_NO_ERROR) {
     texture_manager()->SetLevelInfo(
         texture, target, level, internal_format, width, height, 1, border, 0, 0,
@@ -7609,24 +7736,28 @@
     return error::kInvalidArguments;
   }
   if (!validators_->texture_target.IsValid(target)) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_ENUM, "glCompressedTexSubImage2D", "target");
     return error::kNoError;
   }
   if (!validators_->compressed_texture_format.IsValid(format)) {
-    SetGLErrorInvalidEnum("glCompressedTexSubImage2D", format, "format");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(
+        "glCompressedTexSubImage2D", format, "format");
     return error::kNoError;
   }
   if (width < 0) {
-    SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D", "width < 0");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glCompressedTexSubImage2D", "width < 0");
     return error::kNoError;
   }
   if (height < 0) {
-    SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D", "height < 0");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glCompressedTexSubImage2D", "height < 0");
     return error::kNoError;
   }
   if (imageSize < 0) {
-    SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D", "imageSize < 0");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glCompressedTexSubImage2D", "imageSize < 0");
     return error::kNoError;
   }
   DoCompressedTexSubImage2D(
@@ -7638,19 +7769,21 @@
     const char* function_name,
     GLenum target, GLenum format, GLenum type, GLint level) {
   if (!feature_info_->GetTextureFormatValidator(format).IsValid(type)) {
-      SetGLError(GL_INVALID_OPERATION, function_name,
-                 (std::string("invalid type ") +
-                  GLES2Util::GetStringEnum(type) + " for format " +
-                  GLES2Util::GetStringEnum(format)).c_str());
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_OPERATION, function_name,
+          (std::string("invalid type ") +
+           GLES2Util::GetStringEnum(type) + " for format " +
+           GLES2Util::GetStringEnum(format)).c_str());
       return false;
   }
 
   uint32 channels = GLES2Util::GetChannelsForFormat(format);
   if ((channels & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && level) {
-    SetGLError(GL_INVALID_OPERATION, function_name,
-               (std::string("invalid type ") +
-                GLES2Util::GetStringEnum(type) + " for format " +
-                GLES2Util::GetStringEnum(format)).c_str());
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name,
+        (std::string("invalid type ") +
+         GLES2Util::GetStringEnum(type) + " for format " +
+         GLES2Util::GetStringEnum(format)).c_str());
     return false;
   }
   return true;
@@ -7669,24 +7802,25 @@
     const void* pixels,
     uint32 pixels_size) {
   if (!validators_->texture_target.IsValid(target)) {
-    SetGLErrorInvalidEnum(function_name, target, "target");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, target, "target");
     return false;
   }
   if (!validators_->texture_format.IsValid(internal_format)) {
-    SetGLErrorInvalidEnum(function_name, internal_format, "internal_format");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(
+        function_name, internal_format, "internal_format");
     return false;
   }
   if (!validators_->texture_format.IsValid(format)) {
-    SetGLErrorInvalidEnum(function_name, format, "format");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, format, "format");
     return false;
   }
   if (!validators_->pixel_type.IsValid(type)) {
-    SetGLErrorInvalidEnum(function_name, type, "type");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, type, "type");
     return false;
   }
   if (format != internal_format) {
-    SetGLError(GL_INVALID_OPERATION,
-               function_name, "format != internalFormat");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name, "format != internalFormat");
     return false;
   }
   if (!ValidateTextureParameters(function_name, target, format, type, level)) {
@@ -7694,25 +7828,26 @@
   }
   if (!texture_manager()->ValidForTarget(target, level, width, height, 1) ||
       border != 0) {
-    SetGLError(GL_INVALID_VALUE, function_name, "dimensions out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, function_name, "dimensions out of range");
     return false;
   }
   if ((GLES2Util::GetChannelsForFormat(format) &
        (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && pixels) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         function_name, "can not supply data for depth or stencil textures");
     return false;
   }
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               function_name, "unknown texture for target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name, "unknown texture for target");
     return false;
   }
   if (texture->IsImmutable()) {
-    SetGLError(GL_INVALID_OPERATION,
-               function_name, "texture is immutable");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name, "texture is immutable");
     return false;
   }
   return true;
@@ -7735,7 +7870,7 @@
   }
 
   if (!EnsureGPUMemoryAvailable(pixels_size)) {
-    SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory");
+    LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory");
     return;
   }
 
@@ -7774,11 +7909,11 @@
     return;
   }
 
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexImage2D");
   WrappedTexImage2D(
       target, level, internal_format, width, height, border, format, type,
       pixels);
-  GLenum error = PeekGLError();
+  GLenum error = LOCAL_PEEK_GL_ERROR("glTexImage2D");
   if (error == GL_NO_ERROR) {
     texture_manager()->SetLevelInfo(
         texture,
@@ -7863,28 +7998,29 @@
   const void * data) {
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glCompressedTexSubImage2D", "unknown texture for target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glCompressedTexSubImage2D", "unknown texture for target");
     return;
   }
   GLenum type = 0;
   GLenum internal_format = 0;
   if (!texture->GetLevelType(target, level, &type, &internal_format)) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         "glCompressedTexSubImage2D", "level does not exist.");
     return;
   }
   if (internal_format != format) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         "glCompressedTexSubImage2D", "format does not match internal format.");
     return;
   }
   if (!texture->ValidForTexture(
       target, level, xoffset, yoffset, width, height, format, type)) {
-    SetGLError(GL_INVALID_VALUE,
-               "glCompressedTexSubImage2D", "bad dimensions.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glCompressedTexSubImage2D", "bad dimensions.");
     return;
   }
 
@@ -7934,17 +8070,19 @@
   DCHECK(!ShouldDeferReads());
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glCopyTexImage2D", "unknown texture for target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glCopyTexImage2D", "unknown texture for target");
     return;
   }
   if (texture->IsImmutable()) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glCopyTexImage2D", "texture is immutable");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, "glCopyTexImage2D", "texture is immutable");
   }
   if (!texture_manager()->ValidForTarget(target, level, width, height, 1) ||
       border != 0) {
-    SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "dimensions out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glCopyTexImage2D", "dimensions out of range");
     return;
   }
   if (!ValidateTextureParameters(
@@ -7958,12 +8096,13 @@
   uint32 channels_needed = GLES2Util::GetChannelsForFormat(internal_format);
 
   if ((channels_needed & channels_exist) != channels_needed) {
-    SetGLError(GL_INVALID_OPERATION, "glCopyTexImage2D", "incompatible format");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, "glCopyTexImage2D", "incompatible format");
     return;
   }
 
   if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         "glCopyTexImage2D", "can not be used with depth or stencil textures");
     return;
@@ -7973,12 +8112,13 @@
   if (!GLES2Util::ComputeImageDataSizes(
       width, height, internal_format, GL_UNSIGNED_BYTE, state_.unpack_alignment,
       &estimated_size, NULL, NULL)) {
-    SetGLError(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too large");
+    LOCAL_SET_GL_ERROR(
+        GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too large");
     return;
   }
 
   if (!EnsureGPUMemoryAvailable(estimated_size)) {
-    SetGLError(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "out of memory");
+    LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "out of memory");
     return;
   }
 
@@ -7986,7 +8126,7 @@
     return;
   }
 
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTexImage2D");
   ScopedResolvedFrameBufferBinder binder(this, false, true);
   gfx::Size size = GetBoundReadFrameBufferSize();
 
@@ -8014,7 +8154,8 @@
         texture->service_id(), texture->target(),
         target, level, internal_format, GL_UNSIGNED_BYTE, width, height,
         texture->IsImmutable())) {
-      SetGLError(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big");
+      LOCAL_SET_GL_ERROR(
+          GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big");
       return;
     }
     if (copyHeight > 0 && copyWidth > 0) {
@@ -8030,7 +8171,7 @@
     glCopyTexImage2D(target, level, internal_format,
                      copyX, copyY, copyWidth, copyHeight, border);
   }
-  GLenum error = PeekGLError();
+  GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTexImage2D");
   if (error == GL_NO_ERROR) {
     texture_manager()->SetLevelInfo(
         texture, target, level, internal_format, width, height, 1,
@@ -8050,8 +8191,9 @@
   DCHECK(!ShouldDeferReads());
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glCopyTexSubImage2D", "unknown texture for target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glCopyTexSubImage2D", "unknown texture for target");
     return;
   }
   GLenum type = 0;
@@ -8059,13 +8201,14 @@
   if (!texture->GetLevelType(target, level, &type, &format) ||
       !texture->ValidForTexture(
           target, level, xoffset, yoffset, width, height, format, type)) {
-    SetGLError(GL_INVALID_VALUE,
-               "glCopyTexSubImage2D", "bad dimensions.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glCopyTexSubImage2D", "bad dimensions.");
     return;
   }
   if (texture->AsyncTransferIsInProgress()) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glCopyTexSubImage2D", "async upload pending for texture");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glCopyTexSubImage2D", "async upload pending for texture");
     return;
   }
 
@@ -8076,13 +8219,13 @@
 
   if (!channels_needed ||
       (channels_needed & channels_exist) != channels_needed) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION, "glCopyTexSubImage2D", "incompatible format");
     return;
   }
 
   if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         "glCopySubImage2D", "can not be used with depth or stencil textures");
     return;
@@ -8102,7 +8245,8 @@
   Clip(y, height, size.height(), &copyY, &copyHeight);
 
   if (!texture_manager()->ClearTextureLevel(this, texture, target, level)) {
-    SetGLError(GL_OUT_OF_MEMORY, "glCopyTexSubImage2D", "dimensions too big");
+    LOCAL_SET_GL_ERROR(
+        GL_OUT_OF_MEMORY, "glCopyTexSubImage2D", "dimensions too big");
     return;
   }
 
@@ -8115,7 +8259,7 @@
     if (!GLES2Util::ComputeImageDataSizes(
         width, height, format, type, state_.unpack_alignment, &pixels_size,
         NULL, NULL)) {
-      SetGLError(
+      LOCAL_SET_GL_ERROR(
           GL_INVALID_VALUE, "glCopyTexSubImage2D", "dimensions too large");
       return;
     }
@@ -8151,61 +8295,65 @@
     const void * data) {
   (*error) = error::kNoError;
   if (!validators_->texture_target.IsValid(target)) {
-    SetGLErrorInvalidEnum(function_name, target, "target");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, target, "target");
     return false;
   }
   if (width < 0) {
-    SetGLError(GL_INVALID_VALUE, function_name, "width < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "width < 0");
     return false;
   }
   if (height < 0) {
-    SetGLError(GL_INVALID_VALUE, function_name, "height < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "height < 0");
     return false;
   }
   if (!validators_->texture_format.IsValid(format)) {
-    SetGLErrorInvalidEnum(function_name, format, "format");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, format, "format");
     return false;
   }
   if (!validators_->pixel_type.IsValid(type)) {
-    SetGLErrorInvalidEnum(function_name, type, "type");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, type, "type");
     return false;
   }
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               function_name, "unknown texture for target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        function_name, "unknown texture for target");
     return false;
   }
   GLenum current_type = 0;
   GLenum internal_format = 0;
   if (!texture->GetLevelType(target, level, &current_type, &internal_format)) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION, function_name, "level does not exist.");
     return false;
   }
   if (format != internal_format) {
-    SetGLError(GL_INVALID_OPERATION,
-               function_name, "format does not match internal format.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        function_name, "format does not match internal format.");
     return false;
   }
   if (type != current_type) {
-    SetGLError(GL_INVALID_OPERATION,
-               function_name, "type does not match type of texture.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        function_name, "type does not match type of texture.");
     return false;
   }
   if (texture->AsyncTransferIsInProgress()) {
-    SetGLError(GL_INVALID_OPERATION,
-               function_name, "async upload pending for texture");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        function_name, "async upload pending for texture");
     return false;
   }
   if (!texture->ValidForTexture(
           target, level, xoffset, yoffset, width, height, format, type)) {
-    SetGLError(GL_INVALID_VALUE, function_name, "bad dimensions.");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "bad dimensions.");
     return false;
   }
   if ((GLES2Util::GetChannelsForFormat(format) &
        (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         function_name, "can not supply data for depth or stencil textures");
     return false;
@@ -8240,7 +8388,8 @@
   if (xoffset != 0 || yoffset != 0 ||
       width != tex_width || height != tex_height) {
     if (!texture_manager()->ClearTextureLevel(this, texture, target, level)) {
-      SetGLError(GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big");
+      LOCAL_SET_GL_ERROR(
+          GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big");
       return error::kNoError;
     }
     ScopedTextureUploadTimer timer(this);
@@ -8332,12 +8481,13 @@
     return error::kInvalidArguments;
   }
   if (!validators_->vertex_pointer.IsValid(pname)) {
-    SetGLErrorInvalidEnum("glGetVertexAttribPointerv", pname, "pname");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(
+        "glGetVertexAttribPointerv", pname, "pname");
     return error::kNoError;
   }
   if (index >= group_->max_vertex_attribs()) {
-    SetGLError(GL_INVALID_VALUE,
-               "glGetVertexAttribPointerv", "index out of range.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glGetVertexAttribPointerv", "index out of range.");
     return error::kNoError;
   }
   result->SetNumResults(1);
@@ -8374,7 +8524,8 @@
   }
   if (!program->IsValid()) {
     // Program was not linked successfully. (ie, glLinkProgram)
-    SetGLError(GL_INVALID_OPERATION, "glGetUniform", "program not linked");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, "glGetUniform", "program not linked");
     return false;
   }
   *service_id = program->service_id();
@@ -8384,13 +8535,14 @@
           fake_location, real_location, &array_index);
   if (!uniform_info) {
     // No such location.
-    SetGLError(GL_INVALID_OPERATION, "glGetUniform", "unknown location");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, "glGetUniform", "unknown location");
     return false;
   }
   GLenum type = uniform_info->type;
   GLsizei size = GLES2Util::GetGLDataTypeSizeForUniforms(type);
   if (size == 0) {
-    SetGLError(GL_INVALID_OPERATION, "glGetUniform", "unknown type");
+    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glGetUniform", "unknown type");
     return false;
   }
   result = GetSharedMemoryAs<SizedResult<GLint>*>(
@@ -8468,12 +8620,12 @@
     return error::kInvalidArguments;
   }
   if (!validators_->shader_type.IsValid(shader_type)) {
-    SetGLErrorInvalidEnum(
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(
         "glGetShaderPrecisionFormat", shader_type, "shader_type");
     return error::kNoError;
   }
   if (!validators_->shader_precision.IsValid(precision_type)) {
-    SetGLErrorInvalidEnum(
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(
         "glGetShaderPrecisionFormat", precision_type, "precision_type");
     return error::kNoError;
   }
@@ -8577,7 +8729,8 @@
   const Program::UniformInfo* uniform_info =
       program->GetUniformInfo(index);
   if (!uniform_info) {
-    SetGLError(GL_INVALID_VALUE, "glGetActiveUniform", "index out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glGetActiveUniform", "index out of range");
     return error::kNoError;
   }
   result->success = 1;  // true.
@@ -8611,7 +8764,8 @@
   const Program::VertexAttrib* attrib_info =
       program->GetAttribInfo(index);
   if (!attrib_info) {
-    SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib", "index out of range");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glGetActiveAttrib", "index out of range");
     return error::kNoError;
   }
   result->success = 1;  // true.
@@ -8625,17 +8779,17 @@
 error::Error GLES2DecoderImpl::HandleShaderBinary(
     uint32 immediate_data_size, const cmds::ShaderBinary& c) {
 #if 1  // No binary shader support.
-  SetGLError(GL_INVALID_OPERATION, "glShaderBinary", "not supported");
+  LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glShaderBinary", "not supported");
   return error::kNoError;
 #else
   GLsizei n = static_cast<GLsizei>(c.n);
   if (n < 0) {
-    SetGLError(GL_INVALID_VALUE, "glShaderBinary", "n < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glShaderBinary", "n < 0");
     return error::kNoError;
   }
   GLsizei length = static_cast<GLsizei>(c.length);
   if (length < 0) {
-    SetGLError(GL_INVALID_VALUE, "glShaderBinary", "length < 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glShaderBinary", "length < 0");
     return error::kNoError;
   }
   uint32 data_size;
@@ -8654,7 +8808,7 @@
   for (GLsizei ii = 0; ii < n; ++ii) {
     Shader* shader = GetShader(shaders[ii]);
     if (!shader) {
-      SetGLError(GL_INVALID_VALUE, "glShaderBinary", "unknown shader");
+      LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glShaderBinary", "unknown shader");
       return error::kNoError;
     }
     service_ids[ii] = shader->service_id();
@@ -8724,7 +8878,8 @@
 
     if (offscreen_size_.width() == 0 || offscreen_size_.height() == 0)
       return error::kNoError;
-    ScopedGLErrorSuppressor suppressor(this);
+    ScopedGLErrorSuppressor suppressor(
+        "GLES2DecoderImpl::HandleSwapBuffers", this);
 
     if (IsOffscreenBufferMultisampled()) {
       // For multisampled buffers, resolve the frame buffer.
@@ -8882,7 +9037,8 @@
   for (GLuint ii = 0; ii < count; ++ii) {
     uint32 num = util_.GLGetNumValuesReturned(enums[ii]);
     if (num == 0) {
-      SetGLErrorInvalidEnum("glGetMulitpleCHROMIUM", enums[ii], "pname");
+      LOCAL_SET_GL_ERROR_INVALID_ENUM(
+          "glGetMulitpleCHROMIUM", enums[ii], "pname");
       return error::kNoError;
     }
     // Num will never be more than 4.
@@ -8898,8 +9054,9 @@
   }
 
   if (result_size != static_cast<uint32>(c.size)) {
-    SetGLError(GL_INVALID_VALUE,
-               "glGetMulitpleCHROMIUM", "bad size GL_INVALID_VALUE");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glGetMulitpleCHROMIUM", "bad size GL_INVALID_VALUE");
     return error::kNoError;
   }
 
@@ -9016,10 +9173,11 @@
   GLenum current = static_cast<GLenum>(c.current);
   GLenum other = static_cast<GLenum>(c.other);
   if (!validators_->reset_status.IsValid(current)) {
-    SetGLErrorInvalidEnum("glLoseContextCHROMIUM", current, "current");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(
+        "glLoseContextCHROMIUM", current, "current");
   }
   if (!validators_->reset_status.IsValid(other)) {
-    SetGLErrorInvalidEnum("glLoseContextCHROMIUM", other, "other");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", other, "other");
   }
   group_->LoseContexts(other);
   reset_status_ = current;
@@ -9090,20 +9248,21 @@
       break;
     default:
       if (!features().occlusion_query_boolean) {
-        SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "not enabled");
+        LOCAL_SET_GL_ERROR(
+            GL_INVALID_OPERATION, "glBeginQueryEXT", "not enabled");
         return error::kNoError;
       }
       break;
   }
 
   if (state_.current_query) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress");
     return error::kNoError;
   }
 
   if (client_id == 0) {
-    SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0");
     return error::kNoError;
   }
 
@@ -9122,8 +9281,9 @@
     // IdAllocatorInterface* id_allocator =
     //     group_->GetIdAllocator(id_namespaces::kQueries);
     // if (!id_allocator->InUse(client_id)) {
-    //   SetGLError(GL_INVALID_OPERATION,
-    //              "glBeginQueryEXT", "id not made by glGenQueriesEXT");
+    //   LOCAL_SET_GL_ERROR(
+    //       GL_INVALID_OPERATION,
+    //       "glBeginQueryEXT", "id not made by glGenQueriesEXT");
     //   return error::kNoError;
     // }
     query = query_manager_->CreateQuery(
@@ -9131,7 +9291,7 @@
   }
 
   if (query->target() != target) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION, "glBeginQueryEXT", "target does not match");
     return error::kNoError;
   } else if (query->shm_id() != sync_shm_id ||
@@ -9154,12 +9314,14 @@
   uint32 submit_count = static_cast<GLuint>(c.submit_count);
 
   if (!state_.current_query) {
-    SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "No active query");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, "glEndQueryEXT", "No active query");
     return error::kNoError;
   }
   if (state_.current_query->target() != target) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glEndQueryEXT", "target does not match active query");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glEndQueryEXT", "target does not match active query");
     return error::kNoError;
   }
 
@@ -9221,9 +9383,9 @@
       // Unlike most Bind* methods, the spec explicitly states that VertexArray
       // only allows names that have been previously generated. As such, we do
       // not generate new names here.
-      SetGLError(GL_INVALID_OPERATION,
-          "glBindVertexArrayOES", ""
-          "bad vertex array id.");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_OPERATION,
+          "glBindVertexArrayOES", "bad vertex array id.");
       current_decoder_error_ = error::kNoError;
       return;
     } else {
@@ -9268,9 +9430,9 @@
     uint32 immediate_data_size,
     const cmds::CreateStreamTextureCHROMIUM& c) {
   if (!features().chromium_stream_texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glOpenStreamTextureCHROMIUM", ""
-               "not supported.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glOpenStreamTextureCHROMIUM", "not supported.");
     return error::kNoError;
   }
 
@@ -9284,23 +9446,24 @@
   *result = GL_ZERO;
   Texture* texture = texture_manager()->GetTexture(client_id);
   if (!texture) {
-    SetGLError(GL_INVALID_VALUE,
-               "glCreateStreamTextureCHROMIUM", ""
-               "bad texture id.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glCreateStreamTextureCHROMIUM", "bad texture id.");
     return error::kNoError;
   }
 
   if (texture->IsStreamTexture()) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glCreateStreamTextureCHROMIUM", ""
-               "is already a stream texture.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glCreateStreamTextureCHROMIUM", "is already a stream texture.");
     return error::kNoError;
   }
 
   if (texture->target() && texture->target() != GL_TEXTURE_EXTERNAL_OES) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glCreateStreamTextureCHROMIUM", ""
-               "is already bound to incompatible target.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glCreateStreamTextureCHROMIUM",
+        "is already bound to incompatible target.");
     return error::kNoError;
   }
 
@@ -9313,9 +9476,9 @@
   if (object_id) {
     texture->SetStreamTexture(true);
   } else {
-    SetGLError(GL_OUT_OF_MEMORY,
-               "glCreateStreamTextureCHROMIUM", ""
-               "failed to create platform texture.");
+    LOCAL_SET_GL_ERROR(
+        GL_OUT_OF_MEMORY,
+        "glCreateStreamTextureCHROMIUM", "failed to create platform texture.");
   }
 
   *result = object_id;
@@ -9334,8 +9497,9 @@
     stream_texture_manager_->DestroyStreamTexture(texture->service_id());
     texture->SetStreamTexture(false);
   } else {
-    SetGLError(GL_INVALID_VALUE,
-               "glDestroyStreamTextureCHROMIUM", "bad texture id.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glDestroyStreamTextureCHROMIUM", "bad texture id.");
   }
 
   return error::kNoError;
@@ -9359,7 +9523,7 @@
     GLuint io_surface_id, GLuint plane) {
 #if defined(OS_MACOSX)
   if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         "glTexImageIOSurface2DCHROMIUM", "only supported on desktop GL.");
     return;
@@ -9367,8 +9531,9 @@
 
   IOSurfaceSupport* surface_support = IOSurfaceSupport::Initialize();
   if (!surface_support) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glTexImageIOSurface2DCHROMIUM", "only supported on 10.6.");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glTexImageIOSurface2DCHROMIUM", "only supported on 10.6.");
     return;
   }
 
@@ -9377,7 +9542,7 @@
     // support for binding an IOSurface to a NPOT TEXTURE_2D texture, we
     // could delete a lot of code. For now, perform strict validation so we
     // know what's going on.
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         "glTexImageIOSurface2DCHROMIUM",
         "requires TEXTURE_RECTANGLE_ARB target");
@@ -9388,8 +9553,9 @@
   // accidents.
   Texture* texture = GetTextureInfoForTargetUnlessDefault(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound");
     return;
   }
 
@@ -9400,7 +9566,7 @@
   // IOSurface in this case.
   CFTypeRef surface = surface_support->IOSurfaceLookup(io_surface_id);
   if (!surface) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         "glTexImageIOSurface2DCHROMIUM", "no IOSurface with the given ID");
     return;
@@ -9428,7 +9594,7 @@
       plane);
 
   if (err != kCGLNoError) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         "glTexImageIOSurface2DCHROMIUM", "error in CGLTexImageIOSurface2D");
     return;
@@ -9439,7 +9605,7 @@
       GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, true);
 
 #else
-  SetGLError(GL_INVALID_OPERATION,
+  LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
              "glTexImageIOSurface2DCHROMIUM", "not supported.");
 #endif
 }
@@ -9496,47 +9662,51 @@
   Texture* source_texture = GetTexture(source_id);
 
   if (!source_texture || !dest_texture) {
-    SetGLError(GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "unknown texture id");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "unknown texture id");
     return;
   }
 
   if (GL_TEXTURE_2D != target) {
-    SetGLError(GL_INVALID_VALUE,
-               "glCopyTextureCHROMIUM", "invalid texture target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "invalid texture target");
     return;
   }
 
   if (dest_texture->target() != GL_TEXTURE_2D ||
       source_texture->target() != GL_TEXTURE_2D) {
-    SetGLError(GL_INVALID_VALUE,
-               "glCopyTextureCHROMIUM", "invalid texture target binding");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glCopyTextureCHROMIUM", "invalid texture target binding");
     return;
   }
 
   int source_width, source_height, dest_width, dest_height;
   if (!source_texture->GetLevelSize(GL_TEXTURE_2D, 0, &source_width,
                                  &source_height)) {
-    SetGLError(GL_INVALID_VALUE,
-               "glCopyTextureChromium", "source texture has no level 0");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glCopyTextureChromium", "source texture has no level 0");
     return;
   }
 
   // Check that this type of texture is allowed.
   if (!texture_manager()->ValidForTarget(GL_TEXTURE_2D, level, source_width,
                                          source_height, 1)) {
-    SetGLError(GL_INVALID_VALUE,
-             "glCopyTextureCHROMIUM", "Bad dimensions");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_VALUE,
+        "glCopyTextureCHROMIUM", "Bad dimensions");
     return;
   }
 
   // Defer initializing the CopyTextureCHROMIUMResourceManager until it is
   // needed because it takes 10s of milliseconds to initialize.
   if (!copy_texture_CHROMIUM_.get()) {
-    CopyRealGLErrorsToWrapper();
+    LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM");
     copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager());
     copy_texture_CHROMIUM_->Initialize(this);
     RestoreCurrentFramebufferBindings();
-    if (PeekGLError() != GL_NO_ERROR)
+    if (LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM") != GL_NO_ERROR)
       return;
   }
 
@@ -9559,12 +9729,12 @@
       dest_height != source_height ||
       dest_internal_format != internal_format) {
     // Ensure that the glTexImage2D succeeds.
-    CopyRealGLErrorsToWrapper();
+    LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM");
     glBindTexture(GL_TEXTURE_2D, dest_texture->service_id());
     WrappedTexImage2D(
         GL_TEXTURE_2D, level, internal_format, source_width, source_height,
         0, internal_format, dest_type, NULL);
-    GLenum error = PeekGLError();
+    GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM");
     if (error != GL_NO_ERROR) {
       RestoreCurrentTexture2DBindings();
       return;
@@ -9643,22 +9813,24 @@
   TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoTexStorage2DEXT");
   if (!texture_manager()->ValidForTarget(target, 0, width, height, 1) ||
       TextureManager::ComputeMipMapCount(width, height, 1) < levels) {
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_VALUE, "glTexStorage2DEXT", "dimensions out of range");
     return;
   }
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glTexStorage2DEXT", "unknown texture for target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glTexStorage2DEXT", "unknown texture for target");
     return;
   }
   if (texture->IsAttachedToFramebuffer()) {
     clear_state_dirty_ = true;
   }
   if (texture->IsImmutable()) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glTexStorage2DEXT", "texture is immutable");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glTexStorage2DEXT", "texture is immutable");
     return;
   }
 
@@ -9675,23 +9847,24 @@
           level_width, level_height, format, type, state_.unpack_alignment,
           &estimated_size, NULL, NULL) ||
           !SafeAddUint32(estimated_size, level_size, &estimated_size)) {
-        SetGLError(GL_OUT_OF_MEMORY,
-                   "glTexStorage2DEXT", "dimensions too large");
+        LOCAL_SET_GL_ERROR(
+            GL_OUT_OF_MEMORY, "glTexStorage2DEXT", "dimensions too large");
         return;
       }
       level_width = std::max(1, level_width >> 1);
       level_height = std::max(1, level_height >> 1);
     }
     if (!EnsureGPUMemoryAvailable(estimated_size)) {
-      SetGLError(GL_OUT_OF_MEMORY, "glTexStorage2DEXT", "out of memory");
+      LOCAL_SET_GL_ERROR(
+          GL_OUT_OF_MEMORY, "glTexStorage2DEXT", "out of memory");
       return;
     }
   }
 
-  CopyRealGLErrorsToWrapper();
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexStorage2DEXT");
   glTexStorage2DEXT(target, levels, GetTexInternalFormat(internal_format),
                     width, height);
-  GLenum error = PeekGLError();
+  GLenum error = LOCAL_PEEK_GL_ERROR("glTexStorage2DEXT");
   if (error == GL_NO_ERROR) {
     GLsizei level_width = width;
     GLsizei level_height = height;
@@ -9723,15 +9896,17 @@
                                                 const GLbyte* mailbox) {
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glProduceTextureCHROMIUM", "unknown texture for target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glProduceTextureCHROMIUM", "unknown texture for target");
     return;
   }
 
   TextureDefinition* definition = texture_manager()->Save(texture);
   if (!definition) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glProduceTextureCHROMIUM", "invalid texture");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glProduceTextureCHROMIUM", "invalid texture");
     return;
   }
 
@@ -9743,8 +9918,9 @@
     bool success = texture_manager()->Restore(
         "glProductTextureCHROMIUM", this, texture, definition);
     DCHECK(success);
-    SetGLError(GL_INVALID_OPERATION,
-               "glProduceTextureCHROMIUM", "invalid mailbox name");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glProduceTextureCHROMIUM", "invalid mailbox name");
     return;
   }
 
@@ -9755,8 +9931,9 @@
                                                 const GLbyte* mailbox) {
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glConsumeTextureCHROMIUM", "unknown texture for target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glConsumeTextureCHROMIUM", "unknown texture for target");
     return;
   }
 
@@ -9765,15 +9942,17 @@
       target,
       *reinterpret_cast<const MailboxName*>(mailbox)));
   if (!definition.get()) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glConsumeTextureCHROMIUM", "invalid mailbox name");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glConsumeTextureCHROMIUM", "invalid mailbox name");
     return;
   }
 
   if (!texture_manager()->Restore(
       "glConsumeTextureCHROMIUM", this, texture, definition.release())) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glConsumeTextureCHROMIUM", "invalid texture");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glConsumeTextureCHROMIUM", "invalid texture");
     return;
   }
 }
@@ -9805,7 +9984,7 @@
   TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoBindTexImage2DCHROMIUM");
   if (target != GL_TEXTURE_2D) {
     // This might be supported in the future.
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         "glBindTexImage2DCHROMIUM", "requires TEXTURE_2D target");
     return;
@@ -9815,23 +9994,24 @@
   // accidents.
   Texture* texture = GetTextureInfoForTargetUnlessDefault(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glBindTexImage2DCHROMIUM", "no texture bound");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glBindTexImage2DCHROMIUM", "no texture bound");
     return;
   }
 
   gfx::GLImage* gl_image = image_manager()->LookupImage(image_id);
   if (!gl_image) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glBindTexImage2DCHROMIUM",
-               "no image found with the given ID");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glBindTexImage2DCHROMIUM", "no image found with the given ID");
     return;
   }
 
   if (!gl_image->BindTexImage()) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glBindTexImage2DCHROMIUM",
-               "fail to bind image with the given ID");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glBindTexImage2DCHROMIUM", "fail to bind image with the given ID");
     return;
   }
 
@@ -9847,7 +10027,7 @@
   TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM");
   if (target != GL_TEXTURE_2D) {
     // This might be supported in the future.
-    SetGLError(
+    LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
         "glReleaseTexImage2DCHROMIUM", "requires TEXTURE_2D target");
     return;
@@ -9857,16 +10037,17 @@
   // accidents.
   Texture* texture = GetTextureInfoForTargetUnlessDefault(target);
   if (!texture) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glReleaseTexImage2DCHROMIUM", "no texture bound");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glReleaseTexImage2DCHROMIUM", "no texture bound");
     return;
   }
 
   gfx::GLImage* gl_image = image_manager()->LookupImage(image_id);
   if (!gl_image) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glReleaseTexImage2DCHROMIUM",
-               "no image found with the given ID");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glReleaseTexImage2DCHROMIUM", "no image found with the given ID");
     return;
   }
 
@@ -9893,8 +10074,9 @@
   }
   TRACE_EVENT_COPY_ASYNC_BEGIN0("gpu", command_name.c_str(), this);
   if (!gpu_tracer_->Begin(command_name)) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glTraceBeginCHROMIUM", "unable to create begin trace");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glTraceBeginCHROMIUM", "unable to create begin trace");
     return error::kNoError;
   }
   return error::kNoError;
@@ -9902,8 +10084,9 @@
 
 void GLES2DecoderImpl::DoTraceEndCHROMIUM() {
   if (gpu_tracer_->CurrentName().empty()) {
-    SetGLError(GL_INVALID_OPERATION,
-               "glTraceEndCHROMIUM", "no trace begin found");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
+        "glTraceEndCHROMIUM", "no trace begin found");
     return;
   }
   TRACE_EVENT_COPY_ASYNC_END0("gpu", gpu_tracer_->CurrentName().c_str(), this);
@@ -9918,22 +10101,23 @@
     const void * data) {
   // We only support async uploads to 2D textures for now.
   if (GL_TEXTURE_2D != target) {
-    SetGLErrorInvalidEnum(function_name, target, "target");
+    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, target, "target");
     return false;
   }
   // We only support uploads to level zero for now.
   if (level != 0) {
-    SetGLError(GL_INVALID_VALUE, function_name, "level != 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "level != 0");
     return false;
   }
   // A transfer buffer must be bound, even for asyncTexImage2D.
   if (data == NULL) {
-    SetGLError(GL_INVALID_OPERATION, function_name, "buffer == 0");
+    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, "buffer == 0");
     return false;
   }
   // We only support one async transfer in progress.
   if (!texture || texture->AsyncTransferIsInProgress()) {
-    SetGLError(GL_INVALID_OPERATION,
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
         function_name, "transfer already in progress");
     return false;
   }
@@ -9986,13 +10170,15 @@
 
   // Don't allow async redefinition of a textures.
   if (texture->IsDefined()) {
-    SetGLError(GL_INVALID_OPERATION,
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION,
         "glAsyncTexImage2DCHROMIUM", "already defined");
     return error::kNoError;
   }
 
   if (!EnsureGPUMemoryAvailable(pixels_size)) {
-    SetGLError(GL_OUT_OF_MEMORY, "glAsyncTexImage2DCHROMIUM", "out of memory");
+    LOCAL_SET_GL_ERROR(
+        GL_OUT_OF_MEMORY, "glAsyncTexImage2DCHROMIUM", "out of memory");
     return error::kNoError;
   }
 
@@ -10076,7 +10262,8 @@
   // This way we know in all cases that an async texture is always clear.
   if (!texture->SafeToRenderFrom()) {
     if (!texture_manager()->ClearTextureLevel(this, texture, target, level)) {
-      SetGLError(GL_OUT_OF_MEMORY,
+      LOCAL_SET_GL_ERROR(
+          GL_OUT_OF_MEMORY,
           "glAsyncTexSubImage2DCHROMIUM", "dimensions too big");
       return error::kNoError;
     }
@@ -10114,13 +10301,15 @@
   GLenum target = static_cast<GLenum>(c.target);
 
   if (GL_TEXTURE_2D != target) {
-    SetGLError(GL_INVALID_ENUM, "glWaitAsyncTexImage2DCHROMIUM", "target");
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_ENUM, "glWaitAsyncTexImage2DCHROMIUM", "target");
     return error::kNoError;
   }
   Texture* texture = GetTextureInfoForTarget(target);
   if (!texture) {
-      SetGLError(GL_INVALID_OPERATION,
-                 "glWaitAsyncTexImage2DCHROMIUM", "unknown texture");
+      LOCAL_SET_GL_ERROR(
+          GL_INVALID_OPERATION,
+          "glWaitAsyncTexImage2DCHROMIUM", "unknown texture");
     return error::kNoError;
   }
   async_pixel_transfer_delegate_->WaitForTransferCompletion(