Add a ContextImpl class.

This class can contain impl-specific functionality for a Context.
This will eventually replace the Renderer class, and we can then
start passing around a gl::Context instead of gl::ContextState.

In D3D11, the ContextImpl could hold a DeferredContext, which would
enable multi-thread rendering. In GL, we can implement non-virtual
(native) Contexts. In Vulkan it might store the logical device.

BUG=angleproject:1363

Change-Id: I39617e6d1a605d1a9574832e4d322400b09867ec
Reviewed-on: https://chromium-review.googlesource.com/340745
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index a41bfa7..0b589ff 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -75,7 +75,7 @@
                     // enough backing data.
                     if (attribDataSize + attribOffset > buffer->getSize())
                     {
-                        context->recordError(
+                        context->handleError(
                             Error(GL_INVALID_OPERATION,
                                   "Vertex buffer is not big enough for the draw call"));
                         return false;
@@ -86,7 +86,7 @@
             {
                 // This is an application error that would normally result in a crash,
                 // but we catch it and return an error
-                context->recordError(Error(
+                context->handleError(Error(
                     GL_INVALID_OPERATION, "An enabled vertex array has no buffer and no pointer."));
                 return false;
             }
@@ -415,12 +415,12 @@
     {
         if (context->getShader(id))
         {
-            context->recordError(
+            context->handleError(
                 Error(GL_INVALID_OPERATION, "Expected a program name, but found a shader name"));
         }
         else
         {
-            context->recordError(Error(GL_INVALID_VALUE, "Program name is not valid"));
+            context->handleError(Error(GL_INVALID_VALUE, "Program name is not valid"));
         }
     }
 
@@ -437,12 +437,12 @@
     {
         if (context->getProgram(id))
         {
-            context->recordError(
+            context->handleError(
                 Error(GL_INVALID_OPERATION, "Expected a shader name, but found a program name"));
         }
         else
         {
-            context->recordError(Error(GL_INVALID_VALUE, "Shader name is invalid"));
+            context->handleError(Error(GL_INVALID_VALUE, "Shader name is invalid"));
         }
     }
 
@@ -457,7 +457,7 @@
 
         if (colorAttachment >= context->getCaps().maxColorAttachments)
         {
-            context->recordError(Error(GL_INVALID_VALUE));
+            context->handleError(Error(GL_INVALID_VALUE));
             return false;
         }
     }
@@ -472,13 +472,13 @@
           case GL_DEPTH_STENCIL_ATTACHMENT:
             if (context->getClientVersion() < 3)
             {
-                context->recordError(Error(GL_INVALID_ENUM));
+                context->handleError(Error(GL_INVALID_ENUM));
                 return false;
             }
             break;
 
           default:
-            context->recordError(Error(GL_INVALID_ENUM));
+              context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
     }
@@ -494,20 +494,20 @@
       case GL_RENDERBUFFER:
         break;
       default:
-        context->recordError(Error(GL_INVALID_ENUM));
+          context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
     if (width < 0 || height < 0 || samples < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
     const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
     if (!formatCaps.renderable)
     {
-        context->recordError(Error(GL_INVALID_ENUM));
+        context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
@@ -517,20 +517,20 @@
     const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalformat);
     if (formatInfo.pixelBytes == 0)
     {
-        context->recordError(Error(GL_INVALID_ENUM));
+        context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
     if (static_cast<GLuint>(std::max(width, height)) > context->getCaps().maxRenderbufferSize)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
     GLuint handle = context->getState().getRenderbufferId();
     if (handle == 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -547,7 +547,7 @@
     // generated.
     if (static_cast<GLuint>(samples) > context->getCaps().maxSamples)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
@@ -560,7 +560,7 @@
         const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
         if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
         {
-            context->recordError(Error(GL_OUT_OF_MEMORY));
+            context->handleError(Error(GL_OUT_OF_MEMORY));
             return false;
         }
     }
@@ -573,7 +573,7 @@
 {
     if (!ValidFramebufferTarget(target))
     {
-        context->recordError(Error(GL_INVALID_ENUM));
+        context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
@@ -582,7 +582,8 @@
     ASSERT(framebuffer);
     if (framebuffer->id() == 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Cannot change default FBO's attachments"));
+        context->handleError(
+            Error(GL_INVALID_OPERATION, "Cannot change default FBO's attachments"));
         return false;
     }
 
@@ -599,7 +600,7 @@
     {
         if (!context->getRenderbuffer(renderbuffer))
         {
-            context->recordError(Error(GL_INVALID_OPERATION));
+            context->handleError(Error(GL_INVALID_OPERATION));
             return false;
         }
     }
@@ -626,13 +627,13 @@
       case GL_LINEAR:
         break;
       default:
-        context->recordError(Error(GL_INVALID_ENUM));
+          context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
     if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
@@ -647,13 +648,13 @@
     // color buffer, leaving only nearest being unfiltered from above
     if ((mask & ~GL_COLOR_BUFFER_BIT) != 0 && filter != GL_NEAREST)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
     if (context->getState().getReadFramebuffer()->id() == context->getState().getDrawFramebuffer()->id())
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -662,25 +663,25 @@
 
     if (!readFramebuffer || !drawFramebuffer)
     {
-        context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
+        context->handleError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
         return false;
     }
 
     if (!readFramebuffer->checkStatus(context->getData()))
     {
-        context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
+        context->handleError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
         return false;
     }
 
     if (!drawFramebuffer->checkStatus(context->getData()))
     {
-        context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
+        context->handleError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
         return false;
     }
 
     if (drawFramebuffer->getSamples(context->getData()) != 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -727,7 +728,7 @@
 
                         if (readFixedOrFloat != drawFixedOrFloat)
                         {
-                            context->recordError(Error(GL_INVALID_OPERATION,
+                            context->handleError(Error(GL_INVALID_OPERATION,
                                                        "If the read buffer contains fixed-point or "
                                                        "floating-point values, the draw buffer "
                                                        "must as well."));
@@ -736,7 +737,7 @@
                     }
                     else if (readFixedPoint != drawFixedPoint)
                     {
-                        context->recordError(Error(GL_INVALID_OPERATION,
+                        context->handleError(Error(GL_INVALID_OPERATION,
                                                    "If the read buffer contains fixed-point "
                                                    "values, the draw buffer must as well."));
                         return false;
@@ -745,19 +746,19 @@
                     if (readComponentType == GL_UNSIGNED_INT &&
                         drawComponentType != GL_UNSIGNED_INT)
                     {
-                        context->recordError(Error(GL_INVALID_OPERATION));
+                        context->handleError(Error(GL_INVALID_OPERATION));
                         return false;
                     }
 
                     if (readComponentType == GL_INT && drawComponentType != GL_INT)
                     {
-                        context->recordError(Error(GL_INVALID_OPERATION));
+                        context->handleError(Error(GL_INVALID_OPERATION));
                         return false;
                     }
 
                     if (readColorBuffer->getSamples() > 0 && (readInternalFormat != drawInternalFormat || !sameBounds))
                     {
-                        context->recordError(Error(GL_INVALID_OPERATION));
+                        context->handleError(Error(GL_INVALID_OPERATION));
                         return false;
                     }
                 }
@@ -765,7 +766,7 @@
 
             if ((readFormatInfo.componentType == GL_INT || readFormatInfo.componentType == GL_UNSIGNED_INT) && filter == GL_LINEAR)
             {
-                context->recordError(Error(GL_INVALID_OPERATION));
+                context->handleError(Error(GL_INVALID_OPERATION));
                 return false;
             }
         }
@@ -784,13 +785,13 @@
             {
                 if (readBuffer->getInternalFormat() != drawBuffer->getInternalFormat())
                 {
-                    context->recordError(Error(GL_INVALID_OPERATION));
+                    context->handleError(Error(GL_INVALID_OPERATION));
                     return false;
                 }
 
                 if (readBuffer->getSamples() > 0 && !sameBounds)
                 {
-                    context->recordError(Error(GL_INVALID_OPERATION));
+                    context->handleError(Error(GL_INVALID_OPERATION));
                     return false;
                 }
             }
@@ -823,13 +824,13 @@
       case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
         if (context->getClientVersion() < 3)
         {
-            context->recordError(Error(GL_INVALID_ENUM));
+            context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
         return true;
 
       default:
-        context->recordError(Error(GL_INVALID_ENUM));
+          context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 }
@@ -853,7 +854,7 @@
           // written against ES2.
           if (context->getClientVersion() < 3 || target == GL_TEXTURE_EXTERNAL_OES)
         {
-            context->recordError(Error(GL_INVALID_ENUM));
+            context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
         break;
@@ -875,13 +876,13 @@
               if (target == GL_TEXTURE_EXTERNAL_OES)
               {
                   // OES_EGL_image_external specifies this error.
-                  context->recordError(Error(
+                  context->handleError(Error(
                       GL_INVALID_ENUM, "external textures only support CLAMP_TO_EDGE wrap mode"));
                   return false;
               }
               return true;
           default:
-            context->recordError(Error(GL_INVALID_ENUM));
+              context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
 
@@ -898,14 +899,14 @@
               if (target == GL_TEXTURE_EXTERNAL_OES)
               {
                   // OES_EGL_image_external specifies this error.
-                  context->recordError(
+                  context->handleError(
                       Error(GL_INVALID_ENUM,
                             "external textures only support NEAREST and LINEAR filtering"));
                   return false;
               }
               return true;
           default:
-            context->recordError(Error(GL_INVALID_ENUM));
+              context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
         break;
@@ -917,7 +918,7 @@
           case GL_LINEAR:
             return true;
           default:
-            context->recordError(Error(GL_INVALID_ENUM));
+              context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
         break;
@@ -929,7 +930,7 @@
           case GL_FRAMEBUFFER_ATTACHMENT_ANGLE:
             return true;
           default:
-            context->recordError(Error(GL_INVALID_ENUM));
+              context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
         break;
@@ -937,14 +938,14 @@
       case GL_TEXTURE_MAX_ANISOTROPY_EXT:
         if (!context->getExtensions().textureFilterAnisotropic)
         {
-            context->recordError(Error(GL_INVALID_ENUM));
+            context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
 
         // we assume the parameter passed to this validation method is truncated, not rounded
         if (param < 1)
         {
-            context->recordError(Error(GL_INVALID_VALUE));
+            context->handleError(Error(GL_INVALID_VALUE));
             return false;
         }
         return true;
@@ -962,7 +963,7 @@
           case GL_COMPARE_REF_TO_TEXTURE:
             return true;
           default:
-            context->recordError(Error(GL_INVALID_ENUM));
+              context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
         break;
@@ -981,7 +982,7 @@
           case GL_NEVER:
             return true;
           default:
-            context->recordError(Error(GL_INVALID_ENUM));
+              context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
         break;
@@ -1000,7 +1001,7 @@
           case GL_ONE:
             return true;
           default:
-            context->recordError(Error(GL_INVALID_ENUM));
+              context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
         break;
@@ -1009,13 +1010,13 @@
       case GL_TEXTURE_MAX_LEVEL:
         if (param < 0)
         {
-            context->recordError(Error(GL_INVALID_VALUE));
+            context->handleError(Error(GL_INVALID_VALUE));
             return false;
         }
         return true;
 
       default:
-        context->recordError(Error(GL_INVALID_ENUM));
+          context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 }
@@ -1036,7 +1037,7 @@
         return true;
 
       default:
-        context->recordError(Error(GL_INVALID_ENUM));
+          context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 }
@@ -1052,7 +1053,7 @@
 {
     if (width < 0 || height < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE, "width and height must be positive"));
+        context->handleError(Error(GL_INVALID_VALUE, "width and height must be positive"));
         return false;
     }
 
@@ -1061,21 +1062,21 @@
 
     if (framebuffer->checkStatus(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
     {
-        context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
+        context->handleError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
         return false;
     }
 
     if (context->getState().getReadFramebuffer()->id() != 0 &&
         framebuffer->getSamples(context->getData()) != 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
     const FramebufferAttachment *readBuffer = framebuffer->getReadColorbuffer();
     if (!readBuffer)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1089,7 +1090,7 @@
 
     if (!(currentFormat == format && currentType == type) && !validReadFormat)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1108,7 +1109,7 @@
 {
     if (bufSize < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE, "bufSize must be a positive number"));
+        context->handleError(Error(GL_INVALID_VALUE, "bufSize must be a positive number"));
         return false;
     }
 
@@ -1122,7 +1123,7 @@
     int requiredSize = outputPitch * height;
     if (requiredSize > bufSize)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1134,7 +1135,7 @@
     if (!context->getExtensions().occlusionQueryBoolean &&
         !context->getExtensions().disjointTimerQuery)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
         return false;
     }
 
@@ -1146,7 +1147,7 @@
     if (!context->getExtensions().occlusionQueryBoolean &&
         !context->getExtensions().disjointTimerQuery)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
         return false;
     }
 
@@ -1157,13 +1158,13 @@
 {
     if (!ValidQueryType(context, target))
     {
-        context->recordError(Error(GL_INVALID_ENUM, "Invalid query target"));
+        context->handleError(Error(GL_INVALID_ENUM, "Invalid query target"));
         return false;
     }
 
     if (id == 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query id is 0"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query id is 0"));
         return false;
     }
 
@@ -1185,7 +1186,7 @@
 
     if (context->getState().isQueryActive(target))
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Other query is active"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Other query is active"));
         return false;
     }
 
@@ -1194,14 +1195,14 @@
     // check that name was obtained with glGenQueries
     if (!queryObject)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Invalid query id"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Invalid query id"));
         return false;
     }
 
     // check for type mismatch
     if (queryObject->getType() != target)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query type does not match target"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query type does not match target"));
         return false;
     }
 
@@ -1213,7 +1214,7 @@
     if (!context->getExtensions().occlusionQueryBoolean &&
         !context->getExtensions().disjointTimerQuery)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
         return false;
     }
 
@@ -1224,7 +1225,7 @@
 {
     if (!ValidQueryType(context, target))
     {
-        context->recordError(Error(GL_INVALID_ENUM, "Invalid query target"));
+        context->handleError(Error(GL_INVALID_ENUM, "Invalid query target"));
         return false;
     }
 
@@ -1232,7 +1233,7 @@
 
     if (queryObject == nullptr)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query target not active"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query target not active"));
         return false;
     }
 
@@ -1244,7 +1245,7 @@
     if (!context->getExtensions().occlusionQueryBoolean &&
         !context->getExtensions().disjointTimerQuery)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
         return false;
     }
 
@@ -1255,26 +1256,26 @@
 {
     if (!context->getExtensions().disjointTimerQuery)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Disjoint timer query not enabled"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Disjoint timer query not enabled"));
         return false;
     }
 
     if (target != GL_TIMESTAMP_EXT)
     {
-        context->recordError(Error(GL_INVALID_ENUM, "Invalid query target"));
+        context->handleError(Error(GL_INVALID_ENUM, "Invalid query target"));
         return false;
     }
 
     Query *queryObject = context->getQuery(id, true, target);
     if (queryObject == nullptr)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Invalid query id"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Invalid query id"));
         return false;
     }
 
     if (context->getState().isQueryActive(queryObject))
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query is active"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query is active"));
         return false;
     }
 
@@ -1285,7 +1286,7 @@
 {
     if (!ValidQueryType(context, target) && target != GL_TIMESTAMP_EXT)
     {
-        context->recordError(Error(GL_INVALID_ENUM, "Invalid query type"));
+        context->handleError(Error(GL_INVALID_ENUM, "Invalid query type"));
         return false;
     }
 
@@ -1294,7 +1295,7 @@
         case GL_CURRENT_QUERY_EXT:
             if (target == GL_TIMESTAMP_EXT)
             {
-                context->recordError(
+                context->handleError(
                     Error(GL_INVALID_ENUM, "Cannot use current query for timestamp"));
                 return false;
             }
@@ -1303,12 +1304,12 @@
             if (!context->getExtensions().disjointTimerQuery ||
                 (target != GL_TIMESTAMP_EXT && target != GL_TIME_ELAPSED_EXT))
             {
-                context->recordError(Error(GL_INVALID_ENUM, "Invalid pname"));
+                context->handleError(Error(GL_INVALID_ENUM, "Invalid pname"));
                 return false;
             }
             break;
         default:
-            context->recordError(Error(GL_INVALID_ENUM, "Invalid pname"));
+            context->handleError(Error(GL_INVALID_ENUM, "Invalid pname"));
             return false;
     }
 
@@ -1320,7 +1321,7 @@
     if (!context->getExtensions().occlusionQueryBoolean &&
         !context->getExtensions().disjointTimerQuery)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
         return false;
     }
 
@@ -1333,13 +1334,13 @@
 
     if (!queryObject)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query does not exist"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query does not exist"));
         return false;
     }
 
     if (context->getState().isQueryActive(queryObject))
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query currently active"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query currently active"));
         return false;
     }
 
@@ -1350,7 +1351,7 @@
             break;
 
         default:
-            context->recordError(Error(GL_INVALID_ENUM, "Invalid pname enum"));
+            context->handleError(Error(GL_INVALID_ENUM, "Invalid pname enum"));
             return false;
     }
 
@@ -1361,7 +1362,7 @@
 {
     if (!context->getExtensions().disjointTimerQuery)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
         return false;
     }
     return ValidateGetQueryObjectValueBase(context, id, pname);
@@ -1372,7 +1373,7 @@
     if (!context->getExtensions().disjointTimerQuery &&
         !context->getExtensions().occlusionQueryBoolean)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
         return false;
     }
     return ValidateGetQueryObjectValueBase(context, id, pname);
@@ -1382,7 +1383,7 @@
 {
     if (!context->getExtensions().disjointTimerQuery)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
         return false;
     }
     return ValidateGetQueryObjectValueBase(context, id, pname);
@@ -1392,7 +1393,7 @@
 {
     if (!context->getExtensions().disjointTimerQuery)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
+        context->handleError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
         return false;
     }
     return ValidateGetQueryObjectValueBase(context, id, pname);
@@ -1406,14 +1407,14 @@
 {
     if (count < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
     gl::Program *program = context->getState().getProgram();
     if (!program)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1425,7 +1426,7 @@
 
     if (!program->isValidUniformLocation(location))
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1434,7 +1435,7 @@
     // attempting to write an array to a non-array uniform is an INVALID_OPERATION
     if (!uniform.isArray() && count > 1)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1447,7 +1448,7 @@
     // Check for ES3 uniform entry points
     if (VariableComponentType(uniformType) == GL_UNSIGNED_INT && context->getClientVersion() < 3)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1461,7 +1462,7 @@
     bool samplerUniformCheck = (IsSamplerType(uniform->type) && uniformType == GL_INT);
     if (!samplerUniformCheck && uniformType != uniform->type && targetBoolType != uniform->type)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1476,13 +1477,13 @@
     int cols = VariableColumnCount(matrixType);
     if (rows != cols && context->getClientVersion() < 3)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
     if (transpose != GL_FALSE && context->getClientVersion() < 3)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
@@ -1494,7 +1495,7 @@
 
     if (uniform->type != matrixType)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1505,7 +1506,7 @@
 {
     if (!context->getQueryParameterInfo(pname, nativeType, numParams))
     {
-        context->recordError(Error(GL_INVALID_ENUM));
+        context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
@@ -1517,7 +1518,7 @@
 
         if (colorAttachment >= caps.maxDrawBuffers)
         {
-            context->recordError(Error(GL_INVALID_OPERATION));
+            context->handleError(Error(GL_INVALID_OPERATION));
             return false;
         }
     }
@@ -1532,7 +1533,7 @@
       case GL_TEXTURE_BINDING_EXTERNAL_OES:
           if (!context->getExtensions().eglStreamConsumerExternal)
           {
-              context->recordError(
+              context->handleError(
                   Error(GL_INVALID_ENUM, "NV_EGL_stream_consumer_external extension not enabled"));
               return false;
           }
@@ -1545,14 +1546,14 @@
             ASSERT(framebuffer);
             if (framebuffer->checkStatus(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
             {
-                context->recordError(Error(GL_INVALID_OPERATION));
+                context->handleError(Error(GL_INVALID_OPERATION));
                 return false;
             }
 
             const FramebufferAttachment *attachment = framebuffer->getReadColorbuffer();
             if (!attachment)
             {
-                context->recordError(Error(GL_INVALID_OPERATION));
+                context->handleError(Error(GL_INVALID_OPERATION));
                 return false;
             }
         }
@@ -1588,39 +1589,39 @@
 {
     if (level < 0 || xoffset < 0 || yoffset < 0 || zoffset < 0 || width < 0 || height < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
     if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
     if (border != 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
     if (!ValidMipLevel(context, target, level))
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
     const gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
     if (framebuffer->checkStatus(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
     {
-        context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
+        context->handleError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
         return false;
     }
 
     const auto &state = context->getState();
     if (state.getReadFramebuffer()->id() != 0 && framebuffer->getSamples(context->getData()) != 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1651,7 +1652,7 @@
         break;
 
       default:
-        context->recordError(Error(GL_INVALID_ENUM));
+          context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
@@ -1659,13 +1660,13 @@
         state.getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
     if (!texture)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
     if (texture->getImmutableFormat() && !isSubImage)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1673,13 +1674,13 @@
 
     if (formatInfo.depthBits > 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
     if (formatInfo.compressed && !ValidCompressedImageSize(context, internalformat, width, height))
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1689,7 +1690,7 @@
             static_cast<size_t>(yoffset + height) > texture->getHeight(target, level) ||
             static_cast<size_t>(zoffset) >= texture->getDepth(target, level))
         {
-            context->recordError(Error(GL_INVALID_VALUE));
+            context->handleError(Error(GL_INVALID_VALUE));
             return false;
         }
     }
@@ -1697,20 +1698,20 @@
     {
         if (IsCubeMapTextureTarget(target) && width != height)
         {
-            context->recordError(Error(GL_INVALID_VALUE));
+            context->handleError(Error(GL_INVALID_VALUE));
             return false;
         }
 
         if (!formatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
         {
-            context->recordError(Error(GL_INVALID_ENUM));
+            context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
 
         int maxLevelDimension = (maxDimension >> level);
         if (static_cast<int>(width) > maxLevelDimension || static_cast<int>(height) > maxLevelDimension)
         {
-            context->recordError(Error(GL_INVALID_VALUE));
+            context->handleError(Error(GL_INVALID_VALUE));
             return false;
         }
     }
@@ -1735,13 +1736,13 @@
       case GL_TRIANGLE_FAN:
         break;
       default:
-        context->recordError(Error(GL_INVALID_ENUM));
+          context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
     if (count < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
@@ -1750,7 +1751,7 @@
     // Check for mapped buffers
     if (state.hasMappedBuffer(GL_ARRAY_BUFFER))
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1772,7 +1773,7 @@
             ERR(
                 "This ANGLE implementation does not support separate front/back stencil "
                 "writemasks, reference values, or stencil mask values.");
-            context->recordError(Error(GL_INVALID_OPERATION));
+            context->handleError(Error(GL_INVALID_OPERATION));
             return false;
         }
     }
@@ -1780,20 +1781,20 @@
     const gl::Framebuffer *fbo = state.getDrawFramebuffer();
     if (!fbo || fbo->checkStatus(context->getData()) != GL_FRAMEBUFFER_COMPLETE)
     {
-        context->recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
+        context->handleError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
         return false;
     }
 
     gl::Program *program = state.getProgram();
     if (!program)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
     if (!program->validateSamplers(NULL, context->getCaps()))
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1808,7 +1809,9 @@
         if (uniformBuffer.get() == nullptr)
         {
             // undefined behaviour
-            context->recordError(Error(GL_INVALID_OPERATION, "It is undefined behaviour to have a used but unbound uniform buffer."));
+            context->handleError(
+                Error(GL_INVALID_OPERATION,
+                      "It is undefined behaviour to have a used but unbound uniform buffer."));
             return false;
         }
 
@@ -1822,7 +1825,9 @@
         if (uniformBufferSize < uniformBlock.dataSize)
         {
             // undefined behaviour
-            context->recordError(Error(GL_INVALID_OPERATION, "It is undefined behaviour to use a uniform buffer that is too small."));
+            context->handleError(
+                Error(GL_INVALID_OPERATION,
+                      "It is undefined behaviour to use a uniform buffer that is too small."));
             return false;
         }
     }
@@ -1835,7 +1840,7 @@
 {
     if (first < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
@@ -1847,7 +1852,7 @@
         // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
         // that does not match the current transform feedback object's draw mode (if transform feedback
         // is active), (3.0.2, section 2.14, pg 86)
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1868,7 +1873,7 @@
 {
     if (primcount < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
@@ -1898,8 +1903,9 @@
         }
     }
 
-    context->recordError(Error(GL_INVALID_OPERATION, "ANGLE_instanced_arrays requires that at least one active attribute"
-                                                     "has a divisor of zero."));
+    context->handleError(Error(GL_INVALID_OPERATION,
+                               "ANGLE_instanced_arrays requires that at least one active attribute"
+                               "has a divisor of zero."));
     return false;
 }
 
@@ -1929,12 +1935,12 @@
       case GL_UNSIGNED_INT:
           if (context->getClientVersion() < 3 && !context->getExtensions().elementIndexUint)
         {
-            context->recordError(Error(GL_INVALID_ENUM));
+            context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
         break;
       default:
-        context->recordError(Error(GL_INVALID_ENUM));
+          context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
@@ -1945,14 +1951,14 @@
     {
         // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
         // while transform feedback is active, (3.0.2, section 2.14, pg 86)
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
     // Check for mapped buffers
     if (state.hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1960,7 +1966,7 @@
     gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
     if (!indices && !elementArrayBuffer)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -1975,21 +1981,21 @@
         if (static_cast<GLuint>(count) > (std::numeric_limits<GLuint>::max() / typeInfo.bytes) ||
             byteCount > static_cast<GLint64>(std::numeric_limits<GLuint>::max()))
         {
-            context->recordError(Error(GL_OUT_OF_MEMORY));
+            context->handleError(Error(GL_OUT_OF_MEMORY));
             return false;
         }
 
         // Check for reading past the end of the bound buffer object
         if (byteCount > elementArrayBuffer->getSize())
         {
-            context->recordError(Error(GL_INVALID_OPERATION));
+            context->handleError(Error(GL_INVALID_OPERATION));
             return false;
         }
     }
     else if (!indices)
     {
         // Catch this programming error here
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -2009,7 +2015,7 @@
                                               state.isPrimitiveRestartEnabled(), indexRangeOut);
         if (error.isError())
         {
-            context->recordError(error);
+            context->handleError(error);
             return false;
         }
     }
@@ -2023,7 +2029,7 @@
     // return an error if possible here.
     if (static_cast<GLuint64>(indexRangeOut->end) >= context->getCaps().maxElementIndex)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, g_ExceedsMaxElementErrorMessage));
+        context->handleError(Error(GL_INVALID_OPERATION, g_ExceedsMaxElementErrorMessage));
         return false;
     }
 
@@ -2046,7 +2052,7 @@
 {
     if (primcount < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
@@ -2080,7 +2086,7 @@
 {
     if (!ValidFramebufferTarget(target))
     {
-        context->recordError(Error(GL_INVALID_ENUM));
+        context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
@@ -2095,13 +2101,13 @@
 
         if (tex == NULL)
         {
-            context->recordError(Error(GL_INVALID_OPERATION));
+            context->handleError(Error(GL_INVALID_OPERATION));
             return false;
         }
 
         if (level < 0)
         {
-            context->recordError(Error(GL_INVALID_VALUE));
+            context->handleError(Error(GL_INVALID_VALUE));
             return false;
         }
     }
@@ -2111,7 +2117,8 @@
 
     if (framebuffer->id() == 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Cannot change default FBO's attachments"));
+        context->handleError(
+            Error(GL_INVALID_OPERATION, "Cannot change default FBO's attachments"));
         return false;
     }
 
@@ -2124,7 +2131,7 @@
     // Attachments are required to be bound to level 0 without ES3 or the GL_OES_fbo_render_mipmap extension
     if (context->getClientVersion() < 3 && !context->getExtensions().fboRenderMipmap && level != 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
@@ -2146,12 +2153,12 @@
             {
                 if (level > gl::log2(caps.max2DTextureSize))
                 {
-                    context->recordError(Error(GL_INVALID_VALUE));
+                    context->handleError(Error(GL_INVALID_VALUE));
                     return false;
                 }
                 if (tex->getTarget() != GL_TEXTURE_2D)
                 {
-                    context->recordError(Error(GL_INVALID_OPERATION));
+                    context->handleError(Error(GL_INVALID_OPERATION));
                     return false;
                 }
             }
@@ -2166,26 +2173,26 @@
             {
                 if (level > gl::log2(caps.maxCubeMapTextureSize))
                 {
-                    context->recordError(Error(GL_INVALID_VALUE));
+                    context->handleError(Error(GL_INVALID_VALUE));
                     return false;
                 }
                 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
                 {
-                    context->recordError(Error(GL_INVALID_OPERATION));
+                    context->handleError(Error(GL_INVALID_OPERATION));
                     return false;
                 }
             }
             break;
 
           default:
-            context->recordError(Error(GL_INVALID_ENUM));
+              context->handleError(Error(GL_INVALID_ENUM));
             return false;
         }
 
         const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(tex->getInternalFormat(textarget, level));
         if (internalFormatInfo.compressed)
         {
-            context->recordError(Error(GL_INVALID_OPERATION));
+            context->handleError(Error(GL_INVALID_OPERATION));
             return false;
         }
     }
@@ -2197,7 +2204,7 @@
 {
     if (program == 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE));
+        context->handleError(Error(GL_INVALID_VALUE));
         return false;
     }
 
@@ -2209,13 +2216,13 @@
 
     if (!programObject || !programObject->isLinked())
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
     if (!programObject->isValidUniformLocation(location))
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -2247,7 +2254,7 @@
     size_t requiredBytes = VariableExternalSize(uniform.type);
     if (static_cast<size_t>(bufSize) < requiredBytes)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -2269,7 +2276,7 @@
 {
     if (numAttachments < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE, "numAttachments must not be less than zero"));
+        context->handleError(Error(GL_INVALID_VALUE, "numAttachments must not be less than zero"));
         return false;
     }
 
@@ -2279,14 +2286,16 @@
         {
             if (defaultFramebuffer)
             {
-                context->recordError(Error(GL_INVALID_ENUM, "Invalid attachment when the default framebuffer is bound"));
+                context->handleError(Error(
+                    GL_INVALID_ENUM, "Invalid attachment when the default framebuffer is bound"));
                 return false;
             }
 
             if (attachments[i] >= GL_COLOR_ATTACHMENT0 + context->getCaps().maxColorAttachments)
             {
-                context->recordError(Error(GL_INVALID_OPERATION,
-                                           "Requested color attachment is greater than the maximum supported color attachments"));
+                context->handleError(Error(GL_INVALID_OPERATION,
+                                           "Requested color attachment is greater than the maximum "
+                                           "supported color attachments"));
                 return false;
             }
         }
@@ -2299,7 +2308,9 @@
               case GL_DEPTH_STENCIL_ATTACHMENT:
                 if (defaultFramebuffer)
                 {
-                    context->recordError(Error(GL_INVALID_ENUM, "Invalid attachment when the default framebuffer is bound"));
+                    context->handleError(
+                        Error(GL_INVALID_ENUM,
+                              "Invalid attachment when the default framebuffer is bound"));
                     return false;
                 }
                 break;
@@ -2308,12 +2319,14 @@
               case GL_STENCIL:
                 if (!defaultFramebuffer)
                 {
-                    context->recordError(Error(GL_INVALID_ENUM, "Invalid attachment when the default framebuffer is not bound"));
+                    context->handleError(
+                        Error(GL_INVALID_ENUM,
+                              "Invalid attachment when the default framebuffer is not bound"));
                     return false;
                 }
                 break;
               default:
-                context->recordError(Error(GL_INVALID_ENUM, "Invalid attachment"));
+                  context->handleError(Error(GL_INVALID_ENUM, "Invalid attachment"));
                 return false;
             }
         }
@@ -2363,7 +2376,7 @@
 {
     if (!context->getExtensions().eglImage && !context->getExtensions().eglImageExternal)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -2373,19 +2386,19 @@
             break;
 
         default:
-            context->recordError(Error(GL_INVALID_ENUM, "invalid texture target."));
+            context->handleError(Error(GL_INVALID_ENUM, "invalid texture target."));
             return false;
     }
 
     if (!display->isValidImage(image))
     {
-        context->recordError(Error(GL_INVALID_VALUE, "EGL image is not valid."));
+        context->handleError(Error(GL_INVALID_VALUE, "EGL image is not valid."));
         return false;
     }
 
     if (image->getSamples() > 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION,
+        context->handleError(Error(GL_INVALID_OPERATION,
                                    "cannot create a 2D texture from a multisampled EGL image."));
         return false;
     }
@@ -2393,7 +2406,7 @@
     const TextureCaps &textureCaps = context->getTextureCaps().get(image->getInternalFormat());
     if (!textureCaps.texturable)
     {
-        context->recordError(Error(GL_INVALID_OPERATION,
+        context->handleError(Error(GL_INVALID_OPERATION,
                                    "EGL image internal format is not supported as a texture."));
         return false;
     }
@@ -2408,7 +2421,7 @@
 {
     if (!context->getExtensions().eglImage)
     {
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -2418,20 +2431,20 @@
             break;
 
         default:
-            context->recordError(Error(GL_INVALID_ENUM, "invalid renderbuffer target."));
+            context->handleError(Error(GL_INVALID_ENUM, "invalid renderbuffer target."));
             return false;
     }
 
     if (!display->isValidImage(image))
     {
-        context->recordError(Error(GL_INVALID_VALUE, "EGL image is not valid."));
+        context->handleError(Error(GL_INVALID_VALUE, "EGL image is not valid."));
         return false;
     }
 
     const TextureCaps &textureCaps = context->getTextureCaps().get(image->getInternalFormat());
     if (!textureCaps.renderable)
     {
-        context->recordError(Error(
+        context->handleError(Error(
             GL_INVALID_OPERATION, "EGL image internal format is not supported as a renderbuffer."));
         return false;
     }
@@ -2445,7 +2458,7 @@
     {
         // The default VAO should always exist
         ASSERT(array != 0);
-        context->recordError(Error(GL_INVALID_OPERATION));
+        context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
@@ -2457,7 +2470,7 @@
     if (context->hasActiveTransformFeedback(program))
     {
         // ES 3.0.4 section 2.15 page 91
-        context->recordError(Error(GL_INVALID_OPERATION,
+        context->handleError(Error(GL_INVALID_OPERATION,
                                    "Cannot link program while program is associated with an active "
                                    "transform feedback object."));
         return false;
@@ -2481,14 +2494,14 @@
     if (std::find(programBinaryFormats.begin(), programBinaryFormats.end(), binaryFormat) ==
         programBinaryFormats.end())
     {
-        context->recordError(Error(GL_INVALID_ENUM, "Program binary format is not valid."));
+        context->handleError(Error(GL_INVALID_ENUM, "Program binary format is not valid."));
         return false;
     }
 
     if (context->hasActiveTransformFeedback(program))
     {
         // ES 3.0.4 section 2.15 page 91
-        context->recordError(Error(GL_INVALID_OPERATION,
+        context->handleError(Error(GL_INVALID_OPERATION,
                                    "Cannot change program binary while program is associated with "
                                    "an active transform feedback object."));
         return false;
@@ -2512,7 +2525,7 @@
 
     if (!programObject->isLinked())
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Program is not linked."));
+        context->handleError(Error(GL_INVALID_OPERATION, "Program is not linked."));
         return false;
     }
 
@@ -2529,27 +2542,27 @@
             // ES 3.1.0 section 7.3 page 72
             if (context->getShader(program))
             {
-                context->recordError(
+                context->handleError(
                     Error(GL_INVALID_OPERATION,
                           "Attempted to use a single shader instead of a shader program."));
                 return false;
             }
             else
             {
-                context->recordError(Error(GL_INVALID_VALUE, "Program invalid."));
+                context->handleError(Error(GL_INVALID_VALUE, "Program invalid."));
                 return false;
             }
         }
         if (!programObject->isLinked())
         {
-            context->recordError(Error(GL_INVALID_OPERATION, "Program not linked."));
+            context->handleError(Error(GL_INVALID_OPERATION, "Program not linked."));
             return false;
         }
     }
     if (context->getState().isTransformFeedbackActiveUnpaused())
     {
         // ES 3.0.4 section 2.15 page 91
-        context->recordError(
+        context->handleError(
             Error(GL_INVALID_OPERATION,
                   "Cannot change active program while transform feedback is unpaused."));
         return false;
@@ -2588,7 +2601,7 @@
     if (!ValidFramebufferTarget(target) ||
         (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
     {
-        context->recordError(Error(GL_INVALID_ENUM));
+        context->handleError(Error(GL_INVALID_ENUM));
         return false;
     }
 
@@ -2601,7 +2614,7 @@
     // INVALID_VALUE is generated if n is negative or greater than value of MAX_DRAW_BUFFERS
     if (n < 0 || static_cast<GLuint>(n) > context->getCaps().maxDrawBuffers)
     {
-        context->recordError(
+        context->handleError(
             Error(GL_INVALID_VALUE, "n must be non-negative and no greater than MAX_DRAW_BUFFERS"));
         return false;
     }
@@ -2626,12 +2639,12 @@
             // was changed to GL_INVALID_ENUM in 3.1, which dEQP also expects.
             // 3.1 is still a bit ambiguous about the error, but future specs are
             // expected to clarify that GL_INVALID_ENUM is the correct error.
-            context->recordError(Error(GL_INVALID_ENUM, "Invalid buffer value"));
+            context->handleError(Error(GL_INVALID_ENUM, "Invalid buffer value"));
             return false;
         }
         else if (bufs[colorAttachment] >= maxColorAttachment)
         {
-            context->recordError(
+            context->handleError(
                 Error(GL_INVALID_OPERATION, "Buffer value is greater than MAX_DRAW_BUFFERS"));
             return false;
         }
@@ -2640,7 +2653,7 @@
         {
             // INVALID_OPERATION-GL is bound to buffer and ith argument
             // is not COLOR_ATTACHMENTi or NONE
-            context->recordError(
+            context->handleError(
                 Error(GL_INVALID_OPERATION, "Ith value does not match COLOR_ATTACHMENTi or NONE"));
             return false;
         }
@@ -2652,14 +2665,14 @@
     {
         if (n != 1)
         {
-            context->recordError(Error(GL_INVALID_OPERATION,
+            context->handleError(Error(GL_INVALID_OPERATION,
                                        "n must be 1 when GL is bound to the default framebuffer"));
             return false;
         }
 
         if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
         {
-            context->recordError(Error(
+            context->handleError(Error(
                 GL_INVALID_OPERATION,
                 "Only NONE or BACK are valid values when drawing to the default framebuffer"));
             return false;
@@ -2693,13 +2706,13 @@
 {
     if (!ValidBufferTarget(context, target))
     {
-        context->recordError(Error(GL_INVALID_ENUM, "Buffer target not valid: 0x%X", target));
+        context->handleError(Error(GL_INVALID_ENUM, "Buffer target not valid: 0x%X", target));
         return false;
     }
 
     if (pname != GL_BUFFER_MAP_POINTER)
     {
-        context->recordError(Error(GL_INVALID_ENUM, "pname not valid: 0x%X", pname));
+        context->handleError(Error(GL_INVALID_ENUM, "pname not valid: 0x%X", pname));
         return false;
     }
 
@@ -2710,7 +2723,7 @@
     // GLES 3.1 section 6.6 explicitly specifies this error.
     if (!buffer)
     {
-        context->recordError(
+        context->handleError(
             Error(GL_INVALID_OPERATION, "Can not get pointer for reserved buffer name zero."));
         return false;
     }
@@ -2722,7 +2735,7 @@
 {
     if (!ValidBufferTarget(context, target))
     {
-        context->recordError(Error(GL_INVALID_ENUM, "Invalid buffer target."));
+        context->handleError(Error(GL_INVALID_ENUM, "Invalid buffer target."));
         return false;
     }
 
@@ -2730,7 +2743,7 @@
 
     if (buffer == nullptr || !buffer->isMapped())
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Buffer not mapped."));
+        context->handleError(Error(GL_INVALID_OPERATION, "Buffer not mapped."));
         return false;
     }
 
@@ -2745,13 +2758,13 @@
 {
     if (!ValidBufferTarget(context, target))
     {
-        context->recordError(Error(GL_INVALID_ENUM, "Invalid buffer target."));
+        context->handleError(Error(GL_INVALID_ENUM, "Invalid buffer target."));
         return false;
     }
 
     if (offset < 0 || length < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE, "Invalid offset or length."));
+        context->handleError(Error(GL_INVALID_VALUE, "Invalid offset or length."));
         return false;
     }
 
@@ -2759,7 +2772,7 @@
 
     if (!buffer)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Attempted to map buffer object zero."));
+        context->handleError(Error(GL_INVALID_OPERATION, "Attempted to map buffer object zero."));
         return false;
     }
 
@@ -2770,7 +2783,7 @@
     if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
         offsetSize + lengthSize > static_cast<size_t>(buffer->getSize()))
     {
-        context->recordError(
+        context->handleError(
             Error(GL_INVALID_VALUE, "Mapped range does not fit into buffer dimensions."));
         return false;
     }
@@ -2782,26 +2795,26 @@
 
     if (access & ~(allAccessBits))
     {
-        context->recordError(Error(GL_INVALID_VALUE, "Invalid access bits: 0x%X.", access));
+        context->handleError(Error(GL_INVALID_VALUE, "Invalid access bits: 0x%X.", access));
         return false;
     }
 
     if (length == 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Buffer mapping length is zero."));
+        context->handleError(Error(GL_INVALID_OPERATION, "Buffer mapping length is zero."));
         return false;
     }
 
     if (buffer->isMapped())
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Buffer is already mapped."));
+        context->handleError(Error(GL_INVALID_OPERATION, "Buffer is already mapped."));
         return false;
     }
 
     // Check for invalid bit combinations
     if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
     {
-        context->recordError(
+        context->handleError(
             Error(GL_INVALID_OPERATION, "Need to map buffer for either reading or writing."));
         return false;
     }
@@ -2811,7 +2824,7 @@
 
     if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
     {
-        context->recordError(Error(GL_INVALID_OPERATION,
+        context->handleError(Error(GL_INVALID_OPERATION,
                                    "Invalid access bits when mapping buffer for reading: 0x%X.",
                                    access));
         return false;
@@ -2819,7 +2832,7 @@
 
     if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
     {
-        context->recordError(Error(
+        context->handleError(Error(
             GL_INVALID_OPERATION,
             "The explicit flushing bit may only be set if the buffer is mapped for writing."));
         return false;
@@ -2834,13 +2847,13 @@
 {
     if (offset < 0 || length < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE, "Invalid offset/length parameters."));
+        context->handleError(Error(GL_INVALID_VALUE, "Invalid offset/length parameters."));
         return false;
     }
 
     if (!ValidBufferTarget(context, target))
     {
-        context->recordError(Error(GL_INVALID_ENUM, "Invalid buffer target."));
+        context->handleError(Error(GL_INVALID_ENUM, "Invalid buffer target."));
         return false;
     }
 
@@ -2848,13 +2861,13 @@
 
     if (buffer == nullptr)
     {
-        context->recordError(Error(GL_INVALID_OPERATION, "Attempted to flush buffer object zero."));
+        context->handleError(Error(GL_INVALID_OPERATION, "Attempted to flush buffer object zero."));
         return false;
     }
 
     if (!buffer->isMapped() || (buffer->getAccessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
     {
-        context->recordError(Error(
+        context->handleError(Error(
             GL_INVALID_OPERATION, "Attempted to flush a buffer not mapped for explicit flushing."));
         return false;
     }
@@ -2866,7 +2879,7 @@
     if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
         offsetSize + lengthSize > static_cast<size_t>(buffer->getMapLength()))
     {
-        context->recordError(
+        context->handleError(
             Error(GL_INVALID_VALUE, "Flushed range does not fit into buffer mapping dimensions."));
         return false;
     }
@@ -2918,7 +2931,7 @@
 {
     if (n < 0)
     {
-        context->recordError(Error(GL_INVALID_VALUE, "n < 0"));
+        context->handleError(Error(GL_INVALID_VALUE, "n < 0"));
         return false;
     }
     return true;