Use ShaderProgramID in place of GLuint handles

Bug: angleproject:3804
Change-Id: I5dc640004c2cc054c53261e8e939b6a9f5fc23bb
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1762363
Commit-Queue: Jiacheng Lu <lujc@google.com>
Reviewed-by: Tobin Ehlis <tobine@google.com>
diff --git a/src/common/PackedEnums.h b/src/common/PackedEnums.h
index 32b1c23..b1c22ad 100644
--- a/src/common/PackedEnums.h
+++ b/src/common/PackedEnums.h
@@ -396,6 +396,11 @@
     GLuint value;
 };
 
+struct ShaderProgramID
+{
+    GLuint value;
+};
+
 struct TextureID
 {
     GLuint value;
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 983077f..1412a84 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -683,13 +683,14 @@
 
 GLuint Context::createProgram()
 {
-    return mState.mShaderProgramManager->createProgram(mImplementation.get());
+    return mState.mShaderProgramManager->createProgram(mImplementation.get()).value;
 }
 
 GLuint Context::createShader(ShaderType type)
 {
-    return mState.mShaderProgramManager->createShader(mImplementation.get(), mState.mLimitations,
-                                                      type);
+    return mState.mShaderProgramManager
+        ->createShader(mImplementation.get(), mState.mLimitations, type)
+        .value;
 }
 
 TextureID Context::createTexture()
@@ -762,12 +763,12 @@
     mState.mBufferManager->deleteObject(this, bufferName);
 }
 
-void Context::deleteShader(GLuint shader)
+void Context::deleteShader(ShaderProgramID shader)
 {
     mState.mShaderProgramManager->deleteShader(this, shader);
 }
 
-void Context::deleteProgram(GLuint program)
+void Context::deleteProgram(ShaderProgramID program)
 {
     mState.mShaderProgramManager->deleteProgram(this, program);
 }
@@ -1000,9 +1001,9 @@
         case GL_BUFFER:
             return getBuffer({name});
         case GL_SHADER:
-            return getShader(name);
+            return getShader({name});
         case GL_PROGRAM:
-            return getProgramNoResolveLink(name);
+            return getProgramNoResolveLink({name});
         case GL_VERTEX_ARRAY:
             return getVertexArray(name);
         case GL_QUERY:
@@ -1154,13 +1155,15 @@
     mState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
 }
 
-void Context::useProgram(GLuint program)
+void Context::useProgram(ShaderProgramID program)
 {
     ANGLE_CONTEXT_TRY(mState.setProgram(this, getProgramResolveLink(program)));
     mStateCache.onProgramExecutableChange(this);
 }
 
-void Context::useProgramStages(ProgramPipelineID pipeline, GLbitfield stages, GLuint program)
+void Context::useProgramStages(ProgramPipelineID pipeline,
+                               GLbitfield stages,
+                               ShaderProgramID program)
 {
     UNIMPLEMENTED();
 }
@@ -2341,7 +2344,7 @@
     mImplementation->popGroupMarker();
 }
 
-void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
+void Context::bindUniformLocation(ShaderProgramID program, GLint location, const GLchar *name)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
@@ -2545,14 +2548,14 @@
                                                          transformType, transformValues);
 }
 
-void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
+void Context::bindFragmentInputLocation(ShaderProgramID program, GLint location, const GLchar *name)
 {
     auto *programObject = getProgramResolveLink(program);
 
     programObject->bindFragmentInputLocation(location, name);
 }
 
-void Context::programPathFragmentInputGen(GLuint program,
+void Context::programPathFragmentInputGen(ShaderProgramID program,
                                           GLint location,
                                           GLenum genMode,
                                           GLint components,
@@ -2563,13 +2566,15 @@
     programObject->pathFragmentInputGen(location, genMode, components, coeffs);
 }
 
-GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
+GLuint Context::getProgramResourceIndex(ShaderProgramID program,
+                                        GLenum programInterface,
+                                        const GLchar *name)
 {
     const Program *programObject = getProgramResolveLink(program);
     return QueryProgramResourceIndex(programObject, programInterface, name);
 }
 
-void Context::getProgramResourceName(GLuint program,
+void Context::getProgramResourceName(ShaderProgramID program,
                                      GLenum programInterface,
                                      GLuint index,
                                      GLsizei bufSize,
@@ -2580,7 +2585,7 @@
     QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
 }
 
-GLint Context::getProgramResourceLocation(GLuint program,
+GLint Context::getProgramResourceLocation(ShaderProgramID program,
                                           GLenum programInterface,
                                           const GLchar *name)
 {
@@ -2588,7 +2593,7 @@
     return QueryProgramResourceLocation(programObject, programInterface, name);
 }
 
-void Context::getProgramResourceiv(GLuint program,
+void Context::getProgramResourceiv(ShaderProgramID program,
                                    GLenum programInterface,
                                    GLuint index,
                                    GLsizei propCount,
@@ -2602,7 +2607,7 @@
                            length, params);
 }
 
-void Context::getProgramInterfaceiv(GLuint program,
+void Context::getProgramInterfaceiv(ShaderProgramID program,
                                     GLenum programInterface,
                                     GLenum pname,
                                     GLint *params)
@@ -2611,7 +2616,7 @@
     QueryProgramInterfaceiv(programObject, programInterface, pname, params);
 }
 
-void Context::getProgramInterfaceivRobust(GLuint program,
+void Context::getProgramInterfaceivRobust(ShaderProgramID program,
                                           GLenum programInterface,
                                           GLenum pname,
                                           GLsizei bufSize,
@@ -3007,7 +3012,7 @@
     getSamplerParameterfv(sampler, pname, params);
 }
 
-void Context::programParameteri(GLuint program, GLenum pname, GLint value)
+void Context::programParameteri(ShaderProgramID program, GLenum pname, GLint value)
 {
     gl::Program *programObject = getProgramResolveLink(program);
     SetProgramParameteri(programObject, pname, value);
@@ -3204,7 +3209,7 @@
     mStateCache.onActiveTransformFeedbackChange(this);
 }
 
-bool Context::hasActiveTransformFeedback(GLuint program) const
+bool Context::hasActiveTransformFeedback(ShaderProgramID program) const
 {
     for (auto pair : mTransformFeedbackMap)
     {
@@ -4627,7 +4632,7 @@
     return angle::Result::Continue;
 }
 
-void Context::activeShaderProgram(ProgramPipelineID pipeline, GLuint program)
+void Context::activeShaderProgram(ProgramPipelineID pipeline, ShaderProgramID program)
 {
     UNIMPLEMENTED();
 }
@@ -5192,7 +5197,7 @@
     ANGLE_CONTEXT_TRY(buffer->bufferSubData(this, target, data, size, offset));
 }
 
-void Context::attachShader(GLuint program, GLuint shader)
+void Context::attachShader(ShaderProgramID program, ShaderProgramID shader)
 {
     Program *programObject = mState.mShaderProgramManager->getProgram(program);
     Shader *shaderObject   = mState.mShaderProgramManager->getShader(shader);
@@ -5220,7 +5225,7 @@
         writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
 }
 
-void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+void Context::bindAttribLocation(ShaderProgramID program, GLuint index, const GLchar *name)
 {
     // Ideally we could share the program query with the validation layer if possible.
     Program *programObject = getProgramResolveLink(program);
@@ -5889,7 +5894,7 @@
     return framebuffer->checkStatus(this);
 }
 
-void Context::compileShader(GLuint shader)
+void Context::compileShader(ShaderProgramID shader)
 {
     Shader *shaderObject = GetValidShader(this, shader);
     if (!shaderObject)
@@ -5937,7 +5942,7 @@
     }
 }
 
-void Context::detachShader(GLuint program, GLuint shader)
+void Context::detachShader(ShaderProgramID program, ShaderProgramID shader)
 {
     Program *programObject = getProgramNoResolveLink(program);
     ASSERT(programObject);
@@ -5980,7 +5985,7 @@
     }
 }
 
-void Context::getActiveAttrib(GLuint program,
+void Context::getActiveAttrib(ShaderProgramID program,
                               GLuint index,
                               GLsizei bufsize,
                               GLsizei *length,
@@ -5993,7 +5998,7 @@
     programObject->getActiveAttribute(index, bufsize, length, size, type, name);
 }
 
-void Context::getActiveUniform(GLuint program,
+void Context::getActiveUniform(ShaderProgramID program,
                                GLuint index,
                                GLsizei bufsize,
                                GLsizei *length,
@@ -6006,14 +6011,17 @@
     programObject->getActiveUniform(index, bufsize, length, size, type, name);
 }
 
-void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
+void Context::getAttachedShaders(ShaderProgramID program,
+                                 GLsizei maxcount,
+                                 GLsizei *count,
+                                 ShaderProgramID *shaders)
 {
     Program *programObject = getProgramNoResolveLink(program);
     ASSERT(programObject);
     programObject->getAttachedShaders(maxcount, count, shaders);
 }
 
-GLint Context::getAttribLocation(GLuint program, const GLchar *name)
+GLint Context::getAttribLocation(ShaderProgramID program, const GLchar *name)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
@@ -6083,7 +6091,7 @@
     getIntegerv(pname, data);
 }
 
-void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
+void Context::getProgramiv(ShaderProgramID program, GLenum pname, GLint *params)
 {
     Program *programObject = nullptr;
     if (!mContextLost)
@@ -6096,7 +6104,7 @@
     QueryProgramiv(this, programObject, pname, params);
 }
 
-void Context::getProgramivRobust(GLuint program,
+void Context::getProgramivRobust(ShaderProgramID program,
                                  GLenum pname,
                                  GLsizei bufSize,
                                  GLsizei *length,
@@ -6120,7 +6128,10 @@
     return mState.mSemaphoreManager->getSemaphore(handle);
 }
 
-void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
+void Context::getProgramInfoLog(ShaderProgramID program,
+                                GLsizei bufsize,
+                                GLsizei *length,
+                                GLchar *infolog)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
@@ -6135,7 +6146,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
+void Context::getShaderiv(ShaderProgramID shader, GLenum pname, GLint *params)
 {
     Shader *shaderObject = nullptr;
     if (!mContextLost)
@@ -6146,7 +6157,7 @@
     QueryShaderiv(this, shaderObject, pname, params);
 }
 
-void Context::getShaderivRobust(GLuint shader,
+void Context::getShaderivRobust(ShaderProgramID shader,
                                 GLenum pname,
                                 GLsizei bufSize,
                                 GLsizei *length,
@@ -6155,7 +6166,10 @@
     getShaderiv(shader, pname, params);
 }
 
-void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
+void Context::getShaderInfoLog(ShaderProgramID shader,
+                               GLsizei bufsize,
+                               GLsizei *length,
+                               GLchar *infolog)
 {
     Shader *shaderObject = getShader(shader);
     ASSERT(shaderObject);
@@ -6235,21 +6249,24 @@
     }
 }
 
-void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
+void Context::getShaderSource(ShaderProgramID shader,
+                              GLsizei bufsize,
+                              GLsizei *length,
+                              GLchar *source)
 {
     Shader *shaderObject = getShader(shader);
     ASSERT(shaderObject);
     shaderObject->getSource(bufsize, length, source);
 }
 
-void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
+void Context::getUniformfv(ShaderProgramID program, GLint location, GLfloat *params)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->getUniformfv(this, location, params);
 }
 
-void Context::getUniformfvRobust(GLuint program,
+void Context::getUniformfvRobust(ShaderProgramID program,
                                  GLint location,
                                  GLsizei bufSize,
                                  GLsizei *length,
@@ -6258,14 +6275,14 @@
     getUniformfv(program, location, params);
 }
 
-void Context::getUniformiv(GLuint program, GLint location, GLint *params)
+void Context::getUniformiv(ShaderProgramID program, GLint location, GLint *params)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->getUniformiv(this, location, params);
 }
 
-void Context::getUniformivRobust(GLuint program,
+void Context::getUniformivRobust(ShaderProgramID program,
                                  GLint location,
                                  GLsizei bufSize,
                                  GLsizei *length,
@@ -6274,7 +6291,7 @@
     getUniformiv(program, location, params);
 }
 
-GLint Context::getUniformLocation(GLuint program, const GLchar *name)
+GLint Context::getUniformLocation(ShaderProgramID program, const GLchar *name)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
@@ -6306,9 +6323,9 @@
     return ConvertToGLBoolean(getFramebuffer(framebuffer));
 }
 
-GLboolean Context::isProgram(GLuint program)
+GLboolean Context::isProgram(ShaderProgramID program)
 {
-    if (program == 0)
+    if (program.value == 0)
     {
         return GL_FALSE;
     }
@@ -6326,9 +6343,9 @@
     return ConvertToGLBoolean(getRenderbuffer(renderbuffer));
 }
 
-GLboolean Context::isShader(GLuint shader)
+GLboolean Context::isShader(ShaderProgramID shader)
 {
-    if (shader == 0)
+    if (shader.value == 0)
     {
         return GL_FALSE;
     }
@@ -6346,7 +6363,7 @@
     return ConvertToGLBoolean(getTexture(texture));
 }
 
-void Context::linkProgram(GLuint program)
+void Context::linkProgram(ShaderProgramID program)
 {
     Program *programObject = getProgramNoResolveLink(program);
     ASSERT(programObject);
@@ -6360,7 +6377,7 @@
 }
 
 void Context::shaderBinary(GLsizei n,
-                           const GLuint *shaders,
+                           const ShaderProgramID *shaders,
                            GLenum binaryformat,
                            const void *binary,
                            GLsizei length)
@@ -6369,7 +6386,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::bindFragDataLocationIndexed(GLuint program,
+void Context::bindFragDataLocationIndexed(ShaderProgramID program,
                                           GLuint colorNumber,
                                           GLuint index,
                                           const char *name)
@@ -6379,18 +6396,18 @@
     programObject->bindFragmentOutputIndex(index, name);
 }
 
-void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
+void Context::bindFragDataLocation(ShaderProgramID program, GLuint colorNumber, const char *name)
 {
     bindFragDataLocationIndexed(program, colorNumber, 0u, name);
 }
 
-int Context::getFragDataIndex(GLuint program, const char *name)
+int Context::getFragDataIndex(ShaderProgramID program, const char *name)
 {
     Program *programObject = getProgramResolveLink(program);
     return programObject->getFragDataIndex(name);
 }
 
-int Context::getProgramResourceLocationIndex(GLuint program,
+int Context::getProgramResourceLocationIndex(ShaderProgramID program,
                                              GLenum programInterface,
                                              const char *name)
 {
@@ -6399,7 +6416,7 @@
     return programObject->getFragDataIndex(name);
 }
 
-void Context::shaderSource(GLuint shader,
+void Context::shaderSource(ShaderProgramID shader,
                            GLsizei count,
                            const GLchar *const *string,
                            const GLint *length)
@@ -6562,7 +6579,7 @@
     program->setUniformMatrix4fv(location, count, transpose, value);
 }
 
-void Context::validateProgram(GLuint program)
+void Context::validateProgram(ShaderProgramID program)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
@@ -6574,7 +6591,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::getProgramBinary(GLuint program,
+void Context::getProgramBinary(ShaderProgramID program,
                                GLsizei bufSize,
                                GLsizei *length,
                                GLenum *binaryFormat,
@@ -6586,7 +6603,10 @@
     ANGLE_CONTEXT_TRY(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
 }
 
-void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
+void Context::programBinary(ShaderProgramID program,
+                            GLenum binaryFormat,
+                            const void *binary,
+                            GLsizei length)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject != nullptr);
@@ -6783,7 +6803,7 @@
     mStateCache.onActiveTransformFeedbackChange(this);
 }
 
-void Context::transformFeedbackVaryings(GLuint program,
+void Context::transformFeedbackVaryings(ShaderProgramID program,
                                         GLsizei count,
                                         const GLchar *const *varyings,
                                         GLenum bufferMode)
@@ -6793,7 +6813,7 @@
     programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
 }
 
-void Context::getTransformFeedbackVarying(GLuint program,
+void Context::getTransformFeedbackVarying(ShaderProgramID program,
                                           GLuint index,
                                           GLsizei bufSize,
                                           GLsizei *length,
@@ -6867,13 +6887,13 @@
     mStateCache.onActiveTransformFeedbackChange(this);
 }
 
-void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
+void Context::getUniformuiv(ShaderProgramID program, GLint location, GLuint *params)
 {
     const Program *programObject = getProgramResolveLink(program);
     programObject->getUniformuiv(this, location, params);
 }
 
-void Context::getUniformuivRobust(GLuint program,
+void Context::getUniformuivRobust(ShaderProgramID program,
                                   GLint location,
                                   GLsizei bufSize,
                                   GLsizei *length,
@@ -6882,13 +6902,13 @@
     getUniformuiv(program, location, params);
 }
 
-GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
+GLint Context::getFragDataLocation(ShaderProgramID program, const GLchar *name)
 {
     const Program *programObject = getProgramResolveLink(program);
     return programObject->getFragDataLocation(name);
 }
 
-void Context::getUniformIndices(GLuint program,
+void Context::getUniformIndices(ShaderProgramID program,
                                 GLsizei uniformCount,
                                 const GLchar *const *uniformNames,
                                 GLuint *uniformIndices)
@@ -6910,7 +6930,7 @@
     }
 }
 
-void Context::getActiveUniformsiv(GLuint program,
+void Context::getActiveUniformsiv(ShaderProgramID program,
                                   GLsizei uniformCount,
                                   const GLuint *uniformIndices,
                                   GLenum pname,
@@ -6924,13 +6944,13 @@
     }
 }
 
-GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+GLuint Context::getUniformBlockIndex(ShaderProgramID program, const GLchar *uniformBlockName)
 {
     const Program *programObject = getProgramResolveLink(program);
     return programObject->getUniformBlockIndex(uniformBlockName);
 }
 
-void Context::getActiveUniformBlockiv(GLuint program,
+void Context::getActiveUniformBlockiv(ShaderProgramID program,
                                       GLuint uniformBlockIndex,
                                       GLenum pname,
                                       GLint *params)
@@ -6939,7 +6959,7 @@
     QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
 }
 
-void Context::getActiveUniformBlockivRobust(GLuint program,
+void Context::getActiveUniformBlockivRobust(ShaderProgramID program,
                                             GLuint uniformBlockIndex,
                                             GLenum pname,
                                             GLsizei bufSize,
@@ -6949,7 +6969,7 @@
     getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
 }
 
-void Context::getActiveUniformBlockName(GLuint program,
+void Context::getActiveUniformBlockName(ShaderProgramID program,
                                         GLuint uniformBlockIndex,
                                         GLsizei bufSize,
                                         GLsizei *length,
@@ -6959,7 +6979,7 @@
     programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
 }
 
-void Context::uniformBlockBinding(GLuint program,
+void Context::uniformBlockBinding(ShaderProgramID program,
                                   GLuint uniformBlockIndex,
                                   GLuint uniformBlockBinding)
 {
@@ -7091,24 +7111,28 @@
     getInternalformativ(target, internalformat, pname, bufSize, params);
 }
 
-void Context::programUniform1i(GLuint program, GLint location, GLint v0)
+void Context::programUniform1i(ShaderProgramID program, GLint location, GLint v0)
 {
     programUniform1iv(program, location, 1, &v0);
 }
 
-void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+void Context::programUniform2i(ShaderProgramID program, GLint location, GLint v0, GLint v1)
 {
     GLint xy[2] = {v0, v1};
     programUniform2iv(program, location, 1, xy);
 }
 
-void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+void Context::programUniform3i(ShaderProgramID program,
+                               GLint location,
+                               GLint v0,
+                               GLint v1,
+                               GLint v2)
 {
     GLint xyz[3] = {v0, v1, v2};
     programUniform3iv(program, location, 1, xyz);
 }
 
-void Context::programUniform4i(GLuint program,
+void Context::programUniform4i(ShaderProgramID program,
                                GLint location,
                                GLint v0,
                                GLint v1,
@@ -7119,24 +7143,28 @@
     programUniform4iv(program, location, 1, xyzw);
 }
 
-void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
+void Context::programUniform1ui(ShaderProgramID program, GLint location, GLuint v0)
 {
     programUniform1uiv(program, location, 1, &v0);
 }
 
-void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+void Context::programUniform2ui(ShaderProgramID program, GLint location, GLuint v0, GLuint v1)
 {
     GLuint xy[2] = {v0, v1};
     programUniform2uiv(program, location, 1, xy);
 }
 
-void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+void Context::programUniform3ui(ShaderProgramID program,
+                                GLint location,
+                                GLuint v0,
+                                GLuint v1,
+                                GLuint v2)
 {
     GLuint xyz[3] = {v0, v1, v2};
     programUniform3uiv(program, location, 1, xyz);
 }
 
-void Context::programUniform4ui(GLuint program,
+void Context::programUniform4ui(ShaderProgramID program,
                                 GLint location,
                                 GLuint v0,
                                 GLuint v1,
@@ -7147,24 +7175,28 @@
     programUniform4uiv(program, location, 1, xyzw);
 }
 
-void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
+void Context::programUniform1f(ShaderProgramID program, GLint location, GLfloat v0)
 {
     programUniform1fv(program, location, 1, &v0);
 }
 
-void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+void Context::programUniform2f(ShaderProgramID program, GLint location, GLfloat v0, GLfloat v1)
 {
     GLfloat xy[2] = {v0, v1};
     programUniform2fv(program, location, 1, xy);
 }
 
-void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+void Context::programUniform3f(ShaderProgramID program,
+                               GLint location,
+                               GLfloat v0,
+                               GLfloat v1,
+                               GLfloat v2)
 {
     GLfloat xyz[3] = {v0, v1, v2};
     programUniform3fv(program, location, 1, xyz);
 }
 
-void Context::programUniform4f(GLuint program,
+void Context::programUniform4f(ShaderProgramID program,
                                GLint location,
                                GLfloat v0,
                                GLfloat v1,
@@ -7175,91 +7207,127 @@
     programUniform4fv(program, location, 1, xyzw);
 }
 
-void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+void Context::programUniform1iv(ShaderProgramID program,
+                                GLint location,
+                                GLsizei count,
+                                const GLint *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     setUniform1iImpl(programObject, location, count, value);
 }
 
-void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+void Context::programUniform2iv(ShaderProgramID program,
+                                GLint location,
+                                GLsizei count,
+                                const GLint *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform2iv(location, count, value);
 }
 
-void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+void Context::programUniform3iv(ShaderProgramID program,
+                                GLint location,
+                                GLsizei count,
+                                const GLint *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform3iv(location, count, value);
 }
 
-void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+void Context::programUniform4iv(ShaderProgramID program,
+                                GLint location,
+                                GLsizei count,
+                                const GLint *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform4iv(location, count, value);
 }
 
-void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+void Context::programUniform1uiv(ShaderProgramID program,
+                                 GLint location,
+                                 GLsizei count,
+                                 const GLuint *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform1uiv(location, count, value);
 }
 
-void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+void Context::programUniform2uiv(ShaderProgramID program,
+                                 GLint location,
+                                 GLsizei count,
+                                 const GLuint *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform2uiv(location, count, value);
 }
 
-void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+void Context::programUniform3uiv(ShaderProgramID program,
+                                 GLint location,
+                                 GLsizei count,
+                                 const GLuint *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform3uiv(location, count, value);
 }
 
-void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+void Context::programUniform4uiv(ShaderProgramID program,
+                                 GLint location,
+                                 GLsizei count,
+                                 const GLuint *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform4uiv(location, count, value);
 }
 
-void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+void Context::programUniform1fv(ShaderProgramID program,
+                                GLint location,
+                                GLsizei count,
+                                const GLfloat *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform1fv(location, count, value);
 }
 
-void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+void Context::programUniform2fv(ShaderProgramID program,
+                                GLint location,
+                                GLsizei count,
+                                const GLfloat *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform2fv(location, count, value);
 }
 
-void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+void Context::programUniform3fv(ShaderProgramID program,
+                                GLint location,
+                                GLsizei count,
+                                const GLfloat *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform3fv(location, count, value);
 }
 
-void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+void Context::programUniform4fv(ShaderProgramID program,
+                                GLint location,
+                                GLsizei count,
+                                const GLfloat *value)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
     programObject->setUniform4fv(location, count, value);
 }
 
-void Context::programUniformMatrix2fv(GLuint program,
+void Context::programUniformMatrix2fv(ShaderProgramID program,
                                       GLint location,
                                       GLsizei count,
                                       GLboolean transpose,
@@ -7270,7 +7338,7 @@
     programObject->setUniformMatrix2fv(location, count, transpose, value);
 }
 
-void Context::programUniformMatrix3fv(GLuint program,
+void Context::programUniformMatrix3fv(ShaderProgramID program,
                                       GLint location,
                                       GLsizei count,
                                       GLboolean transpose,
@@ -7281,7 +7349,7 @@
     programObject->setUniformMatrix3fv(location, count, transpose, value);
 }
 
-void Context::programUniformMatrix4fv(GLuint program,
+void Context::programUniformMatrix4fv(ShaderProgramID program,
                                       GLint location,
                                       GLsizei count,
                                       GLboolean transpose,
@@ -7292,7 +7360,7 @@
     programObject->setUniformMatrix4fv(location, count, transpose, value);
 }
 
-void Context::programUniformMatrix2x3fv(GLuint program,
+void Context::programUniformMatrix2x3fv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -7303,7 +7371,7 @@
     programObject->setUniformMatrix2x3fv(location, count, transpose, value);
 }
 
-void Context::programUniformMatrix3x2fv(GLuint program,
+void Context::programUniformMatrix3x2fv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -7314,7 +7382,7 @@
     programObject->setUniformMatrix3x2fv(location, count, transpose, value);
 }
 
-void Context::programUniformMatrix2x4fv(GLuint program,
+void Context::programUniformMatrix2x4fv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -7325,7 +7393,7 @@
     programObject->setUniformMatrix2x4fv(location, count, transpose, value);
 }
 
-void Context::programUniformMatrix4x2fv(GLuint program,
+void Context::programUniformMatrix4x2fv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -7336,7 +7404,7 @@
     programObject->setUniformMatrix4x2fv(location, count, transpose, value);
 }
 
-void Context::programUniformMatrix3x4fv(GLuint program,
+void Context::programUniformMatrix3x4fv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -7347,7 +7415,7 @@
     programObject->setUniformMatrix3x4fv(location, count, transpose, value);
 }
 
-void Context::programUniformMatrix4x3fv(GLuint program,
+void Context::programUniformMatrix4x3fv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -7434,7 +7502,7 @@
     }
 }
 
-void Context::getTranslatedShaderSource(GLuint shader,
+void Context::getTranslatedShaderSource(ShaderProgramID shader,
                                         GLsizei bufsize,
                                         GLsizei *length,
                                         GLchar *source)
@@ -7444,7 +7512,10 @@
     shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
 }
 
-void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
+void Context::getnUniformfv(ShaderProgramID program,
+                            GLint location,
+                            GLsizei bufSize,
+                            GLfloat *params)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
@@ -7452,7 +7523,7 @@
     programObject->getUniformfv(this, location, params);
 }
 
-void Context::getnUniformfvRobust(GLuint program,
+void Context::getnUniformfvRobust(ShaderProgramID program,
                                   GLint location,
                                   GLsizei bufSize,
                                   GLsizei *length,
@@ -7461,7 +7532,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
+void Context::getnUniformiv(ShaderProgramID program, GLint location, GLsizei bufSize, GLint *params)
 {
     Program *programObject = getProgramResolveLink(program);
     ASSERT(programObject);
@@ -7469,7 +7540,7 @@
     programObject->getUniformiv(this, location, params);
 }
 
-void Context::getnUniformivRobust(GLuint program,
+void Context::getnUniformivRobust(ShaderProgramID program,
                                   GLint location,
                                   GLsizei bufSize,
                                   GLsizei *length,
@@ -7478,7 +7549,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::getnUniformuivRobust(GLuint program,
+void Context::getnUniformuivRobust(ShaderProgramID program,
                                    GLint location,
                                    GLsizei bufSize,
                                    GLsizei *length,
@@ -8586,12 +8657,12 @@
     return false;
 }
 
-Program *Context::getProgramNoResolveLink(GLuint handle) const
+Program *Context::getProgramNoResolveLink(ShaderProgramID handle) const
 {
     return mState.mShaderProgramManager->getProgram(handle);
 }
 
-Shader *Context::getShader(GLuint handle) const
+Shader *Context::getShader(ShaderProgramID handle) const
 {
     return mState.mShaderProgramManager->getShader(handle);
 }
diff --git a/src/libANGLE/Context.h b/src/libANGLE/Context.h
index 24441bb..26d5951 100644
--- a/src/libANGLE/Context.h
+++ b/src/libANGLE/Context.h
@@ -407,7 +407,7 @@
     GLuint createFramebuffer();
     void deleteFramebuffer(GLuint framebuffer);
 
-    bool hasActiveTransformFeedback(GLuint program) const;
+    bool hasActiveTransformFeedback(ShaderProgramID program) const;
 
     // GL emulation: Interface to entry points
     ANGLE_GL_1_0_CONTEXT_API
@@ -511,7 +511,7 @@
     bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams) const;
     bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams) const;
 
-    ANGLE_INLINE Program *getProgramResolveLink(GLuint handle) const
+    ANGLE_INLINE Program *getProgramResolveLink(ShaderProgramID handle) const
     {
         Program *program = mState.mShaderProgramManager->getProgram(handle);
         if (program)
@@ -521,8 +521,8 @@
         return program;
     }
 
-    Program *getProgramNoResolveLink(GLuint handle) const;
-    Shader *getShader(GLuint handle) const;
+    Program *getProgramNoResolveLink(ShaderProgramID handle) const;
+    Shader *getShader(ShaderProgramID handle) const;
 
     ANGLE_INLINE bool isTextureGenerated(TextureID texture) const
     {
diff --git a/src/libANGLE/Context_gl.cpp b/src/libANGLE/Context_gl.cpp
index e14ffa9..09b4b12 100644
--- a/src/libANGLE/Context_gl.cpp
+++ b/src/libANGLE/Context_gl.cpp
@@ -485,7 +485,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::getActiveUniformName(GLuint program,
+void Context::getActiveUniformName(ShaderProgramID program,
                                    GLuint uniformIndex,
                                    GLsizei bufSize,
                                    GLsizei *length,
@@ -2307,7 +2307,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::getActiveSubroutineName(GLuint program,
+void Context::getActiveSubroutineName(ShaderProgramID program,
                                       GLenum shadertype,
                                       GLuint index,
                                       GLsizei bufsize,
@@ -2317,7 +2317,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::getActiveSubroutineUniformName(GLuint program,
+void Context::getActiveSubroutineUniformName(ShaderProgramID program,
                                              GLenum shadertype,
                                              GLuint index,
                                              GLsizei bufsize,
@@ -2327,7 +2327,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::getActiveSubroutineUniformiv(GLuint program,
+void Context::getActiveSubroutineUniformiv(ShaderProgramID program,
                                            GLenum shadertype,
                                            GLuint index,
                                            GLenum pname,
@@ -2336,7 +2336,10 @@
     UNIMPLEMENTED();
 }
 
-void Context::getProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+void Context::getProgramStageiv(ShaderProgramID program,
+                                GLenum shadertype,
+                                GLenum pname,
+                                GLint *values)
 {
     UNIMPLEMENTED();
 }
@@ -2346,13 +2349,15 @@
     UNIMPLEMENTED();
 }
 
-GLuint Context::getSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+GLuint Context::getSubroutineIndex(ShaderProgramID program, GLenum shadertype, const GLchar *name)
 {
     UNIMPLEMENTED();
     return 0;
 }
 
-GLint Context::getSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+GLint Context::getSubroutineUniformLocation(ShaderProgramID program,
+                                            GLenum shadertype,
+                                            const GLchar *name)
 {
     UNIMPLEMENTED();
     return 0;
@@ -2363,7 +2368,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::getUniformdv(GLuint program, GLint location, GLdouble *params)
+void Context::getUniformdv(ShaderProgramID program, GLint location, GLdouble *params)
 {
     UNIMPLEMENTED();
 }
@@ -2525,12 +2530,12 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniform1d(GLuint program, GLint location, GLdouble v0)
+void Context::programUniform1d(ShaderProgramID program, GLint location, GLdouble v0)
 {
     UNIMPLEMENTED();
 }
 
-void Context::programUniform1dv(GLuint program,
+void Context::programUniform1dv(ShaderProgramID program,
                                 GLint location,
                                 GLsizei count,
                                 const GLdouble *value)
@@ -2538,12 +2543,12 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+void Context::programUniform2d(ShaderProgramID program, GLint location, GLdouble v0, GLdouble v1)
 {
     UNIMPLEMENTED();
 }
 
-void Context::programUniform2dv(GLuint program,
+void Context::programUniform2dv(ShaderProgramID program,
                                 GLint location,
                                 GLsizei count,
                                 const GLdouble *value)
@@ -2551,7 +2556,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniform3d(GLuint program,
+void Context::programUniform3d(ShaderProgramID program,
                                GLint location,
                                GLdouble v0,
                                GLdouble v1,
@@ -2560,7 +2565,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniform3dv(GLuint program,
+void Context::programUniform3dv(ShaderProgramID program,
                                 GLint location,
                                 GLsizei count,
                                 const GLdouble *value)
@@ -2568,7 +2573,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniform4d(GLuint program,
+void Context::programUniform4d(ShaderProgramID program,
                                GLint location,
                                GLdouble v0,
                                GLdouble v1,
@@ -2578,7 +2583,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniform4dv(GLuint program,
+void Context::programUniform4dv(ShaderProgramID program,
                                 GLint location,
                                 GLsizei count,
                                 const GLdouble *value)
@@ -2586,7 +2591,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniformMatrix2dv(GLuint program,
+void Context::programUniformMatrix2dv(ShaderProgramID program,
                                       GLint location,
                                       GLsizei count,
                                       GLboolean transpose,
@@ -2595,7 +2600,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniformMatrix2x3dv(GLuint program,
+void Context::programUniformMatrix2x3dv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -2604,7 +2609,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniformMatrix2x4dv(GLuint program,
+void Context::programUniformMatrix2x4dv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -2613,7 +2618,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniformMatrix3dv(GLuint program,
+void Context::programUniformMatrix3dv(ShaderProgramID program,
                                       GLint location,
                                       GLsizei count,
                                       GLboolean transpose,
@@ -2622,7 +2627,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniformMatrix3x2dv(GLuint program,
+void Context::programUniformMatrix3x2dv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -2631,7 +2636,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniformMatrix3x4dv(GLuint program,
+void Context::programUniformMatrix3x4dv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -2640,7 +2645,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniformMatrix4dv(GLuint program,
+void Context::programUniformMatrix4dv(ShaderProgramID program,
                                       GLint location,
                                       GLsizei count,
                                       GLboolean transpose,
@@ -2649,7 +2654,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniformMatrix4x2dv(GLuint program,
+void Context::programUniformMatrix4x2dv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -2658,7 +2663,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::programUniformMatrix4x3dv(GLuint program,
+void Context::programUniformMatrix4x3dv(ShaderProgramID program,
                                         GLint location,
                                         GLsizei count,
                                         GLboolean transpose,
@@ -2769,7 +2774,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::getActiveAtomicCounterBufferiv(GLuint program,
+void Context::getActiveAtomicCounterBufferiv(ShaderProgramID program,
                                              GLuint bufferIndex,
                                              GLenum pname,
                                              GLint *params)
@@ -2869,7 +2874,7 @@
     UNIMPLEMENTED();
 }
 
-void Context::shaderStorageBlockBinding(GLuint program,
+void Context::shaderStorageBlockBinding(ShaderProgramID program,
                                         GLuint storageBlockIndex,
                                         GLuint storageBlockBinding)
 {
@@ -3480,12 +3485,18 @@
     UNIMPLEMENTED();
 }
 
-void Context::getnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params)
+void Context::getnUniformdv(ShaderProgramID program,
+                            GLint location,
+                            GLsizei bufSize,
+                            GLdouble *params)
 {
     UNIMPLEMENTED();
 }
 
-void Context::getnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params)
+void Context::getnUniformuiv(ShaderProgramID program,
+                             GLint location,
+                             GLsizei bufSize,
+                             GLuint *params)
 {
     UNIMPLEMENTED();
 }
diff --git a/src/libANGLE/Context_gl_3_1_autogen.h b/src/libANGLE/Context_gl_3_1_autogen.h
index dce54fe..c6ef505 100644
--- a/src/libANGLE/Context_gl_3_1_autogen.h
+++ b/src/libANGLE/Context_gl_3_1_autogen.h
@@ -10,10 +10,10 @@
 #ifndef ANGLE_CONTEXT_GL_3_1_AUTOGEN_H_
 #define ANGLE_CONTEXT_GL_3_1_AUTOGEN_H_
 
-#define ANGLE_GL_3_1_CONTEXT_API                                                    \
-    void getActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, \
-                              GLsizei *length, GLchar *uniformName);                \
-    void primitiveRestartIndex(GLuint index);                                       \
+#define ANGLE_GL_3_1_CONTEXT_API                                                                   \
+    void getActiveUniformName(ShaderProgramID programPacked, GLuint uniformIndex, GLsizei bufSize, \
+                              GLsizei *length, GLchar *uniformName);                               \
+    void primitiveRestartIndex(GLuint index);                                                      \
     void texBuffer(GLenum target, GLenum internalformat, BufferID bufferPacked);
 
 #endif  // ANGLE_CONTEXT_API_3_1_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_0_autogen.h b/src/libANGLE/Context_gl_4_0_autogen.h
index ee7b5e3..9d92cf7 100644
--- a/src/libANGLE/Context_gl_4_0_autogen.h
+++ b/src/libANGLE/Context_gl_4_0_autogen.h
@@ -10,57 +10,61 @@
 #ifndef ANGLE_CONTEXT_GL_4_0_AUTOGEN_H_
 #define ANGLE_CONTEXT_GL_4_0_AUTOGEN_H_
 
-#define ANGLE_GL_4_0_CONTEXT_API                                                                   \
-    void beginQueryIndexed(GLenum target, GLuint index, QueryID idPacked);                         \
-    void blendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);                     \
-    void blendEquationi(GLuint buf, GLenum mode);                                                  \
-    void blendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha,             \
-                            GLenum dstAlpha);                                                      \
-    void blendFunci(GLuint buf, GLenum src, GLenum dst);                                           \
-    void drawTransformFeedback(GLenum mode, GLuint id);                                            \
-    void drawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);                       \
-    void endQueryIndexed(GLenum target, GLuint index);                                             \
-    void getActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, \
-                                 GLsizei *length, GLchar *name);                                   \
-    void getActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index,           \
-                                        GLsizei bufsize, GLsizei *length, GLchar *name);           \
-    void getActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index,             \
-                                      GLenum pname, GLint *values);                                \
-    void getProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);        \
-    void getQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);              \
-    GLuint getSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);              \
-    GLint getSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);     \
-    void getUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);               \
-    void getUniformdv(GLuint program, GLint location, GLdouble *params);                           \
-    void minSampleShading(GLfloat value);                                                          \
-    void patchParameterfv(GLenum pname, const GLfloat *values);                                    \
-    void patchParameteri(GLenum pname, GLint value);                                               \
-    void uniform1d(GLint location, GLdouble x);                                                    \
-    void uniform1dv(GLint location, GLsizei count, const GLdouble *value);                         \
-    void uniform2d(GLint location, GLdouble x, GLdouble y);                                        \
-    void uniform2dv(GLint location, GLsizei count, const GLdouble *value);                         \
-    void uniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);                            \
-    void uniform3dv(GLint location, GLsizei count, const GLdouble *value);                         \
-    void uniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);                \
-    void uniform4dv(GLint location, GLsizei count, const GLdouble *value);                         \
-    void uniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose,                      \
-                          const GLdouble *value);                                                  \
-    void uniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose,                    \
-                            const GLdouble *value);                                                \
-    void uniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose,                    \
-                            const GLdouble *value);                                                \
-    void uniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose,                      \
-                          const GLdouble *value);                                                  \
-    void uniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose,                    \
-                            const GLdouble *value);                                                \
-    void uniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose,                    \
-                            const GLdouble *value);                                                \
-    void uniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose,                      \
-                          const GLdouble *value);                                                  \
-    void uniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose,                    \
-                            const GLdouble *value);                                                \
-    void uniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose,                    \
-                            const GLdouble *value);                                                \
+#define ANGLE_GL_4_0_CONTEXT_API                                                                 \
+    void beginQueryIndexed(GLenum target, GLuint index, QueryID idPacked);                       \
+    void blendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);                   \
+    void blendEquationi(GLuint buf, GLenum mode);                                                \
+    void blendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha,           \
+                            GLenum dstAlpha);                                                    \
+    void blendFunci(GLuint buf, GLenum src, GLenum dst);                                         \
+    void drawTransformFeedback(GLenum mode, GLuint id);                                          \
+    void drawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);                     \
+    void endQueryIndexed(GLenum target, GLuint index);                                           \
+    void getActiveSubroutineName(ShaderProgramID programPacked, GLenum shadertype, GLuint index, \
+                                 GLsizei bufsize, GLsizei *length, GLchar *name);                \
+    void getActiveSubroutineUniformName(ShaderProgramID programPacked, GLenum shadertype,        \
+                                        GLuint index, GLsizei bufsize, GLsizei *length,          \
+                                        GLchar *name);                                           \
+    void getActiveSubroutineUniformiv(ShaderProgramID programPacked, GLenum shadertype,          \
+                                      GLuint index, GLenum pname, GLint *values);                \
+    void getProgramStageiv(ShaderProgramID programPacked, GLenum shadertype, GLenum pname,       \
+                           GLint *values);                                                       \
+    void getQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);            \
+    GLuint getSubroutineIndex(ShaderProgramID programPacked, GLenum shadertype,                  \
+                              const GLchar *name);                                               \
+    GLint getSubroutineUniformLocation(ShaderProgramID programPacked, GLenum shadertype,         \
+                                       const GLchar *name);                                      \
+    void getUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);             \
+    void getUniformdv(ShaderProgramID programPacked, GLint location, GLdouble *params);          \
+    void minSampleShading(GLfloat value);                                                        \
+    void patchParameterfv(GLenum pname, const GLfloat *values);                                  \
+    void patchParameteri(GLenum pname, GLint value);                                             \
+    void uniform1d(GLint location, GLdouble x);                                                  \
+    void uniform1dv(GLint location, GLsizei count, const GLdouble *value);                       \
+    void uniform2d(GLint location, GLdouble x, GLdouble y);                                      \
+    void uniform2dv(GLint location, GLsizei count, const GLdouble *value);                       \
+    void uniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);                          \
+    void uniform3dv(GLint location, GLsizei count, const GLdouble *value);                       \
+    void uniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);              \
+    void uniform4dv(GLint location, GLsizei count, const GLdouble *value);                       \
+    void uniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose,                    \
+                          const GLdouble *value);                                                \
+    void uniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose,                  \
+                            const GLdouble *value);                                              \
+    void uniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose,                  \
+                            const GLdouble *value);                                              \
+    void uniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose,                    \
+                          const GLdouble *value);                                                \
+    void uniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose,                  \
+                            const GLdouble *value);                                              \
+    void uniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose,                  \
+                            const GLdouble *value);                                              \
+    void uniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose,                    \
+                          const GLdouble *value);                                                \
+    void uniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose,                  \
+                            const GLdouble *value);                                              \
+    void uniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose,                  \
+                            const GLdouble *value);                                              \
     void uniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
 
 #endif  // ANGLE_CONTEXT_API_4_0_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_1_autogen.h b/src/libANGLE/Context_gl_4_1_autogen.h
index 7a1eab2..8725a71 100644
--- a/src/libANGLE/Context_gl_4_1_autogen.h
+++ b/src/libANGLE/Context_gl_4_1_autogen.h
@@ -10,54 +10,60 @@
 #ifndef ANGLE_CONTEXT_GL_4_1_AUTOGEN_H_
 #define ANGLE_CONTEXT_GL_4_1_AUTOGEN_H_
 
-#define ANGLE_GL_4_1_CONTEXT_API                                                                  \
-    void depthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);                        \
-    void depthRangeIndexed(GLuint index, GLdouble n, GLdouble f);                                 \
-    void getDoublei_v(GLenum target, GLuint index, GLdouble *data);                               \
-    void getFloati_v(GLenum target, GLuint index, GLfloat *data);                                 \
-    void getVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);                        \
-    void programUniform1d(GLuint program, GLint location, GLdouble v0);                           \
-    void programUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value); \
-    void programUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);              \
-    void programUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value); \
-    void programUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); \
-    void programUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value); \
-    void programUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2,  \
-                          GLdouble v3);                                                           \
-    void programUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value); \
-    void programUniformMatrix2dv(GLuint program, GLint location, GLsizei count,                   \
-                                 GLboolean transpose, const GLdouble *value);                     \
-    void programUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count,                 \
-                                   GLboolean transpose, const GLdouble *value);                   \
-    void programUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count,                 \
-                                   GLboolean transpose, const GLdouble *value);                   \
-    void programUniformMatrix3dv(GLuint program, GLint location, GLsizei count,                   \
-                                 GLboolean transpose, const GLdouble *value);                     \
-    void programUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count,                 \
-                                   GLboolean transpose, const GLdouble *value);                   \
-    void programUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count,                 \
-                                   GLboolean transpose, const GLdouble *value);                   \
-    void programUniformMatrix4dv(GLuint program, GLint location, GLsizei count,                   \
-                                 GLboolean transpose, const GLdouble *value);                     \
-    void programUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count,                 \
-                                   GLboolean transpose, const GLdouble *value);                   \
-    void programUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count,                 \
-                                   GLboolean transpose, const GLdouble *value);                   \
-    void scissorArrayv(GLuint first, GLsizei count, const GLint *v);                              \
-    void scissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);   \
-    void scissorIndexedv(GLuint index, const GLint *v);                                           \
-    void vertexAttribL1d(GLuint index, GLdouble x);                                               \
-    void vertexAttribL1dv(GLuint index, const GLdouble *v);                                       \
-    void vertexAttribL2d(GLuint index, GLdouble x, GLdouble y);                                   \
-    void vertexAttribL2dv(GLuint index, const GLdouble *v);                                       \
-    void vertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);                       \
-    void vertexAttribL3dv(GLuint index, const GLdouble *v);                                       \
-    void vertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);           \
-    void vertexAttribL4dv(GLuint index, const GLdouble *v);                                       \
-    void vertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride,              \
-                              const void *pointer);                                               \
-    void viewportArrayv(GLuint first, GLsizei count, const GLfloat *v);                           \
-    void viewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);              \
+#define ANGLE_GL_4_1_CONTEXT_API                                                                   \
+    void depthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);                         \
+    void depthRangeIndexed(GLuint index, GLdouble n, GLdouble f);                                  \
+    void getDoublei_v(GLenum target, GLuint index, GLdouble *data);                                \
+    void getFloati_v(GLenum target, GLuint index, GLfloat *data);                                  \
+    void getVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);                         \
+    void programUniform1d(ShaderProgramID programPacked, GLint location, GLdouble v0);             \
+    void programUniform1dv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLdouble *value);                                                 \
+    void programUniform2d(ShaderProgramID programPacked, GLint location, GLdouble v0,              \
+                          GLdouble v1);                                                            \
+    void programUniform2dv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLdouble *value);                                                 \
+    void programUniform3d(ShaderProgramID programPacked, GLint location, GLdouble v0, GLdouble v1, \
+                          GLdouble v2);                                                            \
+    void programUniform3dv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLdouble *value);                                                 \
+    void programUniform4d(ShaderProgramID programPacked, GLint location, GLdouble v0, GLdouble v1, \
+                          GLdouble v2, GLdouble v3);                                               \
+    void programUniform4dv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLdouble *value);                                                 \
+    void programUniformMatrix2dv(ShaderProgramID programPacked, GLint location, GLsizei count,     \
+                                 GLboolean transpose, const GLdouble *value);                      \
+    void programUniformMatrix2x3dv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
+                                   GLboolean transpose, const GLdouble *value);                    \
+    void programUniformMatrix2x4dv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
+                                   GLboolean transpose, const GLdouble *value);                    \
+    void programUniformMatrix3dv(ShaderProgramID programPacked, GLint location, GLsizei count,     \
+                                 GLboolean transpose, const GLdouble *value);                      \
+    void programUniformMatrix3x2dv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
+                                   GLboolean transpose, const GLdouble *value);                    \
+    void programUniformMatrix3x4dv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
+                                   GLboolean transpose, const GLdouble *value);                    \
+    void programUniformMatrix4dv(ShaderProgramID programPacked, GLint location, GLsizei count,     \
+                                 GLboolean transpose, const GLdouble *value);                      \
+    void programUniformMatrix4x2dv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
+                                   GLboolean transpose, const GLdouble *value);                    \
+    void programUniformMatrix4x3dv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
+                                   GLboolean transpose, const GLdouble *value);                    \
+    void scissorArrayv(GLuint first, GLsizei count, const GLint *v);                               \
+    void scissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);    \
+    void scissorIndexedv(GLuint index, const GLint *v);                                            \
+    void vertexAttribL1d(GLuint index, GLdouble x);                                                \
+    void vertexAttribL1dv(GLuint index, const GLdouble *v);                                        \
+    void vertexAttribL2d(GLuint index, GLdouble x, GLdouble y);                                    \
+    void vertexAttribL2dv(GLuint index, const GLdouble *v);                                        \
+    void vertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);                        \
+    void vertexAttribL3dv(GLuint index, const GLdouble *v);                                        \
+    void vertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);            \
+    void vertexAttribL4dv(GLuint index, const GLdouble *v);                                        \
+    void vertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride,               \
+                              const void *pointer);                                                \
+    void viewportArrayv(GLuint first, GLsizei count, const GLfloat *v);                            \
+    void viewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);               \
     void viewportIndexedfv(GLuint index, const GLfloat *v);
 
 #endif  // ANGLE_CONTEXT_API_4_1_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_2_autogen.h b/src/libANGLE/Context_gl_4_2_autogen.h
index 751c0f6..9a2490a 100644
--- a/src/libANGLE/Context_gl_4_2_autogen.h
+++ b/src/libANGLE/Context_gl_4_2_autogen.h
@@ -10,14 +10,14 @@
 #ifndef ANGLE_CONTEXT_GL_4_2_AUTOGEN_H_
 #define ANGLE_CONTEXT_GL_4_2_AUTOGEN_H_
 
-#define ANGLE_GL_4_2_CONTEXT_API                                                          \
-    void drawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type,       \
-                                           const void *indices, GLsizei instancecount,    \
-                                           GLuint baseinstance);                          \
-    void drawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);   \
-    void drawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream,      \
-                                              GLsizei instancecount);                     \
-    void getActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, \
-                                        GLint *params);
+#define ANGLE_GL_4_2_CONTEXT_API                                                           \
+    void drawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type,        \
+                                           const void *indices, GLsizei instancecount,     \
+                                           GLuint baseinstance);                           \
+    void drawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);    \
+    void drawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream,       \
+                                              GLsizei instancecount);                      \
+    void getActiveAtomicCounterBufferiv(ShaderProgramID programPacked, GLuint bufferIndex, \
+                                        GLenum pname, GLint *params);
 
 #endif  // ANGLE_CONTEXT_API_4_2_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_3_autogen.h b/src/libANGLE/Context_gl_4_3_autogen.h
index 2ab51d4..2ad6fc2 100644
--- a/src/libANGLE/Context_gl_4_3_autogen.h
+++ b/src/libANGLE/Context_gl_4_3_autogen.h
@@ -30,7 +30,7 @@
                                  GLsizei stride);                                                  \
     void multiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect,                 \
                                    GLsizei drawcount, GLsizei stride);                             \
-    void shaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex,                       \
+    void shaderStorageBlockBinding(ShaderProgramID programPacked, GLuint storageBlockIndex,        \
                                    GLuint storageBlockBinding);                                    \
     void texBufferRange(GLenum target, GLenum internalformat, BufferID bufferPacked,               \
                         GLintptr offset, GLsizeiptr size);                                         \
diff --git a/src/libANGLE/Context_gl_4_5_autogen.h b/src/libANGLE/Context_gl_4_5_autogen.h
index 41b0f69..1e38bc2 100644
--- a/src/libANGLE/Context_gl_4_5_autogen.h
+++ b/src/libANGLE/Context_gl_4_5_autogen.h
@@ -119,8 +119,10 @@
                              void *row, GLsizei columnBufSize, void *column, void *span);          \
     void getnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize,     \
                       void *pixels);                                                               \
-    void getnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params);         \
-    void getnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params);          \
+    void getnUniformdv(ShaderProgramID programPacked, GLint location, GLsizei bufSize,             \
+                       GLdouble *params);                                                          \
+    void getnUniformuiv(ShaderProgramID programPacked, GLint location, GLsizei bufSize,            \
+                        GLuint *params);                                                           \
     void invalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments,                \
                                         const GLenum *attachments);                                \
     void invalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments,             \
diff --git a/src/libANGLE/Context_gles_2_0_autogen.h b/src/libANGLE/Context_gles_2_0_autogen.h
index 7460e59..3e0f91c 100644
--- a/src/libANGLE/Context_gles_2_0_autogen.h
+++ b/src/libANGLE/Context_gles_2_0_autogen.h
@@ -12,8 +12,8 @@
 
 #define ANGLE_GLES_2_0_CONTEXT_API                                                                 \
     void activeTexture(GLenum texture);                                                            \
-    void attachShader(GLuint program, GLuint shader);                                              \
-    void bindAttribLocation(GLuint program, GLuint index, const GLchar *name);                     \
+    void attachShader(ShaderProgramID programPacked, ShaderProgramID shaderPacked);                \
+    void bindAttribLocation(ShaderProgramID programPacked, GLuint index, const GLchar *name);      \
     void bindBuffer(BufferBinding targetPacked, BufferID bufferPacked);                            \
     void bindFramebuffer(GLenum target, GLuint framebuffer);                                       \
     void bindRenderbuffer(GLenum target, RenderbufferID renderbufferPacked);                       \
@@ -34,7 +34,7 @@
     void clearDepthf(GLfloat d);                                                                   \
     void clearStencil(GLint s);                                                                    \
     void colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);               \
-    void compileShader(GLuint shader);                                                             \
+    void compileShader(ShaderProgramID shaderPacked);                                              \
     void compressedTexImage2D(TextureTarget targetPacked, GLint level, GLenum internalformat,      \
                               GLsizei width, GLsizei height, GLint border, GLsizei imageSize,      \
                               const void *data);                                                   \
@@ -50,14 +50,14 @@
     void cullFace(CullFaceMode modePacked);                                                        \
     void deleteBuffers(GLsizei n, const BufferID *buffersPacked);                                  \
     void deleteFramebuffers(GLsizei n, const GLuint *framebuffers);                                \
-    void deleteProgram(GLuint program);                                                            \
+    void deleteProgram(ShaderProgramID programPacked);                                             \
     void deleteRenderbuffers(GLsizei n, const RenderbufferID *renderbuffersPacked);                \
-    void deleteShader(GLuint shader);                                                              \
+    void deleteShader(ShaderProgramID shaderPacked);                                               \
     void deleteTextures(GLsizei n, const TextureID *texturesPacked);                               \
     void depthFunc(GLenum func);                                                                   \
     void depthMask(GLboolean flag);                                                                \
     void depthRangef(GLfloat n, GLfloat f);                                                        \
-    void detachShader(GLuint program, GLuint shader);                                              \
+    void detachShader(ShaderProgramID programPacked, ShaderProgramID shaderPacked);                \
     void disable(GLenum cap);                                                                      \
     void disableVertexAttribArray(GLuint index);                                                   \
     void drawArrays(PrimitiveMode modePacked, GLint first, GLsizei count);                         \
@@ -77,12 +77,13 @@
     void genRenderbuffers(GLsizei n, RenderbufferID *renderbuffersPacked);                         \
     void genTextures(GLsizei n, TextureID *texturesPacked);                                        \
     void generateMipmap(TextureType targetPacked);                                                 \
-    void getActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length,           \
-                         GLint *size, GLenum *type, GLchar *name);                                 \
-    void getActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length,          \
-                          GLint *size, GLenum *type, GLchar *name);                                \
-    void getAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);    \
-    GLint getAttribLocation(GLuint program, const GLchar *name);                                   \
+    void getActiveAttrib(ShaderProgramID programPacked, GLuint index, GLsizei bufSize,             \
+                         GLsizei *length, GLint *size, GLenum *type, GLchar *name);                \
+    void getActiveUniform(ShaderProgramID programPacked, GLuint index, GLsizei bufSize,            \
+                          GLsizei *length, GLint *size, GLenum *type, GLchar *name);               \
+    void getAttachedShaders(ShaderProgramID programPacked, GLsizei maxCount, GLsizei *count,       \
+                            ShaderProgramID *shadersPacked);                                       \
+    GLint getAttribLocation(ShaderProgramID programPacked, const GLchar *name);                    \
     void getBooleanv(GLenum pname, GLboolean *data);                                               \
     void getBufferParameteriv(BufferBinding targetPacked, GLenum pname, GLint *params);            \
     GLenum getError();                                                                             \
@@ -90,20 +91,23 @@
     void getFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname,       \
                                              GLint *params);                                       \
     void getIntegerv(GLenum pname, GLint *data);                                                   \
-    void getProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);     \
-    void getProgramiv(GLuint program, GLenum pname, GLint *params);                                \
+    void getProgramInfoLog(ShaderProgramID programPacked, GLsizei bufSize, GLsizei *length,        \
+                           GLchar *infoLog);                                                       \
+    void getProgramiv(ShaderProgramID programPacked, GLenum pname, GLint *params);                 \
     void getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);                   \
-    void getShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);       \
+    void getShaderInfoLog(ShaderProgramID shaderPacked, GLsizei bufSize, GLsizei *length,          \
+                          GLchar *infoLog);                                                        \
     void getShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range,           \
                                   GLint *precision);                                               \
-    void getShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);         \
-    void getShaderiv(GLuint shader, GLenum pname, GLint *params);                                  \
+    void getShaderSource(ShaderProgramID shaderPacked, GLsizei bufSize, GLsizei *length,           \
+                         GLchar *source);                                                          \
+    void getShaderiv(ShaderProgramID shaderPacked, GLenum pname, GLint *params);                   \
     const GLubyte *getString(GLenum name);                                                         \
     void getTexParameterfv(TextureType targetPacked, GLenum pname, GLfloat *params);               \
     void getTexParameteriv(TextureType targetPacked, GLenum pname, GLint *params);                 \
-    GLint getUniformLocation(GLuint program, const GLchar *name);                                  \
-    void getUniformfv(GLuint program, GLint location, GLfloat *params);                            \
-    void getUniformiv(GLuint program, GLint location, GLint *params);                              \
+    GLint getUniformLocation(ShaderProgramID programPacked, const GLchar *name);                   \
+    void getUniformfv(ShaderProgramID programPacked, GLint location, GLfloat *params);             \
+    void getUniformiv(ShaderProgramID programPacked, GLint location, GLint *params);               \
     void getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer);                      \
     void getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);                           \
     void getVertexAttribiv(GLuint index, GLenum pname, GLint *params);                             \
@@ -111,12 +115,12 @@
     GLboolean isBuffer(BufferID bufferPacked);                                                     \
     GLboolean isEnabled(GLenum cap);                                                               \
     GLboolean isFramebuffer(GLuint framebuffer);                                                   \
-    GLboolean isProgram(GLuint program);                                                           \
+    GLboolean isProgram(ShaderProgramID programPacked);                                            \
     GLboolean isRenderbuffer(RenderbufferID renderbufferPacked);                                   \
-    GLboolean isShader(GLuint shader);                                                             \
+    GLboolean isShader(ShaderProgramID shaderPacked);                                              \
     GLboolean isTexture(TextureID texturePacked);                                                  \
     void lineWidth(GLfloat width);                                                                 \
-    void linkProgram(GLuint program);                                                              \
+    void linkProgram(ShaderProgramID programPacked);                                               \
     void pixelStorei(GLenum pname, GLint param);                                                   \
     void polygonOffset(GLfloat factor, GLfloat units);                                             \
     void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,   \
@@ -125,9 +129,9 @@
     void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); \
     void sampleCoverage(GLfloat value, GLboolean invert);                                          \
     void scissor(GLint x, GLint y, GLsizei width, GLsizei height);                                 \
-    void shaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat,                   \
+    void shaderBinary(GLsizei count, const ShaderProgramID *shadersPacked, GLenum binaryformat,    \
                       const void *binary, GLsizei length);                                         \
-    void shaderSource(GLuint shader, GLsizei count, const GLchar *const *string,                   \
+    void shaderSource(ShaderProgramID shaderPacked, GLsizei count, const GLchar *const *string,    \
                       const GLint *length);                                                        \
     void stencilFunc(GLenum func, GLint ref, GLuint mask);                                         \
     void stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);                    \
@@ -166,8 +170,8 @@
                           const GLfloat *value);                                                   \
     void uniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose,                      \
                           const GLfloat *value);                                                   \
-    void useProgram(GLuint program);                                                               \
-    void validateProgram(GLuint program);                                                          \
+    void useProgram(ShaderProgramID programPacked);                                                \
+    void validateProgram(ShaderProgramID programPacked);                                           \
     void vertexAttrib1f(GLuint index, GLfloat x);                                                  \
     void vertexAttrib1fv(GLuint index, const GLfloat *v);                                          \
     void vertexAttrib2f(GLuint index, GLfloat x, GLfloat y);                                       \
diff --git a/src/libANGLE/Context_gles_3_0_autogen.h b/src/libANGLE/Context_gles_3_0_autogen.h
index 95b1abe..8eaa521 100644
--- a/src/libANGLE/Context_gles_3_0_autogen.h
+++ b/src/libANGLE/Context_gles_3_0_autogen.h
@@ -60,34 +60,34 @@
     void genSamplers(GLsizei count, SamplerID *samplersPacked);                                    \
     void genTransformFeedbacks(GLsizei n, GLuint *ids);                                            \
     void genVertexArrays(GLsizei n, GLuint *arrays);                                               \
-    void getActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize,      \
-                                   GLsizei *length, GLchar *uniformBlockName);                     \
-    void getActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname,           \
-                                 GLint *params);                                                   \
-    void getActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices,   \
-                             GLenum pname, GLint *params);                                         \
+    void getActiveUniformBlockName(ShaderProgramID programPacked, GLuint uniformBlockIndex,        \
+                                   GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);    \
+    void getActiveUniformBlockiv(ShaderProgramID programPacked, GLuint uniformBlockIndex,          \
+                                 GLenum pname, GLint *params);                                     \
+    void getActiveUniformsiv(ShaderProgramID programPacked, GLsizei uniformCount,                  \
+                             const GLuint *uniformIndices, GLenum pname, GLint *params);           \
     void getBufferParameteri64v(BufferBinding targetPacked, GLenum pname, GLint64 *params);        \
     void getBufferPointerv(BufferBinding targetPacked, GLenum pname, void **params);               \
-    GLint getFragDataLocation(GLuint program, const GLchar *name);                                 \
+    GLint getFragDataLocation(ShaderProgramID programPacked, const GLchar *name);                  \
     void getInteger64i_v(GLenum target, GLuint index, GLint64 *data);                              \
     void getInteger64v(GLenum pname, GLint64 *data);                                               \
     void getIntegeri_v(GLenum target, GLuint index, GLint *data);                                  \
     void getInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize,  \
                              GLint *params);                                                       \
-    void getProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat,  \
-                          void *binary);                                                           \
+    void getProgramBinary(ShaderProgramID programPacked, GLsizei bufSize, GLsizei *length,         \
+                          GLenum *binaryFormat, void *binary);                                     \
     void getQueryObjectuiv(QueryID idPacked, GLenum pname, GLuint *params);                        \
     void getQueryiv(QueryType targetPacked, GLenum pname, GLint *params);                          \
     void getSamplerParameterfv(SamplerID samplerPacked, GLenum pname, GLfloat *params);            \
     void getSamplerParameteriv(SamplerID samplerPacked, GLenum pname, GLint *params);              \
     const GLubyte *getStringi(GLenum name, GLuint index);                                          \
     void getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);    \
-    void getTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize,                \
+    void getTransformFeedbackVarying(ShaderProgramID programPacked, GLuint index, GLsizei bufSize, \
                                      GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);  \
-    GLuint getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);                   \
-    void getUniformIndices(GLuint program, GLsizei uniformCount,                                   \
+    GLuint getUniformBlockIndex(ShaderProgramID programPacked, const GLchar *uniformBlockName);    \
+    void getUniformIndices(ShaderProgramID programPacked, GLsizei uniformCount,                    \
                            const GLchar *const *uniformNames, GLuint *uniformIndices);             \
-    void getUniformuiv(GLuint program, GLint location, GLuint *params);                            \
+    void getUniformuiv(ShaderProgramID programPacked, GLint location, GLuint *params);             \
     void getVertexAttribIiv(GLuint index, GLenum pname, GLint *params);                            \
     void getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);                          \
     void invalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);  \
@@ -102,8 +102,9 @@
     void *mapBufferRange(BufferBinding targetPacked, GLintptr offset, GLsizeiptr length,           \
                          GLbitfield access);                                                       \
     void pauseTransformFeedback();                                                                 \
-    void programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);   \
-    void programParameteri(GLuint program, GLenum pname, GLint value);                             \
+    void programBinary(ShaderProgramID programPacked, GLenum binaryFormat, const void *binary,     \
+                       GLsizei length);                                                            \
+    void programParameteri(ShaderProgramID programPacked, GLenum pname, GLint value);              \
     void readBuffer(GLenum src);                                                                   \
     void renderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat,     \
                                         GLsizei width, GLsizei height);                            \
@@ -122,8 +123,8 @@
     void texSubImage3D(TextureTarget targetPacked, GLint level, GLint xoffset, GLint yoffset,      \
                        GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, \
                        GLenum type, const void *pixels);                                           \
-    void transformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const *varyings,   \
-                                   GLenum bufferMode);                                             \
+    void transformFeedbackVaryings(ShaderProgramID programPacked, GLsizei count,                   \
+                                   const GLchar *const *varyings, GLenum bufferMode);              \
     void uniform1ui(GLint location, GLuint v0);                                                    \
     void uniform1uiv(GLint location, GLsizei count, const GLuint *value);                          \
     void uniform2ui(GLint location, GLuint v0, GLuint v1);                                         \
@@ -132,7 +133,7 @@
     void uniform3uiv(GLint location, GLsizei count, const GLuint *value);                          \
     void uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);                   \
     void uniform4uiv(GLint location, GLsizei count, const GLuint *value);                          \
-    void uniformBlockBinding(GLuint program, GLuint uniformBlockIndex,                             \
+    void uniformBlockBinding(ShaderProgramID programPacked, GLuint uniformBlockIndex,              \
                              GLuint uniformBlockBinding);                                          \
     void uniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,                    \
                             const GLfloat *value);                                                 \
diff --git a/src/libANGLE/Context_gles_3_1_autogen.h b/src/libANGLE/Context_gles_3_1_autogen.h
index b1a351b..9f9730d 100644
--- a/src/libANGLE/Context_gles_3_1_autogen.h
+++ b/src/libANGLE/Context_gles_3_1_autogen.h
@@ -11,7 +11,7 @@
 #define ANGLE_CONTEXT_GLES_3_1_AUTOGEN_H_
 
 #define ANGLE_GLES_3_1_CONTEXT_API                                                                 \
-    void activeShaderProgram(ProgramPipelineID pipelinePacked, GLuint program);                    \
+    void activeShaderProgram(ProgramPipelineID pipelinePacked, ShaderProgramID programPacked);     \
     void bindImageTexture(GLuint unit, TextureID texturePacked, GLint level, GLboolean layered,    \
                           GLint layer, GLenum access, GLenum format);                              \
     void bindProgramPipeline(ProgramPipelineID pipelinePacked);                                    \
@@ -30,18 +30,20 @@
     void getBooleani_v(GLenum target, GLuint index, GLboolean *data);                              \
     void getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);                    \
     void getMultisamplefv(GLenum pname, GLuint index, GLfloat *val);                               \
-    void getProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname,              \
-                               GLint *params);                                                     \
+    void getProgramInterfaceiv(ShaderProgramID programPacked, GLenum programInterface,             \
+                               GLenum pname, GLint *params);                                       \
     void getProgramPipelineInfoLog(ProgramPipelineID pipelinePacked, GLsizei bufSize,              \
                                    GLsizei *length, GLchar *infoLog);                              \
     void getProgramPipelineiv(ProgramPipelineID pipelinePacked, GLenum pname, GLint *params);      \
-    GLuint getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);   \
-    GLint getProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name); \
-    void getProgramResourceName(GLuint program, GLenum programInterface, GLuint index,             \
-                                GLsizei bufSize, GLsizei *length, GLchar *name);                   \
-    void getProgramResourceiv(GLuint program, GLenum programInterface, GLuint index,               \
-                              GLsizei propCount, const GLenum *props, GLsizei bufSize,             \
-                              GLsizei *length, GLint *params);                                     \
+    GLuint getProgramResourceIndex(ShaderProgramID programPacked, GLenum programInterface,         \
+                                   const GLchar *name);                                            \
+    GLint getProgramResourceLocation(ShaderProgramID programPacked, GLenum programInterface,       \
+                                     const GLchar *name);                                          \
+    void getProgramResourceName(ShaderProgramID programPacked, GLenum programInterface,            \
+                                GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);     \
+    void getProgramResourceiv(ShaderProgramID programPacked, GLenum programInterface,              \
+                              GLuint index, GLsizei propCount, const GLenum *props,                \
+                              GLsizei bufSize, GLsizei *length, GLint *params);                    \
     void getTexLevelParameterfv(TextureTarget targetPacked, GLint level, GLenum pname,             \
                                 GLfloat *params);                                                  \
     void getTexLevelParameteriv(TextureTarget targetPacked, GLint level, GLenum pname,             \
@@ -49,54 +51,71 @@
     GLboolean isProgramPipeline(ProgramPipelineID pipelinePacked);                                 \
     void memoryBarrier(GLbitfield barriers);                                                       \
     void memoryBarrierByRegion(GLbitfield barriers);                                               \
-    void programUniform1f(GLuint program, GLint location, GLfloat v0);                             \
-    void programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);   \
-    void programUniform1i(GLuint program, GLint location, GLint v0);                               \
-    void programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);     \
-    void programUniform1ui(GLuint program, GLint location, GLuint v0);                             \
-    void programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);   \
-    void programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);                 \
-    void programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);   \
-    void programUniform2i(GLuint program, GLint location, GLint v0, GLint v1);                     \
-    void programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);     \
-    void programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);                  \
-    void programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);   \
-    void programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);     \
-    void programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);   \
-    void programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);           \
-    void programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);     \
-    void programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);       \
-    void programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);   \
-    void programUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2,      \
-                          GLfloat v3);                                                             \
-    void programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);   \
-    void programUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); \
-    void programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);     \
-    void programUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2,        \
-                           GLuint v3);                                                             \
-    void programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);   \
-    void programUniformMatrix2fv(GLuint program, GLint location, GLsizei count,                    \
+    void programUniform1f(ShaderProgramID programPacked, GLint location, GLfloat v0);              \
+    void programUniform1fv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLfloat *value);                                                  \
+    void programUniform1i(ShaderProgramID programPacked, GLint location, GLint v0);                \
+    void programUniform1iv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLint *value);                                                    \
+    void programUniform1ui(ShaderProgramID programPacked, GLint location, GLuint v0);              \
+    void programUniform1uiv(ShaderProgramID programPacked, GLint location, GLsizei count,          \
+                            const GLuint *value);                                                  \
+    void programUniform2f(ShaderProgramID programPacked, GLint location, GLfloat v0, GLfloat v1);  \
+    void programUniform2fv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLfloat *value);                                                  \
+    void programUniform2i(ShaderProgramID programPacked, GLint location, GLint v0, GLint v1);      \
+    void programUniform2iv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLint *value);                                                    \
+    void programUniform2ui(ShaderProgramID programPacked, GLint location, GLuint v0, GLuint v1);   \
+    void programUniform2uiv(ShaderProgramID programPacked, GLint location, GLsizei count,          \
+                            const GLuint *value);                                                  \
+    void programUniform3f(ShaderProgramID programPacked, GLint location, GLfloat v0, GLfloat v1,   \
+                          GLfloat v2);                                                             \
+    void programUniform3fv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLfloat *value);                                                  \
+    void programUniform3i(ShaderProgramID programPacked, GLint location, GLint v0, GLint v1,       \
+                          GLint v2);                                                               \
+    void programUniform3iv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLint *value);                                                    \
+    void programUniform3ui(ShaderProgramID programPacked, GLint location, GLuint v0, GLuint v1,    \
+                           GLuint v2);                                                             \
+    void programUniform3uiv(ShaderProgramID programPacked, GLint location, GLsizei count,          \
+                            const GLuint *value);                                                  \
+    void programUniform4f(ShaderProgramID programPacked, GLint location, GLfloat v0, GLfloat v1,   \
+                          GLfloat v2, GLfloat v3);                                                 \
+    void programUniform4fv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLfloat *value);                                                  \
+    void programUniform4i(ShaderProgramID programPacked, GLint location, GLint v0, GLint v1,       \
+                          GLint v2, GLint v3);                                                     \
+    void programUniform4iv(ShaderProgramID programPacked, GLint location, GLsizei count,           \
+                           const GLint *value);                                                    \
+    void programUniform4ui(ShaderProgramID programPacked, GLint location, GLuint v0, GLuint v1,    \
+                           GLuint v2, GLuint v3);                                                  \
+    void programUniform4uiv(ShaderProgramID programPacked, GLint location, GLsizei count,          \
+                            const GLuint *value);                                                  \
+    void programUniformMatrix2fv(ShaderProgramID programPacked, GLint location, GLsizei count,     \
                                  GLboolean transpose, const GLfloat *value);                       \
-    void programUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count,                  \
+    void programUniformMatrix2x3fv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
                                    GLboolean transpose, const GLfloat *value);                     \
-    void programUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count,                  \
+    void programUniformMatrix2x4fv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
                                    GLboolean transpose, const GLfloat *value);                     \
-    void programUniformMatrix3fv(GLuint program, GLint location, GLsizei count,                    \
+    void programUniformMatrix3fv(ShaderProgramID programPacked, GLint location, GLsizei count,     \
                                  GLboolean transpose, const GLfloat *value);                       \
-    void programUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count,                  \
+    void programUniformMatrix3x2fv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
                                    GLboolean transpose, const GLfloat *value);                     \
-    void programUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count,                  \
+    void programUniformMatrix3x4fv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
                                    GLboolean transpose, const GLfloat *value);                     \
-    void programUniformMatrix4fv(GLuint program, GLint location, GLsizei count,                    \
+    void programUniformMatrix4fv(ShaderProgramID programPacked, GLint location, GLsizei count,     \
                                  GLboolean transpose, const GLfloat *value);                       \
-    void programUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count,                  \
+    void programUniformMatrix4x2fv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
                                    GLboolean transpose, const GLfloat *value);                     \
-    void programUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count,                  \
+    void programUniformMatrix4x3fv(ShaderProgramID programPacked, GLint location, GLsizei count,   \
                                    GLboolean transpose, const GLfloat *value);                     \
     void sampleMaski(GLuint maskNumber, GLbitfield mask);                                          \
     void texStorage2DMultisample(TextureType targetPacked, GLsizei samples, GLenum internalformat, \
                                  GLsizei width, GLsizei height, GLboolean fixedsamplelocations);   \
-    void useProgramStages(ProgramPipelineID pipelinePacked, GLbitfield stages, GLuint program);    \
+    void useProgramStages(ProgramPipelineID pipelinePacked, GLbitfield stages,                     \
+                          ShaderProgramID programPacked);                                          \
     void validateProgramPipeline(ProgramPipelineID pipelinePacked);                                \
     void vertexAttribBinding(GLuint attribindex, GLuint bindingindex);                             \
     void vertexAttribFormat(GLuint attribindex, GLint size, VertexAttribType typePacked,           \
diff --git a/src/libANGLE/Context_gles_ext_autogen.h b/src/libANGLE/Context_gles_ext_autogen.h
index b1eca82..1bdd83c 100644
--- a/src/libANGLE/Context_gles_ext_autogen.h
+++ b/src/libANGLE/Context_gles_ext_autogen.h
@@ -67,20 +67,20 @@
                                                    GLsizei bufSize, GLsizei *length,               \
                                                    GLint *params);                                 \
     void getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data);           \
-    void getProgramivRobust(GLuint program, GLenum pname, GLsizei bufSize, GLsizei *length,        \
-                            GLint *params);                                                        \
+    void getProgramivRobust(ShaderProgramID programPacked, GLenum pname, GLsizei bufSize,          \
+                            GLsizei *length, GLint *params);                                       \
     void getRenderbufferParameterivRobust(GLenum target, GLenum pname, GLsizei bufSize,            \
                                           GLsizei *length, GLint *params);                         \
-    void getShaderivRobust(GLuint shader, GLenum pname, GLsizei bufSize, GLsizei *length,          \
-                           GLint *params);                                                         \
+    void getShaderivRobust(ShaderProgramID shaderPacked, GLenum pname, GLsizei bufSize,            \
+                           GLsizei *length, GLint *params);                                        \
     void getTexParameterfvRobust(TextureType targetPacked, GLenum pname, GLsizei bufSize,          \
                                  GLsizei *length, GLfloat *params);                                \
     void getTexParameterivRobust(TextureType targetPacked, GLenum pname, GLsizei bufSize,          \
                                  GLsizei *length, GLint *params);                                  \
-    void getUniformfvRobust(GLuint program, GLint location, GLsizei bufSize, GLsizei *length,      \
-                            GLfloat *params);                                                      \
-    void getUniformivRobust(GLuint program, GLint location, GLsizei bufSize, GLsizei *length,      \
-                            GLint *params);                                                        \
+    void getUniformfvRobust(ShaderProgramID programPacked, GLint location, GLsizei bufSize,        \
+                            GLsizei *length, GLfloat *params);                                     \
+    void getUniformivRobust(ShaderProgramID programPacked, GLint location, GLsizei bufSize,        \
+                            GLsizei *length, GLint *params);                                       \
     void getVertexAttribfvRobust(GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length,     \
                                  GLfloat *params);                                                 \
     void getVertexAttribivRobust(GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length,     \
@@ -135,10 +135,11 @@
                                   GLint *params);                                                  \
     void getVertexAttribIuivRobust(GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length,   \
                                    GLuint *params);                                                \
-    void getUniformuivRobust(GLuint program, GLint location, GLsizei bufSize, GLsizei *length,     \
-                             GLuint *params);                                                      \
-    void getActiveUniformBlockivRobust(GLuint program, GLuint uniformBlockIndex, GLenum pname,     \
-                                       GLsizei bufSize, GLsizei *length, GLint *params);           \
+    void getUniformuivRobust(ShaderProgramID programPacked, GLint location, GLsizei bufSize,       \
+                             GLsizei *length, GLuint *params);                                     \
+    void getActiveUniformBlockivRobust(ShaderProgramID programPacked, GLuint uniformBlockIndex,    \
+                                       GLenum pname, GLsizei bufSize, GLsizei *length,             \
+                                       GLint *params);                                             \
     void getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data);       \
     void getInteger64i_vRobust(GLenum target, GLuint index, GLsizei bufSize, GLsizei *length,      \
                                GLint64 *data);                                                     \
@@ -154,8 +155,9 @@
                                      GLsizei *length, GLfloat *params);                            \
     void getFramebufferParameterivRobust(GLenum target, GLenum pname, GLsizei bufSize,             \
                                          GLsizei *length, GLint *params);                          \
-    void getProgramInterfaceivRobust(GLuint program, GLenum programInterface, GLenum pname,        \
-                                     GLsizei bufSize, GLsizei *length, GLint *params);             \
+    void getProgramInterfaceivRobust(ShaderProgramID programPacked, GLenum programInterface,       \
+                                     GLenum pname, GLsizei bufSize, GLsizei *length,               \
+                                     GLint *params);                                               \
     void getBooleani_vRobust(GLenum target, GLuint index, GLsizei bufSize, GLsizei *length,        \
                              GLboolean *data);                                                     \
     void getMultisamplefvRobust(GLenum pname, GLuint index, GLsizei bufSize, GLsizei *length,      \
@@ -169,12 +171,12 @@
     void readnPixelsRobust(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format,         \
                            GLenum type, GLsizei bufSize, GLsizei *length, GLsizei *columns,        \
                            GLsizei *rows, void *data);                                             \
-    void getnUniformfvRobust(GLuint program, GLint location, GLsizei bufSize, GLsizei *length,     \
-                             GLfloat *params);                                                     \
-    void getnUniformivRobust(GLuint program, GLint location, GLsizei bufSize, GLsizei *length,     \
-                             GLint *params);                                                       \
-    void getnUniformuivRobust(GLuint program, GLint location, GLsizei bufSize, GLsizei *length,    \
-                              GLuint *params);                                                     \
+    void getnUniformfvRobust(ShaderProgramID programPacked, GLint location, GLsizei bufSize,       \
+                             GLsizei *length, GLfloat *params);                                    \
+    void getnUniformivRobust(ShaderProgramID programPacked, GLint location, GLsizei bufSize,       \
+                             GLsizei *length, GLint *params);                                      \
+    void getnUniformuivRobust(ShaderProgramID programPacked, GLint location, GLsizei bufSize,      \
+                              GLsizei *length, GLuint *params);                                    \
     void texParameterIivRobust(TextureType targetPacked, GLenum pname, GLsizei bufSize,            \
                                const GLint *params);                                               \
     void texParameterIuivRobust(TextureType targetPacked, GLenum pname, GLsizei bufSize,           \
@@ -203,7 +205,7 @@
                             GLenum type);                                                          \
     void invalidateTexture(TextureType targetPacked);                                              \
     /* GL_CHROMIUM_bind_uniform_location */                                                        \
-    void bindUniformLocation(GLuint program, GLint location, const GLchar *name);                  \
+    void bindUniformLocation(ShaderProgramID programPacked, GLint location, const GLchar *name);   \
     /* GL_CHROMIUM_copy_compressed_texture */                                                      \
     void compressedCopyTexture(TextureID sourceIdPacked, TextureID destIdPacked);                  \
     /* GL_CHROMIUM_copy_texture */                                                                 \
@@ -261,9 +263,10 @@
         GLsizei numPaths, GLenum pathNameType, const void *paths, PathID pathBasePacked,           \
         GLint reference, GLuint mask, GLenum coverMode, GLenum transformType,                      \
         const GLfloat *transformValues);                                                           \
-    void bindFragmentInputLocation(GLuint programs, GLint location, const GLchar *name);           \
-    void programPathFragmentInputGen(GLuint program, GLint location, GLenum genMode,               \
-                                     GLint components, const GLfloat *coeffs);                     \
+    void bindFragmentInputLocation(ShaderProgramID programsPacked, GLint location,                 \
+                                   const GLchar *name);                                            \
+    void programPathFragmentInputGen(ShaderProgramID programPacked, GLint location,                \
+                                     GLenum genMode, GLint components, const GLfloat *coeffs);     \
                                                                                                    \
     /* GLES2+ Extensions */                                                                        \
                                                                                                    \
@@ -299,14 +302,14 @@
     void provokingVertex(ProvokingVertexConvention modePacked);                                    \
     /* GL_ANGLE_texture_multisample */                                                             \
     /* GL_ANGLE_translated_shader_source */                                                        \
-    void getTranslatedShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length,                \
+    void getTranslatedShaderSource(ShaderProgramID shaderPacked, GLsizei bufsize, GLsizei *length, \
                                    GLchar *source);                                                \
     /* GL_EXT_blend_func_extended */                                                               \
-    void bindFragDataLocation(GLuint program, GLuint color, const GLchar *name);                   \
-    void bindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index,             \
-                                     const GLchar *name);                                          \
-    GLint getFragDataIndex(GLuint program, const GLchar *name);                                    \
-    GLint getProgramResourceLocationIndex(GLuint program, GLenum programInterface,                 \
+    void bindFragDataLocation(ShaderProgramID programPacked, GLuint color, const GLchar *name);    \
+    void bindFragDataLocationIndexed(ShaderProgramID programPacked, GLuint colorNumber,            \
+                                     GLuint index, const GLchar *name);                            \
+    GLint getFragDataIndex(ShaderProgramID programPacked, const GLchar *name);                     \
+    GLint getProgramResourceLocationIndex(ShaderProgramID programPacked, GLenum programInterface,  \
                                           const GLchar *name);                                     \
     /* GL_EXT_debug_marker */                                                                      \
     void insertEventMarker(GLsizei length, const GLchar *marker);                                  \
@@ -352,8 +355,10 @@
     /* GL_EXT_occlusion_query_boolean */                                                           \
     /* GL_EXT_robustness */                                                                        \
     GLenum getGraphicsResetStatus();                                                               \
-    void getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params);          \
-    void getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params);            \
+    void getnUniformfv(ShaderProgramID programPacked, GLint location, GLsizei bufSize,             \
+                       GLfloat *params);                                                           \
+    void getnUniformiv(ShaderProgramID programPacked, GLint location, GLsizei bufSize,             \
+                       GLint *params);                                                             \
     void readnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,  \
                      GLsizei bufSize, void *data);                                                 \
     /* GL_EXT_semaphore */                                                                         \
diff --git a/src/libANGLE/FrameCapture.cpp b/src/libANGLE/FrameCapture.cpp
index 991e230..77ca712 100644
--- a/src/libANGLE/FrameCapture.cpp
+++ b/src/libANGLE/FrameCapture.cpp
@@ -896,6 +896,13 @@
     os << value.value;
 }
 
+template <>
+void WriteParamValueToStream<ParamType::TShaderProgramID>(std::ostream &os,
+                                                          gl::ShaderProgramID value)
+{
+    os << value.value;
+}
+
 // TODO(jmadill): Use FenceNV ID map. http://anglebug.com/3611
 template <>
 void WriteParamValueToStream<ParamType::TFenceNVID>(std::ostream &os, gl::FenceNVID value)
diff --git a/src/libANGLE/FrameCapture.h b/src/libANGLE/FrameCapture.h
index 0494740..3760214 100644
--- a/src/libANGLE/FrameCapture.h
+++ b/src/libANGLE/FrameCapture.h
@@ -267,6 +267,10 @@
                                                             gl::ProgramPipelineID value);
 
 template <>
+void WriteParamValueToStream<ParamType::TShaderProgramID>(std::ostream &os,
+                                                          gl::ShaderProgramID value);
+
+template <>
 void WriteParamValueToStream<ParamType::TRenderbufferID>(std::ostream &os,
                                                          gl::RenderbufferID value);
 
diff --git a/src/libANGLE/GLES1Renderer.cpp b/src/libANGLE/GLES1Renderer.cpp
index 4e7395e..37025a5 100644
--- a/src/libANGLE/GLES1Renderer.cpp
+++ b/src/libANGLE/GLES1Renderer.cpp
@@ -37,7 +37,7 @@
     {
         (void)state->setProgram(context, 0);
 
-        mShaderPrograms->deleteProgram(context, mProgramState.program);
+        mShaderPrograms->deleteProgram(context, {mProgramState.program});
         mShaderPrograms->release(context);
         mShaderPrograms             = nullptr;
         mRendererProgramInitialized = false;
@@ -503,12 +503,12 @@
     mDrawTextureEnabled = false;
 }
 
-Shader *GLES1Renderer::getShader(GLuint handle) const
+Shader *GLES1Renderer::getShader(ShaderProgramID handle) const
 {
     return mShaderPrograms->getShader(handle);
 }
 
-Program *GLES1Renderer::getProgram(GLuint handle) const
+Program *GLES1Renderer::getProgram(ShaderProgramID handle) const
 {
     return mShaderPrograms->getProgram(handle);
 }
@@ -516,12 +516,12 @@
 angle::Result GLES1Renderer::compileShader(Context *context,
                                            ShaderType shaderType,
                                            const char *src,
-                                           GLuint *shaderOut)
+                                           ShaderProgramID *shaderOut)
 {
     rx::ContextImpl *implementation = context->getImplementation();
     const Limitations &limitations  = implementation->getNativeLimitations();
 
-    GLuint shader = mShaderPrograms->createShader(implementation, limitations, shaderType);
+    ShaderProgramID shader = mShaderPrograms->createShader(implementation, limitations, shaderType);
 
     Shader *shaderObject = getShader(shader);
     ANGLE_CHECK(context, shaderObject, "Missing shader object", GL_INVALID_OPERATION);
@@ -547,12 +547,12 @@
 
 angle::Result GLES1Renderer::linkProgram(Context *context,
                                          State *glState,
-                                         GLuint vertexShader,
-                                         GLuint fragmentShader,
+                                         ShaderProgramID vertexShader,
+                                         ShaderProgramID fragmentShader,
                                          const std::unordered_map<GLint, std::string> &attribLocs,
-                                         GLuint *programOut)
+                                         ShaderProgramID *programOut)
 {
-    GLuint program = mShaderPrograms->createProgram(context->getImplementation());
+    ShaderProgramID program = mShaderPrograms->createProgram(context->getImplementation());
 
     Program *programObject = getProgram(program);
     ANGLE_CHECK(context, programObject, "Missing program object", GL_INVALID_OPERATION);
@@ -600,8 +600,8 @@
 
     mShaderPrograms = new ShaderProgramManager();
 
-    GLuint vertexShader;
-    GLuint fragmentShader;
+    ShaderProgramID vertexShader;
+    ShaderProgramID fragmentShader;
 
     ANGLE_TRY(compileShader(context, ShaderType::Vertex, kGLES1DrawVShader, &vertexShader));
 
diff --git a/src/libANGLE/GLES1Renderer.h b/src/libANGLE/GLES1Renderer.h
index f2b592a..f7b6a99 100644
--- a/src/libANGLE/GLES1Renderer.h
+++ b/src/libANGLE/GLES1Renderer.h
@@ -55,19 +55,19 @@
     using Vec4Uniform = float[4];
     using Vec3Uniform = float[3];
 
-    Shader *getShader(GLuint handle) const;
-    Program *getProgram(GLuint handle) const;
+    Shader *getShader(ShaderProgramID handle) const;
+    Program *getProgram(ShaderProgramID handle) const;
 
     angle::Result compileShader(Context *context,
                                 ShaderType shaderType,
                                 const char *src,
-                                GLuint *shaderOut);
+                                ShaderProgramID *shaderOut);
     angle::Result linkProgram(Context *context,
                               State *glState,
-                              GLuint vshader,
-                              GLuint fshader,
+                              ShaderProgramID vshader,
+                              ShaderProgramID fshader,
                               const std::unordered_map<GLint, std::string> &attribLocs,
-                              GLuint *programOut);
+                              ShaderProgramID *programOut);
     angle::Result initializeRendererProgram(Context *context, State *glState);
 
     void setUniform1i(Context *context, Program *programObject, GLint loc, GLint value);
@@ -103,7 +103,7 @@
 
     struct GLES1ProgramState
     {
-        GLuint program;
+        ShaderProgramID program;
 
         GLint projMatrixLoc;
         GLint modelviewMatrixLoc;
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index e967c7f..ee8c289 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -1119,7 +1119,7 @@
     return false;
 }
 
-Program::Program(rx::GLImplFactory *factory, ShaderProgramManager *manager, GLuint handle)
+Program::Program(rx::GLImplFactory *factory, ShaderProgramManager *manager, ShaderProgramID handle)
     : mProgram(factory->createProgram(mState)),
       mValidated(false),
       mLinked(false),
@@ -1158,7 +1158,7 @@
 
     delete this;
 }
-GLuint Program::id() const
+ShaderProgramID Program::id() const
 {
     ASSERT(mLinkResolved);
     return mHandle;
@@ -1839,7 +1839,7 @@
     return mInfoLog.getLog(bufSize, length, infoLog);
 }
 
-void Program::getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders) const
+void Program::getAttachedShaders(GLsizei maxCount, GLsizei *count, ShaderProgramID *shaders) const
 {
     ASSERT(mLinkResolved);
     int total = 0;
diff --git a/src/libANGLE/Program.h b/src/libANGLE/Program.h
index 7c9401e..85e3883 100644
--- a/src/libANGLE/Program.h
+++ b/src/libANGLE/Program.h
@@ -552,10 +552,10 @@
 class Program final : angle::NonCopyable, public LabeledObject
 {
   public:
-    Program(rx::GLImplFactory *factory, ShaderProgramManager *manager, GLuint handle);
+    Program(rx::GLImplFactory *factory, ShaderProgramManager *manager, ShaderProgramID handle);
     void onDestroy(const Context *context);
 
-    GLuint id() const;
+    ShaderProgramID id() const;
 
     void setLabel(const Context *context, const std::string &label) override;
     const std::string &getLabel() const override;
@@ -623,7 +623,7 @@
 
     int getInfoLogLength() const;
     void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const;
-    void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders) const;
+    void getAttachedShaders(GLsizei maxCount, GLsizei *count, ShaderProgramID *shaders) const;
 
     GLuint getAttributeLocation(const std::string &name) const;
     bool isAttribLocationActive(size_t attribLocation) const;
@@ -1069,7 +1069,7 @@
     unsigned int mRefCount;
 
     ShaderProgramManager *mResourceManager;
-    const GLuint mHandle;
+    const ShaderProgramID mHandle;
 
     InfoLog mInfoLog;
 
diff --git a/src/libANGLE/ResourceManager.cpp b/src/libANGLE/ResourceManager.cpp
index 9b60d2a..31d315a 100644
--- a/src/libANGLE/ResourceManager.cpp
+++ b/src/libANGLE/ResourceManager.cpp
@@ -157,52 +157,52 @@
 {
     while (!mPrograms.empty())
     {
-        deleteProgram(context, mPrograms.begin()->first);
+        deleteProgram(context, {mPrograms.begin()->first});
     }
     mPrograms.clear();
     while (!mShaders.empty())
     {
-        deleteShader(context, mShaders.begin()->first);
+        deleteShader(context, {mShaders.begin()->first});
     }
     mShaders.clear();
 }
 
-GLuint ShaderProgramManager::createShader(rx::GLImplFactory *factory,
-                                          const gl::Limitations &rendererLimitations,
-                                          ShaderType type)
+ShaderProgramID ShaderProgramManager::createShader(rx::GLImplFactory *factory,
+                                                   const gl::Limitations &rendererLimitations,
+                                                   ShaderType type)
 {
     ASSERT(type != ShaderType::InvalidEnum);
-    GLuint handle = mHandleAllocator.allocate();
+    ShaderProgramID handle = ShaderProgramID{mHandleAllocator.allocate()};
     mShaders.assign(handle, new Shader(this, factory, rendererLimitations, type, handle));
     return handle;
 }
 
-void ShaderProgramManager::deleteShader(const Context *context, GLuint shader)
+void ShaderProgramManager::deleteShader(const Context *context, ShaderProgramID shader)
 {
     deleteObject(context, &mShaders, shader);
 }
 
-Shader *ShaderProgramManager::getShader(GLuint handle) const
+Shader *ShaderProgramManager::getShader(ShaderProgramID handle) const
 {
     return mShaders.query(handle);
 }
 
-GLuint ShaderProgramManager::createProgram(rx::GLImplFactory *factory)
+ShaderProgramID ShaderProgramManager::createProgram(rx::GLImplFactory *factory)
 {
-    GLuint handle = mHandleAllocator.allocate();
+    ShaderProgramID handle = ShaderProgramID{mHandleAllocator.allocate()};
     mPrograms.assign(handle, new Program(factory, this, handle));
     return handle;
 }
 
-void ShaderProgramManager::deleteProgram(const gl::Context *context, GLuint program)
+void ShaderProgramManager::deleteProgram(const gl::Context *context, ShaderProgramID program)
 {
     deleteObject(context, &mPrograms, program);
 }
 
-template <typename ObjectType>
+template <typename ObjectType, typename IDType>
 void ShaderProgramManager::deleteObject(const Context *context,
-                                        ResourceMap<ObjectType> *objectMap,
-                                        GLuint id)
+                                        ResourceMap<ObjectType, IDType> *objectMap,
+                                        IDType id)
 {
     ObjectType *object = objectMap->query(id);
     if (!object)
@@ -212,7 +212,7 @@
 
     if (object->getRefCount() == 0)
     {
-        mHandleAllocator.release(id);
+        mHandleAllocator.release(id.value);
         object->onDestroy(context);
         objectMap->erase(id, &object);
     }
diff --git a/src/libANGLE/ResourceManager.h b/src/libANGLE/ResourceManager.h
index 0c729bc..b099d38 100644
--- a/src/libANGLE/ResourceManager.h
+++ b/src/libANGLE/ResourceManager.h
@@ -144,28 +144,33 @@
   public:
     ShaderProgramManager();
 
-    GLuint createShader(rx::GLImplFactory *factory,
-                        const Limitations &rendererLimitations,
-                        ShaderType type);
-    void deleteShader(const Context *context, GLuint shader);
-    Shader *getShader(GLuint handle) const;
+    ShaderProgramID createShader(rx::GLImplFactory *factory,
+                                 const Limitations &rendererLimitations,
+                                 ShaderType type);
+    void deleteShader(const Context *context, ShaderProgramID shader);
+    Shader *getShader(ShaderProgramID handle) const;
 
-    GLuint createProgram(rx::GLImplFactory *factory);
-    void deleteProgram(const Context *context, GLuint program);
+    ShaderProgramID createProgram(rx::GLImplFactory *factory);
+    void deleteProgram(const Context *context, ShaderProgramID program);
 
-    ANGLE_INLINE Program *getProgram(GLuint handle) const { return mPrograms.query(handle); }
+    ANGLE_INLINE Program *getProgram(ShaderProgramID handle) const
+    {
+        return mPrograms.query(handle);
+    }
 
   protected:
     ~ShaderProgramManager() override;
 
   private:
-    template <typename ObjectType>
-    void deleteObject(const Context *context, ResourceMap<ObjectType> *objectMap, GLuint id);
+    template <typename ObjectType, typename IDType>
+    void deleteObject(const Context *context,
+                      ResourceMap<ObjectType, IDType> *objectMap,
+                      IDType id);
 
     void reset(const Context *context) override;
 
-    ResourceMap<Shader> mShaders;
-    ResourceMap<Program> mPrograms;
+    ResourceMap<Shader, ShaderProgramID> mShaders;
+    ResourceMap<Program, ShaderProgramID> mPrograms;
 };
 
 class TextureManager
diff --git a/src/libANGLE/Shader.cpp b/src/libANGLE/Shader.cpp
index 9ff68e9..d055dd4 100644
--- a/src/libANGLE/Shader.cpp
+++ b/src/libANGLE/Shader.cpp
@@ -131,7 +131,7 @@
                rx::GLImplFactory *implFactory,
                const gl::Limitations &rendererLimitations,
                ShaderType type,
-               GLuint handle)
+               ShaderProgramID handle)
     : mState(type),
       mImplementation(implFactory->createShader(mState)),
       mRendererLimitations(rendererLimitations),
@@ -169,7 +169,7 @@
     return mState.mLabel;
 }
 
-GLuint Shader::getHandle() const
+ShaderProgramID Shader::getHandle() const
 {
     return mHandle;
 }
diff --git a/src/libANGLE/Shader.h b/src/libANGLE/Shader.h
index ab62777..22a9f0a 100644
--- a/src/libANGLE/Shader.h
+++ b/src/libANGLE/Shader.h
@@ -128,7 +128,7 @@
            rx::GLImplFactory *implFactory,
            const gl::Limitations &rendererLimitations,
            ShaderType type,
-           GLuint handle);
+           ShaderProgramID handle);
 
     void onDestroy(const Context *context);
 
@@ -136,7 +136,7 @@
     const std::string &getLabel() const override;
 
     ShaderType getType() const { return mType; }
-    GLuint getHandle() const;
+    ShaderProgramID getHandle() const;
 
     rx::ShaderImpl *getImplementation() const { return mImplementation.get(); }
 
@@ -203,7 +203,7 @@
     ShaderState mState;
     std::unique_ptr<rx::ShaderImpl> mImplementation;
     const gl::Limitations &mRendererLimitations;
-    const GLuint mHandle;
+    const ShaderProgramID mHandle;
     const ShaderType mType;
     unsigned int mRefCount;  // Number of program objects this shader is attached to
     bool mDeleteStatus;  // Flag to indicate that the shader can be deleted when no longer in use
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index f81817e..ec94269 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -2089,7 +2089,7 @@
             *params = mVertexArray->id();
             break;
         case GL_CURRENT_PROGRAM:
-            *params = mProgram ? mProgram->id() : 0;
+            *params = mProgram ? mProgram->id().value : 0;
             break;
         case GL_PACK_ALIGNMENT:
             *params = mPack.alignment;
diff --git a/src/libANGLE/TransformFeedback.cpp b/src/libANGLE/TransformFeedback.cpp
index aae1091..7e9bb43 100644
--- a/src/libANGLE/TransformFeedback.cpp
+++ b/src/libANGLE/TransformFeedback.cpp
@@ -235,9 +235,9 @@
     }
 }
 
-bool TransformFeedback::hasBoundProgram(GLuint program) const
+bool TransformFeedback::hasBoundProgram(ShaderProgramID program) const
 {
-    return mState.mProgram != nullptr && mState.mProgram->id() == program;
+    return mState.mProgram != nullptr && mState.mProgram->id().value == program.value;
 }
 
 angle::Result TransformFeedback::detachBuffer(const Context *context, GLuint bufferName)
diff --git a/src/libANGLE/TransformFeedback.h b/src/libANGLE/TransformFeedback.h
index 52abd83..36ea2ab 100644
--- a/src/libANGLE/TransformFeedback.h
+++ b/src/libANGLE/TransformFeedback.h
@@ -85,7 +85,7 @@
     // after the last vertex of the previous draw call.
     void onVerticesDrawn(const Context *context, GLsizei count, GLsizei primcount);
 
-    bool hasBoundProgram(GLuint program) const;
+    bool hasBoundProgram(ShaderProgramID program) const;
 
     angle::Result bindIndexedBuffer(const Context *context,
                                     size_t index,
diff --git a/src/libANGLE/capture_gles_2_0_autogen.cpp b/src/libANGLE/capture_gles_2_0_autogen.cpp
index 7ff4f8f..96dc5a6 100644
--- a/src/libANGLE/capture_gles_2_0_autogen.cpp
+++ b/src/libANGLE/capture_gles_2_0_autogen.cpp
@@ -31,31 +31,31 @@
 
 CallCapture CaptureAttachShader(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
-                                GLuint shader)
+                                ShaderProgramID programPacked,
+                                ShaderProgramID shaderPacked)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
 
     return CallCapture(gl::EntryPoint::AttachShader, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindAttribLocation(const Context *context,
                                       bool isCallValid,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       GLuint index,
                                       const GLchar *name)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureBindAttribLocation_name(context, isCallValid, program, index, name, &nameParam);
+    CaptureBindAttribLocation_name(context, isCallValid, programPacked, index, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     return CallCapture(gl::EntryPoint::BindAttribLocation, std::move(paramBuffer));
@@ -308,11 +308,13 @@
     return CallCapture(gl::EntryPoint::ColorMask, std::move(paramBuffer));
 }
 
-CallCapture CaptureCompileShader(const Context *context, bool isCallValid, GLuint shader)
+CallCapture CaptureCompileShader(const Context *context,
+                                 bool isCallValid,
+                                 ShaderProgramID shaderPacked)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
 
     return CallCapture(gl::EntryPoint::CompileShader, std::move(paramBuffer));
 }
@@ -502,11 +504,13 @@
     return CallCapture(gl::EntryPoint::DeleteFramebuffers, std::move(paramBuffer));
 }
 
-CallCapture CaptureDeleteProgram(const Context *context, bool isCallValid, GLuint program)
+CallCapture CaptureDeleteProgram(const Context *context,
+                                 bool isCallValid,
+                                 ShaderProgramID programPacked)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     return CallCapture(gl::EntryPoint::DeleteProgram, std::move(paramBuffer));
 }
@@ -531,11 +535,13 @@
     return CallCapture(gl::EntryPoint::DeleteRenderbuffers, std::move(paramBuffer));
 }
 
-CallCapture CaptureDeleteShader(const Context *context, bool isCallValid, GLuint shader)
+CallCapture CaptureDeleteShader(const Context *context,
+                                bool isCallValid,
+                                ShaderProgramID shaderPacked)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
 
     return CallCapture(gl::EntryPoint::DeleteShader, std::move(paramBuffer));
 }
@@ -588,13 +594,13 @@
 
 CallCapture CaptureDetachShader(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
-                                GLuint shader)
+                                ShaderProgramID programPacked,
+                                ShaderProgramID shaderPacked)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
 
     return CallCapture(gl::EntryPoint::DetachShader, std::move(paramBuffer));
 }
@@ -818,7 +824,7 @@
 
 CallCapture CaptureGetActiveAttrib(const Context *context,
                                    bool isCallValid,
-                                   GLuint program,
+                                   ShaderProgramID programPacked,
                                    GLuint index,
                                    GLsizei bufSize,
                                    GLsizei *length,
@@ -828,32 +834,32 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetActiveAttrib_length(context, isCallValid, program, index, bufSize, length, size, type,
-                                  name, &lengthParam);
+    CaptureGetActiveAttrib_length(context, isCallValid, programPacked, index, bufSize, length, size,
+                                  type, name, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture sizeParam("size", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, size, &sizeParam.value);
-    CaptureGetActiveAttrib_size(context, isCallValid, program, index, bufSize, length, size, type,
-                                name, &sizeParam);
+    CaptureGetActiveAttrib_size(context, isCallValid, programPacked, index, bufSize, length, size,
+                                type, name, &sizeParam);
     paramBuffer.addParam(std::move(sizeParam));
 
     ParamCapture typeParam("type", ParamType::TGLenumPointer);
     InitParamValue(ParamType::TGLenumPointer, type, &typeParam.value);
-    CaptureGetActiveAttrib_type(context, isCallValid, program, index, bufSize, length, size, type,
-                                name, &typeParam);
+    CaptureGetActiveAttrib_type(context, isCallValid, programPacked, index, bufSize, length, size,
+                                type, name, &typeParam);
     paramBuffer.addParam(std::move(typeParam));
 
     ParamCapture nameParam("name", ParamType::TGLcharPointer);
     InitParamValue(ParamType::TGLcharPointer, name, &nameParam.value);
-    CaptureGetActiveAttrib_name(context, isCallValid, program, index, bufSize, length, size, type,
-                                name, &nameParam);
+    CaptureGetActiveAttrib_name(context, isCallValid, programPacked, index, bufSize, length, size,
+                                type, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     return CallCapture(gl::EntryPoint::GetActiveAttrib, std::move(paramBuffer));
@@ -861,7 +867,7 @@
 
 CallCapture CaptureGetActiveUniform(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLuint index,
                                     GLsizei bufSize,
                                     GLsizei *length,
@@ -871,32 +877,32 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetActiveUniform_length(context, isCallValid, program, index, bufSize, length, size,
-                                   type, name, &lengthParam);
+    CaptureGetActiveUniform_length(context, isCallValid, programPacked, index, bufSize, length,
+                                   size, type, name, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture sizeParam("size", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, size, &sizeParam.value);
-    CaptureGetActiveUniform_size(context, isCallValid, program, index, bufSize, length, size, type,
-                                 name, &sizeParam);
+    CaptureGetActiveUniform_size(context, isCallValid, programPacked, index, bufSize, length, size,
+                                 type, name, &sizeParam);
     paramBuffer.addParam(std::move(sizeParam));
 
     ParamCapture typeParam("type", ParamType::TGLenumPointer);
     InitParamValue(ParamType::TGLenumPointer, type, &typeParam.value);
-    CaptureGetActiveUniform_type(context, isCallValid, program, index, bufSize, length, size, type,
-                                 name, &typeParam);
+    CaptureGetActiveUniform_type(context, isCallValid, programPacked, index, bufSize, length, size,
+                                 type, name, &typeParam);
     paramBuffer.addParam(std::move(typeParam));
 
     ParamCapture nameParam("name", ParamType::TGLcharPointer);
     InitParamValue(ParamType::TGLcharPointer, name, &nameParam.value);
-    CaptureGetActiveUniform_name(context, isCallValid, program, index, bufSize, length, size, type,
-                                 name, &nameParam);
+    CaptureGetActiveUniform_name(context, isCallValid, programPacked, index, bufSize, length, size,
+                                 type, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     return CallCapture(gl::EntryPoint::GetActiveUniform, std::move(paramBuffer));
@@ -904,44 +910,44 @@
 
 CallCapture CaptureGetAttachedShaders(const Context *context,
                                       bool isCallValid,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       GLsizei maxCount,
                                       GLsizei *count,
-                                      GLuint *shaders)
+                                      ShaderProgramID *shadersPacked)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("maxCount", ParamType::TGLsizei, maxCount);
 
     ParamCapture countParam("count", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, count, &countParam.value);
-    CaptureGetAttachedShaders_count(context, isCallValid, program, maxCount, count, shaders,
-                                    &countParam);
+    CaptureGetAttachedShaders_count(context, isCallValid, programPacked, maxCount, count,
+                                    shadersPacked, &countParam);
     paramBuffer.addParam(std::move(countParam));
 
-    ParamCapture shadersParam("shaders", ParamType::TGLuintPointer);
-    InitParamValue(ParamType::TGLuintPointer, shaders, &shadersParam.value);
-    CaptureGetAttachedShaders_shaders(context, isCallValid, program, maxCount, count, shaders,
-                                      &shadersParam);
-    paramBuffer.addParam(std::move(shadersParam));
+    ParamCapture shadersPackedParam("shadersPacked", ParamType::TShaderProgramIDPointer);
+    InitParamValue(ParamType::TShaderProgramIDPointer, shadersPacked, &shadersPackedParam.value);
+    CaptureGetAttachedShaders_shadersPacked(context, isCallValid, programPacked, maxCount, count,
+                                            shadersPacked, &shadersPackedParam);
+    paramBuffer.addParam(std::move(shadersPackedParam));
 
     return CallCapture(gl::EntryPoint::GetAttachedShaders, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetAttribLocation(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      const GLchar *name,
                                      GLint returnValue)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureGetAttribLocation_name(context, isCallValid, program, name, &nameParam);
+    CaptureGetAttribLocation_name(context, isCallValid, programPacked, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     ParamCapture returnValueCapture("returnValue", ParamType::TGLint);
@@ -1053,25 +1059,25 @@
 
 CallCapture CaptureGetProgramInfoLog(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLsizei bufSize,
                                      GLsizei *length,
                                      GLchar *infoLog)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetProgramInfoLog_length(context, isCallValid, program, bufSize, length, infoLog,
+    CaptureGetProgramInfoLog_length(context, isCallValid, programPacked, bufSize, length, infoLog,
                                     &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture infoLogParam("infoLog", ParamType::TGLcharPointer);
     InitParamValue(ParamType::TGLcharPointer, infoLog, &infoLogParam.value);
-    CaptureGetProgramInfoLog_infoLog(context, isCallValid, program, bufSize, length, infoLog,
+    CaptureGetProgramInfoLog_infoLog(context, isCallValid, programPacked, bufSize, length, infoLog,
                                      &infoLogParam);
     paramBuffer.addParam(std::move(infoLogParam));
 
@@ -1080,18 +1086,18 @@
 
 CallCapture CaptureGetProgramiv(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLenum pname,
                                 GLint *params)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("pname", GLenumGroup::ProgramPropertyARB, ParamType::TGLenum, pname);
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetProgramiv_params(context, isCallValid, program, pname, params, &paramsParam);
+    CaptureGetProgramiv_params(context, isCallValid, programPacked, pname, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetProgramiv, std::move(paramBuffer));
@@ -1120,25 +1126,25 @@
 
 CallCapture CaptureGetShaderInfoLog(const Context *context,
                                     bool isCallValid,
-                                    GLuint shader,
+                                    ShaderProgramID shaderPacked,
                                     GLsizei bufSize,
                                     GLsizei *length,
                                     GLchar *infoLog)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetShaderInfoLog_length(context, isCallValid, shader, bufSize, length, infoLog,
+    CaptureGetShaderInfoLog_length(context, isCallValid, shaderPacked, bufSize, length, infoLog,
                                    &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture infoLogParam("infoLog", ParamType::TGLcharPointer);
     InitParamValue(ParamType::TGLcharPointer, infoLog, &infoLogParam.value);
-    CaptureGetShaderInfoLog_infoLog(context, isCallValid, shader, bufSize, length, infoLog,
+    CaptureGetShaderInfoLog_infoLog(context, isCallValid, shaderPacked, bufSize, length, infoLog,
                                     &infoLogParam);
     paramBuffer.addParam(std::move(infoLogParam));
 
@@ -1175,25 +1181,25 @@
 
 CallCapture CaptureGetShaderSource(const Context *context,
                                    bool isCallValid,
-                                   GLuint shader,
+                                   ShaderProgramID shaderPacked,
                                    GLsizei bufSize,
                                    GLsizei *length,
                                    GLchar *source)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetShaderSource_length(context, isCallValid, shader, bufSize, length, source,
+    CaptureGetShaderSource_length(context, isCallValid, shaderPacked, bufSize, length, source,
                                   &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture sourceParam("source", ParamType::TGLcharPointer);
     InitParamValue(ParamType::TGLcharPointer, source, &sourceParam.value);
-    CaptureGetShaderSource_source(context, isCallValid, shader, bufSize, length, source,
+    CaptureGetShaderSource_source(context, isCallValid, shaderPacked, bufSize, length, source,
                                   &sourceParam);
     paramBuffer.addParam(std::move(sourceParam));
 
@@ -1202,18 +1208,18 @@
 
 CallCapture CaptureGetShaderiv(const Context *context,
                                bool isCallValid,
-                               GLuint shader,
+                               ShaderProgramID shaderPacked,
                                GLenum pname,
                                GLint *params)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
     paramBuffer.addEnumParam("pname", GLenumGroup::ShaderParameterName, ParamType::TGLenum, pname);
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetShaderiv_params(context, isCallValid, shader, pname, params, &paramsParam);
+    CaptureGetShaderiv_params(context, isCallValid, shaderPacked, pname, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetShaderiv, std::move(paramBuffer));
@@ -1277,17 +1283,17 @@
 
 CallCapture CaptureGetUniformLocation(const Context *context,
                                       bool isCallValid,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       const GLchar *name,
                                       GLint returnValue)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureGetUniformLocation_name(context, isCallValid, program, name, &nameParam);
+    CaptureGetUniformLocation_name(context, isCallValid, programPacked, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     ParamCapture returnValueCapture("returnValue", ParamType::TGLint);
@@ -1299,18 +1305,18 @@
 
 CallCapture CaptureGetUniformfv(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLint location,
                                 GLfloat *params)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
 
     ParamCapture paramsParam("params", ParamType::TGLfloatPointer);
     InitParamValue(ParamType::TGLfloatPointer, params, &paramsParam.value);
-    CaptureGetUniformfv_params(context, isCallValid, program, location, params, &paramsParam);
+    CaptureGetUniformfv_params(context, isCallValid, programPacked, location, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetUniformfv, std::move(paramBuffer));
@@ -1318,18 +1324,18 @@
 
 CallCapture CaptureGetUniformiv(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLint location,
                                 GLint *params)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetUniformiv_params(context, isCallValid, program, location, params, &paramsParam);
+    CaptureGetUniformiv_params(context, isCallValid, programPacked, location, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetUniformiv, std::move(paramBuffer));
@@ -1453,12 +1459,12 @@
 
 CallCapture CaptureIsProgram(const Context *context,
                              bool isCallValid,
-                             GLuint program,
+                             ShaderProgramID programPacked,
                              GLboolean returnValue)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     ParamCapture returnValueCapture("returnValue", ParamType::TGLboolean);
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
@@ -1485,12 +1491,12 @@
 
 CallCapture CaptureIsShader(const Context *context,
                             bool isCallValid,
-                            GLuint shader,
+                            ShaderProgramID shaderPacked,
                             GLboolean returnValue)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
 
     ParamCapture returnValueCapture("returnValue", ParamType::TGLboolean);
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
@@ -1524,11 +1530,13 @@
     return CallCapture(gl::EntryPoint::LineWidth, std::move(paramBuffer));
 }
 
-CallCapture CaptureLinkProgram(const Context *context, bool isCallValid, GLuint program)
+CallCapture CaptureLinkProgram(const Context *context,
+                               bool isCallValid,
+                               ShaderProgramID programPacked)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     return CallCapture(gl::EntryPoint::LinkProgram, std::move(paramBuffer));
 }
@@ -1642,7 +1650,7 @@
 CallCapture CaptureShaderBinary(const Context *context,
                                 bool isCallValid,
                                 GLsizei count,
-                                const GLuint *shaders,
+                                const ShaderProgramID *shadersPacked,
                                 GLenum binaryformat,
                                 const void *binary,
                                 GLsizei length)
@@ -1651,19 +1659,20 @@
 
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
-    ParamCapture shadersParam("shaders", ParamType::TGLuintConstPointer);
-    InitParamValue(ParamType::TGLuintConstPointer, shaders, &shadersParam.value);
-    CaptureShaderBinary_shaders(context, isCallValid, count, shaders, binaryformat, binary, length,
-                                &shadersParam);
-    paramBuffer.addParam(std::move(shadersParam));
+    ParamCapture shadersPackedParam("shadersPacked", ParamType::TShaderProgramIDConstPointer);
+    InitParamValue(ParamType::TShaderProgramIDConstPointer, shadersPacked,
+                   &shadersPackedParam.value);
+    CaptureShaderBinary_shadersPacked(context, isCallValid, count, shadersPacked, binaryformat,
+                                      binary, length, &shadersPackedParam);
+    paramBuffer.addParam(std::move(shadersPackedParam));
 
     paramBuffer.addEnumParam("binaryformat", GLenumGroup::DefaultGroup, ParamType::TGLenum,
                              binaryformat);
 
     ParamCapture binaryParam("binary", ParamType::TvoidConstPointer);
     InitParamValue(ParamType::TvoidConstPointer, binary, &binaryParam.value);
-    CaptureShaderBinary_binary(context, isCallValid, count, shaders, binaryformat, binary, length,
-                               &binaryParam);
+    CaptureShaderBinary_binary(context, isCallValid, count, shadersPacked, binaryformat, binary,
+                               length, &binaryParam);
     paramBuffer.addParam(std::move(binaryParam));
 
     paramBuffer.addValueParam("length", ParamType::TGLsizei, length);
@@ -1673,24 +1682,26 @@
 
 CallCapture CaptureShaderSource(const Context *context,
                                 bool isCallValid,
-                                GLuint shader,
+                                ShaderProgramID shaderPacked,
                                 GLsizei count,
                                 const GLchar *const *string,
                                 const GLint *length)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture stringParam("string", ParamType::TGLcharConstPointerPointer);
     InitParamValue(ParamType::TGLcharConstPointerPointer, string, &stringParam.value);
-    CaptureShaderSource_string(context, isCallValid, shader, count, string, length, &stringParam);
+    CaptureShaderSource_string(context, isCallValid, shaderPacked, count, string, length,
+                               &stringParam);
     paramBuffer.addParam(std::move(stringParam));
 
     ParamCapture lengthParam("length", ParamType::TGLintConstPointer);
     InitParamValue(ParamType::TGLintConstPointer, length, &lengthParam.value);
-    CaptureShaderSource_length(context, isCallValid, shader, count, string, length, &lengthParam);
+    CaptureShaderSource_length(context, isCallValid, shaderPacked, count, string, length,
+                               &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     return CallCapture(gl::EntryPoint::ShaderSource, std::move(paramBuffer));
@@ -2254,20 +2265,24 @@
     return CallCapture(gl::EntryPoint::UniformMatrix4fv, std::move(paramBuffer));
 }
 
-CallCapture CaptureUseProgram(const Context *context, bool isCallValid, GLuint program)
+CallCapture CaptureUseProgram(const Context *context,
+                              bool isCallValid,
+                              ShaderProgramID programPacked)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     return CallCapture(gl::EntryPoint::UseProgram, std::move(paramBuffer));
 }
 
-CallCapture CaptureValidateProgram(const Context *context, bool isCallValid, GLuint program)
+CallCapture CaptureValidateProgram(const Context *context,
+                                   bool isCallValid,
+                                   ShaderProgramID programPacked)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     return CallCapture(gl::EntryPoint::ValidateProgram, std::move(paramBuffer));
 }
diff --git a/src/libANGLE/capture_gles_2_0_autogen.h b/src/libANGLE/capture_gles_2_0_autogen.h
index 6cbaf98..7584f08 100644
--- a/src/libANGLE/capture_gles_2_0_autogen.h
+++ b/src/libANGLE/capture_gles_2_0_autogen.h
@@ -23,11 +23,11 @@
 angle::CallCapture CaptureActiveTexture(const Context *context, bool isCallValid, GLenum texture);
 angle::CallCapture CaptureAttachShader(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
-                                       GLuint shader);
+                                       ShaderProgramID programPacked,
+                                       ShaderProgramID shaderPacked);
 angle::CallCapture CaptureBindAttribLocation(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLuint index,
                                              const GLchar *name);
 angle::CallCapture CaptureBindBuffer(const Context *context,
@@ -98,7 +98,9 @@
                                     GLboolean green,
                                     GLboolean blue,
                                     GLboolean alpha);
-angle::CallCapture CaptureCompileShader(const Context *context, bool isCallValid, GLuint shader);
+angle::CallCapture CaptureCompileShader(const Context *context,
+                                        bool isCallValid,
+                                        ShaderProgramID shaderPacked);
 angle::CallCapture CaptureCompressedTexImage2D(const Context *context,
                                                bool isCallValid,
                                                TextureTarget targetPacked,
@@ -158,12 +160,16 @@
                                              bool isCallValid,
                                              GLsizei n,
                                              const GLuint *framebuffers);
-angle::CallCapture CaptureDeleteProgram(const Context *context, bool isCallValid, GLuint program);
+angle::CallCapture CaptureDeleteProgram(const Context *context,
+                                        bool isCallValid,
+                                        ShaderProgramID programPacked);
 angle::CallCapture CaptureDeleteRenderbuffers(const Context *context,
                                               bool isCallValid,
                                               GLsizei n,
                                               const RenderbufferID *renderbuffersPacked);
-angle::CallCapture CaptureDeleteShader(const Context *context, bool isCallValid, GLuint shader);
+angle::CallCapture CaptureDeleteShader(const Context *context,
+                                       bool isCallValid,
+                                       ShaderProgramID shaderPacked);
 angle::CallCapture CaptureDeleteTextures(const Context *context,
                                          bool isCallValid,
                                          GLsizei n,
@@ -176,8 +182,8 @@
                                       GLfloat f);
 angle::CallCapture CaptureDetachShader(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
-                                       GLuint shader);
+                                       ShaderProgramID programPacked,
+                                       ShaderProgramID shaderPacked);
 angle::CallCapture CaptureDisable(const Context *context, bool isCallValid, GLenum cap);
 angle::CallCapture CaptureDisableVertexAttribArray(const Context *context,
                                                    bool isCallValid,
@@ -234,7 +240,7 @@
                                          TextureType targetPacked);
 angle::CallCapture CaptureGetActiveAttrib(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID programPacked,
                                           GLuint index,
                                           GLsizei bufSize,
                                           GLsizei *length,
@@ -243,7 +249,7 @@
                                           GLchar *name);
 angle::CallCapture CaptureGetActiveUniform(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLuint index,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -252,13 +258,13 @@
                                            GLchar *name);
 angle::CallCapture CaptureGetAttachedShaders(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLsizei maxCount,
                                              GLsizei *count,
-                                             GLuint *shaders);
+                                             ShaderProgramID *shadersPacked);
 angle::CallCapture CaptureGetAttribLocation(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             const GLchar *name,
                                             GLint returnValue);
 angle::CallCapture CaptureGetBooleanv(const Context *context,
@@ -287,13 +293,13 @@
                                       GLint *data);
 angle::CallCapture CaptureGetProgramInfoLog(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLsizei bufSize,
                                             GLsizei *length,
                                             GLchar *infoLog);
 angle::CallCapture CaptureGetProgramiv(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLenum pname,
                                        GLint *params);
 angle::CallCapture CaptureGetRenderbufferParameteriv(const Context *context,
@@ -303,7 +309,7 @@
                                                      GLint *params);
 angle::CallCapture CaptureGetShaderInfoLog(const Context *context,
                                            bool isCallValid,
-                                           GLuint shader,
+                                           ShaderProgramID shaderPacked,
                                            GLsizei bufSize,
                                            GLsizei *length,
                                            GLchar *infoLog);
@@ -315,13 +321,13 @@
                                                    GLint *precision);
 angle::CallCapture CaptureGetShaderSource(const Context *context,
                                           bool isCallValid,
-                                          GLuint shader,
+                                          ShaderProgramID shaderPacked,
                                           GLsizei bufSize,
                                           GLsizei *length,
                                           GLchar *source);
 angle::CallCapture CaptureGetShaderiv(const Context *context,
                                       bool isCallValid,
-                                      GLuint shader,
+                                      ShaderProgramID shaderPacked,
                                       GLenum pname,
                                       GLint *params);
 angle::CallCapture CaptureGetString(const Context *context,
@@ -340,17 +346,17 @@
                                             GLint *params);
 angle::CallCapture CaptureGetUniformLocation(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              const GLchar *name,
                                              GLint returnValue);
 angle::CallCapture CaptureGetUniformfv(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLfloat *params);
 angle::CallCapture CaptureGetUniformiv(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLint *params);
 angle::CallCapture CaptureGetVertexAttribPointerv(const Context *context,
@@ -386,7 +392,7 @@
                                         GLboolean returnValue);
 angle::CallCapture CaptureIsProgram(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLboolean returnValue);
 angle::CallCapture CaptureIsRenderbuffer(const Context *context,
                                          bool isCallValid,
@@ -394,14 +400,16 @@
                                          GLboolean returnValue);
 angle::CallCapture CaptureIsShader(const Context *context,
                                    bool isCallValid,
-                                   GLuint shader,
+                                   ShaderProgramID shaderPacked,
                                    GLboolean returnValue);
 angle::CallCapture CaptureIsTexture(const Context *context,
                                     bool isCallValid,
                                     TextureID texturePacked,
                                     GLboolean returnValue);
 angle::CallCapture CaptureLineWidth(const Context *context, bool isCallValid, GLfloat width);
-angle::CallCapture CaptureLinkProgram(const Context *context, bool isCallValid, GLuint program);
+angle::CallCapture CaptureLinkProgram(const Context *context,
+                                      bool isCallValid,
+                                      ShaderProgramID programPacked);
 angle::CallCapture CapturePixelStorei(const Context *context,
                                       bool isCallValid,
                                       GLenum pname,
@@ -439,13 +447,13 @@
 angle::CallCapture CaptureShaderBinary(const Context *context,
                                        bool isCallValid,
                                        GLsizei count,
-                                       const GLuint *shaders,
+                                       const ShaderProgramID *shadersPacked,
                                        GLenum binaryformat,
                                        const void *binary,
                                        GLsizei length);
 angle::CallCapture CaptureShaderSource(const Context *context,
                                        bool isCallValid,
-                                       GLuint shader,
+                                       ShaderProgramID shaderPacked,
                                        GLsizei count,
                                        const GLchar *const *string,
                                        const GLint *length);
@@ -620,8 +628,12 @@
                                            GLsizei count,
                                            GLboolean transpose,
                                            const GLfloat *value);
-angle::CallCapture CaptureUseProgram(const Context *context, bool isCallValid, GLuint program);
-angle::CallCapture CaptureValidateProgram(const Context *context, bool isCallValid, GLuint program);
+angle::CallCapture CaptureUseProgram(const Context *context,
+                                     bool isCallValid,
+                                     ShaderProgramID programPacked);
+angle::CallCapture CaptureValidateProgram(const Context *context,
+                                          bool isCallValid,
+                                          ShaderProgramID programPacked);
 angle::CallCapture CaptureVertexAttrib1f(const Context *context,
                                          bool isCallValid,
                                          GLuint index,
@@ -679,7 +691,7 @@
 
 void CaptureBindAttribLocation_name(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLuint index,
                                     const GLchar *name,
                                     angle::ParamCapture *paramCapture);
@@ -769,7 +781,7 @@
                                        angle::ParamCapture *paramCapture);
 void CaptureGetActiveAttrib_length(const Context *context,
                                    bool isCallValid,
-                                   GLuint program,
+                                   ShaderProgramID programPacked,
                                    GLuint index,
                                    GLsizei bufSize,
                                    GLsizei *length,
@@ -779,7 +791,7 @@
                                    angle::ParamCapture *paramCapture);
 void CaptureGetActiveAttrib_size(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID programPacked,
                                  GLuint index,
                                  GLsizei bufSize,
                                  GLsizei *length,
@@ -789,7 +801,7 @@
                                  angle::ParamCapture *paramCapture);
 void CaptureGetActiveAttrib_type(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID programPacked,
                                  GLuint index,
                                  GLsizei bufSize,
                                  GLsizei *length,
@@ -799,7 +811,7 @@
                                  angle::ParamCapture *paramCapture);
 void CaptureGetActiveAttrib_name(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID programPacked,
                                  GLuint index,
                                  GLsizei bufSize,
                                  GLsizei *length,
@@ -809,7 +821,7 @@
                                  angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniform_length(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLuint index,
                                     GLsizei bufSize,
                                     GLsizei *length,
@@ -819,7 +831,7 @@
                                     angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniform_size(const Context *context,
                                   bool isCallValid,
-                                  GLuint program,
+                                  ShaderProgramID programPacked,
                                   GLuint index,
                                   GLsizei bufSize,
                                   GLsizei *length,
@@ -829,7 +841,7 @@
                                   angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniform_type(const Context *context,
                                   bool isCallValid,
-                                  GLuint program,
+                                  ShaderProgramID programPacked,
                                   GLuint index,
                                   GLsizei bufSize,
                                   GLsizei *length,
@@ -839,7 +851,7 @@
                                   angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniform_name(const Context *context,
                                   bool isCallValid,
-                                  GLuint program,
+                                  ShaderProgramID programPacked,
                                   GLuint index,
                                   GLsizei bufSize,
                                   GLsizei *length,
@@ -849,21 +861,21 @@
                                   angle::ParamCapture *paramCapture);
 void CaptureGetAttachedShaders_count(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLsizei maxCount,
                                      GLsizei *count,
-                                     GLuint *shaders,
+                                     ShaderProgramID *shadersPacked,
                                      angle::ParamCapture *paramCapture);
-void CaptureGetAttachedShaders_shaders(const Context *context,
-                                       bool isCallValid,
-                                       GLuint program,
-                                       GLsizei maxCount,
-                                       GLsizei *count,
-                                       GLuint *shaders,
-                                       angle::ParamCapture *paramCapture);
+void CaptureGetAttachedShaders_shadersPacked(const Context *context,
+                                             bool isCallValid,
+                                             ShaderProgramID programPacked,
+                                             GLsizei maxCount,
+                                             GLsizei *count,
+                                             ShaderProgramID *shadersPacked,
+                                             angle::ParamCapture *paramCapture);
 void CaptureGetAttribLocation_name(const Context *context,
                                    bool isCallValid,
-                                   GLuint program,
+                                   ShaderProgramID programPacked,
                                    const GLchar *name,
                                    angle::ParamCapture *paramCapture);
 void CaptureGetBooleanv_data(const Context *context,
@@ -896,21 +908,21 @@
                              angle::ParamCapture *paramCapture);
 void CaptureGetProgramInfoLog_length(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLsizei bufSize,
                                      GLsizei *length,
                                      GLchar *infoLog,
                                      angle::ParamCapture *paramCapture);
 void CaptureGetProgramInfoLog_infoLog(const Context *context,
                                       bool isCallValid,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       GLsizei bufSize,
                                       GLsizei *length,
                                       GLchar *infoLog,
                                       angle::ParamCapture *paramCapture);
 void CaptureGetProgramiv_params(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLenum pname,
                                 GLint *params,
                                 angle::ParamCapture *paramCapture);
@@ -922,14 +934,14 @@
                                               angle::ParamCapture *paramCapture);
 void CaptureGetShaderInfoLog_length(const Context *context,
                                     bool isCallValid,
-                                    GLuint shader,
+                                    ShaderProgramID shaderPacked,
                                     GLsizei bufSize,
                                     GLsizei *length,
                                     GLchar *infoLog,
                                     angle::ParamCapture *paramCapture);
 void CaptureGetShaderInfoLog_infoLog(const Context *context,
                                      bool isCallValid,
-                                     GLuint shader,
+                                     ShaderProgramID shaderPacked,
                                      GLsizei bufSize,
                                      GLsizei *length,
                                      GLchar *infoLog,
@@ -950,21 +962,21 @@
                                                angle::ParamCapture *paramCapture);
 void CaptureGetShaderSource_length(const Context *context,
                                    bool isCallValid,
-                                   GLuint shader,
+                                   ShaderProgramID shaderPacked,
                                    GLsizei bufSize,
                                    GLsizei *length,
                                    GLchar *source,
                                    angle::ParamCapture *paramCapture);
 void CaptureGetShaderSource_source(const Context *context,
                                    bool isCallValid,
-                                   GLuint shader,
+                                   ShaderProgramID shaderPacked,
                                    GLsizei bufSize,
                                    GLsizei *length,
                                    GLchar *source,
                                    angle::ParamCapture *paramCapture);
 void CaptureGetShaderiv_params(const Context *context,
                                bool isCallValid,
-                               GLuint shader,
+                               ShaderProgramID shaderPacked,
                                GLenum pname,
                                GLint *params,
                                angle::ParamCapture *paramCapture);
@@ -982,18 +994,18 @@
                                      angle::ParamCapture *paramCapture);
 void CaptureGetUniformLocation_name(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     const GLchar *name,
                                     angle::ParamCapture *paramCapture);
 void CaptureGetUniformfv_params(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLint location,
                                 GLfloat *params,
                                 angle::ParamCapture *paramCapture);
 void CaptureGetUniformiv_params(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLint location,
                                 GLint *params,
                                 angle::ParamCapture *paramCapture);
@@ -1025,32 +1037,32 @@
                               GLenum type,
                               void *pixels,
                               angle::ParamCapture *paramCapture);
-void CaptureShaderBinary_shaders(const Context *context,
-                                 bool isCallValid,
-                                 GLsizei count,
-                                 const GLuint *shaders,
-                                 GLenum binaryformat,
-                                 const void *binary,
-                                 GLsizei length,
-                                 angle::ParamCapture *paramCapture);
+void CaptureShaderBinary_shadersPacked(const Context *context,
+                                       bool isCallValid,
+                                       GLsizei count,
+                                       const ShaderProgramID *shadersPacked,
+                                       GLenum binaryformat,
+                                       const void *binary,
+                                       GLsizei length,
+                                       angle::ParamCapture *paramCapture);
 void CaptureShaderBinary_binary(const Context *context,
                                 bool isCallValid,
                                 GLsizei count,
-                                const GLuint *shaders,
+                                const ShaderProgramID *shadersPacked,
                                 GLenum binaryformat,
                                 const void *binary,
                                 GLsizei length,
                                 angle::ParamCapture *paramCapture);
 void CaptureShaderSource_string(const Context *context,
                                 bool isCallValid,
-                                GLuint shader,
+                                ShaderProgramID shaderPacked,
                                 GLsizei count,
                                 const GLchar *const *string,
                                 const GLint *length,
                                 angle::ParamCapture *paramCapture);
 void CaptureShaderSource_length(const Context *context,
                                 bool isCallValid,
-                                GLuint shader,
+                                ShaderProgramID shaderPacked,
                                 GLsizei count,
                                 const GLchar *const *string,
                                 const GLint *length,
diff --git a/src/libANGLE/capture_gles_2_0_params.cpp b/src/libANGLE/capture_gles_2_0_params.cpp
index b2fcc80..7815833 100644
--- a/src/libANGLE/capture_gles_2_0_params.cpp
+++ b/src/libANGLE/capture_gles_2_0_params.cpp
@@ -20,7 +20,7 @@
 
 void CaptureBindAttribLocation_name(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLuint index,
                                     const GLchar *name,
                                     ParamCapture *paramCapture)
@@ -189,7 +189,7 @@
 
 void CaptureGetActiveAttrib_length(const Context *context,
                                    bool isCallValid,
-                                   GLuint program,
+                                   ShaderProgramID program,
                                    GLuint index,
                                    GLsizei bufSize,
                                    GLsizei *length,
@@ -203,7 +203,7 @@
 
 void CaptureGetActiveAttrib_size(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID program,
                                  GLuint index,
                                  GLsizei bufSize,
                                  GLsizei *length,
@@ -217,7 +217,7 @@
 
 void CaptureGetActiveAttrib_type(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID program,
                                  GLuint index,
                                  GLsizei bufSize,
                                  GLsizei *length,
@@ -231,7 +231,7 @@
 
 void CaptureGetActiveAttrib_name(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID program,
                                  GLuint index,
                                  GLsizei bufSize,
                                  GLsizei *length,
@@ -245,7 +245,7 @@
 
 void CaptureGetActiveUniform_length(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLuint index,
                                     GLsizei bufSize,
                                     GLsizei *length,
@@ -259,7 +259,7 @@
 
 void CaptureGetActiveUniform_size(const Context *context,
                                   bool isCallValid,
-                                  GLuint program,
+                                  ShaderProgramID program,
                                   GLuint index,
                                   GLsizei bufSize,
                                   GLsizei *length,
@@ -273,7 +273,7 @@
 
 void CaptureGetActiveUniform_type(const Context *context,
                                   bool isCallValid,
-                                  GLuint program,
+                                  ShaderProgramID program,
                                   GLuint index,
                                   GLsizei bufSize,
                                   GLsizei *length,
@@ -287,7 +287,7 @@
 
 void CaptureGetActiveUniform_name(const Context *context,
                                   bool isCallValid,
-                                  GLuint program,
+                                  ShaderProgramID program,
                                   GLuint index,
                                   GLsizei bufSize,
                                   GLsizei *length,
@@ -301,29 +301,29 @@
 
 void CaptureGetAttachedShaders_count(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLsizei maxCount,
                                      GLsizei *count,
-                                     GLuint *shaders,
+                                     ShaderProgramID *shaders,
                                      ParamCapture *paramCapture)
 {
     UNIMPLEMENTED();
 }
 
-void CaptureGetAttachedShaders_shaders(const Context *context,
-                                       bool isCallValid,
-                                       GLuint program,
-                                       GLsizei maxCount,
-                                       GLsizei *count,
-                                       GLuint *shaders,
-                                       ParamCapture *paramCapture)
+void CaptureGetAttachedShaders_shadersPacked(const Context *context,
+                                             bool isCallValid,
+                                             ShaderProgramID program,
+                                             GLsizei maxCount,
+                                             GLsizei *count,
+                                             ShaderProgramID *shaders,
+                                             ParamCapture *paramCapture)
 {
     UNIMPLEMENTED();
 }
 
 void CaptureGetAttribLocation_name(const Context *context,
                                    bool isCallValid,
-                                   GLuint program,
+                                   ShaderProgramID program,
                                    const GLchar *name,
                                    ParamCapture *paramCapture)
 {
@@ -386,7 +386,7 @@
 
 void CaptureGetProgramInfoLog_length(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLsizei bufSize,
                                      GLsizei *length,
                                      GLchar *infoLog,
@@ -397,7 +397,7 @@
 
 void CaptureGetProgramInfoLog_infoLog(const Context *context,
                                       bool isCallValid,
-                                      GLuint program,
+                                      ShaderProgramID program,
                                       GLsizei bufSize,
                                       GLsizei *length,
                                       GLchar *infoLog,
@@ -410,7 +410,7 @@
 
 void CaptureGetProgramiv_params(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
+                                ShaderProgramID program,
                                 GLenum pname,
                                 GLint *params,
                                 ParamCapture *paramCapture)
@@ -433,7 +433,7 @@
 
 void CaptureGetShaderInfoLog_length(const Context *context,
                                     bool isCallValid,
-                                    GLuint shader,
+                                    ShaderProgramID shader,
                                     GLsizei bufSize,
                                     GLsizei *length,
                                     GLchar *infoLog,
@@ -444,7 +444,7 @@
 
 void CaptureGetShaderInfoLog_infoLog(const Context *context,
                                      bool isCallValid,
-                                     GLuint shader,
+                                     ShaderProgramID shader,
                                      GLsizei bufSize,
                                      GLsizei *length,
                                      GLchar *infoLog,
@@ -479,7 +479,7 @@
 
 void CaptureGetShaderSource_length(const Context *context,
                                    bool isCallValid,
-                                   GLuint shader,
+                                   ShaderProgramID shader,
                                    GLsizei bufSize,
                                    GLsizei *length,
                                    GLchar *source,
@@ -490,7 +490,7 @@
 
 void CaptureGetShaderSource_source(const Context *context,
                                    bool isCallValid,
-                                   GLuint shader,
+                                   ShaderProgramID shader,
                                    GLsizei bufSize,
                                    GLsizei *length,
                                    GLchar *source,
@@ -501,7 +501,7 @@
 
 void CaptureGetShaderiv_params(const Context *context,
                                bool isCallValid,
-                               GLuint shader,
+                               ShaderProgramID shader,
                                GLenum pname,
                                GLint *params,
                                ParamCapture *paramCapture)
@@ -534,7 +534,7 @@
 
 void CaptureGetUniformLocation_name(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     const GLchar *name,
                                     ParamCapture *paramCapture)
 {
@@ -543,7 +543,7 @@
 
 void CaptureGetUniformfv_params(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
+                                ShaderProgramID program,
                                 GLint location,
                                 GLfloat *params,
                                 ParamCapture *paramCapture)
@@ -553,7 +553,7 @@
 
 void CaptureGetUniformiv_params(const Context *context,
                                 bool isCallValid,
-                                GLuint program,
+                                ShaderProgramID program,
                                 GLint location,
                                 GLint *params,
                                 ParamCapture *paramCapture)
@@ -609,14 +609,14 @@
     paramCapture->readBufferSizeBytes      = kMaxPixelSize * width * height;
 }
 
-void CaptureShaderBinary_shaders(const Context *context,
-                                 bool isCallValid,
-                                 GLsizei count,
-                                 const GLuint *shaders,
-                                 GLenum binaryformat,
-                                 const void *binary,
-                                 GLsizei length,
-                                 ParamCapture *paramCapture)
+void CaptureShaderBinary_shadersPacked(const Context *context,
+                                       bool isCallValid,
+                                       GLsizei count,
+                                       const ShaderProgramID *shaders,
+                                       GLenum binaryformat,
+                                       const void *binary,
+                                       GLsizei length,
+                                       ParamCapture *paramCapture)
 {
     UNIMPLEMENTED();
 }
@@ -624,7 +624,7 @@
 void CaptureShaderBinary_binary(const Context *context,
                                 bool isCallValid,
                                 GLsizei count,
-                                const GLuint *shaders,
+                                const ShaderProgramID *shaders,
                                 GLenum binaryformat,
                                 const void *binary,
                                 GLsizei length,
@@ -635,7 +635,7 @@
 
 void CaptureShaderSource_string(const Context *context,
                                 bool isCallValid,
-                                GLuint shader,
+                                ShaderProgramID shader,
                                 GLsizei count,
                                 const GLchar *const *string,
                                 const GLint *length,
@@ -652,7 +652,7 @@
 
 void CaptureShaderSource_length(const Context *context,
                                 bool isCallValid,
-                                GLuint shader,
+                                ShaderProgramID shader,
                                 GLsizei count,
                                 const GLchar *const *string,
                                 const GLint *length,
diff --git a/src/libANGLE/capture_gles_3_0_autogen.cpp b/src/libANGLE/capture_gles_3_0_autogen.cpp
index d95ae6d..60eb6bb 100644
--- a/src/libANGLE/capture_gles_3_0_autogen.cpp
+++ b/src/libANGLE/capture_gles_3_0_autogen.cpp
@@ -659,7 +659,7 @@
 
 CallCapture CaptureGetActiveUniformBlockName(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLuint uniformBlockIndex,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -667,19 +667,19 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("uniformBlockIndex", ParamType::TGLuint, uniformBlockIndex);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetActiveUniformBlockName_length(context, isCallValid, program, uniformBlockIndex,
+    CaptureGetActiveUniformBlockName_length(context, isCallValid, programPacked, uniformBlockIndex,
                                             bufSize, length, uniformBlockName, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture uniformBlockNameParam("uniformBlockName", ParamType::TGLcharPointer);
     InitParamValue(ParamType::TGLcharPointer, uniformBlockName, &uniformBlockNameParam.value);
-    CaptureGetActiveUniformBlockName_uniformBlockName(context, isCallValid, program,
+    CaptureGetActiveUniformBlockName_uniformBlockName(context, isCallValid, programPacked,
                                                       uniformBlockIndex, bufSize, length,
                                                       uniformBlockName, &uniformBlockNameParam);
     paramBuffer.addParam(std::move(uniformBlockNameParam));
@@ -689,21 +689,21 @@
 
 CallCapture CaptureGetActiveUniformBlockiv(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLuint uniformBlockIndex,
                                            GLenum pname,
                                            GLint *params)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("uniformBlockIndex", ParamType::TGLuint, uniformBlockIndex);
     paramBuffer.addEnumParam("pname", GLenumGroup::UniformBlockPName, ParamType::TGLenum, pname);
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetActiveUniformBlockiv_params(context, isCallValid, program, uniformBlockIndex, pname,
-                                          params, &paramsParam);
+    CaptureGetActiveUniformBlockiv_params(context, isCallValid, programPacked, uniformBlockIndex,
+                                          pname, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetActiveUniformBlockiv, std::move(paramBuffer));
@@ -711,7 +711,7 @@
 
 CallCapture CaptureGetActiveUniformsiv(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLsizei uniformCount,
                                        const GLuint *uniformIndices,
                                        GLenum pname,
@@ -719,12 +719,12 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("uniformCount", ParamType::TGLsizei, uniformCount);
 
     ParamCapture uniformIndicesParam("uniformIndices", ParamType::TGLuintConstPointer);
     InitParamValue(ParamType::TGLuintConstPointer, uniformIndices, &uniformIndicesParam.value);
-    CaptureGetActiveUniformsiv_uniformIndices(context, isCallValid, program, uniformCount,
+    CaptureGetActiveUniformsiv_uniformIndices(context, isCallValid, programPacked, uniformCount,
                                               uniformIndices, pname, params, &uniformIndicesParam);
     paramBuffer.addParam(std::move(uniformIndicesParam));
 
@@ -732,8 +732,8 @@
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetActiveUniformsiv_params(context, isCallValid, program, uniformCount, uniformIndices,
-                                      pname, params, &paramsParam);
+    CaptureGetActiveUniformsiv_params(context, isCallValid, programPacked, uniformCount,
+                                      uniformIndices, pname, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetActiveUniformsiv, std::move(paramBuffer));
@@ -781,17 +781,17 @@
 
 CallCapture CaptureGetFragDataLocation(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        const GLchar *name,
                                        GLint returnValue)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureGetFragDataLocation_name(context, isCallValid, program, name, &nameParam);
+    CaptureGetFragDataLocation_name(context, isCallValid, programPacked, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     ParamCapture returnValueCapture("returnValue", ParamType::TGLint);
@@ -883,7 +883,7 @@
 
 CallCapture CaptureGetProgramBinary(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLsizei bufSize,
                                     GLsizei *length,
                                     GLenum *binaryFormat,
@@ -891,25 +891,25 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetProgramBinary_length(context, isCallValid, program, bufSize, length, binaryFormat,
-                                   binary, &lengthParam);
+    CaptureGetProgramBinary_length(context, isCallValid, programPacked, bufSize, length,
+                                   binaryFormat, binary, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture binaryFormatParam("binaryFormat", ParamType::TGLenumPointer);
     InitParamValue(ParamType::TGLenumPointer, binaryFormat, &binaryFormatParam.value);
-    CaptureGetProgramBinary_binaryFormat(context, isCallValid, program, bufSize, length,
+    CaptureGetProgramBinary_binaryFormat(context, isCallValid, programPacked, bufSize, length,
                                          binaryFormat, binary, &binaryFormatParam);
     paramBuffer.addParam(std::move(binaryFormatParam));
 
     ParamCapture binaryParam("binary", ParamType::TvoidPointer);
     InitParamValue(ParamType::TvoidPointer, binary, &binaryParam.value);
-    CaptureGetProgramBinary_binary(context, isCallValid, program, bufSize, length, binaryFormat,
-                                   binary, &binaryParam);
+    CaptureGetProgramBinary_binary(context, isCallValid, programPacked, bufSize, length,
+                                   binaryFormat, binary, &binaryParam);
     paramBuffer.addParam(std::move(binaryParam));
 
     return CallCapture(gl::EntryPoint::GetProgramBinary, std::move(paramBuffer));
@@ -1043,7 +1043,7 @@
 
 CallCapture CaptureGetTransformFeedbackVarying(const Context *context,
                                                bool isCallValid,
-                                               GLuint program,
+                                               ShaderProgramID programPacked,
                                                GLuint index,
                                                GLsizei bufSize,
                                                GLsizei *length,
@@ -1053,32 +1053,32 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetTransformFeedbackVarying_length(context, isCallValid, program, index, bufSize, length,
-                                              size, type, name, &lengthParam);
+    CaptureGetTransformFeedbackVarying_length(context, isCallValid, programPacked, index, bufSize,
+                                              length, size, type, name, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture sizeParam("size", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, size, &sizeParam.value);
-    CaptureGetTransformFeedbackVarying_size(context, isCallValid, program, index, bufSize, length,
-                                            size, type, name, &sizeParam);
+    CaptureGetTransformFeedbackVarying_size(context, isCallValid, programPacked, index, bufSize,
+                                            length, size, type, name, &sizeParam);
     paramBuffer.addParam(std::move(sizeParam));
 
     ParamCapture typeParam("type", ParamType::TGLenumPointer);
     InitParamValue(ParamType::TGLenumPointer, type, &typeParam.value);
-    CaptureGetTransformFeedbackVarying_type(context, isCallValid, program, index, bufSize, length,
-                                            size, type, name, &typeParam);
+    CaptureGetTransformFeedbackVarying_type(context, isCallValid, programPacked, index, bufSize,
+                                            length, size, type, name, &typeParam);
     paramBuffer.addParam(std::move(typeParam));
 
     ParamCapture nameParam("name", ParamType::TGLcharPointer);
     InitParamValue(ParamType::TGLcharPointer, name, &nameParam.value);
-    CaptureGetTransformFeedbackVarying_name(context, isCallValid, program, index, bufSize, length,
-                                            size, type, name, &nameParam);
+    CaptureGetTransformFeedbackVarying_name(context, isCallValid, programPacked, index, bufSize,
+                                            length, size, type, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     return CallCapture(gl::EntryPoint::GetTransformFeedbackVarying, std::move(paramBuffer));
@@ -1086,18 +1086,18 @@
 
 CallCapture CaptureGetUniformBlockIndex(const Context *context,
                                         bool isCallValid,
-                                        GLuint program,
+                                        ShaderProgramID programPacked,
                                         const GLchar *uniformBlockName,
                                         GLuint returnValue)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     ParamCapture uniformBlockNameParam("uniformBlockName", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, uniformBlockName, &uniformBlockNameParam.value);
-    CaptureGetUniformBlockIndex_uniformBlockName(context, isCallValid, program, uniformBlockName,
-                                                 &uniformBlockNameParam);
+    CaptureGetUniformBlockIndex_uniformBlockName(context, isCallValid, programPacked,
+                                                 uniformBlockName, &uniformBlockNameParam);
     paramBuffer.addParam(std::move(uniformBlockNameParam));
 
     ParamCapture returnValueCapture("returnValue", ParamType::TGLuint);
@@ -1109,25 +1109,25 @@
 
 CallCapture CaptureGetUniformIndices(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLsizei uniformCount,
                                      const GLchar *const *uniformNames,
                                      GLuint *uniformIndices)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("uniformCount", ParamType::TGLsizei, uniformCount);
 
     ParamCapture uniformNamesParam("uniformNames", ParamType::TGLcharConstPointerPointer);
     InitParamValue(ParamType::TGLcharConstPointerPointer, uniformNames, &uniformNamesParam.value);
-    CaptureGetUniformIndices_uniformNames(context, isCallValid, program, uniformCount, uniformNames,
-                                          uniformIndices, &uniformNamesParam);
+    CaptureGetUniformIndices_uniformNames(context, isCallValid, programPacked, uniformCount,
+                                          uniformNames, uniformIndices, &uniformNamesParam);
     paramBuffer.addParam(std::move(uniformNamesParam));
 
     ParamCapture uniformIndicesParam("uniformIndices", ParamType::TGLuintPointer);
     InitParamValue(ParamType::TGLuintPointer, uniformIndices, &uniformIndicesParam.value);
-    CaptureGetUniformIndices_uniformIndices(context, isCallValid, program, uniformCount,
+    CaptureGetUniformIndices_uniformIndices(context, isCallValid, programPacked, uniformCount,
                                             uniformNames, uniformIndices, &uniformIndicesParam);
     paramBuffer.addParam(std::move(uniformIndicesParam));
 
@@ -1136,18 +1136,19 @@
 
 CallCapture CaptureGetUniformuiv(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID programPacked,
                                  GLint location,
                                  GLuint *params)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
 
     ParamCapture paramsParam("params", ParamType::TGLuintPointer);
     InitParamValue(ParamType::TGLuintPointer, params, &paramsParam.value);
-    CaptureGetUniformuiv_params(context, isCallValid, program, location, params, &paramsParam);
+    CaptureGetUniformuiv_params(context, isCallValid, programPacked, location, params,
+                                &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetUniformuiv, std::move(paramBuffer));
@@ -1353,20 +1354,20 @@
 
 CallCapture CaptureProgramBinary(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID programPacked,
                                  GLenum binaryFormat,
                                  const void *binary,
                                  GLsizei length)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("binaryFormat", GLenumGroup::DefaultGroup, ParamType::TGLenum,
                              binaryFormat);
 
     ParamCapture binaryParam("binary", ParamType::TvoidConstPointer);
     InitParamValue(ParamType::TvoidConstPointer, binary, &binaryParam.value);
-    CaptureProgramBinary_binary(context, isCallValid, program, binaryFormat, binary, length,
+    CaptureProgramBinary_binary(context, isCallValid, programPacked, binaryFormat, binary, length,
                                 &binaryParam);
     paramBuffer.addParam(std::move(binaryParam));
 
@@ -1377,13 +1378,13 @@
 
 CallCapture CaptureProgramParameteri(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLenum pname,
                                      GLint value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("pname", GLenumGroup::ProgramParameterPName, ParamType::TGLenum,
                              pname);
     paramBuffer.addValueParam("value", ParamType::TGLint, value);
@@ -1609,19 +1610,19 @@
 
 CallCapture CaptureTransformFeedbackVaryings(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLsizei count,
                                              const GLchar *const *varyings,
                                              GLenum bufferMode)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture varyingsParam("varyings", ParamType::TGLcharConstPointerPointer);
     InitParamValue(ParamType::TGLcharConstPointerPointer, varyings, &varyingsParam.value);
-    CaptureTransformFeedbackVaryings_varyings(context, isCallValid, program, count, varyings,
+    CaptureTransformFeedbackVaryings_varyings(context, isCallValid, programPacked, count, varyings,
                                               bufferMode, &varyingsParam);
     paramBuffer.addParam(std::move(varyingsParam));
 
@@ -1770,13 +1771,13 @@
 
 CallCapture CaptureUniformBlockBinding(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLuint uniformBlockIndex,
                                        GLuint uniformBlockBinding)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("uniformBlockIndex", ParamType::TGLuint, uniformBlockIndex);
     paramBuffer.addValueParam("uniformBlockBinding", ParamType::TGLuint, uniformBlockBinding);
 
diff --git a/src/libANGLE/capture_gles_3_0_autogen.h b/src/libANGLE/capture_gles_3_0_autogen.h
index 7ffd871..317d821 100644
--- a/src/libANGLE/capture_gles_3_0_autogen.h
+++ b/src/libANGLE/capture_gles_3_0_autogen.h
@@ -210,20 +210,20 @@
                                           GLuint *arrays);
 angle::CallCapture CaptureGetActiveUniformBlockName(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLuint uniformBlockIndex,
                                                     GLsizei bufSize,
                                                     GLsizei *length,
                                                     GLchar *uniformBlockName);
 angle::CallCapture CaptureGetActiveUniformBlockiv(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   GLuint uniformBlockIndex,
                                                   GLenum pname,
                                                   GLint *params);
 angle::CallCapture CaptureGetActiveUniformsiv(const Context *context,
                                               bool isCallValid,
-                                              GLuint program,
+                                              ShaderProgramID programPacked,
                                               GLsizei uniformCount,
                                               const GLuint *uniformIndices,
                                               GLenum pname,
@@ -240,7 +240,7 @@
                                             void **params);
 angle::CallCapture CaptureGetFragDataLocation(const Context *context,
                                               bool isCallValid,
-                                              GLuint program,
+                                              ShaderProgramID programPacked,
                                               const GLchar *name,
                                               GLint returnValue);
 angle::CallCapture CaptureGetInteger64i_v(const Context *context,
@@ -266,7 +266,7 @@
                                               GLint *params);
 angle::CallCapture CaptureGetProgramBinary(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLsizei bufSize,
                                            GLsizei *length,
                                            GLenum *binaryFormat,
@@ -305,7 +305,7 @@
                                     GLint *values);
 angle::CallCapture CaptureGetTransformFeedbackVarying(const Context *context,
                                                       bool isCallValid,
-                                                      GLuint program,
+                                                      ShaderProgramID programPacked,
                                                       GLuint index,
                                                       GLsizei bufSize,
                                                       GLsizei *length,
@@ -314,18 +314,18 @@
                                                       GLchar *name);
 angle::CallCapture CaptureGetUniformBlockIndex(const Context *context,
                                                bool isCallValid,
-                                               GLuint program,
+                                               ShaderProgramID programPacked,
                                                const GLchar *uniformBlockName,
                                                GLuint returnValue);
 angle::CallCapture CaptureGetUniformIndices(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLsizei uniformCount,
                                             const GLchar *const *uniformNames,
                                             GLuint *uniformIndices);
 angle::CallCapture CaptureGetUniformuiv(const Context *context,
                                         bool isCallValid,
-                                        GLuint program,
+                                        ShaderProgramID programPacked,
                                         GLint location,
                                         GLuint *params);
 angle::CallCapture CaptureGetVertexAttribIiv(const Context *context,
@@ -382,13 +382,13 @@
 angle::CallCapture CapturePauseTransformFeedback(const Context *context, bool isCallValid);
 angle::CallCapture CaptureProgramBinary(const Context *context,
                                         bool isCallValid,
-                                        GLuint program,
+                                        ShaderProgramID programPacked,
                                         GLenum binaryFormat,
                                         const void *binary,
                                         GLsizei length);
 angle::CallCapture CaptureProgramParameteri(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLenum pname,
                                             GLint value);
 angle::CallCapture CaptureReadBuffer(const Context *context, bool isCallValid, GLenum src);
@@ -462,7 +462,7 @@
                                         const void *pixels);
 angle::CallCapture CaptureTransformFeedbackVaryings(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLsizei count,
                                                     const GLchar *const *varyings,
                                                     GLenum bufferMode);
@@ -510,7 +510,7 @@
                                       const GLuint *value);
 angle::CallCapture CaptureUniformBlockBinding(const Context *context,
                                               bool isCallValid,
-                                              GLuint program,
+                                              ShaderProgramID programPacked,
                                               GLuint uniformBlockIndex,
                                               GLuint uniformBlockBinding);
 angle::CallCapture CaptureUniformMatrix2x3fv(const Context *context,
@@ -702,7 +702,7 @@
                                    angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniformBlockName_length(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLuint uniformBlockIndex,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -710,7 +710,7 @@
                                              angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniformBlockName_uniformBlockName(const Context *context,
                                                        bool isCallValid,
-                                                       GLuint program,
+                                                       ShaderProgramID programPacked,
                                                        GLuint uniformBlockIndex,
                                                        GLsizei bufSize,
                                                        GLsizei *length,
@@ -718,14 +718,14 @@
                                                        angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniformBlockiv_params(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLuint uniformBlockIndex,
                                            GLenum pname,
                                            GLint *params,
                                            angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniformsiv_uniformIndices(const Context *context,
                                                bool isCallValid,
-                                               GLuint program,
+                                               ShaderProgramID programPacked,
                                                GLsizei uniformCount,
                                                const GLuint *uniformIndices,
                                                GLenum pname,
@@ -733,7 +733,7 @@
                                                angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniformsiv_params(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLsizei uniformCount,
                                        const GLuint *uniformIndices,
                                        GLenum pname,
@@ -753,7 +753,7 @@
                                      angle::ParamCapture *paramCapture);
 void CaptureGetFragDataLocation_name(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      const GLchar *name,
                                      angle::ParamCapture *paramCapture);
 void CaptureGetInteger64i_v_data(const Context *context,
@@ -783,7 +783,7 @@
                                        angle::ParamCapture *paramCapture);
 void CaptureGetProgramBinary_length(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLsizei bufSize,
                                     GLsizei *length,
                                     GLenum *binaryFormat,
@@ -791,7 +791,7 @@
                                     angle::ParamCapture *paramCapture);
 void CaptureGetProgramBinary_binaryFormat(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID programPacked,
                                           GLsizei bufSize,
                                           GLsizei *length,
                                           GLenum *binaryFormat,
@@ -799,7 +799,7 @@
                                           angle::ParamCapture *paramCapture);
 void CaptureGetProgramBinary_binary(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLsizei bufSize,
                                     GLsizei *length,
                                     GLenum *binaryFormat,
@@ -847,7 +847,7 @@
                              angle::ParamCapture *paramCapture);
 void CaptureGetTransformFeedbackVarying_length(const Context *context,
                                                bool isCallValid,
-                                               GLuint program,
+                                               ShaderProgramID programPacked,
                                                GLuint index,
                                                GLsizei bufSize,
                                                GLsizei *length,
@@ -857,7 +857,7 @@
                                                angle::ParamCapture *paramCapture);
 void CaptureGetTransformFeedbackVarying_size(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLuint index,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -867,7 +867,7 @@
                                              angle::ParamCapture *paramCapture);
 void CaptureGetTransformFeedbackVarying_type(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLuint index,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -877,7 +877,7 @@
                                              angle::ParamCapture *paramCapture);
 void CaptureGetTransformFeedbackVarying_name(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLuint index,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -887,26 +887,26 @@
                                              angle::ParamCapture *paramCapture);
 void CaptureGetUniformBlockIndex_uniformBlockName(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   const GLchar *uniformBlockName,
                                                   angle::ParamCapture *paramCapture);
 void CaptureGetUniformIndices_uniformNames(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLsizei uniformCount,
                                            const GLchar *const *uniformNames,
                                            GLuint *uniformIndices,
                                            angle::ParamCapture *paramCapture);
 void CaptureGetUniformIndices_uniformIndices(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLsizei uniformCount,
                                              const GLchar *const *uniformNames,
                                              GLuint *uniformIndices,
                                              angle::ParamCapture *paramCapture);
 void CaptureGetUniformuiv_params(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID programPacked,
                                  GLint location,
                                  GLuint *params,
                                  angle::ParamCapture *paramCapture);
@@ -940,7 +940,7 @@
                                                  angle::ParamCapture *paramCapture);
 void CaptureProgramBinary_binary(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID programPacked,
                                  GLenum binaryFormat,
                                  const void *binary,
                                  GLsizei length,
@@ -986,7 +986,7 @@
                                  angle::ParamCapture *paramCapture);
 void CaptureTransformFeedbackVaryings_varyings(const Context *context,
                                                bool isCallValid,
-                                               GLuint program,
+                                               ShaderProgramID programPacked,
                                                GLsizei count,
                                                const GLchar *const *varyings,
                                                GLenum bufferMode,
diff --git a/src/libANGLE/capture_gles_3_0_params.cpp b/src/libANGLE/capture_gles_3_0_params.cpp
index be66d8a..744e9fa 100644
--- a/src/libANGLE/capture_gles_3_0_params.cpp
+++ b/src/libANGLE/capture_gles_3_0_params.cpp
@@ -184,7 +184,7 @@
 
 void CaptureGetActiveUniformBlockName_length(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID program,
                                              GLuint uniformBlockIndex,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -196,7 +196,7 @@
 
 void CaptureGetActiveUniformBlockName_uniformBlockName(const Context *context,
                                                        bool isCallValid,
-                                                       GLuint program,
+                                                       ShaderProgramID program,
                                                        GLuint uniformBlockIndex,
                                                        GLsizei bufSize,
                                                        GLsizei *length,
@@ -208,7 +208,7 @@
 
 void CaptureGetActiveUniformBlockiv_params(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID program,
                                            GLuint uniformBlockIndex,
                                            GLenum pname,
                                            GLint *params,
@@ -219,7 +219,7 @@
 
 void CaptureGetActiveUniformsiv_uniformIndices(const Context *context,
                                                bool isCallValid,
-                                               GLuint program,
+                                               ShaderProgramID program,
                                                GLsizei uniformCount,
                                                const GLuint *uniformIndices,
                                                GLenum pname,
@@ -231,7 +231,7 @@
 
 void CaptureGetActiveUniformsiv_params(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLsizei uniformCount,
                                        const GLuint *uniformIndices,
                                        GLenum pname,
@@ -263,7 +263,7 @@
 
 void CaptureGetFragDataLocation_name(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      const GLchar *name,
                                      ParamCapture *paramCapture)
 {
@@ -313,7 +313,7 @@
 
 void CaptureGetProgramBinary_length(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLsizei bufSize,
                                     GLsizei *length,
                                     GLenum *binaryFormat,
@@ -325,7 +325,7 @@
 
 void CaptureGetProgramBinary_binaryFormat(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID program,
                                           GLsizei bufSize,
                                           GLsizei *length,
                                           GLenum *binaryFormat,
@@ -337,7 +337,7 @@
 
 void CaptureGetProgramBinary_binary(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLsizei bufSize,
                                     GLsizei *length,
                                     GLenum *binaryFormat,
@@ -413,7 +413,7 @@
 
 void CaptureGetTransformFeedbackVarying_length(const Context *context,
                                                bool isCallValid,
-                                               GLuint program,
+                                               ShaderProgramID program,
                                                GLuint index,
                                                GLsizei bufSize,
                                                GLsizei *length,
@@ -427,7 +427,7 @@
 
 void CaptureGetTransformFeedbackVarying_size(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID program,
                                              GLuint index,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -441,7 +441,7 @@
 
 void CaptureGetTransformFeedbackVarying_type(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID program,
                                              GLuint index,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -455,7 +455,7 @@
 
 void CaptureGetTransformFeedbackVarying_name(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID program,
                                              GLuint index,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -469,7 +469,7 @@
 
 void CaptureGetUniformBlockIndex_uniformBlockName(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID program,
                                                   const GLchar *uniformBlockName,
                                                   ParamCapture *paramCapture)
 {
@@ -478,7 +478,7 @@
 
 void CaptureGetUniformIndices_uniformNames(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID program,
                                            GLsizei uniformCount,
                                            const GLchar *const *uniformNames,
                                            GLuint *uniformIndices,
@@ -489,7 +489,7 @@
 
 void CaptureGetUniformIndices_uniformIndices(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID program,
                                              GLsizei uniformCount,
                                              const GLchar *const *uniformNames,
                                              GLuint *uniformIndices,
@@ -500,7 +500,7 @@
 
 void CaptureGetUniformuiv_params(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID program,
                                  GLint location,
                                  GLuint *params,
                                  ParamCapture *paramCapture)
@@ -554,7 +554,7 @@
 
 void CaptureProgramBinary_binary(const Context *context,
                                  bool isCallValid,
-                                 GLuint program,
+                                 ShaderProgramID program,
                                  GLenum binaryFormat,
                                  const void *binary,
                                  GLsizei length,
@@ -620,7 +620,7 @@
 
 void CaptureTransformFeedbackVaryings_varyings(const Context *context,
                                                bool isCallValid,
-                                               GLuint program,
+                                               ShaderProgramID program,
                                                GLsizei count,
                                                const GLchar *const *varyings,
                                                GLenum bufferMode,
diff --git a/src/libANGLE/capture_gles_3_1_autogen.cpp b/src/libANGLE/capture_gles_3_1_autogen.cpp
index 10901e7..9f09fb0 100644
--- a/src/libANGLE/capture_gles_3_1_autogen.cpp
+++ b/src/libANGLE/capture_gles_3_1_autogen.cpp
@@ -23,12 +23,12 @@
 CallCapture CaptureActiveShaderProgram(const Context *context,
                                        bool isCallValid,
                                        ProgramPipelineID pipelinePacked,
-                                       GLuint program)
+                                       ShaderProgramID programPacked)
 {
     ParamBuffer paramBuffer;
 
     paramBuffer.addValueParam("pipelinePacked", ParamType::TProgramPipelineID, pipelinePacked);
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     return CallCapture(gl::EntryPoint::ActiveShaderProgram, std::move(paramBuffer));
 }
@@ -287,14 +287,14 @@
 
 CallCapture CaptureGetProgramInterfaceiv(const Context *context,
                                          bool isCallValid,
-                                         GLuint program,
+                                         ShaderProgramID programPacked,
                                          GLenum programInterface,
                                          GLenum pname,
                                          GLint *params)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("programInterface", GLenumGroup::ProgramInterface, ParamType::TGLenum,
                              programInterface);
     paramBuffer.addEnumParam("pname", GLenumGroup::ProgramInterfacePName, ParamType::TGLenum,
@@ -302,8 +302,8 @@
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetProgramInterfaceiv_params(context, isCallValid, program, programInterface, pname,
-                                        params, &paramsParam);
+    CaptureGetProgramInterfaceiv_params(context, isCallValid, programPacked, programInterface,
+                                        pname, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetProgramInterfaceiv, std::move(paramBuffer));
@@ -359,20 +359,20 @@
 
 CallCapture CaptureGetProgramResourceIndex(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLenum programInterface,
                                            const GLchar *name,
                                            GLuint returnValue)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("programInterface", GLenumGroup::ProgramInterface, ParamType::TGLenum,
                              programInterface);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureGetProgramResourceIndex_name(context, isCallValid, program, programInterface, name,
+    CaptureGetProgramResourceIndex_name(context, isCallValid, programPacked, programInterface, name,
                                         &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
@@ -385,21 +385,21 @@
 
 CallCapture CaptureGetProgramResourceLocation(const Context *context,
                                               bool isCallValid,
-                                              GLuint program,
+                                              ShaderProgramID programPacked,
                                               GLenum programInterface,
                                               const GLchar *name,
                                               GLint returnValue)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("programInterface", GLenumGroup::ProgramInterface, ParamType::TGLenum,
                              programInterface);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureGetProgramResourceLocation_name(context, isCallValid, program, programInterface, name,
-                                           &nameParam);
+    CaptureGetProgramResourceLocation_name(context, isCallValid, programPacked, programInterface,
+                                           name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     ParamCapture returnValueCapture("returnValue", ParamType::TGLint);
@@ -411,7 +411,7 @@
 
 CallCapture CaptureGetProgramResourceName(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID programPacked,
                                           GLenum programInterface,
                                           GLuint index,
                                           GLsizei bufSize,
@@ -420,7 +420,7 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("programInterface", GLenumGroup::ProgramInterface, ParamType::TGLenum,
                              programInterface);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
@@ -428,13 +428,13 @@
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetProgramResourceName_length(context, isCallValid, program, programInterface, index,
-                                         bufSize, length, name, &lengthParam);
+    CaptureGetProgramResourceName_length(context, isCallValid, programPacked, programInterface,
+                                         index, bufSize, length, name, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture nameParam("name", ParamType::TGLcharPointer);
     InitParamValue(ParamType::TGLcharPointer, name, &nameParam.value);
-    CaptureGetProgramResourceName_name(context, isCallValid, program, programInterface, index,
+    CaptureGetProgramResourceName_name(context, isCallValid, programPacked, programInterface, index,
                                        bufSize, length, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
@@ -443,7 +443,7 @@
 
 CallCapture CaptureGetProgramResourceiv(const Context *context,
                                         bool isCallValid,
-                                        GLuint program,
+                                        ShaderProgramID programPacked,
                                         GLenum programInterface,
                                         GLuint index,
                                         GLsizei propCount,
@@ -454,7 +454,7 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("programInterface", GLenumGroup::ProgramInterface, ParamType::TGLenum,
                              programInterface);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
@@ -462,7 +462,7 @@
 
     ParamCapture propsParam("props", ParamType::TGLenumConstPointer);
     InitParamValue(ParamType::TGLenumConstPointer, props, &propsParam.value);
-    CaptureGetProgramResourceiv_props(context, isCallValid, program, programInterface, index,
+    CaptureGetProgramResourceiv_props(context, isCallValid, programPacked, programInterface, index,
                                       propCount, props, bufSize, length, params, &propsParam);
     paramBuffer.addParam(std::move(propsParam));
 
@@ -470,13 +470,13 @@
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetProgramResourceiv_length(context, isCallValid, program, programInterface, index,
+    CaptureGetProgramResourceiv_length(context, isCallValid, programPacked, programInterface, index,
                                        propCount, props, bufSize, length, params, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetProgramResourceiv_params(context, isCallValid, program, programInterface, index,
+    CaptureGetProgramResourceiv_params(context, isCallValid, programPacked, programInterface, index,
                                        propCount, props, bufSize, length, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
@@ -567,13 +567,13 @@
 
 CallCapture CaptureProgramUniform1f(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLfloat v0)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLfloat, v0);
 
@@ -582,20 +582,20 @@
 
 CallCapture CaptureProgramUniform1fv(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLfloat *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniform1fv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform1fv_value(context, isCallValid, programPacked, location, count, value,
                                    &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -604,13 +604,13 @@
 
 CallCapture CaptureProgramUniform1i(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLint v0)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLint, v0);
 
@@ -619,20 +619,20 @@
 
 CallCapture CaptureProgramUniform1iv(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLint *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLintConstPointer);
     InitParamValue(ParamType::TGLintConstPointer, value, &valueParam.value);
-    CaptureProgramUniform1iv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform1iv_value(context, isCallValid, programPacked, location, count, value,
                                    &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -641,13 +641,13 @@
 
 CallCapture CaptureProgramUniform1ui(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLuint v0)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLuint, v0);
 
@@ -656,20 +656,20 @@
 
 CallCapture CaptureProgramUniform1uiv(const Context *context,
                                       bool isCallValid,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       GLint location,
                                       GLsizei count,
                                       const GLuint *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLuintConstPointer);
     InitParamValue(ParamType::TGLuintConstPointer, value, &valueParam.value);
-    CaptureProgramUniform1uiv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform1uiv_value(context, isCallValid, programPacked, location, count, value,
                                     &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -678,14 +678,14 @@
 
 CallCapture CaptureProgramUniform2f(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLfloat v0,
                                     GLfloat v1)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLfloat, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLfloat, v1);
@@ -695,20 +695,20 @@
 
 CallCapture CaptureProgramUniform2fv(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLfloat *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniform2fv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform2fv_value(context, isCallValid, programPacked, location, count, value,
                                    &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -717,14 +717,14 @@
 
 CallCapture CaptureProgramUniform2i(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLint v0,
                                     GLint v1)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLint, v1);
@@ -734,20 +734,20 @@
 
 CallCapture CaptureProgramUniform2iv(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLint *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLintConstPointer);
     InitParamValue(ParamType::TGLintConstPointer, value, &valueParam.value);
-    CaptureProgramUniform2iv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform2iv_value(context, isCallValid, programPacked, location, count, value,
                                    &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -756,14 +756,14 @@
 
 CallCapture CaptureProgramUniform2ui(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLuint v0,
                                      GLuint v1)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLuint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLuint, v1);
@@ -773,20 +773,20 @@
 
 CallCapture CaptureProgramUniform2uiv(const Context *context,
                                       bool isCallValid,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       GLint location,
                                       GLsizei count,
                                       const GLuint *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLuintConstPointer);
     InitParamValue(ParamType::TGLuintConstPointer, value, &valueParam.value);
-    CaptureProgramUniform2uiv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform2uiv_value(context, isCallValid, programPacked, location, count, value,
                                     &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -795,7 +795,7 @@
 
 CallCapture CaptureProgramUniform3f(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLfloat v0,
                                     GLfloat v1,
@@ -803,7 +803,7 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLfloat, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLfloat, v1);
@@ -814,20 +814,20 @@
 
 CallCapture CaptureProgramUniform3fv(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLfloat *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniform3fv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform3fv_value(context, isCallValid, programPacked, location, count, value,
                                    &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -836,7 +836,7 @@
 
 CallCapture CaptureProgramUniform3i(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLint v0,
                                     GLint v1,
@@ -844,7 +844,7 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLint, v1);
@@ -855,20 +855,20 @@
 
 CallCapture CaptureProgramUniform3iv(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLint *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLintConstPointer);
     InitParamValue(ParamType::TGLintConstPointer, value, &valueParam.value);
-    CaptureProgramUniform3iv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform3iv_value(context, isCallValid, programPacked, location, count, value,
                                    &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -877,7 +877,7 @@
 
 CallCapture CaptureProgramUniform3ui(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLuint v0,
                                      GLuint v1,
@@ -885,7 +885,7 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLuint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLuint, v1);
@@ -896,20 +896,20 @@
 
 CallCapture CaptureProgramUniform3uiv(const Context *context,
                                       bool isCallValid,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       GLint location,
                                       GLsizei count,
                                       const GLuint *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLuintConstPointer);
     InitParamValue(ParamType::TGLuintConstPointer, value, &valueParam.value);
-    CaptureProgramUniform3uiv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform3uiv_value(context, isCallValid, programPacked, location, count, value,
                                     &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -918,7 +918,7 @@
 
 CallCapture CaptureProgramUniform4f(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLfloat v0,
                                     GLfloat v1,
@@ -927,7 +927,7 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLfloat, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLfloat, v1);
@@ -939,20 +939,20 @@
 
 CallCapture CaptureProgramUniform4fv(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLfloat *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniform4fv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform4fv_value(context, isCallValid, programPacked, location, count, value,
                                    &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -961,7 +961,7 @@
 
 CallCapture CaptureProgramUniform4i(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLint v0,
                                     GLint v1,
@@ -970,7 +970,7 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLint, v1);
@@ -982,20 +982,20 @@
 
 CallCapture CaptureProgramUniform4iv(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLint *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLintConstPointer);
     InitParamValue(ParamType::TGLintConstPointer, value, &valueParam.value);
-    CaptureProgramUniform4iv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform4iv_value(context, isCallValid, programPacked, location, count, value,
                                    &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -1004,7 +1004,7 @@
 
 CallCapture CaptureProgramUniform4ui(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLuint v0,
                                      GLuint v1,
@@ -1013,7 +1013,7 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("v0", ParamType::TGLuint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLuint, v1);
@@ -1025,20 +1025,20 @@
 
 CallCapture CaptureProgramUniform4uiv(const Context *context,
                                       bool isCallValid,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       GLint location,
                                       GLsizei count,
                                       const GLuint *value)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
     ParamCapture valueParam("value", ParamType::TGLuintConstPointer);
     InitParamValue(ParamType::TGLuintConstPointer, value, &valueParam.value);
-    CaptureProgramUniform4uiv_value(context, isCallValid, program, location, count, value,
+    CaptureProgramUniform4uiv_value(context, isCallValid, programPacked, location, count, value,
                                     &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -1047,7 +1047,7 @@
 
 CallCapture CaptureProgramUniformMatrix2fv(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei count,
                                            GLboolean transpose,
@@ -1055,15 +1055,15 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("transpose", ParamType::TGLboolean, transpose);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniformMatrix2fv_value(context, isCallValid, program, location, count, transpose,
-                                         value, &valueParam);
+    CaptureProgramUniformMatrix2fv_value(context, isCallValid, programPacked, location, count,
+                                         transpose, value, &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
     return CallCapture(gl::EntryPoint::ProgramUniformMatrix2fv, std::move(paramBuffer));
@@ -1071,7 +1071,7 @@
 
 CallCapture CaptureProgramUniformMatrix2x3fv(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei count,
                                              GLboolean transpose,
@@ -1079,14 +1079,14 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("transpose", ParamType::TGLboolean, transpose);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniformMatrix2x3fv_value(context, isCallValid, program, location, count,
+    CaptureProgramUniformMatrix2x3fv_value(context, isCallValid, programPacked, location, count,
                                            transpose, value, &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -1095,7 +1095,7 @@
 
 CallCapture CaptureProgramUniformMatrix2x4fv(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei count,
                                              GLboolean transpose,
@@ -1103,14 +1103,14 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("transpose", ParamType::TGLboolean, transpose);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniformMatrix2x4fv_value(context, isCallValid, program, location, count,
+    CaptureProgramUniformMatrix2x4fv_value(context, isCallValid, programPacked, location, count,
                                            transpose, value, &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -1119,7 +1119,7 @@
 
 CallCapture CaptureProgramUniformMatrix3fv(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei count,
                                            GLboolean transpose,
@@ -1127,15 +1127,15 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("transpose", ParamType::TGLboolean, transpose);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniformMatrix3fv_value(context, isCallValid, program, location, count, transpose,
-                                         value, &valueParam);
+    CaptureProgramUniformMatrix3fv_value(context, isCallValid, programPacked, location, count,
+                                         transpose, value, &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
     return CallCapture(gl::EntryPoint::ProgramUniformMatrix3fv, std::move(paramBuffer));
@@ -1143,7 +1143,7 @@
 
 CallCapture CaptureProgramUniformMatrix3x2fv(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei count,
                                              GLboolean transpose,
@@ -1151,14 +1151,14 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("transpose", ParamType::TGLboolean, transpose);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniformMatrix3x2fv_value(context, isCallValid, program, location, count,
+    CaptureProgramUniformMatrix3x2fv_value(context, isCallValid, programPacked, location, count,
                                            transpose, value, &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -1167,7 +1167,7 @@
 
 CallCapture CaptureProgramUniformMatrix3x4fv(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei count,
                                              GLboolean transpose,
@@ -1175,14 +1175,14 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("transpose", ParamType::TGLboolean, transpose);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniformMatrix3x4fv_value(context, isCallValid, program, location, count,
+    CaptureProgramUniformMatrix3x4fv_value(context, isCallValid, programPacked, location, count,
                                            transpose, value, &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -1191,7 +1191,7 @@
 
 CallCapture CaptureProgramUniformMatrix4fv(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei count,
                                            GLboolean transpose,
@@ -1199,15 +1199,15 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("transpose", ParamType::TGLboolean, transpose);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniformMatrix4fv_value(context, isCallValid, program, location, count, transpose,
-                                         value, &valueParam);
+    CaptureProgramUniformMatrix4fv_value(context, isCallValid, programPacked, location, count,
+                                         transpose, value, &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
     return CallCapture(gl::EntryPoint::ProgramUniformMatrix4fv, std::move(paramBuffer));
@@ -1215,7 +1215,7 @@
 
 CallCapture CaptureProgramUniformMatrix4x2fv(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei count,
                                              GLboolean transpose,
@@ -1223,14 +1223,14 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("transpose", ParamType::TGLboolean, transpose);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniformMatrix4x2fv_value(context, isCallValid, program, location, count,
+    CaptureProgramUniformMatrix4x2fv_value(context, isCallValid, programPacked, location, count,
                                            transpose, value, &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -1239,7 +1239,7 @@
 
 CallCapture CaptureProgramUniformMatrix4x3fv(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei count,
                                              GLboolean transpose,
@@ -1247,14 +1247,14 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("transpose", ParamType::TGLboolean, transpose);
 
     ParamCapture valueParam("value", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, value, &valueParam.value);
-    CaptureProgramUniformMatrix4x3fv_value(context, isCallValid, program, location, count,
+    CaptureProgramUniformMatrix4x3fv_value(context, isCallValid, programPacked, location, count,
                                            transpose, value, &valueParam);
     paramBuffer.addParam(std::move(valueParam));
 
@@ -1300,14 +1300,14 @@
                                     bool isCallValid,
                                     ProgramPipelineID pipelinePacked,
                                     GLbitfield stages,
-                                    GLuint program)
+                                    ShaderProgramID programPacked)
 {
     ParamBuffer paramBuffer;
 
     paramBuffer.addValueParam("pipelinePacked", ParamType::TProgramPipelineID, pipelinePacked);
     paramBuffer.addEnumParam("stages", GLenumGroup::UseProgramStageMask, ParamType::TGLbitfield,
                              stages);
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     return CallCapture(gl::EntryPoint::UseProgramStages, std::move(paramBuffer));
 }
diff --git a/src/libANGLE/capture_gles_3_1_autogen.h b/src/libANGLE/capture_gles_3_1_autogen.h
index 36337da..6f580ac 100644
--- a/src/libANGLE/capture_gles_3_1_autogen.h
+++ b/src/libANGLE/capture_gles_3_1_autogen.h
@@ -23,7 +23,7 @@
 angle::CallCapture CaptureActiveShaderProgram(const Context *context,
                                               bool isCallValid,
                                               ProgramPipelineID pipelinePacked,
-                                              GLuint program);
+                                              ShaderProgramID programPacked);
 angle::CallCapture CaptureBindImageTexture(const Context *context,
                                            bool isCallValid,
                                            GLuint unit,
@@ -95,7 +95,7 @@
                                            GLfloat *val);
 angle::CallCapture CaptureGetProgramInterfaceiv(const Context *context,
                                                 bool isCallValid,
-                                                GLuint program,
+                                                ShaderProgramID programPacked,
                                                 GLenum programInterface,
                                                 GLenum pname,
                                                 GLint *params);
@@ -112,19 +112,19 @@
                                                GLint *params);
 angle::CallCapture CaptureGetProgramResourceIndex(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   GLenum programInterface,
                                                   const GLchar *name,
                                                   GLuint returnValue);
 angle::CallCapture CaptureGetProgramResourceLocation(const Context *context,
                                                      bool isCallValid,
-                                                     GLuint program,
+                                                     ShaderProgramID programPacked,
                                                      GLenum programInterface,
                                                      const GLchar *name,
                                                      GLint returnValue);
 angle::CallCapture CaptureGetProgramResourceName(const Context *context,
                                                  bool isCallValid,
-                                                 GLuint program,
+                                                 ShaderProgramID programPacked,
                                                  GLenum programInterface,
                                                  GLuint index,
                                                  GLsizei bufSize,
@@ -132,7 +132,7 @@
                                                  GLchar *name);
 angle::CallCapture CaptureGetProgramResourceiv(const Context *context,
                                                bool isCallValid,
-                                               GLuint program,
+                                               ShaderProgramID programPacked,
                                                GLenum programInterface,
                                                GLuint index,
                                                GLsizei propCount,
@@ -164,115 +164,115 @@
                                                 GLbitfield barriers);
 angle::CallCapture CaptureProgramUniform1f(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLfloat v0);
 angle::CallCapture CaptureProgramUniform1fv(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             const GLfloat *value);
 angle::CallCapture CaptureProgramUniform1i(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLint v0);
 angle::CallCapture CaptureProgramUniform1iv(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             const GLint *value);
 angle::CallCapture CaptureProgramUniform1ui(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLuint v0);
 angle::CallCapture CaptureProgramUniform1uiv(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei count,
                                              const GLuint *value);
 angle::CallCapture CaptureProgramUniform2f(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLfloat v0,
                                            GLfloat v1);
 angle::CallCapture CaptureProgramUniform2fv(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             const GLfloat *value);
 angle::CallCapture CaptureProgramUniform2i(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLint v0,
                                            GLint v1);
 angle::CallCapture CaptureProgramUniform2iv(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             const GLint *value);
 angle::CallCapture CaptureProgramUniform2ui(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLuint v0,
                                             GLuint v1);
 angle::CallCapture CaptureProgramUniform2uiv(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei count,
                                              const GLuint *value);
 angle::CallCapture CaptureProgramUniform3f(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLfloat v0,
                                            GLfloat v1,
                                            GLfloat v2);
 angle::CallCapture CaptureProgramUniform3fv(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             const GLfloat *value);
 angle::CallCapture CaptureProgramUniform3i(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLint v0,
                                            GLint v1,
                                            GLint v2);
 angle::CallCapture CaptureProgramUniform3iv(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             const GLint *value);
 angle::CallCapture CaptureProgramUniform3ui(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLuint v0,
                                             GLuint v1,
                                             GLuint v2);
 angle::CallCapture CaptureProgramUniform3uiv(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei count,
                                              const GLuint *value);
 angle::CallCapture CaptureProgramUniform4f(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLfloat v0,
                                            GLfloat v1,
@@ -280,13 +280,13 @@
                                            GLfloat v3);
 angle::CallCapture CaptureProgramUniform4fv(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             const GLfloat *value);
 angle::CallCapture CaptureProgramUniform4i(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLint v0,
                                            GLint v1,
@@ -294,13 +294,13 @@
                                            GLint v3);
 angle::CallCapture CaptureProgramUniform4iv(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             const GLint *value);
 angle::CallCapture CaptureProgramUniform4ui(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLuint v0,
                                             GLuint v1,
@@ -308,69 +308,69 @@
                                             GLuint v3);
 angle::CallCapture CaptureProgramUniform4uiv(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei count,
                                              const GLuint *value);
 angle::CallCapture CaptureProgramUniformMatrix2fv(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLfloat *value);
 angle::CallCapture CaptureProgramUniformMatrix2x3fv(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLint location,
                                                     GLsizei count,
                                                     GLboolean transpose,
                                                     const GLfloat *value);
 angle::CallCapture CaptureProgramUniformMatrix2x4fv(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLint location,
                                                     GLsizei count,
                                                     GLboolean transpose,
                                                     const GLfloat *value);
 angle::CallCapture CaptureProgramUniformMatrix3fv(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLfloat *value);
 angle::CallCapture CaptureProgramUniformMatrix3x2fv(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLint location,
                                                     GLsizei count,
                                                     GLboolean transpose,
                                                     const GLfloat *value);
 angle::CallCapture CaptureProgramUniformMatrix3x4fv(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLint location,
                                                     GLsizei count,
                                                     GLboolean transpose,
                                                     const GLfloat *value);
 angle::CallCapture CaptureProgramUniformMatrix4fv(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLfloat *value);
 angle::CallCapture CaptureProgramUniformMatrix4x2fv(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLint location,
                                                     GLsizei count,
                                                     GLboolean transpose,
                                                     const GLfloat *value);
 angle::CallCapture CaptureProgramUniformMatrix4x3fv(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLint location,
                                                     GLsizei count,
                                                     GLboolean transpose,
@@ -391,7 +391,7 @@
                                            bool isCallValid,
                                            ProgramPipelineID pipelinePacked,
                                            GLbitfield stages,
-                                           GLuint program);
+                                           ShaderProgramID programPacked);
 angle::CallCapture CaptureValidateProgramPipeline(const Context *context,
                                                   bool isCallValid,
                                                   ProgramPipelineID pipelinePacked);
@@ -466,7 +466,7 @@
                                  angle::ParamCapture *paramCapture);
 void CaptureGetProgramInterfaceiv_params(const Context *context,
                                          bool isCallValid,
-                                         GLuint program,
+                                         ShaderProgramID programPacked,
                                          GLenum programInterface,
                                          GLenum pname,
                                          GLint *params,
@@ -493,19 +493,19 @@
                                         angle::ParamCapture *paramCapture);
 void CaptureGetProgramResourceIndex_name(const Context *context,
                                          bool isCallValid,
-                                         GLuint program,
+                                         ShaderProgramID programPacked,
                                          GLenum programInterface,
                                          const GLchar *name,
                                          angle::ParamCapture *paramCapture);
 void CaptureGetProgramResourceLocation_name(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLenum programInterface,
                                             const GLchar *name,
                                             angle::ParamCapture *paramCapture);
 void CaptureGetProgramResourceName_length(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID programPacked,
                                           GLenum programInterface,
                                           GLuint index,
                                           GLsizei bufSize,
@@ -514,7 +514,7 @@
                                           angle::ParamCapture *paramCapture);
 void CaptureGetProgramResourceName_name(const Context *context,
                                         bool isCallValid,
-                                        GLuint program,
+                                        ShaderProgramID programPacked,
                                         GLenum programInterface,
                                         GLuint index,
                                         GLsizei bufSize,
@@ -523,7 +523,7 @@
                                         angle::ParamCapture *paramCapture);
 void CaptureGetProgramResourceiv_props(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLenum programInterface,
                                        GLuint index,
                                        GLsizei propCount,
@@ -534,7 +534,7 @@
                                        angle::ParamCapture *paramCapture);
 void CaptureGetProgramResourceiv_length(const Context *context,
                                         bool isCallValid,
-                                        GLuint program,
+                                        ShaderProgramID programPacked,
                                         GLenum programInterface,
                                         GLuint index,
                                         GLsizei propCount,
@@ -545,7 +545,7 @@
                                         angle::ParamCapture *paramCapture);
 void CaptureGetProgramResourceiv_params(const Context *context,
                                         bool isCallValid,
-                                        GLuint program,
+                                        ShaderProgramID programPacked,
                                         GLenum programInterface,
                                         GLuint index,
                                         GLsizei propCount,
@@ -570,91 +570,91 @@
                                           angle::ParamCapture *paramCapture);
 void CaptureProgramUniform1fv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei count,
                                     const GLfloat *value,
                                     angle::ParamCapture *paramCapture);
 void CaptureProgramUniform1iv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei count,
                                     const GLint *value,
                                     angle::ParamCapture *paramCapture);
 void CaptureProgramUniform1uiv_value(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLuint *value,
                                      angle::ParamCapture *paramCapture);
 void CaptureProgramUniform2fv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei count,
                                     const GLfloat *value,
                                     angle::ParamCapture *paramCapture);
 void CaptureProgramUniform2iv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei count,
                                     const GLint *value,
                                     angle::ParamCapture *paramCapture);
 void CaptureProgramUniform2uiv_value(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLuint *value,
                                      angle::ParamCapture *paramCapture);
 void CaptureProgramUniform3fv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei count,
                                     const GLfloat *value,
                                     angle::ParamCapture *paramCapture);
 void CaptureProgramUniform3iv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei count,
                                     const GLint *value,
                                     angle::ParamCapture *paramCapture);
 void CaptureProgramUniform3uiv_value(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLuint *value,
                                      angle::ParamCapture *paramCapture);
 void CaptureProgramUniform4fv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei count,
                                     const GLfloat *value,
                                     angle::ParamCapture *paramCapture);
 void CaptureProgramUniform4iv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei count,
                                     const GLint *value,
                                     angle::ParamCapture *paramCapture);
 void CaptureProgramUniform4uiv_value(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      const GLuint *value,
                                      angle::ParamCapture *paramCapture);
 void CaptureProgramUniformMatrix2fv_value(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID programPacked,
                                           GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
@@ -662,7 +662,7 @@
                                           angle::ParamCapture *paramCapture);
 void CaptureProgramUniformMatrix2x3fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
@@ -670,7 +670,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureProgramUniformMatrix2x4fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
@@ -678,7 +678,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureProgramUniformMatrix3fv_value(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID programPacked,
                                           GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
@@ -686,7 +686,7 @@
                                           angle::ParamCapture *paramCapture);
 void CaptureProgramUniformMatrix3x2fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
@@ -694,7 +694,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureProgramUniformMatrix3x4fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
@@ -702,7 +702,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureProgramUniformMatrix4fv_value(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID programPacked,
                                           GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
@@ -710,7 +710,7 @@
                                           angle::ParamCapture *paramCapture);
 void CaptureProgramUniformMatrix4x2fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
@@ -718,7 +718,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureProgramUniformMatrix4x3fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
diff --git a/src/libANGLE/capture_gles_3_1_params.cpp b/src/libANGLE/capture_gles_3_1_params.cpp
index 28dc3f6..995cd7f 100644
--- a/src/libANGLE/capture_gles_3_1_params.cpp
+++ b/src/libANGLE/capture_gles_3_1_params.cpp
@@ -92,7 +92,7 @@
 
 void CaptureGetProgramInterfaceiv_params(const Context *context,
                                          bool isCallValid,
-                                         GLuint program,
+                                         ShaderProgramID program,
                                          GLenum programInterface,
                                          GLenum pname,
                                          GLint *params,
@@ -135,7 +135,7 @@
 
 void CaptureGetProgramResourceIndex_name(const Context *context,
                                          bool isCallValid,
-                                         GLuint program,
+                                         ShaderProgramID program,
                                          GLenum programInterface,
                                          const GLchar *name,
                                          ParamCapture *paramCapture)
@@ -145,7 +145,7 @@
 
 void CaptureGetProgramResourceLocation_name(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLenum programInterface,
                                             const GLchar *name,
                                             ParamCapture *paramCapture)
@@ -155,7 +155,7 @@
 
 void CaptureGetProgramResourceName_length(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID program,
                                           GLenum programInterface,
                                           GLuint index,
                                           GLsizei bufSize,
@@ -168,7 +168,7 @@
 
 void CaptureGetProgramResourceName_name(const Context *context,
                                         bool isCallValid,
-                                        GLuint program,
+                                        ShaderProgramID program,
                                         GLenum programInterface,
                                         GLuint index,
                                         GLsizei bufSize,
@@ -181,7 +181,7 @@
 
 void CaptureGetProgramResourceiv_props(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLenum programInterface,
                                        GLuint index,
                                        GLsizei propCount,
@@ -196,7 +196,7 @@
 
 void CaptureGetProgramResourceiv_length(const Context *context,
                                         bool isCallValid,
-                                        GLuint program,
+                                        ShaderProgramID program,
                                         GLenum programInterface,
                                         GLuint index,
                                         GLsizei propCount,
@@ -211,7 +211,7 @@
 
 void CaptureGetProgramResourceiv_params(const Context *context,
                                         bool isCallValid,
-                                        GLuint program,
+                                        ShaderProgramID program,
                                         GLenum programInterface,
                                         GLuint index,
                                         GLsizei propCount,
@@ -248,7 +248,7 @@
 
 void CaptureProgramUniform1fv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei count,
                                     const GLfloat *value,
@@ -259,7 +259,7 @@
 
 void CaptureProgramUniform1iv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei count,
                                     const GLint *value,
@@ -270,7 +270,7 @@
 
 void CaptureProgramUniform1uiv_value(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      const GLuint *value,
@@ -281,7 +281,7 @@
 
 void CaptureProgramUniform2fv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei count,
                                     const GLfloat *value,
@@ -292,7 +292,7 @@
 
 void CaptureProgramUniform2iv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei count,
                                     const GLint *value,
@@ -303,7 +303,7 @@
 
 void CaptureProgramUniform2uiv_value(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      const GLuint *value,
@@ -314,7 +314,7 @@
 
 void CaptureProgramUniform3fv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei count,
                                     const GLfloat *value,
@@ -325,7 +325,7 @@
 
 void CaptureProgramUniform3iv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei count,
                                     const GLint *value,
@@ -336,7 +336,7 @@
 
 void CaptureProgramUniform3uiv_value(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      const GLuint *value,
@@ -347,7 +347,7 @@
 
 void CaptureProgramUniform4fv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei count,
                                     const GLfloat *value,
@@ -358,7 +358,7 @@
 
 void CaptureProgramUniform4iv_value(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei count,
                                     const GLint *value,
@@ -369,7 +369,7 @@
 
 void CaptureProgramUniform4uiv_value(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      const GLuint *value,
@@ -380,7 +380,7 @@
 
 void CaptureProgramUniformMatrix2fv_value(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID program,
                                           GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
@@ -392,7 +392,7 @@
 
 void CaptureProgramUniformMatrix2x3fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
@@ -404,7 +404,7 @@
 
 void CaptureProgramUniformMatrix2x4fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
@@ -416,7 +416,7 @@
 
 void CaptureProgramUniformMatrix3fv_value(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID program,
                                           GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
@@ -428,7 +428,7 @@
 
 void CaptureProgramUniformMatrix3x2fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
@@ -440,7 +440,7 @@
 
 void CaptureProgramUniformMatrix3x4fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
@@ -452,7 +452,7 @@
 
 void CaptureProgramUniformMatrix4fv_value(const Context *context,
                                           bool isCallValid,
-                                          GLuint program,
+                                          ShaderProgramID program,
                                           GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
@@ -464,7 +464,7 @@
 
 void CaptureProgramUniformMatrix4x2fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
@@ -476,7 +476,7 @@
 
 void CaptureProgramUniformMatrix4x3fv_value(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei count,
                                             GLboolean transpose,
diff --git a/src/libANGLE/capture_gles_ext_autogen.cpp b/src/libANGLE/capture_gles_ext_autogen.cpp
index d37d653..fcbfbb0 100644
--- a/src/libANGLE/capture_gles_ext_autogen.cpp
+++ b/src/libANGLE/capture_gles_ext_autogen.cpp
@@ -661,7 +661,7 @@
 
 CallCapture CaptureGetProgramivRobustANGLE(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLenum pname,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -669,20 +669,20 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("pname", GLenumGroup::DefaultGroup, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetProgramivRobustANGLE_length(context, isCallValid, program, pname, bufSize, length,
-                                          params, &lengthParam);
+    CaptureGetProgramivRobustANGLE_length(context, isCallValid, programPacked, pname, bufSize,
+                                          length, params, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetProgramivRobustANGLE_params(context, isCallValid, program, pname, bufSize, length,
-                                          params, &paramsParam);
+    CaptureGetProgramivRobustANGLE_params(context, isCallValid, programPacked, pname, bufSize,
+                                          length, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetProgramivRobustANGLE, std::move(paramBuffer));
@@ -720,7 +720,7 @@
 
 CallCapture CaptureGetShaderivRobustANGLE(const Context *context,
                                           bool isCallValid,
-                                          GLuint shader,
+                                          ShaderProgramID shaderPacked,
                                           GLenum pname,
                                           GLsizei bufSize,
                                           GLsizei *length,
@@ -728,19 +728,19 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
     paramBuffer.addEnumParam("pname", GLenumGroup::DefaultGroup, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetShaderivRobustANGLE_length(context, isCallValid, shader, pname, bufSize, length,
+    CaptureGetShaderivRobustANGLE_length(context, isCallValid, shaderPacked, pname, bufSize, length,
                                          params, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetShaderivRobustANGLE_params(context, isCallValid, shader, pname, bufSize, length,
+    CaptureGetShaderivRobustANGLE_params(context, isCallValid, shaderPacked, pname, bufSize, length,
                                          params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
@@ -807,7 +807,7 @@
 
 CallCapture CaptureGetUniformfvRobustANGLE(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -815,20 +815,20 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetUniformfvRobustANGLE_length(context, isCallValid, program, location, bufSize, length,
-                                          params, &lengthParam);
+    CaptureGetUniformfvRobustANGLE_length(context, isCallValid, programPacked, location, bufSize,
+                                          length, params, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLfloatPointer);
     InitParamValue(ParamType::TGLfloatPointer, params, &paramsParam.value);
-    CaptureGetUniformfvRobustANGLE_params(context, isCallValid, program, location, bufSize, length,
-                                          params, &paramsParam);
+    CaptureGetUniformfvRobustANGLE_params(context, isCallValid, programPacked, location, bufSize,
+                                          length, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetUniformfvRobustANGLE, std::move(paramBuffer));
@@ -836,7 +836,7 @@
 
 CallCapture CaptureGetUniformivRobustANGLE(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -844,20 +844,20 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetUniformivRobustANGLE_length(context, isCallValid, program, location, bufSize, length,
-                                          params, &lengthParam);
+    CaptureGetUniformivRobustANGLE_length(context, isCallValid, programPacked, location, bufSize,
+                                          length, params, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetUniformivRobustANGLE_params(context, isCallValid, program, location, bufSize, length,
-                                          params, &paramsParam);
+    CaptureGetUniformivRobustANGLE_params(context, isCallValid, programPacked, location, bufSize,
+                                          length, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetUniformivRobustANGLE, std::move(paramBuffer));
@@ -1543,7 +1543,7 @@
 
 CallCapture CaptureGetUniformuivRobustANGLE(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -1551,20 +1551,20 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetUniformuivRobustANGLE_length(context, isCallValid, program, location, bufSize, length,
-                                           params, &lengthParam);
+    CaptureGetUniformuivRobustANGLE_length(context, isCallValid, programPacked, location, bufSize,
+                                           length, params, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLuintPointer);
     InitParamValue(ParamType::TGLuintPointer, params, &paramsParam.value);
-    CaptureGetUniformuivRobustANGLE_params(context, isCallValid, program, location, bufSize, length,
-                                           params, &paramsParam);
+    CaptureGetUniformuivRobustANGLE_params(context, isCallValid, programPacked, location, bufSize,
+                                           length, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetUniformuivRobustANGLE, std::move(paramBuffer));
@@ -1572,7 +1572,7 @@
 
 CallCapture CaptureGetActiveUniformBlockivRobustANGLE(const Context *context,
                                                       bool isCallValid,
-                                                      GLuint program,
+                                                      ShaderProgramID programPacked,
                                                       GLuint uniformBlockIndex,
                                                       GLenum pname,
                                                       GLsizei bufSize,
@@ -1581,21 +1581,21 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("uniformBlockIndex", ParamType::TGLuint, uniformBlockIndex);
     paramBuffer.addEnumParam("pname", GLenumGroup::DefaultGroup, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetActiveUniformBlockivRobustANGLE_length(context, isCallValid, program,
+    CaptureGetActiveUniformBlockivRobustANGLE_length(context, isCallValid, programPacked,
                                                      uniformBlockIndex, pname, bufSize, length,
                                                      params, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetActiveUniformBlockivRobustANGLE_params(context, isCallValid, program,
+    CaptureGetActiveUniformBlockivRobustANGLE_params(context, isCallValid, programPacked,
                                                      uniformBlockIndex, pname, bufSize, length,
                                                      params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
@@ -1822,7 +1822,7 @@
 
 CallCapture CaptureGetProgramInterfaceivRobustANGLE(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLenum programInterface,
                                                     GLenum pname,
                                                     GLsizei bufSize,
@@ -1831,7 +1831,7 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("programInterface", GLenumGroup::DefaultGroup, ParamType::TGLenum,
                              programInterface);
     paramBuffer.addEnumParam("pname", GLenumGroup::DefaultGroup, ParamType::TGLenum, pname);
@@ -1839,14 +1839,16 @@
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetProgramInterfaceivRobustANGLE_length(context, isCallValid, program, programInterface,
-                                                   pname, bufSize, length, params, &lengthParam);
+    CaptureGetProgramInterfaceivRobustANGLE_length(context, isCallValid, programPacked,
+                                                   programInterface, pname, bufSize, length, params,
+                                                   &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetProgramInterfaceivRobustANGLE_params(context, isCallValid, program, programInterface,
-                                                   pname, bufSize, length, params, &paramsParam);
+    CaptureGetProgramInterfaceivRobustANGLE_params(context, isCallValid, programPacked,
+                                                   programInterface, pname, bufSize, length, params,
+                                                   &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetProgramInterfaceivRobustANGLE, std::move(paramBuffer));
@@ -2052,7 +2054,7 @@
 
 CallCapture CaptureGetnUniformfvRobustANGLE(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -2060,20 +2062,20 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetnUniformfvRobustANGLE_length(context, isCallValid, program, location, bufSize, length,
-                                           params, &lengthParam);
+    CaptureGetnUniformfvRobustANGLE_length(context, isCallValid, programPacked, location, bufSize,
+                                           length, params, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLfloatPointer);
     InitParamValue(ParamType::TGLfloatPointer, params, &paramsParam.value);
-    CaptureGetnUniformfvRobustANGLE_params(context, isCallValid, program, location, bufSize, length,
-                                           params, &paramsParam);
+    CaptureGetnUniformfvRobustANGLE_params(context, isCallValid, programPacked, location, bufSize,
+                                           length, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetnUniformfvRobustANGLE, std::move(paramBuffer));
@@ -2081,7 +2083,7 @@
 
 CallCapture CaptureGetnUniformivRobustANGLE(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -2089,20 +2091,20 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetnUniformivRobustANGLE_length(context, isCallValid, program, location, bufSize, length,
-                                           params, &lengthParam);
+    CaptureGetnUniformivRobustANGLE_length(context, isCallValid, programPacked, location, bufSize,
+                                           length, params, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetnUniformivRobustANGLE_params(context, isCallValid, program, location, bufSize, length,
-                                           params, &paramsParam);
+    CaptureGetnUniformivRobustANGLE_params(context, isCallValid, programPacked, location, bufSize,
+                                           length, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
     return CallCapture(gl::EntryPoint::GetnUniformivRobustANGLE, std::move(paramBuffer));
@@ -2110,7 +2112,7 @@
 
 CallCapture CaptureGetnUniformuivRobustANGLE(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -2118,19 +2120,19 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetnUniformuivRobustANGLE_length(context, isCallValid, program, location, bufSize,
+    CaptureGetnUniformuivRobustANGLE_length(context, isCallValid, programPacked, location, bufSize,
                                             length, params, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture paramsParam("params", ParamType::TGLuintPointer);
     InitParamValue(ParamType::TGLuintPointer, params, &paramsParam.value);
-    CaptureGetnUniformuivRobustANGLE_params(context, isCallValid, program, location, bufSize,
+    CaptureGetnUniformuivRobustANGLE_params(context, isCallValid, programPacked, location, bufSize,
                                             length, params, &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
@@ -2564,26 +2566,26 @@
 
 CallCapture CaptureGetTranslatedShaderSourceANGLE(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint shader,
+                                                  ShaderProgramID shaderPacked,
                                                   GLsizei bufsize,
                                                   GLsizei *length,
                                                   GLchar *source)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("shader", ParamType::TGLuint, shader);
+    paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
     paramBuffer.addValueParam("bufsize", ParamType::TGLsizei, bufsize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetTranslatedShaderSourceANGLE_length(context, isCallValid, shader, bufsize, length,
-                                                 source, &lengthParam);
+    CaptureGetTranslatedShaderSourceANGLE_length(context, isCallValid, shaderPacked, bufsize,
+                                                 length, source, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture sourceParam("source", ParamType::TGLcharPointer);
     InitParamValue(ParamType::TGLcharPointer, source, &sourceParam.value);
-    CaptureGetTranslatedShaderSourceANGLE_source(context, isCallValid, shader, bufsize, length,
-                                                 source, &sourceParam);
+    CaptureGetTranslatedShaderSourceANGLE_source(context, isCallValid, shaderPacked, bufsize,
+                                                 length, source, &sourceParam);
     paramBuffer.addParam(std::move(sourceParam));
 
     return CallCapture(gl::EntryPoint::GetTranslatedShaderSourceANGLE, std::move(paramBuffer));
@@ -2591,18 +2593,18 @@
 
 CallCapture CaptureBindUniformLocationCHROMIUM(const Context *context,
                                                bool isCallValid,
-                                               GLuint program,
+                                               ShaderProgramID programPacked,
                                                GLint location,
                                                const GLchar *name)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureBindUniformLocationCHROMIUM_name(context, isCallValid, program, location, name,
+    CaptureBindUniformLocationCHROMIUM_name(context, isCallValid, programPacked, location, name,
                                             &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
@@ -3243,19 +3245,19 @@
 
 CallCapture CaptureBindFragmentInputLocationCHROMIUM(const Context *context,
                                                      bool isCallValid,
-                                                     GLuint programs,
+                                                     ShaderProgramID programsPacked,
                                                      GLint location,
                                                      const GLchar *name)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("programs", ParamType::TGLuint, programs);
+    paramBuffer.addValueParam("programsPacked", ParamType::TShaderProgramID, programsPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureBindFragmentInputLocationCHROMIUM_name(context, isCallValid, programs, location, name,
-                                                  &nameParam);
+    CaptureBindFragmentInputLocationCHROMIUM_name(context, isCallValid, programsPacked, location,
+                                                  name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     return CallCapture(gl::EntryPoint::BindFragmentInputLocationCHROMIUM, std::move(paramBuffer));
@@ -3263,7 +3265,7 @@
 
 CallCapture CaptureProgramPathFragmentInputGenCHROMIUM(const Context *context,
                                                        bool isCallValid,
-                                                       GLuint program,
+                                                       ShaderProgramID programPacked,
                                                        GLint location,
                                                        GLenum genMode,
                                                        GLint components,
@@ -3271,14 +3273,14 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addEnumParam("genMode", GLenumGroup::DefaultGroup, ParamType::TGLenum, genMode);
     paramBuffer.addValueParam("components", ParamType::TGLint, components);
 
     ParamCapture coeffsParam("coeffs", ParamType::TGLfloatConstPointer);
     InitParamValue(ParamType::TGLfloatConstPointer, coeffs, &coeffsParam.value);
-    CaptureProgramPathFragmentInputGenCHROMIUM_coeffs(context, isCallValid, program, location,
+    CaptureProgramPathFragmentInputGenCHROMIUM_coeffs(context, isCallValid, programPacked, location,
                                                       genMode, components, coeffs, &coeffsParam);
     paramBuffer.addParam(std::move(coeffsParam));
 
@@ -3287,18 +3289,19 @@
 
 CallCapture CaptureBindFragDataLocationEXT(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLuint color,
                                            const GLchar *name)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("color", ParamType::TGLuint, color);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureBindFragDataLocationEXT_name(context, isCallValid, program, color, name, &nameParam);
+    CaptureBindFragDataLocationEXT_name(context, isCallValid, programPacked, color, name,
+                                        &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     return CallCapture(gl::EntryPoint::BindFragDataLocationEXT, std::move(paramBuffer));
@@ -3306,21 +3309,21 @@
 
 CallCapture CaptureBindFragDataLocationIndexedEXT(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   GLuint colorNumber,
                                                   GLuint index,
                                                   const GLchar *name)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("colorNumber", ParamType::TGLuint, colorNumber);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureBindFragDataLocationIndexedEXT_name(context, isCallValid, program, colorNumber, index,
-                                               name, &nameParam);
+    CaptureBindFragDataLocationIndexedEXT_name(context, isCallValid, programPacked, colorNumber,
+                                               index, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     return CallCapture(gl::EntryPoint::BindFragDataLocationIndexedEXT, std::move(paramBuffer));
@@ -3328,17 +3331,17 @@
 
 CallCapture CaptureGetFragDataIndexEXT(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        const GLchar *name,
                                        GLint returnValue)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureGetFragDataIndexEXT_name(context, isCallValid, program, name, &nameParam);
+    CaptureGetFragDataIndexEXT_name(context, isCallValid, programPacked, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     ParamCapture returnValueCapture("returnValue", ParamType::TGLint);
@@ -3350,21 +3353,21 @@
 
 CallCapture CaptureGetProgramResourceLocationIndexEXT(const Context *context,
                                                       bool isCallValid,
-                                                      GLuint program,
+                                                      ShaderProgramID programPacked,
                                                       GLenum programInterface,
                                                       const GLchar *name,
                                                       GLint returnValue)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("programInterface", GLenumGroup::ProgramInterface, ParamType::TGLenum,
                              programInterface);
 
     ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
     InitParamValue(ParamType::TGLcharConstPointer, name, &nameParam.value);
-    CaptureGetProgramResourceLocationIndexEXT_name(context, isCallValid, program, programInterface,
-                                                   name, &nameParam);
+    CaptureGetProgramResourceLocationIndexEXT_name(context, isCallValid, programPacked,
+                                                   programInterface, name, &nameParam);
     paramBuffer.addParam(std::move(nameParam));
 
     ParamCapture returnValueCapture("returnValue", ParamType::TGLint);
@@ -4032,20 +4035,20 @@
 
 CallCapture CaptureGetnUniformfvEXT(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei bufSize,
                                     GLfloat *params)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture paramsParam("params", ParamType::TGLfloatPointer);
     InitParamValue(ParamType::TGLfloatPointer, params, &paramsParam.value);
-    CaptureGetnUniformfvEXT_params(context, isCallValid, program, location, bufSize, params,
+    CaptureGetnUniformfvEXT_params(context, isCallValid, programPacked, location, bufSize, params,
                                    &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
@@ -4054,20 +4057,20 @@
 
 CallCapture CaptureGetnUniformivEXT(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei bufSize,
                                     GLint *params)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("location", ParamType::TGLint, location);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture paramsParam("params", ParamType::TGLintPointer);
     InitParamValue(ParamType::TGLintPointer, params, &paramsParam.value);
-    CaptureGetnUniformivEXT_params(context, isCallValid, program, location, bufSize, params,
+    CaptureGetnUniformivEXT_params(context, isCallValid, programPacked, location, bufSize, params,
                                    &paramsParam);
     paramBuffer.addParam(std::move(paramsParam));
 
@@ -5168,7 +5171,7 @@
 
 CallCapture CaptureGetProgramBinaryOES(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLsizei bufSize,
                                        GLsizei *length,
                                        GLenum *binaryFormat,
@@ -5176,25 +5179,25 @@
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
 
     ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
     InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
-    CaptureGetProgramBinaryOES_length(context, isCallValid, program, bufSize, length, binaryFormat,
-                                      binary, &lengthParam);
+    CaptureGetProgramBinaryOES_length(context, isCallValid, programPacked, bufSize, length,
+                                      binaryFormat, binary, &lengthParam);
     paramBuffer.addParam(std::move(lengthParam));
 
     ParamCapture binaryFormatParam("binaryFormat", ParamType::TGLenumPointer);
     InitParamValue(ParamType::TGLenumPointer, binaryFormat, &binaryFormatParam.value);
-    CaptureGetProgramBinaryOES_binaryFormat(context, isCallValid, program, bufSize, length,
+    CaptureGetProgramBinaryOES_binaryFormat(context, isCallValid, programPacked, bufSize, length,
                                             binaryFormat, binary, &binaryFormatParam);
     paramBuffer.addParam(std::move(binaryFormatParam));
 
     ParamCapture binaryParam("binary", ParamType::TvoidPointer);
     InitParamValue(ParamType::TvoidPointer, binary, &binaryParam.value);
-    CaptureGetProgramBinaryOES_binary(context, isCallValid, program, bufSize, length, binaryFormat,
-                                      binary, &binaryParam);
+    CaptureGetProgramBinaryOES_binary(context, isCallValid, programPacked, bufSize, length,
+                                      binaryFormat, binary, &binaryParam);
     paramBuffer.addParam(std::move(binaryParam));
 
     return CallCapture(gl::EntryPoint::GetProgramBinaryOES, std::move(paramBuffer));
@@ -5202,21 +5205,21 @@
 
 CallCapture CaptureProgramBinaryOES(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLenum binaryFormat,
                                     const void *binary,
                                     GLint length)
 {
     ParamBuffer paramBuffer;
 
-    paramBuffer.addValueParam("program", ParamType::TGLuint, program);
+    paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addEnumParam("binaryFormat", GLenumGroup::DefaultGroup, ParamType::TGLenum,
                              binaryFormat);
 
     ParamCapture binaryParam("binary", ParamType::TvoidConstPointer);
     InitParamValue(ParamType::TvoidConstPointer, binary, &binaryParam.value);
-    CaptureProgramBinaryOES_binary(context, isCallValid, program, binaryFormat, binary, length,
-                                   &binaryParam);
+    CaptureProgramBinaryOES_binary(context, isCallValid, programPacked, binaryFormat, binary,
+                                   length, &binaryParam);
     paramBuffer.addParam(std::move(binaryParam));
 
     paramBuffer.addValueParam("length", ParamType::TGLint, length);
diff --git a/src/libANGLE/capture_gles_ext_autogen.h b/src/libANGLE/capture_gles_ext_autogen.h
index 90b6291..ec0fe98 100644
--- a/src/libANGLE/capture_gles_ext_autogen.h
+++ b/src/libANGLE/capture_gles_ext_autogen.h
@@ -209,7 +209,7 @@
                                                  GLint *data);
 angle::CallCapture CaptureGetProgramivRobustANGLE(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   GLenum pname,
                                                   GLsizei bufSize,
                                                   GLsizei *length,
@@ -223,7 +223,7 @@
                                                                 GLint *params);
 angle::CallCapture CaptureGetShaderivRobustANGLE(const Context *context,
                                                  bool isCallValid,
-                                                 GLuint shader,
+                                                 ShaderProgramID shaderPacked,
                                                  GLenum pname,
                                                  GLsizei bufSize,
                                                  GLsizei *length,
@@ -244,14 +244,14 @@
                                                        GLint *params);
 angle::CallCapture CaptureGetUniformfvRobustANGLE(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   GLint location,
                                                   GLsizei bufSize,
                                                   GLsizei *length,
                                                   GLfloat *params);
 angle::CallCapture CaptureGetUniformivRobustANGLE(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   GLint location,
                                                   GLsizei bufSize,
                                                   GLsizei *length,
@@ -454,14 +454,14 @@
                                                          GLuint *params);
 angle::CallCapture CaptureGetUniformuivRobustANGLE(const Context *context,
                                                    bool isCallValid,
-                                                   GLuint program,
+                                                   ShaderProgramID programPacked,
                                                    GLint location,
                                                    GLsizei bufSize,
                                                    GLsizei *length,
                                                    GLuint *params);
 angle::CallCapture CaptureGetActiveUniformBlockivRobustANGLE(const Context *context,
                                                              bool isCallValid,
-                                                             GLuint program,
+                                                             ShaderProgramID programPacked,
                                                              GLuint uniformBlockIndex,
                                                              GLenum pname,
                                                              GLsizei bufSize,
@@ -522,7 +522,7 @@
                                                                GLint *params);
 angle::CallCapture CaptureGetProgramInterfaceivRobustANGLE(const Context *context,
                                                            bool isCallValid,
-                                                           GLuint program,
+                                                           ShaderProgramID programPacked,
                                                            GLenum programInterface,
                                                            GLenum pname,
                                                            GLsizei bufSize,
@@ -579,21 +579,21 @@
                                                  void *data);
 angle::CallCapture CaptureGetnUniformfvRobustANGLE(const Context *context,
                                                    bool isCallValid,
-                                                   GLuint program,
+                                                   ShaderProgramID programPacked,
                                                    GLint location,
                                                    GLsizei bufSize,
                                                    GLsizei *length,
                                                    GLfloat *params);
 angle::CallCapture CaptureGetnUniformivRobustANGLE(const Context *context,
                                                    bool isCallValid,
-                                                   GLuint program,
+                                                   ShaderProgramID programPacked,
                                                    GLint location,
                                                    GLsizei bufSize,
                                                    GLsizei *length,
                                                    GLint *params);
 angle::CallCapture CaptureGetnUniformuivRobustANGLE(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLint location,
                                                     GLsizei bufSize,
                                                     GLsizei *length,
@@ -721,7 +721,7 @@
 // GL_ANGLE_translated_shader_source
 angle::CallCapture CaptureGetTranslatedShaderSourceANGLE(const Context *context,
                                                          bool isCallValid,
-                                                         GLuint shader,
+                                                         ShaderProgramID shaderPacked,
                                                          GLsizei bufsize,
                                                          GLsizei *length,
                                                          GLchar *source);
@@ -729,7 +729,7 @@
 // GL_CHROMIUM_bind_uniform_location
 angle::CallCapture CaptureBindUniformLocationCHROMIUM(const Context *context,
                                                       bool isCallValid,
-                                                      GLuint program,
+                                                      ShaderProgramID programPacked,
                                                       GLint location,
                                                       const GLchar *name);
 
@@ -926,12 +926,12 @@
     const GLfloat *transformValues);
 angle::CallCapture CaptureBindFragmentInputLocationCHROMIUM(const Context *context,
                                                             bool isCallValid,
-                                                            GLuint programs,
+                                                            ShaderProgramID programsPacked,
                                                             GLint location,
                                                             const GLchar *name);
 angle::CallCapture CaptureProgramPathFragmentInputGenCHROMIUM(const Context *context,
                                                               bool isCallValid,
-                                                              GLuint program,
+                                                              ShaderProgramID programPacked,
                                                               GLint location,
                                                               GLenum genMode,
                                                               GLint components,
@@ -940,23 +940,23 @@
 // GL_EXT_blend_func_extended
 angle::CallCapture CaptureBindFragDataLocationEXT(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint program,
+                                                  ShaderProgramID programPacked,
                                                   GLuint color,
                                                   const GLchar *name);
 angle::CallCapture CaptureBindFragDataLocationIndexedEXT(const Context *context,
                                                          bool isCallValid,
-                                                         GLuint program,
+                                                         ShaderProgramID programPacked,
                                                          GLuint colorNumber,
                                                          GLuint index,
                                                          const GLchar *name);
 angle::CallCapture CaptureGetFragDataIndexEXT(const Context *context,
                                               bool isCallValid,
-                                              GLuint program,
+                                              ShaderProgramID programPacked,
                                               const GLchar *name,
                                               GLint returnValue);
 angle::CallCapture CaptureGetProgramResourceLocationIndexEXT(const Context *context,
                                                              bool isCallValid,
-                                                             GLuint program,
+                                                             ShaderProgramID programPacked,
                                                              GLenum programInterface,
                                                              const GLchar *name,
                                                              GLint returnValue);
@@ -1171,13 +1171,13 @@
                                                     GLenum returnValue);
 angle::CallCapture CaptureGetnUniformfvEXT(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLfloat *params);
 angle::CallCapture CaptureGetnUniformivEXT(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLint *params);
@@ -1491,14 +1491,14 @@
 // GL_OES_get_program_binary
 angle::CallCapture CaptureGetProgramBinaryOES(const Context *context,
                                               bool isCallValid,
-                                              GLuint program,
+                                              ShaderProgramID programPacked,
                                               GLsizei bufSize,
                                               GLsizei *length,
                                               GLenum *binaryFormat,
                                               void *binary);
 angle::CallCapture CaptureProgramBinaryOES(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLenum binaryFormat,
                                            const void *binary,
                                            GLint length);
@@ -2035,7 +2035,7 @@
                                         angle::ParamCapture *paramCapture);
 void CaptureGetProgramivRobustANGLE_length(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLenum pname,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -2043,7 +2043,7 @@
                                            angle::ParamCapture *paramCapture);
 void CaptureGetProgramivRobustANGLE_params(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLenum pname,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -2067,7 +2067,7 @@
                                                          angle::ParamCapture *paramCapture);
 void CaptureGetShaderivRobustANGLE_length(const Context *context,
                                           bool isCallValid,
-                                          GLuint shader,
+                                          ShaderProgramID shaderPacked,
                                           GLenum pname,
                                           GLsizei bufSize,
                                           GLsizei *length,
@@ -2075,7 +2075,7 @@
                                           angle::ParamCapture *paramCapture);
 void CaptureGetShaderivRobustANGLE_params(const Context *context,
                                           bool isCallValid,
-                                          GLuint shader,
+                                          ShaderProgramID shaderPacked,
                                           GLenum pname,
                                           GLsizei bufSize,
                                           GLsizei *length,
@@ -2115,7 +2115,7 @@
                                                 angle::ParamCapture *paramCapture);
 void CaptureGetUniformfvRobustANGLE_length(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -2123,7 +2123,7 @@
                                            angle::ParamCapture *paramCapture);
 void CaptureGetUniformfvRobustANGLE_params(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -2131,7 +2131,7 @@
                                            angle::ParamCapture *paramCapture);
 void CaptureGetUniformivRobustANGLE_length(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -2139,7 +2139,7 @@
                                            angle::ParamCapture *paramCapture);
 void CaptureGetUniformivRobustANGLE_params(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID programPacked,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -2487,7 +2487,7 @@
                                                   angle::ParamCapture *paramCapture);
 void CaptureGetUniformuivRobustANGLE_length(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -2495,7 +2495,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureGetUniformuivRobustANGLE_params(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -2503,7 +2503,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniformBlockivRobustANGLE_length(const Context *context,
                                                       bool isCallValid,
-                                                      GLuint program,
+                                                      ShaderProgramID programPacked,
                                                       GLuint uniformBlockIndex,
                                                       GLenum pname,
                                                       GLsizei bufSize,
@@ -2512,7 +2512,7 @@
                                                       angle::ParamCapture *paramCapture);
 void CaptureGetActiveUniformBlockivRobustANGLE_params(const Context *context,
                                                       bool isCallValid,
-                                                      GLuint program,
+                                                      ShaderProgramID programPacked,
                                                       GLuint uniformBlockIndex,
                                                       GLenum pname,
                                                       GLsizei bufSize,
@@ -2629,7 +2629,7 @@
                                                         angle::ParamCapture *paramCapture);
 void CaptureGetProgramInterfaceivRobustANGLE_length(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLenum programInterface,
                                                     GLenum pname,
                                                     GLsizei bufSize,
@@ -2638,7 +2638,7 @@
                                                     angle::ParamCapture *paramCapture);
 void CaptureGetProgramInterfaceivRobustANGLE_params(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLenum programInterface,
                                                     GLenum pname,
                                                     GLsizei bufSize,
@@ -2785,7 +2785,7 @@
                                         angle::ParamCapture *paramCapture);
 void CaptureGetnUniformfvRobustANGLE_length(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -2793,7 +2793,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureGetnUniformfvRobustANGLE_params(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -2801,7 +2801,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureGetnUniformivRobustANGLE_length(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -2809,7 +2809,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureGetnUniformivRobustANGLE_params(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -2817,7 +2817,7 @@
                                             angle::ParamCapture *paramCapture);
 void CaptureGetnUniformuivRobustANGLE_length(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -2825,7 +2825,7 @@
                                              angle::ParamCapture *paramCapture);
 void CaptureGetnUniformuivRobustANGLE_params(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -2993,21 +2993,21 @@
                                       angle::ParamCapture *paramCapture);
 void CaptureGetTranslatedShaderSourceANGLE_length(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint shader,
+                                                  ShaderProgramID shaderPacked,
                                                   GLsizei bufsize,
                                                   GLsizei *length,
                                                   GLchar *source,
                                                   angle::ParamCapture *paramCapture);
 void CaptureGetTranslatedShaderSourceANGLE_source(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint shader,
+                                                  ShaderProgramID shaderPacked,
                                                   GLsizei bufsize,
                                                   GLsizei *length,
                                                   GLchar *source,
                                                   angle::ParamCapture *paramCapture);
 void CaptureBindUniformLocationCHROMIUM_name(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLint location,
                                              const GLchar *name,
                                              angle::ParamCapture *paramCapture);
@@ -3182,13 +3182,13 @@
     angle::ParamCapture *paramCapture);
 void CaptureBindFragmentInputLocationCHROMIUM_name(const Context *context,
                                                    bool isCallValid,
-                                                   GLuint programs,
+                                                   ShaderProgramID programsPacked,
                                                    GLint location,
                                                    const GLchar *name,
                                                    angle::ParamCapture *paramCapture);
 void CaptureProgramPathFragmentInputGenCHROMIUM_coeffs(const Context *context,
                                                        bool isCallValid,
-                                                       GLuint program,
+                                                       ShaderProgramID programPacked,
                                                        GLint location,
                                                        GLenum genMode,
                                                        GLint components,
@@ -3196,25 +3196,25 @@
                                                        angle::ParamCapture *paramCapture);
 void CaptureBindFragDataLocationEXT_name(const Context *context,
                                          bool isCallValid,
-                                         GLuint program,
+                                         ShaderProgramID programPacked,
                                          GLuint color,
                                          const GLchar *name,
                                          angle::ParamCapture *paramCapture);
 void CaptureBindFragDataLocationIndexedEXT_name(const Context *context,
                                                 bool isCallValid,
-                                                GLuint program,
+                                                ShaderProgramID programPacked,
                                                 GLuint colorNumber,
                                                 GLuint index,
                                                 const GLchar *name,
                                                 angle::ParamCapture *paramCapture);
 void CaptureGetFragDataIndexEXT_name(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      const GLchar *name,
                                      angle::ParamCapture *paramCapture);
 void CaptureGetProgramResourceLocationIndexEXT_name(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID programPacked,
                                                     GLenum programInterface,
                                                     const GLchar *name,
                                                     angle::ParamCapture *paramCapture);
@@ -3322,14 +3322,14 @@
                                               angle::ParamCapture *paramCapture);
 void CaptureGetnUniformfvEXT_params(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei bufSize,
                                     GLfloat *params,
                                     angle::ParamCapture *paramCapture);
 void CaptureGetnUniformivEXT_params(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLint location,
                                     GLsizei bufSize,
                                     GLint *params,
@@ -3645,7 +3645,7 @@
                                                  angle::ParamCapture *paramCapture);
 void CaptureGetProgramBinaryOES_length(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLsizei bufSize,
                                        GLsizei *length,
                                        GLenum *binaryFormat,
@@ -3653,7 +3653,7 @@
                                        angle::ParamCapture *paramCapture);
 void CaptureGetProgramBinaryOES_binaryFormat(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLsizei bufSize,
                                              GLsizei *length,
                                              GLenum *binaryFormat,
@@ -3661,7 +3661,7 @@
                                              angle::ParamCapture *paramCapture);
 void CaptureGetProgramBinaryOES_binary(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLsizei bufSize,
                                        GLsizei *length,
                                        GLenum *binaryFormat,
@@ -3669,7 +3669,7 @@
                                        angle::ParamCapture *paramCapture);
 void CaptureProgramBinaryOES_binary(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLenum binaryFormat,
                                     const void *binary,
                                     GLint length,
diff --git a/src/libANGLE/capture_gles_ext_params.cpp b/src/libANGLE/capture_gles_ext_params.cpp
index 81689fa..e89f18e 100644
--- a/src/libANGLE/capture_gles_ext_params.cpp
+++ b/src/libANGLE/capture_gles_ext_params.cpp
@@ -420,7 +420,7 @@
 
 void CaptureGetProgramivRobustANGLE_length(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID program,
                                            GLenum pname,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -432,7 +432,7 @@
 
 void CaptureGetProgramivRobustANGLE_params(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID program,
                                            GLenum pname,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -468,7 +468,7 @@
 
 void CaptureGetShaderivRobustANGLE_length(const Context *context,
                                           bool isCallValid,
-                                          GLuint shader,
+                                          ShaderProgramID shader,
                                           GLenum pname,
                                           GLsizei bufSize,
                                           GLsizei *length,
@@ -480,7 +480,7 @@
 
 void CaptureGetShaderivRobustANGLE_params(const Context *context,
                                           bool isCallValid,
-                                          GLuint shader,
+                                          ShaderProgramID shader,
                                           GLenum pname,
                                           GLsizei bufSize,
                                           GLsizei *length,
@@ -540,7 +540,7 @@
 
 void CaptureGetUniformfvRobustANGLE_length(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID program,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -552,7 +552,7 @@
 
 void CaptureGetUniformfvRobustANGLE_params(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID program,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -564,7 +564,7 @@
 
 void CaptureGetUniformivRobustANGLE_length(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID program,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -576,7 +576,7 @@
 
 void CaptureGetUniformivRobustANGLE_params(const Context *context,
                                            bool isCallValid,
-                                           GLuint program,
+                                           ShaderProgramID program,
                                            GLint location,
                                            GLsizei bufSize,
                                            GLsizei *length,
@@ -1064,7 +1064,7 @@
 
 void CaptureGetUniformuivRobustANGLE_length(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -1076,7 +1076,7 @@
 
 void CaptureGetUniformuivRobustANGLE_params(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -1088,7 +1088,7 @@
 
 void CaptureGetActiveUniformBlockivRobustANGLE_length(const Context *context,
                                                       bool isCallValid,
-                                                      GLuint program,
+                                                      ShaderProgramID program,
                                                       GLuint uniformBlockIndex,
                                                       GLenum pname,
                                                       GLsizei bufSize,
@@ -1101,7 +1101,7 @@
 
 void CaptureGetActiveUniformBlockivRobustANGLE_params(const Context *context,
                                                       bool isCallValid,
-                                                      GLuint program,
+                                                      ShaderProgramID program,
                                                       GLuint uniformBlockIndex,
                                                       GLenum pname,
                                                       GLsizei bufSize,
@@ -1278,7 +1278,7 @@
 
 void CaptureGetProgramInterfaceivRobustANGLE_length(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID program,
                                                     GLenum programInterface,
                                                     GLenum pname,
                                                     GLsizei bufSize,
@@ -1291,7 +1291,7 @@
 
 void CaptureGetProgramInterfaceivRobustANGLE_params(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID program,
                                                     GLenum programInterface,
                                                     GLenum pname,
                                                     GLsizei bufSize,
@@ -1498,7 +1498,7 @@
 
 void CaptureGetnUniformfvRobustANGLE_length(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -1510,7 +1510,7 @@
 
 void CaptureGetnUniformfvRobustANGLE_params(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -1522,7 +1522,7 @@
 
 void CaptureGetnUniformivRobustANGLE_length(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -1534,7 +1534,7 @@
 
 void CaptureGetnUniformivRobustANGLE_params(const Context *context,
                                             bool isCallValid,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLint location,
                                             GLsizei bufSize,
                                             GLsizei *length,
@@ -1546,7 +1546,7 @@
 
 void CaptureGetnUniformuivRobustANGLE_length(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID program,
                                              GLint location,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -1558,7 +1558,7 @@
 
 void CaptureGetnUniformuivRobustANGLE_params(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID program,
                                              GLint location,
                                              GLsizei bufSize,
                                              GLsizei *length,
@@ -1814,7 +1814,7 @@
 
 void CaptureGetTranslatedShaderSourceANGLE_length(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint shader,
+                                                  ShaderProgramID shader,
                                                   GLsizei bufsize,
                                                   GLsizei *length,
                                                   GLchar *source,
@@ -1825,7 +1825,7 @@
 
 void CaptureGetTranslatedShaderSourceANGLE_source(const Context *context,
                                                   bool isCallValid,
-                                                  GLuint shader,
+                                                  ShaderProgramID shader,
                                                   GLsizei bufsize,
                                                   GLsizei *length,
                                                   GLchar *source,
@@ -1836,7 +1836,7 @@
 
 void CaptureBindUniformLocationCHROMIUM_name(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID program,
                                              GLint location,
                                              const GLchar *name,
                                              ParamCapture *paramCapture)
@@ -2083,7 +2083,7 @@
 
 void CaptureBindFragmentInputLocationCHROMIUM_name(const Context *context,
                                                    bool isCallValid,
-                                                   GLuint programs,
+                                                   ShaderProgramID programs,
                                                    GLint location,
                                                    const GLchar *name,
                                                    ParamCapture *paramCapture)
@@ -2093,7 +2093,7 @@
 
 void CaptureProgramPathFragmentInputGenCHROMIUM_coeffs(const Context *context,
                                                        bool isCallValid,
-                                                       GLuint program,
+                                                       ShaderProgramID program,
                                                        GLint location,
                                                        GLenum genMode,
                                                        GLint components,
@@ -2105,7 +2105,7 @@
 
 void CaptureBindFragDataLocationEXT_name(const Context *context,
                                          bool isCallValid,
-                                         GLuint program,
+                                         ShaderProgramID program,
                                          GLuint color,
                                          const GLchar *name,
                                          ParamCapture *paramCapture)
@@ -2115,7 +2115,7 @@
 
 void CaptureBindFragDataLocationIndexedEXT_name(const Context *context,
                                                 bool isCallValid,
-                                                GLuint program,
+                                                ShaderProgramID program,
                                                 GLuint colorNumber,
                                                 GLuint index,
                                                 const GLchar *name,
@@ -2126,7 +2126,7 @@
 
 void CaptureGetFragDataIndexEXT_name(const Context *context,
                                      bool isCallValid,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      const GLchar *name,
                                      ParamCapture *paramCapture)
 {
@@ -2135,7 +2135,7 @@
 
 void CaptureGetProgramResourceLocationIndexEXT_name(const Context *context,
                                                     bool isCallValid,
-                                                    GLuint program,
+                                                    ShaderProgramID program,
                                                     GLenum programInterface,
                                                     const GLchar *name,
                                                     ParamCapture *paramCapture)
@@ -2319,7 +2319,7 @@
 
 void CaptureGetnUniformfvEXT_params(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei bufSize,
                                     GLfloat *params,
@@ -2330,7 +2330,7 @@
 
 void CaptureGetnUniformivEXT_params(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei bufSize,
                                     GLint *params,
@@ -2822,7 +2822,7 @@
 
 void CaptureGetProgramBinaryOES_length(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLsizei bufSize,
                                        GLsizei *length,
                                        GLenum *binaryFormat,
@@ -2834,7 +2834,7 @@
 
 void CaptureGetProgramBinaryOES_binaryFormat(const Context *context,
                                              bool isCallValid,
-                                             GLuint program,
+                                             ShaderProgramID program,
                                              GLsizei bufSize,
                                              GLsizei *length,
                                              GLenum *binaryFormat,
@@ -2846,7 +2846,7 @@
 
 void CaptureGetProgramBinaryOES_binary(const Context *context,
                                        bool isCallValid,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLsizei bufSize,
                                        GLsizei *length,
                                        GLenum *binaryFormat,
@@ -2858,7 +2858,7 @@
 
 void CaptureProgramBinaryOES_binary(const Context *context,
                                     bool isCallValid,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLenum binaryFormat,
                                     const void *binary,
                                     GLint length,
diff --git a/src/libANGLE/entry_points_utils.h b/src/libANGLE/entry_points_utils.h
index fe630ee..4d1886e 100644
--- a/src/libANGLE/entry_points_utils.h
+++ b/src/libANGLE/entry_points_utils.h
@@ -43,6 +43,12 @@
     static constexpr GLboolean kValue = GL_FALSE;
 };
 
+template <EntryPoint EP>
+struct DefaultReturnValue<EP, ShaderProgramID>
+{
+    static constexpr ShaderProgramID kValue = {0};
+};
+
 // Catch-all rules for pointer types.
 template <EntryPoint EP, typename PointerType>
 struct DefaultReturnValue<EP, const PointerType *>
diff --git a/src/libANGLE/frame_capture_replay_autogen.cpp b/src/libANGLE/frame_capture_replay_autogen.cpp
index f19f029..7eb54f3 100644
--- a/src/libANGLE/frame_capture_replay_autogen.cpp
+++ b/src/libANGLE/frame_capture_replay_autogen.cpp
@@ -31,7 +31,8 @@
             context->activeShaderProgram(
                 params.getParam("pipelinePacked", ParamType::TProgramPipelineID, 0)
                     .value.ProgramPipelineIDVal,
-                params.getParam("program", ParamType::TGLuint, 1).value.GLuintVal);
+                params.getParam("programPacked", ParamType::TShaderProgramID, 1)
+                    .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::ActiveTexture:
             context->activeTexture(
@@ -48,8 +49,10 @@
                 params.getParam("ref", ParamType::TGLfixed, 1).value.GLfixedVal);
             break;
         case gl::EntryPoint::AttachShader:
-            context->attachShader(params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
-                                  params.getParam("shader", ParamType::TGLuint, 1).value.GLuintVal);
+            context->attachShader(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                      .value.ShaderProgramIDVal,
+                                  params.getParam("shaderPacked", ParamType::TShaderProgramID, 1)
+                                      .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::BeginQuery:
             context->beginQuery(
@@ -63,7 +66,8 @@
             break;
         case gl::EntryPoint::BindAttribLocation:
             context->bindAttribLocation(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 2)));
@@ -92,14 +96,16 @@
             break;
         case gl::EntryPoint::BindFragDataLocation:
             context->bindFragDataLocation(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("color", ParamType::TGLuint, 1).value.GLuintVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 2)));
             break;
         case gl::EntryPoint::BindFragDataLocationIndexed:
             context->bindFragDataLocationIndexed(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("colorNumber", ParamType::TGLuint, 1).value.GLuintVal,
                 params.getParam("index", ParamType::TGLuint, 2).value.GLuintVal,
                 replayContext->getAsConstPointer<const GLchar *>(
@@ -324,8 +330,8 @@
                     params.getParam("pointer", ParamType::TvoidConstPointer, 3)));
             break;
         case gl::EntryPoint::CompileShader:
-            context->compileShader(
-                params.getParam("shader", ParamType::TGLuint, 0).value.GLuintVal);
+            context->compileShader(params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
+                                       .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::CompressedTexImage2D:
             context->compressedTexImage2D(
@@ -494,8 +500,8 @@
                     params.getParam("framebuffers", ParamType::TGLuintConstPointer, 1)));
             break;
         case gl::EntryPoint::DeleteProgram:
-            context->deleteProgram(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal);
+            context->deleteProgram(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                       .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::DeleteProgramPipelines:
             context->deleteProgramPipelines(
@@ -522,7 +528,8 @@
                     params.getParam("samplersPacked", ParamType::TSamplerIDConstPointer, 1)));
             break;
         case gl::EntryPoint::DeleteShader:
-            context->deleteShader(params.getParam("shader", ParamType::TGLuint, 0).value.GLuintVal);
+            context->deleteShader(params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
+                                      .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::DeleteSync:
             context->deleteSync(params.getParam("sync", ParamType::TGLsync, 0).value.GLsyncVal);
@@ -561,8 +568,10 @@
                                  params.getParam("f", ParamType::TGLfixed, 1).value.GLfixedVal);
             break;
         case gl::EntryPoint::DetachShader:
-            context->detachShader(params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
-                                  params.getParam("shader", ParamType::TGLuint, 1).value.GLuintVal);
+            context->detachShader(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                      .value.ShaderProgramIDVal,
+                                  params.getParam("shaderPacked", ParamType::TShaderProgramID, 1)
+                                      .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::Disable:
             context->disable(params.getParam("cap", ParamType::TGLenum, 0).value.GLenumVal);
@@ -853,7 +862,8 @@
             break;
         case gl::EntryPoint::GetActiveAttrib:
             context->getActiveAttrib(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLsizei *>(
@@ -867,7 +877,8 @@
             break;
         case gl::EntryPoint::GetActiveUniform:
             context->getActiveUniform(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLsizei *>(
@@ -881,7 +892,8 @@
             break;
         case gl::EntryPoint::GetActiveUniformBlockName:
             context->getActiveUniformBlockName(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("uniformBlockIndex", ParamType::TGLuint, 1).value.GLuintVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLsizei *>(
@@ -891,7 +903,8 @@
             break;
         case gl::EntryPoint::GetActiveUniformBlockiv:
             context->getActiveUniformBlockiv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("uniformBlockIndex", ParamType::TGLuint, 1).value.GLuintVal,
                 params.getParam("pname", ParamType::TGLenum, 2).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
@@ -899,7 +912,8 @@
             break;
         case gl::EntryPoint::GetActiveUniformsiv:
             context->getActiveUniformsiv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("uniformCount", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLuint *>(
                     params.getParam("uniformIndices", ParamType::TGLuintConstPointer, 2)),
@@ -909,16 +923,18 @@
             break;
         case gl::EntryPoint::GetAttachedShaders:
             context->getAttachedShaders(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("maxCount", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLsizei *>(
                     params.getParam("count", ParamType::TGLsizeiPointer, 2)),
-                replayContext->getReadBufferPointer<GLuint *>(
-                    params.getParam("shaders", ParamType::TGLuintPointer, 3)));
+                replayContext->getReadBufferPointer<ShaderProgramID *>(
+                    params.getParam("shadersPacked", ParamType::TShaderProgramIDPointer, 3)));
             break;
         case gl::EntryPoint::GetAttribLocation:
             context->getAttribLocation(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 1)));
             break;
@@ -1006,13 +1022,15 @@
             break;
         case gl::EntryPoint::GetFragDataIndex:
             context->getFragDataIndex(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 1)));
             break;
         case gl::EntryPoint::GetFragDataLocation:
             context->getFragDataLocation(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 1)));
             break;
@@ -1128,7 +1146,8 @@
             break;
         case gl::EntryPoint::GetProgramBinary:
             context->getProgramBinary(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLsizei *>(
                     params.getParam("length", ParamType::TGLsizeiPointer, 2)),
@@ -1139,7 +1158,8 @@
             break;
         case gl::EntryPoint::GetProgramInfoLog:
             context->getProgramInfoLog(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLsizei *>(
                     params.getParam("length", ParamType::TGLsizeiPointer, 2)),
@@ -1148,7 +1168,8 @@
             break;
         case gl::EntryPoint::GetProgramInterfaceiv:
             context->getProgramInterfaceiv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("programInterface", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("pname", ParamType::TGLenum, 2).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
@@ -1174,28 +1195,32 @@
             break;
         case gl::EntryPoint::GetProgramResourceIndex:
             context->getProgramResourceIndex(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("programInterface", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 2)));
             break;
         case gl::EntryPoint::GetProgramResourceLocation:
             context->getProgramResourceLocation(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("programInterface", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 2)));
             break;
         case gl::EntryPoint::GetProgramResourceLocationIndex:
             context->getProgramResourceLocationIndex(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("programInterface", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 2)));
             break;
         case gl::EntryPoint::GetProgramResourceName:
             context->getProgramResourceName(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("programInterface", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("index", ParamType::TGLuint, 2).value.GLuintVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 3).value.GLsizeiVal,
@@ -1206,7 +1231,8 @@
             break;
         case gl::EntryPoint::GetProgramResourceiv:
             context->getProgramResourceiv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("programInterface", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("index", ParamType::TGLuint, 2).value.GLuintVal,
                 params.getParam("propCount", ParamType::TGLsizei, 3).value.GLsizeiVal,
@@ -1219,7 +1245,8 @@
                     params.getParam("params", ParamType::TGLintPointer, 7)));
             break;
         case gl::EntryPoint::GetProgramiv:
-            context->getProgramiv(params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+            context->getProgramiv(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                      .value.ShaderProgramIDVal,
                                   params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                                   replayContext->getReadBufferPointer<GLint *>(
                                       params.getParam("params", ParamType::TGLintPointer, 2)));
@@ -1296,7 +1323,8 @@
             break;
         case gl::EntryPoint::GetShaderInfoLog:
             context->getShaderInfoLog(
-                params.getParam("shader", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLsizei *>(
                     params.getParam("length", ParamType::TGLsizeiPointer, 2)),
@@ -1314,7 +1342,8 @@
             break;
         case gl::EntryPoint::GetShaderSource:
             context->getShaderSource(
-                params.getParam("shader", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLsizei *>(
                     params.getParam("length", ParamType::TGLsizeiPointer, 2)),
@@ -1322,7 +1351,8 @@
                     params.getParam("source", ParamType::TGLcharPointer, 3)));
             break;
         case gl::EntryPoint::GetShaderiv:
-            context->getShaderiv(params.getParam("shader", ParamType::TGLuint, 0).value.GLuintVal,
+            context->getShaderiv(params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
+                                     .value.ShaderProgramIDVal,
                                  params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                                  replayContext->getReadBufferPointer<GLint *>(
                                      params.getParam("params", ParamType::TGLintPointer, 2)));
@@ -1434,7 +1464,8 @@
             break;
         case gl::EntryPoint::GetTransformFeedbackVarying:
             context->getTransformFeedbackVarying(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLsizei *>(
@@ -1448,13 +1479,15 @@
             break;
         case gl::EntryPoint::GetUniformBlockIndex:
             context->getUniformBlockIndex(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("uniformBlockName", ParamType::TGLcharConstPointer, 1)));
             break;
         case gl::EntryPoint::GetUniformIndices:
             context->getUniformIndices(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("uniformCount", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getAsPointerConstPointer<const GLchar *const *>(
                     params.getParam("uniformNames", ParamType::TGLcharConstPointerPointer, 2)),
@@ -1463,28 +1496,31 @@
             break;
         case gl::EntryPoint::GetUniformLocation:
             context->getUniformLocation(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 1)));
             break;
         case gl::EntryPoint::GetUniformfv:
-            context->getUniformfv(params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+            context->getUniformfv(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                      .value.ShaderProgramIDVal,
                                   params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                                   replayContext->getReadBufferPointer<GLfloat *>(
                                       params.getParam("params", ParamType::TGLfloatPointer, 2)));
             break;
         case gl::EntryPoint::GetUniformiv:
-            context->getUniformiv(params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+            context->getUniformiv(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                      .value.ShaderProgramIDVal,
                                   params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                                   replayContext->getReadBufferPointer<GLint *>(
                                       params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
         case gl::EntryPoint::GetUniformuiv:
-            context->getUniformuiv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
-                params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
-                replayContext->getReadBufferPointer<GLuint *>(
-                    params.getParam("params", ParamType::TGLuintPointer, 2)));
+            context->getUniformuiv(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                       .value.ShaderProgramIDVal,
+                                   params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
+                                   replayContext->getReadBufferPointer<GLuint *>(
+                                       params.getParam("params", ParamType::TGLuintPointer, 2)));
             break;
         case gl::EntryPoint::GetVertexAttribIiv:
             context->getVertexAttribIiv(
@@ -1523,7 +1559,8 @@
             break;
         case gl::EntryPoint::GetnUniformfv:
             context->getnUniformfv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLfloat *>(
@@ -1531,7 +1568,8 @@
             break;
         case gl::EntryPoint::GetnUniformiv:
             context->getnUniformiv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<GLint *>(
@@ -1575,7 +1613,8 @@
                 params.getParam("framebuffer", ParamType::TGLuint, 0).value.GLuintVal);
             break;
         case gl::EntryPoint::IsProgram:
-            context->isProgram(params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal);
+            context->isProgram(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                   .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::IsProgramPipeline:
             context->isProgramPipeline(
@@ -1595,7 +1634,8 @@
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal);
             break;
         case gl::EntryPoint::IsShader:
-            context->isShader(params.getParam("shader", ParamType::TGLuint, 0).value.GLuintVal);
+            context->isShader(params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
+                                  .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::IsSync:
             context->isSync(params.getParam("sync", ParamType::TGLsync, 0).value.GLsyncVal);
@@ -1662,7 +1702,8 @@
             context->lineWidthx(params.getParam("width", ParamType::TGLfixed, 0).value.GLfixedVal);
             break;
         case gl::EntryPoint::LinkProgram:
-            context->linkProgram(params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal);
+            context->linkProgram(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                     .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::LoadIdentity:
             context->loadIdentity();
@@ -1881,7 +1922,8 @@
             break;
         case gl::EntryPoint::ProgramBinary:
             context->programBinary(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("binaryFormat", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("binary", ParamType::TvoidConstPointer, 2)),
@@ -1889,19 +1931,22 @@
             break;
         case gl::EntryPoint::ProgramParameteri:
             context->programParameteri(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("value", ParamType::TGLint, 2).value.GLintVal);
             break;
         case gl::EntryPoint::ProgramUniform1f:
             context->programUniform1f(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
         case gl::EntryPoint::ProgramUniform1fv:
             context->programUniform1fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
@@ -1909,13 +1954,15 @@
             break;
         case gl::EntryPoint::ProgramUniform1i:
             context->programUniform1i(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLint, 2).value.GLintVal);
             break;
         case gl::EntryPoint::ProgramUniform1iv:
             context->programUniform1iv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLint *>(
@@ -1923,13 +1970,15 @@
             break;
         case gl::EntryPoint::ProgramUniform1ui:
             context->programUniform1ui(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLuint, 2).value.GLuintVal);
             break;
         case gl::EntryPoint::ProgramUniform1uiv:
             context->programUniform1uiv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLuint *>(
@@ -1937,14 +1986,16 @@
             break;
         case gl::EntryPoint::ProgramUniform2f:
             context->programUniform2f(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLfloat, 2).value.GLfloatVal,
                 params.getParam("v1", ParamType::TGLfloat, 3).value.GLfloatVal);
             break;
         case gl::EntryPoint::ProgramUniform2fv:
             context->programUniform2fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
@@ -1952,14 +2003,16 @@
             break;
         case gl::EntryPoint::ProgramUniform2i:
             context->programUniform2i(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLint, 2).value.GLintVal,
                 params.getParam("v1", ParamType::TGLint, 3).value.GLintVal);
             break;
         case gl::EntryPoint::ProgramUniform2iv:
             context->programUniform2iv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLint *>(
@@ -1967,14 +2020,16 @@
             break;
         case gl::EntryPoint::ProgramUniform2ui:
             context->programUniform2ui(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLuint, 2).value.GLuintVal,
                 params.getParam("v1", ParamType::TGLuint, 3).value.GLuintVal);
             break;
         case gl::EntryPoint::ProgramUniform2uiv:
             context->programUniform2uiv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLuint *>(
@@ -1982,7 +2037,8 @@
             break;
         case gl::EntryPoint::ProgramUniform3f:
             context->programUniform3f(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLfloat, 2).value.GLfloatVal,
                 params.getParam("v1", ParamType::TGLfloat, 3).value.GLfloatVal,
@@ -1990,7 +2046,8 @@
             break;
         case gl::EntryPoint::ProgramUniform3fv:
             context->programUniform3fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
@@ -1998,7 +2055,8 @@
             break;
         case gl::EntryPoint::ProgramUniform3i:
             context->programUniform3i(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLint, 2).value.GLintVal,
                 params.getParam("v1", ParamType::TGLint, 3).value.GLintVal,
@@ -2006,7 +2064,8 @@
             break;
         case gl::EntryPoint::ProgramUniform3iv:
             context->programUniform3iv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLint *>(
@@ -2014,7 +2073,8 @@
             break;
         case gl::EntryPoint::ProgramUniform3ui:
             context->programUniform3ui(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLuint, 2).value.GLuintVal,
                 params.getParam("v1", ParamType::TGLuint, 3).value.GLuintVal,
@@ -2022,7 +2082,8 @@
             break;
         case gl::EntryPoint::ProgramUniform3uiv:
             context->programUniform3uiv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLuint *>(
@@ -2030,7 +2091,8 @@
             break;
         case gl::EntryPoint::ProgramUniform4f:
             context->programUniform4f(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLfloat, 2).value.GLfloatVal,
                 params.getParam("v1", ParamType::TGLfloat, 3).value.GLfloatVal,
@@ -2039,7 +2101,8 @@
             break;
         case gl::EntryPoint::ProgramUniform4fv:
             context->programUniform4fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
@@ -2047,7 +2110,8 @@
             break;
         case gl::EntryPoint::ProgramUniform4i:
             context->programUniform4i(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLint, 2).value.GLintVal,
                 params.getParam("v1", ParamType::TGLint, 3).value.GLintVal,
@@ -2056,7 +2120,8 @@
             break;
         case gl::EntryPoint::ProgramUniform4iv:
             context->programUniform4iv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLint *>(
@@ -2064,7 +2129,8 @@
             break;
         case gl::EntryPoint::ProgramUniform4ui:
             context->programUniform4ui(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("v0", ParamType::TGLuint, 2).value.GLuintVal,
                 params.getParam("v1", ParamType::TGLuint, 3).value.GLuintVal,
@@ -2073,7 +2139,8 @@
             break;
         case gl::EntryPoint::ProgramUniform4uiv:
             context->programUniform4uiv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLuint *>(
@@ -2081,7 +2148,8 @@
             break;
         case gl::EntryPoint::ProgramUniformMatrix2fv:
             context->programUniformMatrix2fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("transpose", ParamType::TGLboolean, 3).value.GLbooleanVal,
@@ -2090,7 +2158,8 @@
             break;
         case gl::EntryPoint::ProgramUniformMatrix2x3fv:
             context->programUniformMatrix2x3fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("transpose", ParamType::TGLboolean, 3).value.GLbooleanVal,
@@ -2099,7 +2168,8 @@
             break;
         case gl::EntryPoint::ProgramUniformMatrix2x4fv:
             context->programUniformMatrix2x4fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("transpose", ParamType::TGLboolean, 3).value.GLbooleanVal,
@@ -2108,7 +2178,8 @@
             break;
         case gl::EntryPoint::ProgramUniformMatrix3fv:
             context->programUniformMatrix3fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("transpose", ParamType::TGLboolean, 3).value.GLbooleanVal,
@@ -2117,7 +2188,8 @@
             break;
         case gl::EntryPoint::ProgramUniformMatrix3x2fv:
             context->programUniformMatrix3x2fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("transpose", ParamType::TGLboolean, 3).value.GLbooleanVal,
@@ -2126,7 +2198,8 @@
             break;
         case gl::EntryPoint::ProgramUniformMatrix3x4fv:
             context->programUniformMatrix3x4fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("transpose", ParamType::TGLboolean, 3).value.GLbooleanVal,
@@ -2135,7 +2208,8 @@
             break;
         case gl::EntryPoint::ProgramUniformMatrix4fv:
             context->programUniformMatrix4fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("transpose", ParamType::TGLboolean, 3).value.GLbooleanVal,
@@ -2144,7 +2218,8 @@
             break;
         case gl::EntryPoint::ProgramUniformMatrix4x2fv:
             context->programUniformMatrix4x2fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("transpose", ParamType::TGLboolean, 3).value.GLbooleanVal,
@@ -2153,7 +2228,8 @@
             break;
         case gl::EntryPoint::ProgramUniformMatrix4x3fv:
             context->programUniformMatrix4x3fv(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("location", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("transpose", ParamType::TGLboolean, 3).value.GLbooleanVal,
@@ -2322,8 +2398,8 @@
         case gl::EntryPoint::ShaderBinary:
             context->shaderBinary(
                 params.getParam("count", ParamType::TGLsizei, 0).value.GLsizeiVal,
-                replayContext->getAsConstPointer<const GLuint *>(
-                    params.getParam("shaders", ParamType::TGLuintConstPointer, 1)),
+                replayContext->getAsConstPointer<const ShaderProgramID *>(
+                    params.getParam("shadersPacked", ParamType::TShaderProgramIDConstPointer, 1)),
                 params.getParam("binaryformat", ParamType::TGLenum, 2).value.GLenumVal,
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("binary", ParamType::TvoidConstPointer, 3)),
@@ -2331,7 +2407,8 @@
             break;
         case gl::EntryPoint::ShaderSource:
             context->shaderSource(
-                params.getParam("shader", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getAsPointerConstPointer<const GLchar *const *>(
                     params.getParam("string", ParamType::TGLcharConstPointerPointer, 2)),
@@ -2609,7 +2686,8 @@
             break;
         case gl::EntryPoint::TransformFeedbackVaryings:
             context->transformFeedbackVaryings(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getAsPointerConstPointer<const GLchar *const *>(
                     params.getParam("varyings", ParamType::TGLcharConstPointerPointer, 2)),
@@ -2765,7 +2843,8 @@
             break;
         case gl::EntryPoint::UniformBlockBinding:
             context->uniformBlockBinding(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal,
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal,
                 params.getParam("uniformBlockIndex", ParamType::TGLuint, 1).value.GLuintVal,
                 params.getParam("uniformBlockBinding", ParamType::TGLuint, 2).value.GLuintVal);
             break;
@@ -2846,18 +2925,21 @@
                                      .value.BufferBindingVal);
             break;
         case gl::EntryPoint::UseProgram:
-            context->useProgram(params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal);
+            context->useProgram(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                    .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::UseProgramStages:
             context->useProgramStages(
                 params.getParam("pipelinePacked", ParamType::TProgramPipelineID, 0)
                     .value.ProgramPipelineIDVal,
                 params.getParam("stages", ParamType::TGLbitfield, 1).value.GLbitfieldVal,
-                params.getParam("program", ParamType::TGLuint, 2).value.GLuintVal);
+                params.getParam("programPacked", ParamType::TShaderProgramID, 2)
+                    .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::ValidateProgram:
             context->validateProgram(
-                params.getParam("program", ParamType::TGLuint, 0).value.GLuintVal);
+                params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                    .value.ShaderProgramIDVal);
             break;
         case gl::EntryPoint::ValidateProgramPipeline:
             context->validateProgramPipeline(
diff --git a/src/libANGLE/frame_capture_utils_autogen.cpp b/src/libANGLE/frame_capture_utils_autogen.cpp
index 2f77243..844d911 100644
--- a/src/libANGLE/frame_capture_utils_autogen.cpp
+++ b/src/libANGLE/frame_capture_utils_autogen.cpp
@@ -319,6 +319,17 @@
             WriteParamValueToStream<ParamType::TSamplerIDPointer>(os,
                                                                   paramValue.SamplerIDPointerVal);
             break;
+        case ParamType::TShaderProgramID:
+            WriteParamValueToStream<ParamType::TShaderProgramID>(os, paramValue.ShaderProgramIDVal);
+            break;
+        case ParamType::TShaderProgramIDConstPointer:
+            WriteParamValueToStream<ParamType::TShaderProgramIDConstPointer>(
+                os, paramValue.ShaderProgramIDConstPointerVal);
+            break;
+        case ParamType::TShaderProgramIDPointer:
+            WriteParamValueToStream<ParamType::TShaderProgramIDPointer>(
+                os, paramValue.ShaderProgramIDPointerVal);
+            break;
         case ParamType::TShaderType:
             WriteParamValueToStream<ParamType::TShaderType>(os, paramValue.ShaderTypeVal);
             break;
@@ -555,6 +566,12 @@
             return "const GLuint *";
         case ParamType::TSamplerIDPointer:
             return "GLuint *";
+        case ParamType::TShaderProgramID:
+            return "GLuint";
+        case ParamType::TShaderProgramIDConstPointer:
+            return "const GLuint *";
+        case ParamType::TShaderProgramIDPointer:
+            return "GLuint *";
         case ParamType::TShaderType:
             return "GLenum";
         case ParamType::TShadingModel:
diff --git a/src/libANGLE/frame_capture_utils_autogen.h b/src/libANGLE/frame_capture_utils_autogen.h
index 0f88fe1..774ae9b 100644
--- a/src/libANGLE/frame_capture_utils_autogen.h
+++ b/src/libANGLE/frame_capture_utils_autogen.h
@@ -105,6 +105,9 @@
     TSamplerID,
     TSamplerIDConstPointer,
     TSamplerIDPointer,
+    TShaderProgramID,
+    TShaderProgramIDConstPointer,
+    TShaderProgramIDPointer,
     TShaderType,
     TShadingModel,
     TTextureEnvParameter,
@@ -211,6 +214,9 @@
     gl::SamplerID SamplerIDVal;
     const gl::SamplerID *SamplerIDConstPointerVal;
     gl::SamplerID *SamplerIDPointerVal;
+    gl::ShaderProgramID ShaderProgramIDVal;
+    const gl::ShaderProgramID *ShaderProgramIDConstPointerVal;
+    gl::ShaderProgramID *ShaderProgramIDPointerVal;
     gl::ShaderType ShaderTypeVal;
     gl::ShadingModel ShadingModelVal;
     gl::TextureEnvParameter TextureEnvParameterVal;
@@ -807,6 +813,27 @@
 }
 
 template <>
+inline gl::ShaderProgramID GetParamVal<ParamType::TShaderProgramID, gl::ShaderProgramID>(
+    const ParamValue &value)
+{
+    return value.ShaderProgramIDVal;
+}
+
+template <>
+inline const gl::ShaderProgramID *GetParamVal<ParamType::TShaderProgramIDConstPointer,
+                                              const gl::ShaderProgramID *>(const ParamValue &value)
+{
+    return value.ShaderProgramIDConstPointerVal;
+}
+
+template <>
+inline gl::ShaderProgramID *GetParamVal<ParamType::TShaderProgramIDPointer, gl::ShaderProgramID *>(
+    const ParamValue &value)
+{
+    return value.ShaderProgramIDPointerVal;
+}
+
+template <>
 inline gl::ShaderType GetParamVal<ParamType::TShaderType, gl::ShaderType>(const ParamValue &value)
 {
     return value.ShaderTypeVal;
@@ -1087,6 +1114,12 @@
             return GetParamVal<ParamType::TSamplerIDConstPointer, T>(value);
         case ParamType::TSamplerIDPointer:
             return GetParamVal<ParamType::TSamplerIDPointer, T>(value);
+        case ParamType::TShaderProgramID:
+            return GetParamVal<ParamType::TShaderProgramID, T>(value);
+        case ParamType::TShaderProgramIDConstPointer:
+            return GetParamVal<ParamType::TShaderProgramIDConstPointer, T>(value);
+        case ParamType::TShaderProgramIDPointer:
+            return GetParamVal<ParamType::TShaderProgramIDPointer, T>(value);
         case ParamType::TShaderType:
             return GetParamVal<ParamType::TShaderType, T>(value);
         case ParamType::TShadingModel:
@@ -1683,6 +1716,27 @@
 }
 
 template <>
+inline void SetParamVal<ParamType::TShaderProgramID>(gl::ShaderProgramID valueIn,
+                                                     ParamValue *valueOut)
+{
+    valueOut->ShaderProgramIDVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TShaderProgramIDConstPointer>(const gl::ShaderProgramID *valueIn,
+                                                                 ParamValue *valueOut)
+{
+    valueOut->ShaderProgramIDConstPointerVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TShaderProgramIDPointer>(gl::ShaderProgramID *valueIn,
+                                                            ParamValue *valueOut)
+{
+    valueOut->ShaderProgramIDPointerVal = valueIn;
+}
+
+template <>
 inline void SetParamVal<ParamType::TShaderType>(gl::ShaderType valueIn, ParamValue *valueOut)
 {
     valueOut->ShaderTypeVal = valueIn;
@@ -2046,6 +2100,15 @@
         case ParamType::TSamplerIDPointer:
             SetParamVal<ParamType::TSamplerIDPointer>(valueIn, valueOut);
             break;
+        case ParamType::TShaderProgramID:
+            SetParamVal<ParamType::TShaderProgramID>(valueIn, valueOut);
+            break;
+        case ParamType::TShaderProgramIDConstPointer:
+            SetParamVal<ParamType::TShaderProgramIDConstPointer>(valueIn, valueOut);
+            break;
+        case ParamType::TShaderProgramIDPointer:
+            SetParamVal<ParamType::TShaderProgramIDPointer>(valueIn, valueOut);
+            break;
         case ParamType::TShaderType:
             SetParamVal<ParamType::TShaderType>(valueIn, valueOut);
             break;
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index 3a181cf..19211ef 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -1057,7 +1057,7 @@
     return true;
 }
 
-Program *GetValidProgramNoResolve(Context *context, GLuint id)
+Program *GetValidProgramNoResolve(Context *context, ShaderProgramID id)
 {
     // ES3 spec (section 2.11.1) -- "Commands that accept shader or program object names will
     // generate the error INVALID_VALUE if the provided name is not the name of either a shader
@@ -1081,7 +1081,7 @@
     return validProgram;
 }
 
-Program *GetValidProgram(Context *context, GLuint id)
+Program *GetValidProgram(Context *context, ShaderProgramID id)
 {
     Program *program = GetValidProgramNoResolve(context, id);
     if (program)
@@ -1091,7 +1091,7 @@
     return program;
 }
 
-Shader *GetValidShader(Context *context, GLuint id)
+Shader *GetValidShader(Context *context, ShaderProgramID id)
 {
     // See ValidProgram for spec details.
 
@@ -3068,9 +3068,9 @@
     return true;
 }
 
-bool ValidateGetUniformBase(Context *context, GLuint program, GLint location)
+bool ValidateGetUniformBase(Context *context, ShaderProgramID program, GLint location)
 {
-    if (program == 0)
+    if (program.value == 0)
     {
         context->validationError(GL_INVALID_VALUE, kProgramDoesNotExist);
         return false;
@@ -3098,7 +3098,7 @@
 }
 
 static bool ValidateSizedGetUniform(Context *context,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLint location,
                                     GLsizei bufSize,
                                     GLsizei *length)
@@ -3140,7 +3140,7 @@
 }
 
 bool ValidateGetnUniformfvEXT(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLsizei bufSize,
                               GLfloat *params)
@@ -3149,7 +3149,7 @@
 }
 
 bool ValidateGetnUniformfvRobustANGLE(Context *context,
-                                      GLuint program,
+                                      ShaderProgramID program,
                                       GLint location,
                                       GLsizei bufSize,
                                       GLsizei *length,
@@ -3160,7 +3160,7 @@
 }
 
 bool ValidateGetnUniformivEXT(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLsizei bufSize,
                               GLint *params)
@@ -3169,7 +3169,7 @@
 }
 
 bool ValidateGetnUniformivRobustANGLE(Context *context,
-                                      GLuint program,
+                                      ShaderProgramID program,
                                       GLint location,
                                       GLsizei bufSize,
                                       GLsizei *length,
@@ -3180,7 +3180,7 @@
 }
 
 bool ValidateGetnUniformuivRobustANGLE(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei bufSize,
                                        GLsizei *length,
@@ -3191,7 +3191,7 @@
 }
 
 bool ValidateGetUniformfvRobustANGLE(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei bufSize,
                                      GLsizei *length,
@@ -3216,7 +3216,7 @@
 }
 
 bool ValidateGetUniformivRobustANGLE(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei bufSize,
                                      GLsizei *length,
@@ -3241,7 +3241,7 @@
 }
 
 bool ValidateGetUniformuivRobustANGLE(Context *context,
-                                      GLuint program,
+                                      ShaderProgramID program,
                                       GLint location,
                                       GLsizei bufSize,
                                       GLsizei *length,
@@ -3486,7 +3486,7 @@
 }
 
 bool ValidateProgramBinaryBase(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLenum binaryFormat,
                                const void *binary,
                                GLint length)
@@ -3516,7 +3516,7 @@
 }
 
 bool ValidateGetProgramBinaryBase(Context *context,
-                                  GLuint program,
+                                  ShaderProgramID program,
                                   GLsizei bufSize,
                                   GLsizei *length,
                                   GLenum *binaryFormat,
@@ -4202,7 +4202,10 @@
     return true;
 }
 
-bool ValidateGetProgramivBase(Context *context, GLuint program, GLenum pname, GLsizei *numParams)
+bool ValidateGetProgramivBase(Context *context,
+                              ShaderProgramID program,
+                              GLenum pname,
+                              GLsizei *numParams)
 {
     // Currently, all GetProgramiv queries return 1 parameter
     if (numParams)
@@ -4345,7 +4348,7 @@
 }
 
 bool ValidateGetProgramivRobustANGLE(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLenum pname,
                                      GLsizei bufSize,
                                      GLsizei *length,
@@ -4403,7 +4406,7 @@
 }
 
 bool ValidateGetShaderivRobustANGLE(Context *context,
-                                    GLuint shader,
+                                    ShaderProgramID shader,
                                     GLenum pname,
                                     GLsizei bufSize,
                                     GLsizei *length,
@@ -4828,7 +4831,7 @@
 }
 
 bool ValidateGetActiveUniformBlockivRobustANGLE(Context *context,
-                                                GLuint program,
+                                                ShaderProgramID program,
                                                 GLuint uniformBlockIndex,
                                                 GLenum pname,
                                                 GLsizei bufSize,
@@ -5087,7 +5090,10 @@
     return true;
 }
 
-bool ValidateGetShaderivBase(Context *context, GLuint shader, GLenum pname, GLsizei *length)
+bool ValidateGetShaderivBase(Context *context,
+                             ShaderProgramID shader,
+                             GLenum pname,
+                             GLsizei *length)
 {
     if (length)
     {
@@ -5944,7 +5950,7 @@
 }
 
 bool ValidateGetActiveUniformBlockivBase(Context *context,
-                                         GLuint program,
+                                         ShaderProgramID program,
                                          GLuint uniformBlockIndex,
                                          GLenum pname,
                                          GLsizei *length)
diff --git a/src/libANGLE/validationES.h b/src/libANGLE/validationES.h
index d25e461..eb64c7e 100644
--- a/src/libANGLE/validationES.h
+++ b/src/libANGLE/validationES.h
@@ -94,12 +94,12 @@
 // Returns valid program if id is a valid program name
 // Errors INVALID_OPERATION if valid shader is given and returns NULL
 // Errors INVALID_VALUE otherwise and returns NULL
-Program *GetValidProgram(Context *context, GLuint id);
+Program *GetValidProgram(Context *context, ShaderProgramID id);
 
 // Returns valid shader if id is a valid shader name
 // Errors INVALID_OPERATION if valid program is given and returns NULL
 // Errors INVALID_VALUE otherwise and returns NULL
-Shader *GetValidShader(Context *context, GLuint id);
+Shader *GetValidShader(Context *context, ShaderProgramID id);
 
 bool ValidateAttachmentTarget(Context *context, GLenum attachment);
 bool ValidateRenderbufferStorageParametersBase(Context *context,
@@ -367,49 +367,49 @@
                                     TextureID texture,
                                     GLint level);
 
-bool ValidateGetUniformBase(Context *context, GLuint program, GLint location);
+bool ValidateGetUniformBase(Context *context, ShaderProgramID program, GLint location);
 bool ValidateGetnUniformfvEXT(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLsizei bufSize,
                               GLfloat *params);
 bool ValidateGetnUniformfvRobustANGLE(Context *context,
-                                      GLuint program,
+                                      ShaderProgramID program,
                                       GLint location,
                                       GLsizei bufSize,
                                       GLsizei *length,
                                       GLfloat *params);
 bool ValidateGetnUniformivEXT(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLsizei bufSize,
                               GLint *params);
 bool ValidateGetnUniformivRobustANGLE(Context *context,
-                                      GLuint program,
+                                      ShaderProgramID program,
                                       GLint location,
                                       GLsizei bufSize,
                                       GLsizei *length,
                                       GLint *params);
 bool ValidateGetnUniformuivRobustANGLE(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei bufSize,
                                        GLsizei *length,
                                        GLuint *params);
 bool ValidateGetUniformfvRobustANGLE(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei bufSize,
                                      GLsizei *length,
                                      GLfloat *params);
 bool ValidateGetUniformivRobustANGLE(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei bufSize,
                                      GLsizei *length,
                                      GLint *params);
 bool ValidateGetUniformuivRobustANGLE(Context *context,
-                                      GLuint program,
+                                      ShaderProgramID program,
                                       GLint location,
                                       GLsizei bufSize,
                                       GLsizei *length,
@@ -434,12 +434,12 @@
 bool ValidateBindVertexArrayBase(Context *context, GLuint array);
 
 bool ValidateProgramBinaryBase(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLenum binaryFormat,
                                const void *binary,
                                GLint length);
 bool ValidateGetProgramBinaryBase(Context *context,
-                                  GLuint program,
+                                  ShaderProgramID program,
                                   GLsizei bufSize,
                                   GLsizei *length,
                                   GLenum *binaryFormat,
@@ -480,14 +480,20 @@
                                     bool pointerVersion,
                                     GLsizei *numParams);
 
-bool ValidateGetProgramivBase(Context *context, GLuint program, GLenum pname, GLsizei *numParams);
+bool ValidateGetProgramivBase(Context *context,
+                              ShaderProgramID program,
+                              GLenum pname,
+                              GLsizei *numParams);
 
 bool ValidateGetRenderbufferParameterivBase(Context *context,
                                             GLenum target,
                                             GLenum pname,
                                             GLsizei *length);
 
-bool ValidateGetShaderivBase(Context *context, GLuint shader, GLenum pname, GLsizei *length);
+bool ValidateGetShaderivBase(Context *context,
+                             ShaderProgramID shader,
+                             GLenum pname,
+                             GLsizei *length);
 
 bool ValidateGetTexParameterBase(Context *context,
                                  TextureType target,
@@ -575,7 +581,7 @@
 bool ValidateVertexAttribIndex(Context *context, GLuint index);
 
 bool ValidateGetActiveUniformBlockivBase(Context *context,
-                                         GLuint program,
+                                         ShaderProgramID program,
                                          GLuint uniformBlockIndex,
                                          GLenum pname,
                                          GLsizei *length);
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index edef271..234cf84 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -2127,7 +2127,7 @@
 }
 
 bool ValidateProgramBinaryOES(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLenum binaryFormat,
                               const void *binary,
                               GLint length)
@@ -2142,7 +2142,7 @@
 }
 
 bool ValidateGetProgramBinaryOES(Context *context,
-                                 GLuint program,
+                                 ShaderProgramID program,
                                  GLsizei bufSize,
                                  GLsizei *length,
                                  GLenum *binaryFormat,
@@ -2415,7 +2415,7 @@
             return true;
 
         case GL_SHADER:
-            if (context->getShader(name) == nullptr)
+            if (context->getShader({name}) == nullptr)
             {
                 context->validationError(GL_INVALID_VALUE, kInvalidShaderName);
                 return false;
@@ -2423,7 +2423,7 @@
             return true;
 
         case GL_PROGRAM:
-            if (context->getProgramNoResolveLink(name) == nullptr)
+            if (context->getProgramNoResolveLink({name}) == nullptr)
             {
                 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
                 return false;
@@ -3583,7 +3583,7 @@
 }
 
 bool ValidateBindUniformLocationCHROMIUM(Context *context,
-                                         GLuint program,
+                                         ShaderProgramID program,
                                          GLint location,
                                          const GLchar *name)
 {
@@ -4292,7 +4292,7 @@
 }
 
 bool ValidateBindFragmentInputLocationCHROMIUM(Context *context,
-                                               GLuint program,
+                                               ShaderProgramID program,
                                                GLint location,
                                                const GLchar *name)
 {
@@ -4332,7 +4332,7 @@
 }
 
 bool ValidateProgramPathFragmentInputGenCHROMIUM(Context *context,
-                                                 GLuint program,
+                                                 ShaderProgramID program,
                                                  GLint location,
                                                  GLenum genMode,
                                                  GLint components,
@@ -4911,7 +4911,7 @@
     return true;
 }
 
-bool ValidateAttachShader(Context *context, GLuint program, GLuint shader)
+bool ValidateAttachShader(Context *context, ShaderProgramID program, ShaderProgramID shader)
 {
     Program *programObject = GetValidProgram(context, program);
     if (!programObject)
@@ -4934,7 +4934,10 @@
     return true;
 }
 
-bool ValidateBindAttribLocation(Context *context, GLuint program, GLuint index, const GLchar *name)
+bool ValidateBindAttribLocation(Context *context,
+                                ShaderProgramID program,
+                                GLuint index,
+                                const GLchar *name)
 {
     if (index >= MAX_VERTEX_ATTRIBS)
     {
@@ -5253,7 +5256,7 @@
     return true;
 }
 
-bool ValidateCompileShader(Context *context, GLuint shader)
+bool ValidateCompileShader(Context *context, ShaderProgramID shader)
 {
     return true;
 }
@@ -5280,9 +5283,9 @@
     return true;
 }
 
-bool ValidateDeleteProgram(Context *context, GLuint program)
+bool ValidateDeleteProgram(Context *context, ShaderProgramID program)
 {
-    if (program == 0)
+    if (program.value == 0)
     {
         return false;
     }
@@ -5304,9 +5307,9 @@
     return true;
 }
 
-bool ValidateDeleteShader(Context *context, GLuint shader)
+bool ValidateDeleteShader(Context *context, ShaderProgramID shader)
 {
-    if (shader == 0)
+    if (shader.value == 0)
     {
         return false;
     }
@@ -5355,7 +5358,7 @@
     return true;
 }
 
-bool ValidateDetachShader(Context *context, GLuint program, GLuint shader)
+bool ValidateDetachShader(Context *context, ShaderProgramID program, ShaderProgramID shader)
 {
     Program *programObject = GetValidProgram(context, program);
     if (!programObject)
@@ -5427,7 +5430,7 @@
 }
 
 bool ValidateGetActiveAttrib(Context *context,
-                             GLuint program,
+                             ShaderProgramID program,
                              GLuint index,
                              GLsizei bufsize,
                              GLsizei *length,
@@ -5458,7 +5461,7 @@
 }
 
 bool ValidateGetActiveUniform(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLuint index,
                               GLsizei bufsize,
                               GLsizei *length,
@@ -5489,10 +5492,10 @@
 }
 
 bool ValidateGetAttachedShaders(Context *context,
-                                GLuint program,
+                                ShaderProgramID program,
                                 GLsizei maxcount,
                                 GLsizei *count,
-                                GLuint *shaders)
+                                ShaderProgramID *shaders)
 {
     if (maxcount < 0)
     {
@@ -5510,7 +5513,7 @@
     return true;
 }
 
-bool ValidateGetAttribLocation(Context *context, GLuint program, const GLchar *name)
+bool ValidateGetAttribLocation(Context *context, ShaderProgramID program, const GLchar *name)
 {
     // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
     // shader-related entry points
@@ -5564,7 +5567,7 @@
 }
 
 bool ValidateGetProgramInfoLog(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLsizei bufsize,
                                GLsizei *length,
                                GLchar *infolog)
@@ -5585,7 +5588,7 @@
 }
 
 bool ValidateGetShaderInfoLog(Context *context,
-                              GLuint shader,
+                              ShaderProgramID shader,
                               GLsizei bufsize,
                               GLsizei *length,
                               GLchar *infolog)
@@ -5643,7 +5646,7 @@
 }
 
 bool ValidateGetShaderSource(Context *context,
-                             GLuint shader,
+                             ShaderProgramID shader,
                              GLsizei bufsize,
                              GLsizei *length,
                              GLchar *source)
@@ -5663,7 +5666,7 @@
     return true;
 }
 
-bool ValidateGetUniformLocation(Context *context, GLuint program, const GLchar *name)
+bool ValidateGetUniformLocation(Context *context, ShaderProgramID program, const GLchar *name)
 {
     if (strstr(name, "gl_") == name)
     {
@@ -5751,7 +5754,7 @@
     return true;
 }
 
-bool ValidateIsProgram(Context *context, GLuint program)
+bool ValidateIsProgram(Context *context, ShaderProgramID program)
 {
     return true;
 }
@@ -5761,7 +5764,7 @@
     return true;
 }
 
-bool ValidateIsShader(Context *context, GLuint shader)
+bool ValidateIsShader(Context *context, ShaderProgramID shader)
 {
     return true;
 }
@@ -5881,7 +5884,7 @@
 
 bool ValidateShaderBinary(Context *context,
                           GLsizei n,
-                          const GLuint *shaders,
+                          const ShaderProgramID *shaders,
                           GLenum binaryformat,
                           const void *binary,
                           GLsizei length)
@@ -5898,7 +5901,7 @@
 }
 
 bool ValidateShaderSource(Context *context,
-                          GLuint shader,
+                          ShaderProgramID shader,
                           GLsizei count,
                           const GLchar *const *string,
                           const GLint *length)
@@ -6116,7 +6119,7 @@
     return ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose);
 }
 
-bool ValidateValidateProgram(Context *context, GLuint program)
+bool ValidateValidateProgram(Context *context, ShaderProgramID program)
 {
     Program *programObject = GetValidProgram(context, program);
 
@@ -6194,7 +6197,7 @@
                                                            nullptr);
 }
 
-bool ValidateGetProgramiv(Context *context, GLuint program, GLenum pname, GLint *params)
+bool ValidateGetProgramiv(Context *context, ShaderProgramID program, GLenum pname, GLint *params)
 {
     return ValidateGetProgramivBase(context, program, pname, nullptr);
 }
@@ -6640,7 +6643,7 @@
     return ValidateGetRenderbufferParameterivBase(context, target, pname, nullptr);
 }
 
-bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params)
+bool ValidateGetShaderiv(Context *context, ShaderProgramID shader, GLenum pname, GLint *params)
 {
     return ValidateGetShaderivBase(context, shader, pname, nullptr);
 }
@@ -6681,12 +6684,15 @@
     return ValidateGetTexParameterBase(context, target, pname, nullptr);
 }
 
-bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfloat *params)
+bool ValidateGetUniformfv(Context *context,
+                          ShaderProgramID program,
+                          GLint location,
+                          GLfloat *params)
 {
     return ValidateGetUniformBase(context, program, location);
 }
 
-bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint *params)
+bool ValidateGetUniformiv(Context *context, ShaderProgramID program, GLint location, GLint *params)
 {
     return ValidateGetUniformBase(context, program, location);
 }
@@ -6717,7 +6723,7 @@
     return true;
 }
 
-bool ValidateLinkProgram(Context *context, GLuint program)
+bool ValidateLinkProgram(Context *context, ShaderProgramID program)
 {
     if (context->hasActiveTransformFeedback(program))
     {
@@ -6797,9 +6803,9 @@
     return ValidateTexParameterBase(context, target, pname, -1, true, params);
 }
 
-bool ValidateUseProgram(Context *context, GLuint program)
+bool ValidateUseProgram(Context *context, ShaderProgramID program)
 {
-    if (program != 0)
+    if (program.value != 0)
     {
         Program *programObject = context->getProgramResolveLink(program);
         if (!programObject)
@@ -6939,7 +6945,7 @@
 }
 
 bool ValidateGetTranslatedShaderSourceANGLE(Context *context,
-                                            GLuint shader,
+                                            ShaderProgramID shader,
                                             GLsizei bufsize,
                                             GLsizei *length,
                                             GLchar *source)
diff --git a/src/libANGLE/validationES2_autogen.h b/src/libANGLE/validationES2_autogen.h
index 43f8c59..7896b9a 100644
--- a/src/libANGLE/validationES2_autogen.h
+++ b/src/libANGLE/validationES2_autogen.h
@@ -18,8 +18,13 @@
 class Context;
 
 bool ValidateActiveTexture(Context *context, GLenum texture);
-bool ValidateAttachShader(Context *context, GLuint program, GLuint shader);
-bool ValidateBindAttribLocation(Context *context, GLuint program, GLuint index, const GLchar *name);
+bool ValidateAttachShader(Context *context,
+                          ShaderProgramID programPacked,
+                          ShaderProgramID shaderPacked);
+bool ValidateBindAttribLocation(Context *context,
+                                ShaderProgramID programPacked,
+                                GLuint index,
+                                const GLchar *name);
 bool ValidateBindBuffer(Context *context, BufferBinding targetPacked, BufferID bufferPacked);
 bool ValidateBindFramebuffer(Context *context, GLenum target, GLuint framebuffer);
 bool ValidateBindRenderbuffer(Context *context, GLenum target, RenderbufferID renderbufferPacked);
@@ -53,7 +58,7 @@
                        GLboolean green,
                        GLboolean blue,
                        GLboolean alpha);
-bool ValidateCompileShader(Context *context, GLuint shader);
+bool ValidateCompileShader(Context *context, ShaderProgramID shaderPacked);
 bool ValidateCompressedTexImage2D(Context *context,
                                   TextureTarget targetPacked,
                                   GLint level,
@@ -96,16 +101,18 @@
 bool ValidateCullFace(Context *context, CullFaceMode modePacked);
 bool ValidateDeleteBuffers(Context *context, GLsizei n, const BufferID *buffersPacked);
 bool ValidateDeleteFramebuffers(Context *context, GLsizei n, const GLuint *framebuffers);
-bool ValidateDeleteProgram(Context *context, GLuint program);
+bool ValidateDeleteProgram(Context *context, ShaderProgramID programPacked);
 bool ValidateDeleteRenderbuffers(Context *context,
                                  GLsizei n,
                                  const RenderbufferID *renderbuffersPacked);
-bool ValidateDeleteShader(Context *context, GLuint shader);
+bool ValidateDeleteShader(Context *context, ShaderProgramID shaderPacked);
 bool ValidateDeleteTextures(Context *context, GLsizei n, const TextureID *texturesPacked);
 bool ValidateDepthFunc(Context *context, GLenum func);
 bool ValidateDepthMask(Context *context, GLboolean flag);
 bool ValidateDepthRangef(Context *context, GLfloat n, GLfloat f);
-bool ValidateDetachShader(Context *context, GLuint program, GLuint shader);
+bool ValidateDetachShader(Context *context,
+                          ShaderProgramID programPacked,
+                          ShaderProgramID shaderPacked);
 bool ValidateDisable(Context *context, GLenum cap);
 bool ValidateDisableVertexAttribArray(Context *context, GLuint index);
 bool ValidateDrawArrays(Context *context, PrimitiveMode modePacked, GLint first, GLsizei count);
@@ -136,7 +143,7 @@
 bool ValidateGenTextures(Context *context, GLsizei n, TextureID *texturesPacked);
 bool ValidateGenerateMipmap(Context *context, TextureType targetPacked);
 bool ValidateGetActiveAttrib(Context *context,
-                             GLuint program,
+                             ShaderProgramID programPacked,
                              GLuint index,
                              GLsizei bufSize,
                              GLsizei *length,
@@ -144,7 +151,7 @@
                              GLenum *type,
                              GLchar *name);
 bool ValidateGetActiveUniform(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLuint index,
                               GLsizei bufSize,
                               GLsizei *length,
@@ -152,11 +159,11 @@
                               GLenum *type,
                               GLchar *name);
 bool ValidateGetAttachedShaders(Context *context,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLsizei maxCount,
                                 GLsizei *count,
-                                GLuint *shaders);
-bool ValidateGetAttribLocation(Context *context, GLuint program, const GLchar *name);
+                                ShaderProgramID *shadersPacked);
+bool ValidateGetAttribLocation(Context *context, ShaderProgramID programPacked, const GLchar *name);
 bool ValidateGetBooleanv(Context *context, GLenum pname, GLboolean *data);
 bool ValidateGetBufferParameteriv(Context *context,
                                   BufferBinding targetPacked,
@@ -171,17 +178,20 @@
                                                  GLint *params);
 bool ValidateGetIntegerv(Context *context, GLenum pname, GLint *data);
 bool ValidateGetProgramInfoLog(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLsizei bufSize,
                                GLsizei *length,
                                GLchar *infoLog);
-bool ValidateGetProgramiv(Context *context, GLuint program, GLenum pname, GLint *params);
+bool ValidateGetProgramiv(Context *context,
+                          ShaderProgramID programPacked,
+                          GLenum pname,
+                          GLint *params);
 bool ValidateGetRenderbufferParameteriv(Context *context,
                                         GLenum target,
                                         GLenum pname,
                                         GLint *params);
 bool ValidateGetShaderInfoLog(Context *context,
-                              GLuint shader,
+                              ShaderProgramID shaderPacked,
                               GLsizei bufSize,
                               GLsizei *length,
                               GLchar *infoLog);
@@ -191,11 +201,14 @@
                                       GLint *range,
                                       GLint *precision);
 bool ValidateGetShaderSource(Context *context,
-                             GLuint shader,
+                             ShaderProgramID shaderPacked,
                              GLsizei bufSize,
                              GLsizei *length,
                              GLchar *source);
-bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params);
+bool ValidateGetShaderiv(Context *context,
+                         ShaderProgramID shaderPacked,
+                         GLenum pname,
+                         GLint *params);
 bool ValidateGetString(Context *context, GLenum name);
 bool ValidateGetTexParameterfv(Context *context,
                                TextureType targetPacked,
@@ -205,9 +218,17 @@
                                TextureType targetPacked,
                                GLenum pname,
                                GLint *params);
-bool ValidateGetUniformLocation(Context *context, GLuint program, const GLchar *name);
-bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfloat *params);
-bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint *params);
+bool ValidateGetUniformLocation(Context *context,
+                                ShaderProgramID programPacked,
+                                const GLchar *name);
+bool ValidateGetUniformfv(Context *context,
+                          ShaderProgramID programPacked,
+                          GLint location,
+                          GLfloat *params);
+bool ValidateGetUniformiv(Context *context,
+                          ShaderProgramID programPacked,
+                          GLint location,
+                          GLint *params);
 bool ValidateGetVertexAttribPointerv(Context *context, GLuint index, GLenum pname, void **pointer);
 bool ValidateGetVertexAttribfv(Context *context, GLuint index, GLenum pname, GLfloat *params);
 bool ValidateGetVertexAttribiv(Context *context, GLuint index, GLenum pname, GLint *params);
@@ -215,12 +236,12 @@
 bool ValidateIsBuffer(Context *context, BufferID bufferPacked);
 bool ValidateIsEnabled(Context *context, GLenum cap);
 bool ValidateIsFramebuffer(Context *context, GLuint framebuffer);
-bool ValidateIsProgram(Context *context, GLuint program);
+bool ValidateIsProgram(Context *context, ShaderProgramID programPacked);
 bool ValidateIsRenderbuffer(Context *context, RenderbufferID renderbufferPacked);
-bool ValidateIsShader(Context *context, GLuint shader);
+bool ValidateIsShader(Context *context, ShaderProgramID shaderPacked);
 bool ValidateIsTexture(Context *context, TextureID texturePacked);
 bool ValidateLineWidth(Context *context, GLfloat width);
-bool ValidateLinkProgram(Context *context, GLuint program);
+bool ValidateLinkProgram(Context *context, ShaderProgramID programPacked);
 bool ValidatePixelStorei(Context *context, GLenum pname, GLint param);
 bool ValidatePolygonOffset(Context *context, GLfloat factor, GLfloat units);
 bool ValidateReadPixels(Context *context,
@@ -241,12 +262,12 @@
 bool ValidateScissor(Context *context, GLint x, GLint y, GLsizei width, GLsizei height);
 bool ValidateShaderBinary(Context *context,
                           GLsizei count,
-                          const GLuint *shaders,
+                          const ShaderProgramID *shadersPacked,
                           GLenum binaryformat,
                           const void *binary,
                           GLsizei length);
 bool ValidateShaderSource(Context *context,
-                          GLuint shader,
+                          ShaderProgramID shaderPacked,
                           GLsizei count,
                           const GLchar *const *string,
                           const GLint *length);
@@ -330,8 +351,8 @@
                               GLsizei count,
                               GLboolean transpose,
                               const GLfloat *value);
-bool ValidateUseProgram(Context *context, GLuint program);
-bool ValidateValidateProgram(Context *context, GLuint program);
+bool ValidateUseProgram(Context *context, ShaderProgramID programPacked);
+bool ValidateValidateProgram(Context *context, ShaderProgramID programPacked);
 bool ValidateVertexAttrib1f(Context *context, GLuint index, GLfloat x);
 bool ValidateVertexAttrib1fv(Context *context, GLuint index, const GLfloat *v);
 bool ValidateVertexAttrib2f(Context *context, GLuint index, GLfloat x, GLfloat y);
diff --git a/src/libANGLE/validationES3.cpp b/src/libANGLE/validationES3.cpp
index 99bdd76..6da14f0 100644
--- a/src/libANGLE/validationES3.cpp
+++ b/src/libANGLE/validationES3.cpp
@@ -1501,7 +1501,10 @@
     return true;
 }
 
-bool ValidateGetUniformuiv(Context *context, GLuint program, GLint location, GLuint *params)
+bool ValidateGetUniformuiv(Context *context,
+                           ShaderProgramID program,
+                           GLint location,
+                           GLuint *params)
 {
     if (context->getClientMajorVersion() < 3)
     {
@@ -1808,7 +1811,7 @@
 }
 
 bool ValidateProgramBinary(Context *context,
-                           GLuint program,
+                           ShaderProgramID program,
                            GLenum binaryFormat,
                            const void *binary,
                            GLint length)
@@ -1823,7 +1826,7 @@
 }
 
 bool ValidateGetProgramBinary(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLsizei bufSize,
                               GLsizei *length,
                               GLenum *binaryFormat,
@@ -1838,7 +1841,7 @@
     return ValidateGetProgramBinaryBase(context, program, bufSize, length, binaryFormat, binary);
 }
 
-bool ValidateProgramParameteri(Context *context, GLuint program, GLenum pname, GLint value)
+bool ValidateProgramParameteri(Context *context, ShaderProgramID program, GLenum pname, GLint value)
 {
     if (context->getClientMajorVersion() < 3)
     {
@@ -3517,7 +3520,7 @@
 }
 
 bool ValidateTransformFeedbackVaryings(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLsizei count,
                                        const GLchar *const *varyings,
                                        GLenum bufferMode)
@@ -3563,7 +3566,7 @@
 }
 
 bool ValidateGetTransformFeedbackVarying(Context *context,
-                                         GLuint program,
+                                         ShaderProgramID program,
                                          GLuint index,
                                          GLsizei bufSize,
                                          GLsizei *length,
@@ -3750,7 +3753,7 @@
     return ValidateVertexAttribIndex(context, index);
 }
 
-bool ValidateGetFragDataLocation(Context *context, GLuint program, const GLchar *name)
+bool ValidateGetFragDataLocation(Context *context, ShaderProgramID program, const GLchar *name)
 {
     if (context->getClientMajorVersion() < 3)
     {
@@ -3774,7 +3777,7 @@
 }
 
 bool ValidateGetUniformIndices(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLsizei uniformCount,
                                const GLchar *const *uniformNames,
                                GLuint *uniformIndices)
@@ -3801,7 +3804,7 @@
 }
 
 bool ValidateGetActiveUniformsiv(Context *context,
-                                 GLuint program,
+                                 ShaderProgramID program,
                                  GLsizei uniformCount,
                                  const GLuint *uniformIndices,
                                  GLenum pname,
@@ -3869,7 +3872,9 @@
     return true;
 }
 
-bool ValidateGetUniformBlockIndex(Context *context, GLuint program, const GLchar *uniformBlockName)
+bool ValidateGetUniformBlockIndex(Context *context,
+                                  ShaderProgramID program,
+                                  const GLchar *uniformBlockName)
 {
     if (context->getClientMajorVersion() < 3)
     {
@@ -3887,7 +3892,7 @@
 }
 
 bool ValidateGetActiveUniformBlockiv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLuint uniformBlockIndex,
                                      GLenum pname,
                                      GLint *params)
@@ -3896,7 +3901,7 @@
 }
 
 bool ValidateGetActiveUniformBlockName(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLuint uniformBlockIndex,
                                        GLsizei bufSize,
                                        GLsizei *length,
@@ -3924,7 +3929,7 @@
 }
 
 bool ValidateUniformBlockBinding(Context *context,
-                                 GLuint program,
+                                 ShaderProgramID program,
                                  GLuint uniformBlockIndex,
                                  GLuint uniformBlockBinding)
 {
@@ -4305,7 +4310,7 @@
 }
 
 bool ValidateBindFragDataLocationIndexedEXT(Context *context,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLuint colorNumber,
                                             GLuint index,
                                             const char *name)
@@ -4354,14 +4359,14 @@
 }
 
 bool ValidateBindFragDataLocationEXT(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLuint colorNumber,
                                      const char *name)
 {
     return ValidateBindFragDataLocationIndexedEXT(context, program, colorNumber, 0u, name);
 }
 
-bool ValidateGetFragDataIndexEXT(Context *context, GLuint program, const char *name)
+bool ValidateGetFragDataIndexEXT(Context *context, ShaderProgramID program, const char *name)
 {
     if (!context->getExtensions().blendFuncExtended)
     {
diff --git a/src/libANGLE/validationES31.cpp b/src/libANGLE/validationES31.cpp
index 9491b2d..7e835d7 100644
--- a/src/libANGLE/validationES31.cpp
+++ b/src/libANGLE/validationES31.cpp
@@ -298,7 +298,7 @@
 
 bool ValidateProgramUniform(Context *context,
                             GLenum valueType,
-                            GLuint program,
+                            ShaderProgramID program,
                             GLint location,
                             GLsizei count)
 {
@@ -317,7 +317,7 @@
 
 bool ValidateProgramUniformMatrix(Context *context,
                                   GLenum valueType,
-                                  GLuint program,
+                                  ShaderProgramID program,
                                   GLint location,
                                   GLsizei count,
                                   GLboolean transpose)
@@ -539,19 +539,23 @@
     return true;
 }
 
-bool ValidateProgramUniform1i(Context *context, GLuint program, GLint location, GLint v0)
+bool ValidateProgramUniform1i(Context *context, ShaderProgramID program, GLint location, GLint v0)
 {
     return ValidateProgramUniform1iv(context, program, location, 1, &v0);
 }
 
-bool ValidateProgramUniform2i(Context *context, GLuint program, GLint location, GLint v0, GLint v1)
+bool ValidateProgramUniform2i(Context *context,
+                              ShaderProgramID program,
+                              GLint location,
+                              GLint v0,
+                              GLint v1)
 {
     GLint xy[2] = {v0, v1};
     return ValidateProgramUniform2iv(context, program, location, 1, xy);
 }
 
 bool ValidateProgramUniform3i(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLint v0,
                               GLint v1,
@@ -562,7 +566,7 @@
 }
 
 bool ValidateProgramUniform4i(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLint v0,
                               GLint v1,
@@ -573,13 +577,13 @@
     return ValidateProgramUniform4iv(context, program, location, 1, xyzw);
 }
 
-bool ValidateProgramUniform1ui(Context *context, GLuint program, GLint location, GLuint v0)
+bool ValidateProgramUniform1ui(Context *context, ShaderProgramID program, GLint location, GLuint v0)
 {
     return ValidateProgramUniform1uiv(context, program, location, 1, &v0);
 }
 
 bool ValidateProgramUniform2ui(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLuint v0,
                                GLuint v1)
@@ -589,7 +593,7 @@
 }
 
 bool ValidateProgramUniform3ui(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLuint v0,
                                GLuint v1,
@@ -600,7 +604,7 @@
 }
 
 bool ValidateProgramUniform4ui(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLuint v0,
                                GLuint v1,
@@ -611,13 +615,13 @@
     return ValidateProgramUniform4uiv(context, program, location, 1, xyzw);
 }
 
-bool ValidateProgramUniform1f(Context *context, GLuint program, GLint location, GLfloat v0)
+bool ValidateProgramUniform1f(Context *context, ShaderProgramID program, GLint location, GLfloat v0)
 {
     return ValidateProgramUniform1fv(context, program, location, 1, &v0);
 }
 
 bool ValidateProgramUniform2f(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLfloat v0,
                               GLfloat v1)
@@ -627,7 +631,7 @@
 }
 
 bool ValidateProgramUniform3f(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLfloat v0,
                               GLfloat v1,
@@ -638,7 +642,7 @@
 }
 
 bool ValidateProgramUniform4f(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLfloat v0,
                               GLfloat v1,
@@ -650,7 +654,7 @@
 }
 
 bool ValidateProgramUniform1iv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLint *value)
@@ -669,7 +673,7 @@
 }
 
 bool ValidateProgramUniform2iv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLint *value)
@@ -678,7 +682,7 @@
 }
 
 bool ValidateProgramUniform3iv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLint *value)
@@ -687,7 +691,7 @@
 }
 
 bool ValidateProgramUniform4iv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLint *value)
@@ -696,7 +700,7 @@
 }
 
 bool ValidateProgramUniform1uiv(Context *context,
-                                GLuint program,
+                                ShaderProgramID program,
                                 GLint location,
                                 GLsizei count,
                                 const GLuint *value)
@@ -705,7 +709,7 @@
 }
 
 bool ValidateProgramUniform2uiv(Context *context,
-                                GLuint program,
+                                ShaderProgramID program,
                                 GLint location,
                                 GLsizei count,
                                 const GLuint *value)
@@ -714,7 +718,7 @@
 }
 
 bool ValidateProgramUniform3uiv(Context *context,
-                                GLuint program,
+                                ShaderProgramID program,
                                 GLint location,
                                 GLsizei count,
                                 const GLuint *value)
@@ -723,7 +727,7 @@
 }
 
 bool ValidateProgramUniform4uiv(Context *context,
-                                GLuint program,
+                                ShaderProgramID program,
                                 GLint location,
                                 GLsizei count,
                                 const GLuint *value)
@@ -732,7 +736,7 @@
 }
 
 bool ValidateProgramUniform1fv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLfloat *value)
@@ -741,7 +745,7 @@
 }
 
 bool ValidateProgramUniform2fv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLfloat *value)
@@ -750,7 +754,7 @@
 }
 
 bool ValidateProgramUniform3fv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLfloat *value)
@@ -759,7 +763,7 @@
 }
 
 bool ValidateProgramUniform4fv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLfloat *value)
@@ -768,7 +772,7 @@
 }
 
 bool ValidateProgramUniformMatrix2fv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
@@ -779,7 +783,7 @@
 }
 
 bool ValidateProgramUniformMatrix3fv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
@@ -790,7 +794,7 @@
 }
 
 bool ValidateProgramUniformMatrix4fv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
@@ -801,7 +805,7 @@
 }
 
 bool ValidateProgramUniformMatrix2x3fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -812,7 +816,7 @@
 }
 
 bool ValidateProgramUniformMatrix3x2fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -823,7 +827,7 @@
 }
 
 bool ValidateProgramUniformMatrix2x4fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -834,7 +838,7 @@
 }
 
 bool ValidateProgramUniformMatrix4x2fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -845,7 +849,7 @@
 }
 
 bool ValidateProgramUniformMatrix3x4fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -856,7 +860,7 @@
 }
 
 bool ValidateProgramUniformMatrix4x3fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -1118,7 +1122,7 @@
 }
 
 bool ValidateGetProgramResourceIndex(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLenum programInterface,
                                      const GLchar *name)
 {
@@ -1279,7 +1283,7 @@
 }
 
 bool ValidateGetProgramResourceName(Context *context,
-                                    GLuint program,
+                                    ShaderProgramID program,
                                     GLenum programInterface,
                                     GLuint index,
                                     GLsizei bufSize,
@@ -1483,7 +1487,7 @@
 }
 
 bool ValidateGetProgramResourceLocation(Context *context,
-                                        GLuint program,
+                                        ShaderProgramID program,
                                         GLenum programInterface,
                                         const GLchar *name)
 {
@@ -1514,7 +1518,7 @@
 }
 
 bool ValidateGetProgramResourceiv(Context *context,
-                                  GLuint program,
+                                  ShaderProgramID program,
                                   GLenum programInterface,
                                   GLuint index,
                                   GLsizei propCount,
@@ -1571,7 +1575,7 @@
 }
 
 bool ValidateGetProgramInterfaceiv(Context *context,
-                                   GLuint program,
+                                   ShaderProgramID program,
                                    GLenum programInterface,
                                    GLenum pname,
                                    GLint *params)
@@ -1631,7 +1635,7 @@
 }
 
 bool ValidateGetProgramInterfaceivRobustANGLE(Context *context,
-                                              GLuint program,
+                                              ShaderProgramID program,
                                               GLenum programInterface,
                                               GLenum pname,
                                               GLsizei bufSize,
@@ -1694,13 +1698,15 @@
 bool ValidateUseProgramStages(Context *context,
                               ProgramPipelineID pipeline,
                               GLbitfield stages,
-                              GLuint program)
+                              ShaderProgramID program)
 {
     UNIMPLEMENTED();
     return false;
 }
 
-bool ValidateActiveShaderProgram(Context *context, ProgramPipelineID pipeline, GLuint program)
+bool ValidateActiveShaderProgram(Context *context,
+                                 ProgramPipelineID pipeline,
+                                 ShaderProgramID program)
 {
     UNIMPLEMENTED();
     return false;
@@ -1906,7 +1912,7 @@
 }
 
 bool ValidateGetProgramResourceLocationIndexEXT(Context *context,
-                                                GLuint program,
+                                                ShaderProgramID program,
                                                 GLenum programInterface,
                                                 const char *name)
 {
diff --git a/src/libANGLE/validationES31_autogen.h b/src/libANGLE/validationES31_autogen.h
index f826649..43bb91c 100644
--- a/src/libANGLE/validationES31_autogen.h
+++ b/src/libANGLE/validationES31_autogen.h
@@ -19,7 +19,7 @@
 
 bool ValidateActiveShaderProgram(Context *context,
                                  ProgramPipelineID pipelinePacked,
-                                 GLuint program);
+                                 ShaderProgramID programPacked);
 bool ValidateBindImageTexture(Context *context,
                               GLuint unit,
                               TextureID texturePacked,
@@ -60,7 +60,7 @@
                                        GLint *params);
 bool ValidateGetMultisamplefv(Context *context, GLenum pname, GLuint index, GLfloat *val);
 bool ValidateGetProgramInterfaceiv(Context *context,
-                                   GLuint program,
+                                   ShaderProgramID programPacked,
                                    GLenum programInterface,
                                    GLenum pname,
                                    GLint *params);
@@ -74,22 +74,22 @@
                                   GLenum pname,
                                   GLint *params);
 bool ValidateGetProgramResourceIndex(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLenum programInterface,
                                      const GLchar *name);
 bool ValidateGetProgramResourceLocation(Context *context,
-                                        GLuint program,
+                                        ShaderProgramID programPacked,
                                         GLenum programInterface,
                                         const GLchar *name);
 bool ValidateGetProgramResourceName(Context *context,
-                                    GLuint program,
+                                    ShaderProgramID programPacked,
                                     GLenum programInterface,
                                     GLuint index,
                                     GLsizei bufSize,
                                     GLsizei *length,
                                     GLchar *name);
 bool ValidateGetProgramResourceiv(Context *context,
-                                  GLuint program,
+                                  ShaderProgramID programPacked,
                                   GLenum programInterface,
                                   GLuint index,
                                   GLsizei propCount,
@@ -110,169 +110,182 @@
 bool ValidateIsProgramPipeline(Context *context, ProgramPipelineID pipelinePacked);
 bool ValidateMemoryBarrier(Context *context, GLbitfield barriers);
 bool ValidateMemoryBarrierByRegion(Context *context, GLbitfield barriers);
-bool ValidateProgramUniform1f(Context *context, GLuint program, GLint location, GLfloat v0);
+bool ValidateProgramUniform1f(Context *context,
+                              ShaderProgramID programPacked,
+                              GLint location,
+                              GLfloat v0);
 bool ValidateProgramUniform1fv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLfloat *value);
-bool ValidateProgramUniform1i(Context *context, GLuint program, GLint location, GLint v0);
+bool ValidateProgramUniform1i(Context *context,
+                              ShaderProgramID programPacked,
+                              GLint location,
+                              GLint v0);
 bool ValidateProgramUniform1iv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLint *value);
-bool ValidateProgramUniform1ui(Context *context, GLuint program, GLint location, GLuint v0);
+bool ValidateProgramUniform1ui(Context *context,
+                               ShaderProgramID programPacked,
+                               GLint location,
+                               GLuint v0);
 bool ValidateProgramUniform1uiv(Context *context,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLint location,
                                 GLsizei count,
                                 const GLuint *value);
 bool ValidateProgramUniform2f(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLint location,
                               GLfloat v0,
                               GLfloat v1);
 bool ValidateProgramUniform2fv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLfloat *value);
-bool ValidateProgramUniform2i(Context *context, GLuint program, GLint location, GLint v0, GLint v1);
+bool ValidateProgramUniform2i(Context *context,
+                              ShaderProgramID programPacked,
+                              GLint location,
+                              GLint v0,
+                              GLint v1);
 bool ValidateProgramUniform2iv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLint *value);
 bool ValidateProgramUniform2ui(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLuint v0,
                                GLuint v1);
 bool ValidateProgramUniform2uiv(Context *context,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLint location,
                                 GLsizei count,
                                 const GLuint *value);
 bool ValidateProgramUniform3f(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLint location,
                               GLfloat v0,
                               GLfloat v1,
                               GLfloat v2);
 bool ValidateProgramUniform3fv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLfloat *value);
 bool ValidateProgramUniform3i(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLint location,
                               GLint v0,
                               GLint v1,
                               GLint v2);
 bool ValidateProgramUniform3iv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLint *value);
 bool ValidateProgramUniform3ui(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLuint v0,
                                GLuint v1,
                                GLuint v2);
 bool ValidateProgramUniform3uiv(Context *context,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLint location,
                                 GLsizei count,
                                 const GLuint *value);
 bool ValidateProgramUniform4f(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLint location,
                               GLfloat v0,
                               GLfloat v1,
                               GLfloat v2,
                               GLfloat v3);
 bool ValidateProgramUniform4fv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLfloat *value);
 bool ValidateProgramUniform4i(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLint location,
                               GLint v0,
                               GLint v1,
                               GLint v2,
                               GLint v3);
 bool ValidateProgramUniform4iv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLint *value);
 bool ValidateProgramUniform4ui(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLuint v0,
                                GLuint v1,
                                GLuint v2,
                                GLuint v3);
 bool ValidateProgramUniform4uiv(Context *context,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLint location,
                                 GLsizei count,
                                 const GLuint *value);
 bool ValidateProgramUniformMatrix2fv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLfloat *value);
 bool ValidateProgramUniformMatrix2x3fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value);
 bool ValidateProgramUniformMatrix2x4fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value);
 bool ValidateProgramUniformMatrix3fv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLfloat *value);
 bool ValidateProgramUniformMatrix3x2fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value);
 bool ValidateProgramUniformMatrix3x4fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value);
 bool ValidateProgramUniformMatrix4fv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLfloat *value);
 bool ValidateProgramUniformMatrix4x2fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value);
 bool ValidateProgramUniformMatrix4x3fv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -288,7 +301,7 @@
 bool ValidateUseProgramStages(Context *context,
                               ProgramPipelineID pipelinePacked,
                               GLbitfield stages,
-                              GLuint program);
+                              ShaderProgramID programPacked);
 bool ValidateValidateProgramPipeline(Context *context, ProgramPipelineID pipelinePacked);
 bool ValidateVertexAttribBinding(Context *context, GLuint attribindex, GLuint bindingindex);
 bool ValidateVertexAttribFormat(Context *context,
diff --git a/src/libANGLE/validationES3_autogen.h b/src/libANGLE/validationES3_autogen.h
index bb08535..77f9c38 100644
--- a/src/libANGLE/validationES3_autogen.h
+++ b/src/libANGLE/validationES3_autogen.h
@@ -132,18 +132,18 @@
 bool ValidateGenTransformFeedbacks(Context *context, GLsizei n, GLuint *ids);
 bool ValidateGenVertexArrays(Context *context, GLsizei n, GLuint *arrays);
 bool ValidateGetActiveUniformBlockName(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLuint uniformBlockIndex,
                                        GLsizei bufSize,
                                        GLsizei *length,
                                        GLchar *uniformBlockName);
 bool ValidateGetActiveUniformBlockiv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLuint uniformBlockIndex,
                                      GLenum pname,
                                      GLint *params);
 bool ValidateGetActiveUniformsiv(Context *context,
-                                 GLuint program,
+                                 ShaderProgramID programPacked,
                                  GLsizei uniformCount,
                                  const GLuint *uniformIndices,
                                  GLenum pname,
@@ -156,7 +156,9 @@
                                BufferBinding targetPacked,
                                GLenum pname,
                                void **params);
-bool ValidateGetFragDataLocation(Context *context, GLuint program, const GLchar *name);
+bool ValidateGetFragDataLocation(Context *context,
+                                 ShaderProgramID programPacked,
+                                 const GLchar *name);
 bool ValidateGetInteger64i_v(Context *context, GLenum target, GLuint index, GLint64 *data);
 bool ValidateGetInteger64v(Context *context, GLenum pname, GLint64 *data);
 bool ValidateGetIntegeri_v(Context *context, GLenum target, GLuint index, GLint *data);
@@ -167,7 +169,7 @@
                                  GLsizei bufSize,
                                  GLint *params);
 bool ValidateGetProgramBinary(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLsizei bufSize,
                               GLsizei *length,
                               GLenum *binaryFormat,
@@ -190,20 +192,25 @@
                        GLsizei *length,
                        GLint *values);
 bool ValidateGetTransformFeedbackVarying(Context *context,
-                                         GLuint program,
+                                         ShaderProgramID programPacked,
                                          GLuint index,
                                          GLsizei bufSize,
                                          GLsizei *length,
                                          GLsizei *size,
                                          GLenum *type,
                                          GLchar *name);
-bool ValidateGetUniformBlockIndex(Context *context, GLuint program, const GLchar *uniformBlockName);
+bool ValidateGetUniformBlockIndex(Context *context,
+                                  ShaderProgramID programPacked,
+                                  const GLchar *uniformBlockName);
 bool ValidateGetUniformIndices(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLsizei uniformCount,
                                const GLchar *const *uniformNames,
                                GLuint *uniformIndices);
-bool ValidateGetUniformuiv(Context *context, GLuint program, GLint location, GLuint *params);
+bool ValidateGetUniformuiv(Context *context,
+                           ShaderProgramID programPacked,
+                           GLint location,
+                           GLuint *params);
 bool ValidateGetVertexAttribIiv(Context *context, GLuint index, GLenum pname, GLint *params);
 bool ValidateGetVertexAttribIuiv(Context *context, GLuint index, GLenum pname, GLuint *params);
 bool ValidateInvalidateFramebuffer(Context *context,
@@ -230,11 +237,14 @@
                             GLbitfield access);
 bool ValidatePauseTransformFeedback(Context *context);
 bool ValidateProgramBinary(Context *context,
-                           GLuint program,
+                           ShaderProgramID programPacked,
                            GLenum binaryFormat,
                            const void *binary,
                            GLsizei length);
-bool ValidateProgramParameteri(Context *context, GLuint program, GLenum pname, GLint value);
+bool ValidateProgramParameteri(Context *context,
+                               ShaderProgramID programPacked,
+                               GLenum pname,
+                               GLint value);
 bool ValidateReadBuffer(Context *context, GLenum src);
 bool ValidateRenderbufferStorageMultisample(Context *context,
                                             GLenum target,
@@ -296,7 +306,7 @@
                            GLenum type,
                            const void *pixels);
 bool ValidateTransformFeedbackVaryings(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLsizei count,
                                        const GLchar *const *varyings,
                                        GLenum bufferMode);
@@ -314,7 +324,7 @@
                         GLuint v3);
 bool ValidateUniform4uiv(Context *context, GLint location, GLsizei count, const GLuint *value);
 bool ValidateUniformBlockBinding(Context *context,
-                                 GLuint program,
+                                 ShaderProgramID programPacked,
                                  GLuint uniformBlockIndex,
                                  GLuint uniformBlockBinding);
 bool ValidateUniformMatrix2x3fv(Context *context,
diff --git a/src/libANGLE/validationESEXT_autogen.h b/src/libANGLE/validationESEXT_autogen.h
index 70b0382..49d1d09 100644
--- a/src/libANGLE/validationESEXT_autogen.h
+++ b/src/libANGLE/validationESEXT_autogen.h
@@ -177,7 +177,7 @@
                                     GLsizei *length,
                                     GLint *data);
 bool ValidateGetProgramivRobustANGLE(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLenum pname,
                                      GLsizei bufSize,
                                      GLsizei *length,
@@ -189,7 +189,7 @@
                                                    GLsizei *length,
                                                    GLint *params);
 bool ValidateGetShaderivRobustANGLE(Context *context,
-                                    GLuint shader,
+                                    ShaderProgramID shaderPacked,
                                     GLenum pname,
                                     GLsizei bufSize,
                                     GLsizei *length,
@@ -207,13 +207,13 @@
                                           GLsizei *length,
                                           GLint *params);
 bool ValidateGetUniformfvRobustANGLE(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei bufSize,
                                      GLsizei *length,
                                      GLfloat *params);
 bool ValidateGetUniformivRobustANGLE(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei bufSize,
                                      GLsizei *length,
@@ -394,13 +394,13 @@
                                             GLsizei *length,
                                             GLuint *params);
 bool ValidateGetUniformuivRobustANGLE(Context *context,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       GLint location,
                                       GLsizei bufSize,
                                       GLsizei *length,
                                       GLuint *params);
 bool ValidateGetActiveUniformBlockivRobustANGLE(Context *context,
-                                                GLuint program,
+                                                ShaderProgramID programPacked,
                                                 GLuint uniformBlockIndex,
                                                 GLenum pname,
                                                 GLsizei bufSize,
@@ -452,7 +452,7 @@
                                                   GLsizei *length,
                                                   GLint *params);
 bool ValidateGetProgramInterfaceivRobustANGLE(Context *context,
-                                              GLuint program,
+                                              ShaderProgramID programPacked,
                                               GLenum programInterface,
                                               GLenum pname,
                                               GLsizei bufSize,
@@ -502,19 +502,19 @@
                                     GLsizei *rows,
                                     void *data);
 bool ValidateGetnUniformfvRobustANGLE(Context *context,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       GLint location,
                                       GLsizei bufSize,
                                       GLsizei *length,
                                       GLfloat *params);
 bool ValidateGetnUniformivRobustANGLE(Context *context,
-                                      GLuint program,
+                                      ShaderProgramID programPacked,
                                       GLint location,
                                       GLsizei bufSize,
                                       GLsizei *length,
                                       GLint *params);
 bool ValidateGetnUniformuivRobustANGLE(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei bufSize,
                                        GLsizei *length,
@@ -617,14 +617,14 @@
 
 // GL_ANGLE_translated_shader_source
 bool ValidateGetTranslatedShaderSourceANGLE(Context *context,
-                                            GLuint shader,
+                                            ShaderProgramID shaderPacked,
                                             GLsizei bufsize,
                                             GLsizei *length,
                                             GLchar *source);
 
 // GL_CHROMIUM_bind_uniform_location
 bool ValidateBindUniformLocationCHROMIUM(Context *context,
-                                         GLuint program,
+                                         ShaderProgramID programPacked,
                                          GLint location,
                                          const GLchar *name);
 
@@ -771,11 +771,11 @@
                                                          GLenum transformType,
                                                          const GLfloat *transformValues);
 bool ValidateBindFragmentInputLocationCHROMIUM(Context *context,
-                                               GLuint programs,
+                                               ShaderProgramID programsPacked,
                                                GLint location,
                                                const GLchar *name);
 bool ValidateProgramPathFragmentInputGenCHROMIUM(Context *context,
-                                                 GLuint program,
+                                                 ShaderProgramID programPacked,
                                                  GLint location,
                                                  GLenum genMode,
                                                  GLint components,
@@ -783,17 +783,19 @@
 
 // GL_EXT_blend_func_extended
 bool ValidateBindFragDataLocationEXT(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLuint color,
                                      const GLchar *name);
 bool ValidateBindFragDataLocationIndexedEXT(Context *context,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLuint colorNumber,
                                             GLuint index,
                                             const GLchar *name);
-bool ValidateGetFragDataIndexEXT(Context *context, GLuint program, const GLchar *name);
+bool ValidateGetFragDataIndexEXT(Context *context,
+                                 ShaderProgramID programPacked,
+                                 const GLchar *name);
 bool ValidateGetProgramResourceLocationIndexEXT(Context *context,
-                                                GLuint program,
+                                                ShaderProgramID programPacked,
                                                 GLenum programInterface,
                                                 const GLchar *name);
 
@@ -930,12 +932,12 @@
 // GL_EXT_robustness
 bool ValidateGetGraphicsResetStatusEXT(Context *context);
 bool ValidateGetnUniformfvEXT(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLint location,
                               GLsizei bufSize,
                               GLfloat *params);
 bool ValidateGetnUniformivEXT(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLint location,
                               GLsizei bufSize,
                               GLint *params);
@@ -1145,13 +1147,13 @@
 
 // GL_OES_get_program_binary
 bool ValidateGetProgramBinaryOES(Context *context,
-                                 GLuint program,
+                                 ShaderProgramID programPacked,
                                  GLsizei bufSize,
                                  GLsizei *length,
                                  GLenum *binaryFormat,
                                  void *binary);
 bool ValidateProgramBinaryOES(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLenum binaryFormat,
                               const void *binary,
                               GLint length);
diff --git a/src/libANGLE/validationGL3.cpp b/src/libANGLE/validationGL3.cpp
index 791db7b..4849ac8 100644
--- a/src/libANGLE/validationGL3.cpp
+++ b/src/libANGLE/validationGL3.cpp
@@ -16,7 +16,7 @@
 }
 
 bool ValidateBindFragDataLocation(Context *context,
-                                  GLuint program,
+                                  ShaderProgramID program,
                                   GLuint color,
                                   const GLchar *name)
 {
diff --git a/src/libANGLE/validationGL31.cpp b/src/libANGLE/validationGL31.cpp
index 348a51c..d2fbc12 100644
--- a/src/libANGLE/validationGL31.cpp
+++ b/src/libANGLE/validationGL31.cpp
@@ -12,7 +12,7 @@
 {
 
 bool ValidateGetActiveUniformName(Context *context,
-                                  GLuint program,
+                                  ShaderProgramID program,
                                   GLuint uniformIndex,
                                   GLsizei bufSize,
                                   GLsizei *length,
diff --git a/src/libANGLE/validationGL31_autogen.h b/src/libANGLE/validationGL31_autogen.h
index 545b1aa..15c6a5c 100644
--- a/src/libANGLE/validationGL31_autogen.h
+++ b/src/libANGLE/validationGL31_autogen.h
@@ -18,7 +18,7 @@
 class Context;
 
 bool ValidateGetActiveUniformName(Context *context,
-                                  GLuint program,
+                                  ShaderProgramID programPacked,
                                   GLuint uniformIndex,
                                   GLsizei bufSize,
                                   GLsizei *length,
diff --git a/src/libANGLE/validationGL33.cpp b/src/libANGLE/validationGL33.cpp
index 7db7d09..3f3acf5 100644
--- a/src/libANGLE/validationGL33.cpp
+++ b/src/libANGLE/validationGL33.cpp
@@ -12,7 +12,7 @@
 {
 
 bool ValidateBindFragDataLocationIndexed(Context *context,
-                                         GLuint program,
+                                         ShaderProgramID program,
                                          GLuint colorNumber,
                                          GLuint index,
                                          const GLchar *name)
@@ -40,7 +40,7 @@
     return true;
 }
 
-bool ValidateGetFragDataIndex(Context *context, GLuint program, const GLchar *name)
+bool ValidateGetFragDataIndex(Context *context, ShaderProgramID program, const GLchar *name)
 {
     return true;
 }
diff --git a/src/libANGLE/validationGL33_autogen.h b/src/libANGLE/validationGL33_autogen.h
index d536684..06e6424 100644
--- a/src/libANGLE/validationGL33_autogen.h
+++ b/src/libANGLE/validationGL33_autogen.h
@@ -18,7 +18,7 @@
 class Context;
 
 bool ValidateBindFragDataLocationIndexed(Context *context,
-                                         GLuint program,
+                                         ShaderProgramID programPacked,
                                          GLuint colorNumber,
                                          GLuint index,
                                          const GLchar *name);
@@ -26,7 +26,7 @@
 bool ValidateColorP3uiv(Context *context, GLenum type, const GLuint *color);
 bool ValidateColorP4ui(Context *context, GLenum type, GLuint color);
 bool ValidateColorP4uiv(Context *context, GLenum type, const GLuint *color);
-bool ValidateGetFragDataIndex(Context *context, GLuint program, const GLchar *name);
+bool ValidateGetFragDataIndex(Context *context, ShaderProgramID programPacked, const GLchar *name);
 bool ValidateGetQueryObjecti64v(Context *context, QueryID idPacked, GLenum pname, GLint64 *params);
 bool ValidateGetQueryObjectui64v(Context *context,
                                  QueryID idPacked,
diff --git a/src/libANGLE/validationGL3_autogen.h b/src/libANGLE/validationGL3_autogen.h
index 9f886ec..a8761f7 100644
--- a/src/libANGLE/validationGL3_autogen.h
+++ b/src/libANGLE/validationGL3_autogen.h
@@ -19,7 +19,7 @@
 
 bool ValidateBeginConditionalRender(Context *context, GLuint id, GLenum mode);
 bool ValidateBindFragDataLocation(Context *context,
-                                  GLuint program,
+                                  ShaderProgramID programPacked,
                                   GLuint color,
                                   const GLchar *name);
 bool ValidateClampColor(Context *context, GLenum target, GLenum clamp);
diff --git a/src/libANGLE/validationGL4.cpp b/src/libANGLE/validationGL4.cpp
index cdf3f3b..eda552a 100644
--- a/src/libANGLE/validationGL4.cpp
+++ b/src/libANGLE/validationGL4.cpp
@@ -57,7 +57,7 @@
 }
 
 bool ValidateGetActiveSubroutineName(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLenum shadertype,
                                      GLuint index,
                                      GLsizei bufsize,
@@ -68,7 +68,7 @@
 }
 
 bool ValidateGetActiveSubroutineUniformName(Context *context,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLenum shadertype,
                                             GLuint index,
                                             GLsizei bufsize,
@@ -79,7 +79,7 @@
 }
 
 bool ValidateGetActiveSubroutineUniformiv(Context *context,
-                                          GLuint program,
+                                          ShaderProgramID program,
                                           GLenum shadertype,
                                           GLuint index,
                                           GLenum pname,
@@ -89,7 +89,7 @@
 }
 
 bool ValidateGetProgramStageiv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLenum shadertype,
                                GLenum pname,
                                GLint *values)
@@ -107,7 +107,7 @@
 }
 
 bool ValidateGetSubroutineIndex(Context *context,
-                                GLuint program,
+                                ShaderProgramID program,
                                 GLenum shadertype,
                                 const GLchar *name)
 {
@@ -115,7 +115,7 @@
 }
 
 bool ValidateGetSubroutineUniformLocation(Context *context,
-                                          GLuint program,
+                                          ShaderProgramID program,
                                           GLenum shadertype,
                                           const GLchar *name)
 {
@@ -130,7 +130,10 @@
     return true;
 }
 
-bool ValidateGetUniformdv(Context *context, GLuint program, GLint location, GLdouble *params)
+bool ValidateGetUniformdv(Context *context,
+                          ShaderProgramID program,
+                          GLint location,
+                          GLdouble *params)
 {
     return true;
 }
diff --git a/src/libANGLE/validationGL41.cpp b/src/libANGLE/validationGL41.cpp
index e04a6cf..4972c69 100644
--- a/src/libANGLE/validationGL41.cpp
+++ b/src/libANGLE/validationGL41.cpp
@@ -36,13 +36,16 @@
     return true;
 }
 
-bool ValidateProgramUniform1d(Context *context, GLuint program, GLint location, GLdouble v0)
+bool ValidateProgramUniform1d(Context *context,
+                              ShaderProgramID program,
+                              GLint location,
+                              GLdouble v0)
 {
     return true;
 }
 
 bool ValidateProgramUniform1dv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value)
@@ -51,7 +54,7 @@
 }
 
 bool ValidateProgramUniform2d(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLdouble v0,
                               GLdouble v1)
@@ -60,7 +63,7 @@
 }
 
 bool ValidateProgramUniform2dv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value)
@@ -69,7 +72,7 @@
 }
 
 bool ValidateProgramUniform3d(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLdouble v0,
                               GLdouble v1,
@@ -79,7 +82,7 @@
 }
 
 bool ValidateProgramUniform3dv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value)
@@ -88,7 +91,7 @@
 }
 
 bool ValidateProgramUniform4d(Context *context,
-                              GLuint program,
+                              ShaderProgramID program,
                               GLint location,
                               GLdouble v0,
                               GLdouble v1,
@@ -99,7 +102,7 @@
 }
 
 bool ValidateProgramUniform4dv(Context *context,
-                               GLuint program,
+                               ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value)
@@ -108,7 +111,7 @@
 }
 
 bool ValidateProgramUniformMatrix2dv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
@@ -118,7 +121,7 @@
 }
 
 bool ValidateProgramUniformMatrix2x3dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -128,7 +131,7 @@
 }
 
 bool ValidateProgramUniformMatrix2x4dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -138,7 +141,7 @@
 }
 
 bool ValidateProgramUniformMatrix3dv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
@@ -148,7 +151,7 @@
 }
 
 bool ValidateProgramUniformMatrix3x2dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -158,7 +161,7 @@
 }
 
 bool ValidateProgramUniformMatrix3x4dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -168,7 +171,7 @@
 }
 
 bool ValidateProgramUniformMatrix4dv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
@@ -178,7 +181,7 @@
 }
 
 bool ValidateProgramUniformMatrix4x2dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
@@ -188,7 +191,7 @@
 }
 
 bool ValidateProgramUniformMatrix4x3dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
diff --git a/src/libANGLE/validationGL41_autogen.h b/src/libANGLE/validationGL41_autogen.h
index 9c05488..3f8a228 100644
--- a/src/libANGLE/validationGL41_autogen.h
+++ b/src/libANGLE/validationGL41_autogen.h
@@ -22,95 +22,98 @@
 bool ValidateGetDoublei_v(Context *context, GLenum target, GLuint index, GLdouble *data);
 bool ValidateGetFloati_v(Context *context, GLenum target, GLuint index, GLfloat *data);
 bool ValidateGetVertexAttribLdv(Context *context, GLuint index, GLenum pname, GLdouble *params);
-bool ValidateProgramUniform1d(Context *context, GLuint program, GLint location, GLdouble v0);
+bool ValidateProgramUniform1d(Context *context,
+                              ShaderProgramID programPacked,
+                              GLint location,
+                              GLdouble v0);
 bool ValidateProgramUniform1dv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value);
 bool ValidateProgramUniform2d(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLint location,
                               GLdouble v0,
                               GLdouble v1);
 bool ValidateProgramUniform2dv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value);
 bool ValidateProgramUniform3d(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLint location,
                               GLdouble v0,
                               GLdouble v1,
                               GLdouble v2);
 bool ValidateProgramUniform3dv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value);
 bool ValidateProgramUniform4d(Context *context,
-                              GLuint program,
+                              ShaderProgramID programPacked,
                               GLint location,
                               GLdouble v0,
                               GLdouble v1,
                               GLdouble v2,
                               GLdouble v3);
 bool ValidateProgramUniform4dv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value);
 bool ValidateProgramUniformMatrix2dv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLdouble *value);
 bool ValidateProgramUniformMatrix2x3dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value);
 bool ValidateProgramUniformMatrix2x4dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value);
 bool ValidateProgramUniformMatrix3dv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLdouble *value);
 bool ValidateProgramUniformMatrix3x2dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value);
 bool ValidateProgramUniformMatrix3x4dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value);
 bool ValidateProgramUniformMatrix4dv(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLdouble *value);
 bool ValidateProgramUniformMatrix4x2dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value);
 bool ValidateProgramUniformMatrix4x3dv(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
diff --git a/src/libANGLE/validationGL42.cpp b/src/libANGLE/validationGL42.cpp
index 40922ae..4563e33 100644
--- a/src/libANGLE/validationGL42.cpp
+++ b/src/libANGLE/validationGL42.cpp
@@ -62,7 +62,7 @@
 }
 
 bool ValidateGetActiveAtomicCounterBufferiv(Context *context,
-                                            GLuint program,
+                                            ShaderProgramID program,
                                             GLuint bufferIndex,
                                             GLenum pname,
                                             GLint *params)
diff --git a/src/libANGLE/validationGL42_autogen.h b/src/libANGLE/validationGL42_autogen.h
index b5a8be2..f0e45b3 100644
--- a/src/libANGLE/validationGL42_autogen.h
+++ b/src/libANGLE/validationGL42_autogen.h
@@ -48,7 +48,7 @@
                                                   GLuint stream,
                                                   GLsizei instancecount);
 bool ValidateGetActiveAtomicCounterBufferiv(Context *context,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLuint bufferIndex,
                                             GLenum pname,
                                             GLint *params);
diff --git a/src/libANGLE/validationGL43.cpp b/src/libANGLE/validationGL43.cpp
index b2579bc..0a3b154 100644
--- a/src/libANGLE/validationGL43.cpp
+++ b/src/libANGLE/validationGL43.cpp
@@ -123,7 +123,7 @@
 }
 
 bool ValidateGetProgramResourceLocationIndex(Context *context,
-                                             GLuint program,
+                                             ShaderProgramID program,
                                              GLenum programInterface,
                                              const GLchar *name)
 {
@@ -209,7 +209,7 @@
 }
 
 bool ValidateShaderStorageBlockBinding(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID program,
                                        GLuint storageBlockIndex,
                                        GLuint storageBlockBinding)
 {
diff --git a/src/libANGLE/validationGL43_autogen.h b/src/libANGLE/validationGL43_autogen.h
index c7f9892..96620c0 100644
--- a/src/libANGLE/validationGL43_autogen.h
+++ b/src/libANGLE/validationGL43_autogen.h
@@ -89,7 +89,7 @@
                                GLsizei *length,
                                GLchar *label);
 bool ValidateGetProgramResourceLocationIndex(Context *context,
-                                             GLuint program,
+                                             ShaderProgramID programPacked,
                                              GLenum programInterface,
                                              const GLchar *name);
 bool ValidateInvalidateBufferData(Context *context, BufferID bufferPacked);
@@ -131,7 +131,7 @@
                             GLsizei length,
                             const GLchar *message);
 bool ValidateShaderStorageBlockBinding(Context *context,
-                                       GLuint program,
+                                       ShaderProgramID programPacked,
                                        GLuint storageBlockIndex,
                                        GLuint storageBlockBinding);
 bool ValidateTexBufferRange(Context *context,
diff --git a/src/libANGLE/validationGL45.cpp b/src/libANGLE/validationGL45.cpp
index 263e9f2..d67e050 100644
--- a/src/libANGLE/validationGL45.cpp
+++ b/src/libANGLE/validationGL45.cpp
@@ -612,7 +612,7 @@
 }
 
 bool ValidateGetnUniformdv(Context *context,
-                           GLuint program,
+                           ShaderProgramID program,
                            GLint location,
                            GLsizei bufSize,
                            GLdouble *params)
@@ -621,7 +621,7 @@
 }
 
 bool ValidateGetnUniformfv(Context *context,
-                           GLuint program,
+                           ShaderProgramID program,
                            GLint location,
                            GLsizei bufSize,
                            GLfloat *params)
@@ -630,7 +630,7 @@
 }
 
 bool ValidateGetnUniformiv(Context *context,
-                           GLuint program,
+                           ShaderProgramID program,
                            GLint location,
                            GLsizei bufSize,
                            GLint *params)
@@ -639,7 +639,7 @@
 }
 
 bool ValidateGetnUniformuiv(Context *context,
-                            GLuint program,
+                            ShaderProgramID program,
                             GLint location,
                             GLsizei bufSize,
                             GLuint *params)
diff --git a/src/libANGLE/validationGL45_autogen.h b/src/libANGLE/validationGL45_autogen.h
index a765fec..abbba6f 100644
--- a/src/libANGLE/validationGL45_autogen.h
+++ b/src/libANGLE/validationGL45_autogen.h
@@ -336,22 +336,22 @@
                           GLsizei bufSize,
                           void *pixels);
 bool ValidateGetnUniformdv(Context *context,
-                           GLuint program,
+                           ShaderProgramID programPacked,
                            GLint location,
                            GLsizei bufSize,
                            GLdouble *params);
 bool ValidateGetnUniformfv(Context *context,
-                           GLuint program,
+                           ShaderProgramID programPacked,
                            GLint location,
                            GLsizei bufSize,
                            GLfloat *params);
 bool ValidateGetnUniformiv(Context *context,
-                           GLuint program,
+                           ShaderProgramID programPacked,
                            GLint location,
                            GLsizei bufSize,
                            GLint *params);
 bool ValidateGetnUniformuiv(Context *context,
-                            GLuint program,
+                            ShaderProgramID programPacked,
                             GLint location,
                             GLsizei bufSize,
                             GLuint *params);
diff --git a/src/libANGLE/validationGL4_autogen.h b/src/libANGLE/validationGL4_autogen.h
index 3ae6b17..1f9bc8d 100644
--- a/src/libANGLE/validationGL4_autogen.h
+++ b/src/libANGLE/validationGL4_autogen.h
@@ -31,27 +31,27 @@
 bool ValidateDrawTransformFeedbackStream(Context *context, GLenum mode, GLuint id, GLuint stream);
 bool ValidateEndQueryIndexed(Context *context, GLenum target, GLuint index);
 bool ValidateGetActiveSubroutineName(Context *context,
-                                     GLuint program,
+                                     ShaderProgramID programPacked,
                                      GLenum shadertype,
                                      GLuint index,
                                      GLsizei bufsize,
                                      GLsizei *length,
                                      GLchar *name);
 bool ValidateGetActiveSubroutineUniformName(Context *context,
-                                            GLuint program,
+                                            ShaderProgramID programPacked,
                                             GLenum shadertype,
                                             GLuint index,
                                             GLsizei bufsize,
                                             GLsizei *length,
                                             GLchar *name);
 bool ValidateGetActiveSubroutineUniformiv(Context *context,
-                                          GLuint program,
+                                          ShaderProgramID programPacked,
                                           GLenum shadertype,
                                           GLuint index,
                                           GLenum pname,
                                           GLint *values);
 bool ValidateGetProgramStageiv(Context *context,
-                               GLuint program,
+                               ShaderProgramID programPacked,
                                GLenum shadertype,
                                GLenum pname,
                                GLint *values);
@@ -61,18 +61,21 @@
                                GLenum pname,
                                GLint *params);
 bool ValidateGetSubroutineIndex(Context *context,
-                                GLuint program,
+                                ShaderProgramID programPacked,
                                 GLenum shadertype,
                                 const GLchar *name);
 bool ValidateGetSubroutineUniformLocation(Context *context,
-                                          GLuint program,
+                                          ShaderProgramID programPacked,
                                           GLenum shadertype,
                                           const GLchar *name);
 bool ValidateGetUniformSubroutineuiv(Context *context,
                                      GLenum shadertype,
                                      GLint location,
                                      GLuint *params);
-bool ValidateGetUniformdv(Context *context, GLuint program, GLint location, GLdouble *params);
+bool ValidateGetUniformdv(Context *context,
+                          ShaderProgramID programPacked,
+                          GLint location,
+                          GLdouble *params);
 bool ValidateMinSampleShading(Context *context, GLfloat value);
 bool ValidatePatchParameterfv(Context *context, GLenum pname, const GLfloat *values);
 bool ValidatePatchParameteri(Context *context, GLenum pname, GLint value);
diff --git a/src/libGL/entry_points_gl_2_0_autogen.cpp b/src/libGL/entry_points_gl_2_0_autogen.cpp
index 67a92e7..243bdf5 100644
--- a/src/libGL/entry_points_gl_2_0_autogen.cpp
+++ b/src/libGL/entry_points_gl_2_0_autogen.cpp
@@ -34,14 +34,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateAttachShader(context, program, shader));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateAttachShader(context, programPacked, shaderPacked));
         if (isCallValid)
         {
-            context->attachShader(program, shader);
+            context->attachShader(programPacked, shaderPacked);
         }
-        ANGLE_CAPTURE(AttachShader, isCallValid, context, program, shader);
+        ANGLE_CAPTURE(AttachShader, isCallValid, context, programPacked, shaderPacked);
     }
 }
 
@@ -56,14 +58,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateBindAttribLocation(context, program, index, name));
+                            ValidateBindAttribLocation(context, programPacked, index, name));
         if (isCallValid)
         {
-            context->bindAttribLocation(program, index, name);
+            context->bindAttribLocation(programPacked, index, name);
         }
-        ANGLE_CAPTURE(BindAttribLocation, isCallValid, context, program, index, name);
+        ANGLE_CAPTURE(BindAttribLocation, isCallValid, context, programPacked, index, name);
     }
 }
 
@@ -94,13 +97,15 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateCompileShader(context, shader));
+        bool isCallValid =
+            (context->skipValidation() || ValidateCompileShader(context, shaderPacked));
         if (isCallValid)
         {
-            context->compileShader(shader);
+            context->compileShader(shaderPacked);
         }
-        ANGLE_CAPTURE(CompileShader, isCallValid, context, shader);
+        ANGLE_CAPTURE(CompileShader, isCallValid, context, shaderPacked);
     }
 }
 
@@ -167,13 +172,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDeleteProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteProgram(context, programPacked));
         if (isCallValid)
         {
-            context->deleteProgram(program);
+            context->deleteProgram(programPacked);
         }
-        ANGLE_CAPTURE(DeleteProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(DeleteProgram, isCallValid, context, programPacked);
     }
 }
 
@@ -184,13 +191,15 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDeleteShader(context, shader));
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteShader(context, shaderPacked));
         if (isCallValid)
         {
-            context->deleteShader(shader);
+            context->deleteShader(shaderPacked);
         }
-        ANGLE_CAPTURE(DeleteShader, isCallValid, context, shader);
+        ANGLE_CAPTURE(DeleteShader, isCallValid, context, shaderPacked);
     }
 }
 
@@ -202,14 +211,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDetachShader(context, program, shader));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateDetachShader(context, programPacked, shaderPacked));
         if (isCallValid)
         {
-            context->detachShader(program, shader);
+            context->detachShader(programPacked, shaderPacked);
         }
-        ANGLE_CAPTURE(DetachShader, isCallValid, context, program, shader);
+        ANGLE_CAPTURE(DetachShader, isCallValid, context, programPacked, shaderPacked);
     }
 }
 
@@ -285,16 +296,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveAttrib(context, program, index, bufSize, length, size, type, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetActiveAttrib(context, programPacked, index, bufSize, length,
+                                                    size, type, name));
         if (isCallValid)
         {
-            context->getActiveAttrib(program, index, bufSize, length, size, type, name);
+            context->getActiveAttrib(programPacked, index, bufSize, length, size, type, name);
         }
-        ANGLE_CAPTURE(GetActiveAttrib, isCallValid, context, program, index, bufSize, length, size,
-                      type, name);
+        ANGLE_CAPTURE(GetActiveAttrib, isCallValid, context, programPacked, index, bufSize, length,
+                      size, type, name);
     }
 }
 
@@ -316,16 +328,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveUniform(context, program, index, bufSize, length, size, type, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetActiveUniform(context, programPacked, index, bufSize, length,
+                                                     size, type, name));
         if (isCallValid)
         {
-            context->getActiveUniform(program, index, bufSize, length, size, type, name);
+            context->getActiveUniform(programPacked, index, bufSize, length, size, type, name);
         }
-        ANGLE_CAPTURE(GetActiveUniform, isCallValid, context, program, index, bufSize, length, size,
-                      type, name);
+        ANGLE_CAPTURE(GetActiveUniform, isCallValid, context, programPacked, index, bufSize, length,
+                      size, type, name);
     }
 }
 
@@ -343,14 +356,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
+        ShaderProgramID *shadersPacked                = FromGL<ShaderProgramID *>(shaders);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetAttachedShaders(context, program, maxCount, count, shaders));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetAttachedShaders(context, programPacked, maxCount, count, shadersPacked));
         if (isCallValid)
         {
-            context->getAttachedShaders(program, maxCount, count, shaders);
+            context->getAttachedShaders(programPacked, maxCount, count, shadersPacked);
         }
-        ANGLE_CAPTURE(GetAttachedShaders, isCallValid, context, program, maxCount, count, shaders);
+        ANGLE_CAPTURE(GetAttachedShaders, isCallValid, context, programPacked, maxCount, count,
+                      shadersPacked);
     }
 }
 
@@ -364,18 +381,19 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() || ValidateGetAttribLocation(context, program, name));
+            (context->skipValidation() || ValidateGetAttribLocation(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getAttribLocation(program, name);
+            returnValue = context->getAttribLocation(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetAttribLocation, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetAttribLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -398,14 +416,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetProgramInfoLog(context, program, bufSize, length, infoLog));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramInfoLog(context, programPacked, bufSize, length, infoLog));
         if (isCallValid)
         {
-            context->getProgramInfoLog(program, bufSize, length, infoLog);
+            context->getProgramInfoLog(programPacked, bufSize, length, infoLog);
         }
-        ANGLE_CAPTURE(GetProgramInfoLog, isCallValid, context, program, bufSize, length, infoLog);
+        ANGLE_CAPTURE(GetProgramInfoLog, isCallValid, context, programPacked, bufSize, length,
+                      infoLog);
     }
 }
 
@@ -419,14 +440,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetProgramiv(context, program, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetProgramiv(context, programPacked, pname, params));
         if (isCallValid)
         {
-            context->getProgramiv(program, pname, params);
+            context->getProgramiv(programPacked, pname, params);
         }
-        ANGLE_CAPTURE(GetProgramiv, isCallValid, context, program, pname, params);
+        ANGLE_CAPTURE(GetProgramiv, isCallValid, context, programPacked, pname, params);
     }
 }
 
@@ -440,14 +462,17 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetShaderInfoLog(context, shader, bufSize, length, infoLog));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetShaderInfoLog(context, shaderPacked, bufSize, length, infoLog));
         if (isCallValid)
         {
-            context->getShaderInfoLog(shader, bufSize, length, infoLog);
+            context->getShaderInfoLog(shaderPacked, bufSize, length, infoLog);
         }
-        ANGLE_CAPTURE(GetShaderInfoLog, isCallValid, context, shader, bufSize, length, infoLog);
+        ANGLE_CAPTURE(GetShaderInfoLog, isCallValid, context, shaderPacked, bufSize, length,
+                      infoLog);
     }
 }
 
@@ -461,14 +486,16 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetShaderSource(context, shader, bufSize, length, source));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetShaderSource(context, shaderPacked, bufSize, length, source));
         if (isCallValid)
         {
-            context->getShaderSource(shader, bufSize, length, source);
+            context->getShaderSource(shaderPacked, bufSize, length, source);
         }
-        ANGLE_CAPTURE(GetShaderSource, isCallValid, context, shader, bufSize, length, source);
+        ANGLE_CAPTURE(GetShaderSource, isCallValid, context, shaderPacked, bufSize, length, source);
     }
 }
 
@@ -482,14 +509,15 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetShaderiv(context, shader, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetShaderiv(context, shaderPacked, pname, params));
         if (isCallValid)
         {
-            context->getShaderiv(shader, pname, params);
+            context->getShaderiv(shaderPacked, pname, params);
         }
-        ANGLE_CAPTURE(GetShaderiv, isCallValid, context, shader, pname, params);
+        ANGLE_CAPTURE(GetShaderiv, isCallValid, context, shaderPacked, pname, params);
     }
 }
 
@@ -503,18 +531,19 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformLocation(context, program, name));
+            (context->skipValidation() || ValidateGetUniformLocation(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getUniformLocation(program, name);
+            returnValue = context->getUniformLocation(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetUniformLocation, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetUniformLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -533,14 +562,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformfv(context, program, location, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformfv(context, programPacked, location, params));
         if (isCallValid)
         {
-            context->getUniformfv(program, location, params);
+            context->getUniformfv(programPacked, location, params);
         }
-        ANGLE_CAPTURE(GetUniformfv, isCallValid, context, program, location, params);
+        ANGLE_CAPTURE(GetUniformfv, isCallValid, context, programPacked, location, params);
     }
 }
 
@@ -554,14 +584,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformiv(context, program, location, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformiv(context, programPacked, location, params));
         if (isCallValid)
         {
-            context->getUniformiv(program, location, params);
+            context->getUniformiv(programPacked, location, params);
         }
-        ANGLE_CAPTURE(GetUniformiv, isCallValid, context, program, location, params);
+        ANGLE_CAPTURE(GetUniformiv, isCallValid, context, programPacked, location, params);
     }
 }
 
@@ -655,17 +686,18 @@
     GLboolean returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsProgram(context, program));
+        bool isCallValid = (context->skipValidation() || ValidateIsProgram(context, programPacked));
         if (isCallValid)
         {
-            returnValue = context->isProgram(program);
+            returnValue = context->isProgram(programPacked);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
         }
-        ANGLE_CAPTURE(IsProgram, isCallValid, context, program, returnValue);
+        ANGLE_CAPTURE(IsProgram, isCallValid, context, programPacked, returnValue);
     }
     else
     {
@@ -682,17 +714,18 @@
     GLboolean returnValue;
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsShader(context, shader));
+        bool isCallValid = (context->skipValidation() || ValidateIsShader(context, shaderPacked));
         if (isCallValid)
         {
-            returnValue = context->isShader(shader);
+            returnValue = context->isShader(shaderPacked);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
         }
-        ANGLE_CAPTURE(IsShader, isCallValid, context, shader, returnValue);
+        ANGLE_CAPTURE(IsShader, isCallValid, context, shaderPacked, returnValue);
     }
     else
     {
@@ -708,13 +741,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLinkProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateLinkProgram(context, programPacked));
         if (isCallValid)
         {
-            context->linkProgram(program);
+            context->linkProgram(programPacked);
         }
-        ANGLE_CAPTURE(LinkProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(LinkProgram, isCallValid, context, programPacked);
     }
 }
 
@@ -731,14 +766,15 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateShaderSource(context, shader, count, string, length));
+                            ValidateShaderSource(context, shaderPacked, count, string, length));
         if (isCallValid)
         {
-            context->shaderSource(shader, count, string, length);
+            context->shaderSource(shaderPacked, count, string, length);
         }
-        ANGLE_CAPTURE(ShaderSource, isCallValid, context, shader, count, string, length);
+        ANGLE_CAPTURE(ShaderSource, isCallValid, context, shaderPacked, count, string, length);
     }
 }
 
@@ -1213,13 +1249,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateUseProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateUseProgram(context, programPacked));
         if (isCallValid)
         {
-            context->useProgram(program);
+            context->useProgram(programPacked);
         }
-        ANGLE_CAPTURE(UseProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(UseProgram, isCallValid, context, programPacked);
     }
 }
 
@@ -1230,13 +1268,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateValidateProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateValidateProgram(context, programPacked));
         if (isCallValid)
         {
-            context->validateProgram(program);
+            context->validateProgram(programPacked);
         }
-        ANGLE_CAPTURE(ValidateProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(ValidateProgram, isCallValid, context, programPacked);
     }
 }
 
diff --git a/src/libGL/entry_points_gl_3_0_autogen.cpp b/src/libGL/entry_points_gl_3_0_autogen.cpp
index 45960ed..f8d6333 100644
--- a/src/libGL/entry_points_gl_3_0_autogen.cpp
+++ b/src/libGL/entry_points_gl_3_0_autogen.cpp
@@ -125,14 +125,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateBindFragDataLocation(context, program, color, name));
+                            ValidateBindFragDataLocation(context, programPacked, color, name));
         if (isCallValid)
         {
-            context->bindFragDataLocation(program, color, name);
+            context->bindFragDataLocation(programPacked, color, name);
         }
-        ANGLE_CAPTURE(BindFragDataLocation, isCallValid, context, program, color, name);
+        ANGLE_CAPTURE(BindFragDataLocation, isCallValid, context, programPacked, color, name);
     }
 }
 
@@ -802,18 +803,19 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetFragDataLocation(context, program, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetFragDataLocation(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getFragDataLocation(program, name);
+            returnValue = context->getFragDataLocation(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetFragDataLocation, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetFragDataLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -982,16 +984,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetTransformFeedbackVarying(context, program, index, bufSize,
-                                                                length, size, type, name));
+                            ValidateGetTransformFeedbackVarying(context, programPacked, index,
+                                                                bufSize, length, size, type, name));
         if (isCallValid)
         {
-            context->getTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+            context->getTransformFeedbackVarying(programPacked, index, bufSize, length, size, type,
+                                                 name);
         }
-        ANGLE_CAPTURE(GetTransformFeedbackVarying, isCallValid, context, program, index, bufSize,
-                      length, size, type, name);
+        ANGLE_CAPTURE(GetTransformFeedbackVarying, isCallValid, context, programPacked, index,
+                      bufSize, length, size, type, name);
     }
 }
 
@@ -1005,14 +1009,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetUniformuiv(context, program, location, params));
+                            ValidateGetUniformuiv(context, programPacked, location, params));
         if (isCallValid)
         {
-            context->getUniformuiv(program, location, params);
+            context->getUniformuiv(programPacked, location, params);
         }
-        ANGLE_CAPTURE(GetUniformuiv, isCallValid, context, program, location, params);
+        ANGLE_CAPTURE(GetUniformuiv, isCallValid, context, programPacked, location, params);
     }
 }
 
@@ -1326,16 +1331,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTransformFeedbackVaryings(context, program, count, varyings, bufferMode));
+            (context->skipValidation() || ValidateTransformFeedbackVaryings(
+                                              context, programPacked, count, varyings, bufferMode));
         if (isCallValid)
         {
-            context->transformFeedbackVaryings(program, count, varyings, bufferMode);
+            context->transformFeedbackVaryings(programPacked, count, varyings, bufferMode);
         }
-        ANGLE_CAPTURE(TransformFeedbackVaryings, isCallValid, context, program, count, varyings,
-                      bufferMode);
+        ANGLE_CAPTURE(TransformFeedbackVaryings, isCallValid, context, programPacked, count,
+                      varyings, bufferMode);
     }
 }
 
diff --git a/src/libGL/entry_points_gl_3_1_autogen.cpp b/src/libGL/entry_points_gl_3_1_autogen.cpp
index c25516f..20a7d0c 100644
--- a/src/libGL/entry_points_gl_3_1_autogen.cpp
+++ b/src/libGL/entry_points_gl_3_1_autogen.cpp
@@ -129,17 +129,19 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetActiveUniformBlockName(context, program, uniformBlockIndex,
-                                                              bufSize, length, uniformBlockName));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetActiveUniformBlockName(context, programPacked, uniformBlockIndex, bufSize,
+                                               length, uniformBlockName));
         if (isCallValid)
         {
-            context->getActiveUniformBlockName(program, uniformBlockIndex, bufSize, length,
+            context->getActiveUniformBlockName(programPacked, uniformBlockIndex, bufSize, length,
                                                uniformBlockName);
         }
-        ANGLE_CAPTURE(GetActiveUniformBlockName, isCallValid, context, program, uniformBlockIndex,
-                      bufSize, length, uniformBlockName);
+        ANGLE_CAPTURE(GetActiveUniformBlockName, isCallValid, context, programPacked,
+                      uniformBlockIndex, bufSize, length, uniformBlockName);
     }
 }
 
@@ -157,16 +159,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveUniformBlockiv(context, program, uniformBlockIndex, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetActiveUniformBlockiv(context, programPacked,
+                                                            uniformBlockIndex, pname, params));
         if (isCallValid)
         {
-            context->getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+            context->getActiveUniformBlockiv(programPacked, uniformBlockIndex, pname, params);
         }
-        ANGLE_CAPTURE(GetActiveUniformBlockiv, isCallValid, context, program, uniformBlockIndex,
-                      pname, params);
+        ANGLE_CAPTURE(GetActiveUniformBlockiv, isCallValid, context, programPacked,
+                      uniformBlockIndex, pname, params);
     }
 }
 
@@ -184,16 +187,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetActiveUniformName(context, program, uniformIndex, bufSize,
-                                                         length, uniformName));
+                            ValidateGetActiveUniformName(context, programPacked, uniformIndex,
+                                                         bufSize, length, uniformName));
         if (isCallValid)
         {
-            context->getActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+            context->getActiveUniformName(programPacked, uniformIndex, bufSize, length,
+                                          uniformName);
         }
-        ANGLE_CAPTURE(GetActiveUniformName, isCallValid, context, program, uniformIndex, bufSize,
-                      length, uniformName);
+        ANGLE_CAPTURE(GetActiveUniformName, isCallValid, context, programPacked, uniformIndex,
+                      bufSize, length, uniformName);
     }
 }
 
@@ -213,15 +218,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetActiveUniformsiv(context, program, uniformCount,
+                            ValidateGetActiveUniformsiv(context, programPacked, uniformCount,
                                                         uniformIndices, pname, params));
         if (isCallValid)
         {
-            context->getActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+            context->getActiveUniformsiv(programPacked, uniformCount, uniformIndices, pname,
+                                         params);
         }
-        ANGLE_CAPTURE(GetActiveUniformsiv, isCallValid, context, program, uniformCount,
+        ANGLE_CAPTURE(GetActiveUniformsiv, isCallValid, context, programPacked, uniformCount,
                       uniformIndices, pname, params);
     }
 }
@@ -236,18 +243,19 @@
     GLuint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetUniformBlockIndex(context, program, uniformBlockName));
+                            ValidateGetUniformBlockIndex(context, programPacked, uniformBlockName));
         if (isCallValid)
         {
-            returnValue = context->getUniformBlockIndex(program, uniformBlockName);
+            returnValue = context->getUniformBlockIndex(programPacked, uniformBlockName);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>();
         }
-        ANGLE_CAPTURE(GetUniformBlockIndex, isCallValid, context, program, uniformBlockName,
+        ANGLE_CAPTURE(GetUniformBlockIndex, isCallValid, context, programPacked, uniformBlockName,
                       returnValue);
     }
     else
@@ -270,16 +278,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformIndices(context, program, uniformCount,
-                                                                    uniformNames, uniformIndices));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformIndices(context, programPacked, uniformCount,
+                                                      uniformNames, uniformIndices));
         if (isCallValid)
         {
-            context->getUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+            context->getUniformIndices(programPacked, uniformCount, uniformNames, uniformIndices);
         }
-        ANGLE_CAPTURE(GetUniformIndices, isCallValid, context, program, uniformCount, uniformNames,
-                      uniformIndices);
+        ANGLE_CAPTURE(GetUniformIndices, isCallValid, context, programPacked, uniformCount,
+                      uniformNames, uniformIndices);
     }
 }
 
@@ -335,15 +344,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformBlockBinding(context, program, uniformBlockIndex, uniformBlockBinding));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateUniformBlockBinding(context, programPacked, uniformBlockIndex,
+                                                        uniformBlockBinding));
         if (isCallValid)
         {
-            context->uniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+            context->uniformBlockBinding(programPacked, uniformBlockIndex, uniformBlockBinding);
         }
-        ANGLE_CAPTURE(UniformBlockBinding, isCallValid, context, program, uniformBlockIndex,
+        ANGLE_CAPTURE(UniformBlockBinding, isCallValid, context, programPacked, uniformBlockIndex,
                       uniformBlockBinding);
     }
 }
diff --git a/src/libGL/entry_points_gl_3_3_autogen.cpp b/src/libGL/entry_points_gl_3_3_autogen.cpp
index aa489c0..0aad289 100644
--- a/src/libGL/entry_points_gl_3_3_autogen.cpp
+++ b/src/libGL/entry_points_gl_3_3_autogen.cpp
@@ -39,15 +39,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateBindFragDataLocationIndexed(context, program, colorNumber, index, name));
+             ValidateBindFragDataLocationIndexed(context, programPacked, colorNumber, index, name));
         if (isCallValid)
         {
-            context->bindFragDataLocationIndexed(program, colorNumber, index, name);
+            context->bindFragDataLocationIndexed(programPacked, colorNumber, index, name);
         }
-        ANGLE_CAPTURE(BindFragDataLocationIndexed, isCallValid, context, program, colorNumber,
+        ANGLE_CAPTURE(BindFragDataLocationIndexed, isCallValid, context, programPacked, colorNumber,
                       index, name);
     }
 }
@@ -195,18 +196,19 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() || ValidateGetFragDataIndex(context, program, name));
+            (context->skipValidation() || ValidateGetFragDataIndex(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getFragDataIndex(program, name);
+            returnValue = context->getFragDataIndex(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataIndex, GLint>();
         }
-        ANGLE_CAPTURE(GetFragDataIndex, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetFragDataIndex, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
diff --git a/src/libGL/entry_points_gl_4_0_autogen.cpp b/src/libGL/entry_points_gl_4_0_autogen.cpp
index c1bd64a..e5d1823 100644
--- a/src/libGL/entry_points_gl_4_0_autogen.cpp
+++ b/src/libGL/entry_points_gl_4_0_autogen.cpp
@@ -313,16 +313,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetActiveSubroutineName(context, program, shadertype, index,
-                                                            bufsize, length, name));
+                            ValidateGetActiveSubroutineName(context, programPacked, shadertype,
+                                                            index, bufsize, length, name));
         if (isCallValid)
         {
-            context->getActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+            context->getActiveSubroutineName(programPacked, shadertype, index, bufsize, length,
+                                             name);
         }
-        ANGLE_CAPTURE(GetActiveSubroutineName, isCallValid, context, program, shadertype, index,
-                      bufsize, length, name);
+        ANGLE_CAPTURE(GetActiveSubroutineName, isCallValid, context, programPacked, shadertype,
+                      index, bufsize, length, name);
     }
 }
 
@@ -342,17 +344,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetActiveSubroutineUniformName(context, program, shadertype,
-                                                                   index, bufsize, length, name));
+                            ValidateGetActiveSubroutineUniformName(
+                                context, programPacked, shadertype, index, bufsize, length, name));
         if (isCallValid)
         {
-            context->getActiveSubroutineUniformName(program, shadertype, index, bufsize, length,
-                                                    name);
+            context->getActiveSubroutineUniformName(programPacked, shadertype, index, bufsize,
+                                                    length, name);
         }
-        ANGLE_CAPTURE(GetActiveSubroutineUniformName, isCallValid, context, program, shadertype,
-                      index, bufsize, length, name);
+        ANGLE_CAPTURE(GetActiveSubroutineUniformName, isCallValid, context, programPacked,
+                      shadertype, index, bufsize, length, name);
     }
 }
 
@@ -371,15 +374,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetActiveSubroutineUniformiv(
-                                              context, program, shadertype, index, pname, values));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetActiveSubroutineUniformiv(context, programPacked, shadertype,
+                                                                 index, pname, values));
         if (isCallValid)
         {
-            context->getActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+            context->getActiveSubroutineUniformiv(programPacked, shadertype, index, pname, values);
         }
-        ANGLE_CAPTURE(GetActiveSubroutineUniformiv, isCallValid, context, program, shadertype,
+        ANGLE_CAPTURE(GetActiveSubroutineUniformiv, isCallValid, context, programPacked, shadertype,
                       index, pname, values);
     }
 }
@@ -395,14 +399,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetProgramStageiv(context, program, shadertype, pname, values));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramStageiv(context, programPacked, shadertype, pname, values));
         if (isCallValid)
         {
-            context->getProgramStageiv(program, shadertype, pname, values);
+            context->getProgramStageiv(programPacked, shadertype, pname, values);
         }
-        ANGLE_CAPTURE(GetProgramStageiv, isCallValid, context, program, shadertype, pname, values);
+        ANGLE_CAPTURE(GetProgramStageiv, isCallValid, context, programPacked, shadertype, pname,
+                      values);
     }
 }
 
@@ -440,18 +447,19 @@
     GLuint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetSubroutineIndex(context, program, shadertype, name));
+                            ValidateGetSubroutineIndex(context, programPacked, shadertype, name));
         if (isCallValid)
         {
-            returnValue = context->getSubroutineIndex(program, shadertype, name);
+            returnValue = context->getSubroutineIndex(programPacked, shadertype, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetSubroutineIndex, GLuint>();
         }
-        ANGLE_CAPTURE(GetSubroutineIndex, isCallValid, context, program, shadertype, name,
+        ANGLE_CAPTURE(GetSubroutineIndex, isCallValid, context, programPacked, shadertype, name,
                       returnValue);
     }
     else
@@ -475,19 +483,21 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetSubroutineUniformLocation(
-                                                             context, program, shadertype, name));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetSubroutineUniformLocation(context, programPacked, shadertype, name));
         if (isCallValid)
         {
-            returnValue = context->getSubroutineUniformLocation(program, shadertype, name);
+            returnValue = context->getSubroutineUniformLocation(programPacked, shadertype, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetSubroutineUniformLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetSubroutineUniformLocation, isCallValid, context, program, shadertype, name,
-                      returnValue);
+        ANGLE_CAPTURE(GetSubroutineUniformLocation, isCallValid, context, programPacked, shadertype,
+                      name, returnValue);
     }
     else
     {
@@ -530,14 +540,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformdv(context, program, location, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformdv(context, programPacked, location, params));
         if (isCallValid)
         {
-            context->getUniformdv(program, location, params);
+            context->getUniformdv(programPacked, location, params);
         }
-        ANGLE_CAPTURE(GetUniformdv, isCallValid, context, program, location, params);
+        ANGLE_CAPTURE(GetUniformdv, isCallValid, context, programPacked, location, params);
     }
 }
 
diff --git a/src/libGL/entry_points_gl_4_1_autogen.cpp b/src/libGL/entry_points_gl_4_1_autogen.cpp
index 18c6905..45591cd 100644
--- a/src/libGL/entry_points_gl_4_1_autogen.cpp
+++ b/src/libGL/entry_points_gl_4_1_autogen.cpp
@@ -35,14 +35,15 @@
     if (context)
     {
         ProgramPipelineID pipelinePacked              = FromGL<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateActiveShaderProgram(context, pipelinePacked, program));
+                            ValidateActiveShaderProgram(context, pipelinePacked, programPacked));
         if (isCallValid)
         {
-            context->activeShaderProgram(pipelinePacked, program);
+            context->activeShaderProgram(pipelinePacked, programPacked);
         }
-        ANGLE_CAPTURE(ActiveShaderProgram, isCallValid, context, pipelinePacked, program);
+        ANGLE_CAPTURE(ActiveShaderProgram, isCallValid, context, pipelinePacked, programPacked);
     }
 }
 
@@ -271,15 +272,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramBinary(context, program, bufSize, length, binaryFormat, binary));
+            (context->skipValidation() || ValidateGetProgramBinary(context, programPacked, bufSize,
+                                                                   length, binaryFormat, binary));
         if (isCallValid)
         {
-            context->getProgramBinary(program, bufSize, length, binaryFormat, binary);
+            context->getProgramBinary(programPacked, bufSize, length, binaryFormat, binary);
         }
-        ANGLE_CAPTURE(GetProgramBinary, isCallValid, context, program, bufSize, length,
+        ANGLE_CAPTURE(GetProgramBinary, isCallValid, context, programPacked, bufSize, length,
                       binaryFormat, binary);
     }
 }
@@ -428,14 +430,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramBinary(context, program, binaryFormat, binary, length));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramBinary(context, programPacked, binaryFormat, binary, length));
         if (isCallValid)
         {
-            context->programBinary(program, binaryFormat, binary, length);
+            context->programBinary(programPacked, binaryFormat, binary, length);
         }
-        ANGLE_CAPTURE(ProgramBinary, isCallValid, context, program, binaryFormat, binary, length);
+        ANGLE_CAPTURE(ProgramBinary, isCallValid, context, programPacked, binaryFormat, binary,
+                      length);
     }
 }
 
@@ -448,14 +453,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramParameteri(context, program, pname, value));
+                            ValidateProgramParameteri(context, programPacked, pname, value));
         if (isCallValid)
         {
-            context->programParameteri(program, pname, value);
+            context->programParameteri(programPacked, pname, value);
         }
-        ANGLE_CAPTURE(ProgramParameteri, isCallValid, context, program, pname, value);
+        ANGLE_CAPTURE(ProgramParameteri, isCallValid, context, programPacked, pname, value);
     }
 }
 
@@ -468,14 +474,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniform1d(context, program, location, v0));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniform1d(context, programPacked, location, v0));
         if (isCallValid)
         {
-            context->programUniform1d(program, location, v0);
+            context->programUniform1d(programPacked, location, v0);
         }
-        ANGLE_CAPTURE(ProgramUniform1d, isCallValid, context, program, location, v0);
+        ANGLE_CAPTURE(ProgramUniform1d, isCallValid, context, programPacked, location, v0);
     }
 }
 
@@ -492,14 +499,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1dv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1dv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform1dv(program, location, count, value);
+            context->programUniform1dv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform1dv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform1dv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -512,14 +522,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniform1f(context, program, location, v0));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniform1f(context, programPacked, location, v0));
         if (isCallValid)
         {
-            context->programUniform1f(program, location, v0);
+            context->programUniform1f(programPacked, location, v0);
         }
-        ANGLE_CAPTURE(ProgramUniform1f, isCallValid, context, program, location, v0);
+        ANGLE_CAPTURE(ProgramUniform1f, isCallValid, context, programPacked, location, v0);
     }
 }
 
@@ -536,14 +547,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform1fv(program, location, count, value);
+            context->programUniform1fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform1fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform1fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -556,14 +570,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniform1i(context, program, location, v0));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniform1i(context, programPacked, location, v0));
         if (isCallValid)
         {
-            context->programUniform1i(program, location, v0);
+            context->programUniform1i(programPacked, location, v0);
         }
-        ANGLE_CAPTURE(ProgramUniform1i, isCallValid, context, program, location, v0);
+        ANGLE_CAPTURE(ProgramUniform1i, isCallValid, context, programPacked, location, v0);
     }
 }
 
@@ -580,14 +595,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform1iv(program, location, count, value);
+            context->programUniform1iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform1iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform1iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -600,14 +618,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1ui(context, program, location, v0));
+                            ValidateProgramUniform1ui(context, programPacked, location, v0));
         if (isCallValid)
         {
-            context->programUniform1ui(program, location, v0);
+            context->programUniform1ui(programPacked, location, v0);
         }
-        ANGLE_CAPTURE(ProgramUniform1ui, isCallValid, context, program, location, v0);
+        ANGLE_CAPTURE(ProgramUniform1ui, isCallValid, context, programPacked, location, v0);
     }
 }
 
@@ -624,14 +643,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform1uiv(program, location, count, value);
+            context->programUniform1uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform1uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform1uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -645,14 +667,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2d(context, program, location, v0, v1));
+                            ValidateProgramUniform2d(context, programPacked, location, v0, v1));
         if (isCallValid)
         {
-            context->programUniform2d(program, location, v0, v1);
+            context->programUniform2d(programPacked, location, v0, v1);
         }
-        ANGLE_CAPTURE(ProgramUniform2d, isCallValid, context, program, location, v0, v1);
+        ANGLE_CAPTURE(ProgramUniform2d, isCallValid, context, programPacked, location, v0, v1);
     }
 }
 
@@ -669,14 +692,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2dv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2dv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform2dv(program, location, count, value);
+            context->programUniform2dv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform2dv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform2dv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -690,14 +716,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2f(context, program, location, v0, v1));
+                            ValidateProgramUniform2f(context, programPacked, location, v0, v1));
         if (isCallValid)
         {
-            context->programUniform2f(program, location, v0, v1);
+            context->programUniform2f(programPacked, location, v0, v1);
         }
-        ANGLE_CAPTURE(ProgramUniform2f, isCallValid, context, program, location, v0, v1);
+        ANGLE_CAPTURE(ProgramUniform2f, isCallValid, context, programPacked, location, v0, v1);
     }
 }
 
@@ -714,14 +741,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform2fv(program, location, count, value);
+            context->programUniform2fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform2fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform2fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -734,14 +764,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2i(context, program, location, v0, v1));
+                            ValidateProgramUniform2i(context, programPacked, location, v0, v1));
         if (isCallValid)
         {
-            context->programUniform2i(program, location, v0, v1);
+            context->programUniform2i(programPacked, location, v0, v1);
         }
-        ANGLE_CAPTURE(ProgramUniform2i, isCallValid, context, program, location, v0, v1);
+        ANGLE_CAPTURE(ProgramUniform2i, isCallValid, context, programPacked, location, v0, v1);
     }
 }
 
@@ -758,14 +789,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform2iv(program, location, count, value);
+            context->programUniform2iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform2iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform2iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -778,14 +812,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2ui(context, program, location, v0, v1));
+                            ValidateProgramUniform2ui(context, programPacked, location, v0, v1));
         if (isCallValid)
         {
-            context->programUniform2ui(program, location, v0, v1);
+            context->programUniform2ui(programPacked, location, v0, v1);
         }
-        ANGLE_CAPTURE(ProgramUniform2ui, isCallValid, context, program, location, v0, v1);
+        ANGLE_CAPTURE(ProgramUniform2ui, isCallValid, context, programPacked, location, v0, v1);
     }
 }
 
@@ -802,14 +837,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform2uiv(program, location, count, value);
+            context->programUniform2uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform2uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform2uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -824,14 +862,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3d(context, program, location, v0, v1, v2));
+                            ValidateProgramUniform3d(context, programPacked, location, v0, v1, v2));
         if (isCallValid)
         {
-            context->programUniform3d(program, location, v0, v1, v2);
+            context->programUniform3d(programPacked, location, v0, v1, v2);
         }
-        ANGLE_CAPTURE(ProgramUniform3d, isCallValid, context, program, location, v0, v1, v2);
+        ANGLE_CAPTURE(ProgramUniform3d, isCallValid, context, programPacked, location, v0, v1, v2);
     }
 }
 
@@ -848,14 +887,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3dv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3dv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform3dv(program, location, count, value);
+            context->programUniform3dv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform3dv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform3dv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -870,14 +912,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3f(context, program, location, v0, v1, v2));
+                            ValidateProgramUniform3f(context, programPacked, location, v0, v1, v2));
         if (isCallValid)
         {
-            context->programUniform3f(program, location, v0, v1, v2);
+            context->programUniform3f(programPacked, location, v0, v1, v2);
         }
-        ANGLE_CAPTURE(ProgramUniform3f, isCallValid, context, program, location, v0, v1, v2);
+        ANGLE_CAPTURE(ProgramUniform3f, isCallValid, context, programPacked, location, v0, v1, v2);
     }
 }
 
@@ -894,14 +937,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform3fv(program, location, count, value);
+            context->programUniform3fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform3fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform3fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -915,14 +961,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3i(context, program, location, v0, v1, v2));
+                            ValidateProgramUniform3i(context, programPacked, location, v0, v1, v2));
         if (isCallValid)
         {
-            context->programUniform3i(program, location, v0, v1, v2);
+            context->programUniform3i(programPacked, location, v0, v1, v2);
         }
-        ANGLE_CAPTURE(ProgramUniform3i, isCallValid, context, program, location, v0, v1, v2);
+        ANGLE_CAPTURE(ProgramUniform3i, isCallValid, context, programPacked, location, v0, v1, v2);
     }
 }
 
@@ -939,14 +986,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform3iv(program, location, count, value);
+            context->programUniform3iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform3iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform3iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -960,14 +1010,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3ui(context, program, location, v0, v1, v2));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3ui(context, programPacked, location, v0, v1, v2));
         if (isCallValid)
         {
-            context->programUniform3ui(program, location, v0, v1, v2);
+            context->programUniform3ui(programPacked, location, v0, v1, v2);
         }
-        ANGLE_CAPTURE(ProgramUniform3ui, isCallValid, context, program, location, v0, v1, v2);
+        ANGLE_CAPTURE(ProgramUniform3ui, isCallValid, context, programPacked, location, v0, v1, v2);
     }
 }
 
@@ -984,14 +1036,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform3uiv(program, location, count, value);
+            context->programUniform3uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform3uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform3uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1006,14 +1061,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4d(context, program, location, v0, v1, v2, v3));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4d(context, programPacked, location, v0, v1, v2, v3));
         if (isCallValid)
         {
-            context->programUniform4d(program, location, v0, v1, v2, v3);
+            context->programUniform4d(programPacked, location, v0, v1, v2, v3);
         }
-        ANGLE_CAPTURE(ProgramUniform4d, isCallValid, context, program, location, v0, v1, v2, v3);
+        ANGLE_CAPTURE(ProgramUniform4d, isCallValid, context, programPacked, location, v0, v1, v2,
+                      v3);
     }
 }
 
@@ -1030,14 +1088,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4dv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4dv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform4dv(program, location, count, value);
+            context->programUniform4dv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform4dv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform4dv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1052,14 +1113,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4f(context, program, location, v0, v1, v2, v3));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4f(context, programPacked, location, v0, v1, v2, v3));
         if (isCallValid)
         {
-            context->programUniform4f(program, location, v0, v1, v2, v3);
+            context->programUniform4f(programPacked, location, v0, v1, v2, v3);
         }
-        ANGLE_CAPTURE(ProgramUniform4f, isCallValid, context, program, location, v0, v1, v2, v3);
+        ANGLE_CAPTURE(ProgramUniform4f, isCallValid, context, programPacked, location, v0, v1, v2,
+                      v3);
     }
 }
 
@@ -1076,14 +1140,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform4fv(program, location, count, value);
+            context->programUniform4fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform4fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform4fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1098,14 +1165,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4i(context, program, location, v0, v1, v2, v3));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4i(context, programPacked, location, v0, v1, v2, v3));
         if (isCallValid)
         {
-            context->programUniform4i(program, location, v0, v1, v2, v3);
+            context->programUniform4i(programPacked, location, v0, v1, v2, v3);
         }
-        ANGLE_CAPTURE(ProgramUniform4i, isCallValid, context, program, location, v0, v1, v2, v3);
+        ANGLE_CAPTURE(ProgramUniform4i, isCallValid, context, programPacked, location, v0, v1, v2,
+                      v3);
     }
 }
 
@@ -1122,14 +1192,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform4iv(program, location, count, value);
+            context->programUniform4iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform4iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform4iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1144,14 +1217,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4ui(context, program, location, v0, v1, v2, v3));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4ui(context, programPacked, location, v0, v1, v2, v3));
         if (isCallValid)
         {
-            context->programUniform4ui(program, location, v0, v1, v2, v3);
+            context->programUniform4ui(programPacked, location, v0, v1, v2, v3);
         }
-        ANGLE_CAPTURE(ProgramUniform4ui, isCallValid, context, program, location, v0, v1, v2, v3);
+        ANGLE_CAPTURE(ProgramUniform4ui, isCallValid, context, programPacked, location, v0, v1, v2,
+                      v3);
     }
 }
 
@@ -1168,14 +1244,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform4uiv(program, location, count, value);
+            context->programUniform4uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform4uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform4uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1193,15 +1272,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix2dv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2dv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2dv(program, location, count, transpose, value);
+            context->programUniformMatrix2dv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2dv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix2dv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -1220,15 +1300,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix2fv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2fv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2fv(program, location, count, transpose, value);
+            context->programUniformMatrix2fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2fv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix2fv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -1247,16 +1328,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix2x3dv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x3dv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2x3dv(program, location, count, transpose, value);
+            context->programUniformMatrix2x3dv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x3dv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix2x3dv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1274,16 +1356,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix2x3fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x3fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2x3fv(program, location, count, transpose, value);
+            context->programUniformMatrix2x3fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x3fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix2x3fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1301,16 +1384,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix2x4dv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x4dv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2x4dv(program, location, count, transpose, value);
+            context->programUniformMatrix2x4dv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x4dv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix2x4dv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1328,16 +1412,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix2x4fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x4fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2x4fv(program, location, count, transpose, value);
+            context->programUniformMatrix2x4fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x4fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix2x4fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1355,15 +1440,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix3dv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3dv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3dv(program, location, count, transpose, value);
+            context->programUniformMatrix3dv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3dv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix3dv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -1382,15 +1468,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix3fv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3fv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3fv(program, location, count, transpose, value);
+            context->programUniformMatrix3fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3fv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix3fv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -1409,16 +1496,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix3x2dv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x2dv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3x2dv(program, location, count, transpose, value);
+            context->programUniformMatrix3x2dv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x2dv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix3x2dv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1436,16 +1524,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix3x2fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x2fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3x2fv(program, location, count, transpose, value);
+            context->programUniformMatrix3x2fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x2fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix3x2fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1463,16 +1552,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix3x4dv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x4dv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3x4dv(program, location, count, transpose, value);
+            context->programUniformMatrix3x4dv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x4dv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix3x4dv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1490,16 +1580,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix3x4fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x4fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3x4fv(program, location, count, transpose, value);
+            context->programUniformMatrix3x4fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x4fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix3x4fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1517,15 +1608,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix4dv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4dv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4dv(program, location, count, transpose, value);
+            context->programUniformMatrix4dv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4dv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix4dv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -1544,15 +1636,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix4fv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4fv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4fv(program, location, count, transpose, value);
+            context->programUniformMatrix4fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4fv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix4fv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -1571,16 +1664,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix4x2dv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x2dv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4x2dv(program, location, count, transpose, value);
+            context->programUniformMatrix4x2dv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x2dv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix4x2dv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1598,16 +1692,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix4x2fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x2fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4x2fv(program, location, count, transpose, value);
+            context->programUniformMatrix4x2fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x2fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix4x2fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1625,16 +1720,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix4x3dv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x3dv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4x3dv(program, location, count, transpose, value);
+            context->programUniformMatrix4x3dv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x3dv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix4x3dv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1652,16 +1748,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix4x3fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x3fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4x3fv(program, location, count, transpose, value);
+            context->programUniformMatrix4x3fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x3fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix4x3fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1759,16 +1856,17 @@
 
     if (context)
     {
+        const ShaderProgramID *shadersPacked          = FromGL<const ShaderProgramID *>(shaders);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateShaderBinary(context, count, shaders, binaryformat, binary, length));
+             ValidateShaderBinary(context, count, shadersPacked, binaryformat, binary, length));
         if (isCallValid)
         {
-            context->shaderBinary(count, shaders, binaryformat, binary, length);
+            context->shaderBinary(count, shadersPacked, binaryformat, binary, length);
         }
-        ANGLE_CAPTURE(ShaderBinary, isCallValid, context, count, shaders, binaryformat, binary,
-                      length);
+        ANGLE_CAPTURE(ShaderBinary, isCallValid, context, count, shadersPacked, binaryformat,
+                      binary, length);
     }
 }
 
@@ -1783,14 +1881,17 @@
     if (context)
     {
         ProgramPipelineID pipelinePacked              = FromGL<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateUseProgramStages(context, pipelinePacked, stages, program));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUseProgramStages(context, pipelinePacked, stages, programPacked));
         if (isCallValid)
         {
-            context->useProgramStages(pipelinePacked, stages, program);
+            context->useProgramStages(pipelinePacked, stages, programPacked);
         }
-        ANGLE_CAPTURE(UseProgramStages, isCallValid, context, pipelinePacked, stages, program);
+        ANGLE_CAPTURE(UseProgramStages, isCallValid, context, pipelinePacked, stages,
+                      programPacked);
     }
 }
 
diff --git a/src/libGL/entry_points_gl_4_2_autogen.cpp b/src/libGL/entry_points_gl_4_2_autogen.cpp
index 6aabb2a..f42dbac 100644
--- a/src/libGL/entry_points_gl_4_2_autogen.cpp
+++ b/src/libGL/entry_points_gl_4_2_autogen.cpp
@@ -217,16 +217,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveAtomicCounterBufferiv(context, program, bufferIndex, pname, params));
+            (context->skipValidation() || ValidateGetActiveAtomicCounterBufferiv(
+                                              context, programPacked, bufferIndex, pname, params));
         if (isCallValid)
         {
-            context->getActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
+            context->getActiveAtomicCounterBufferiv(programPacked, bufferIndex, pname, params);
         }
-        ANGLE_CAPTURE(GetActiveAtomicCounterBufferiv, isCallValid, context, program, bufferIndex,
-                      pname, params);
+        ANGLE_CAPTURE(GetActiveAtomicCounterBufferiv, isCallValid, context, programPacked,
+                      bufferIndex, pname, params);
     }
 }
 
diff --git a/src/libGL/entry_points_gl_4_3_autogen.cpp b/src/libGL/entry_points_gl_4_3_autogen.cpp
index 5c328f5..9be365b 100644
--- a/src/libGL/entry_points_gl_4_3_autogen.cpp
+++ b/src/libGL/entry_points_gl_4_3_autogen.cpp
@@ -461,16 +461,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramInterfaceiv(context, program, programInterface, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetProgramInterfaceiv(context, programPacked, programInterface,
+                                                          pname, params));
         if (isCallValid)
         {
-            context->getProgramInterfaceiv(program, programInterface, pname, params);
+            context->getProgramInterfaceiv(programPacked, programInterface, pname, params);
         }
-        ANGLE_CAPTURE(GetProgramInterfaceiv, isCallValid, context, program, programInterface, pname,
-                      params);
+        ANGLE_CAPTURE(GetProgramInterfaceiv, isCallValid, context, programPacked, programInterface,
+                      pname, params);
     }
 }
 
@@ -488,20 +489,21 @@
     GLuint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetProgramResourceIndex(context, program, programInterface, name));
+             ValidateGetProgramResourceIndex(context, programPacked, programInterface, name));
         if (isCallValid)
         {
-            returnValue = context->getProgramResourceIndex(program, programInterface, name);
+            returnValue = context->getProgramResourceIndex(programPacked, programInterface, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceIndex, GLuint>();
         }
-        ANGLE_CAPTURE(GetProgramResourceIndex, isCallValid, context, program, programInterface,
-                      name, returnValue);
+        ANGLE_CAPTURE(GetProgramResourceIndex, isCallValid, context, programPacked,
+                      programInterface, name, returnValue);
     }
     else
     {
@@ -524,20 +526,22 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetProgramResourceLocation(context, program, programInterface, name));
+             ValidateGetProgramResourceLocation(context, programPacked, programInterface, name));
         if (isCallValid)
         {
-            returnValue = context->getProgramResourceLocation(program, programInterface, name);
+            returnValue =
+                context->getProgramResourceLocation(programPacked, programInterface, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetProgramResourceLocation, isCallValid, context, program, programInterface,
-                      name, returnValue);
+        ANGLE_CAPTURE(GetProgramResourceLocation, isCallValid, context, programPacked,
+                      programInterface, name, returnValue);
     }
     else
     {
@@ -560,20 +564,22 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramResourceLocationIndex(context, program, programInterface, name));
+            (context->skipValidation() || ValidateGetProgramResourceLocationIndex(
+                                              context, programPacked, programInterface, name));
         if (isCallValid)
         {
-            returnValue = context->getProgramResourceLocationIndex(program, programInterface, name);
+            returnValue =
+                context->getProgramResourceLocationIndex(programPacked, programInterface, name);
         }
         else
         {
             returnValue =
                 GetDefaultReturnValue<EntryPoint::GetProgramResourceLocationIndex, GLint>();
         }
-        ANGLE_CAPTURE(GetProgramResourceLocationIndex, isCallValid, context, program,
+        ANGLE_CAPTURE(GetProgramResourceLocationIndex, isCallValid, context, programPacked,
                       programInterface, name, returnValue);
     }
     else
@@ -600,16 +606,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetProgramResourceName(context, program, programInterface,
+                            ValidateGetProgramResourceName(context, programPacked, programInterface,
                                                            index, bufSize, length, name));
         if (isCallValid)
         {
-            context->getProgramResourceName(program, programInterface, index, bufSize, length,
+            context->getProgramResourceName(programPacked, programInterface, index, bufSize, length,
                                             name);
         }
-        ANGLE_CAPTURE(GetProgramResourceName, isCallValid, context, program, programInterface,
+        ANGLE_CAPTURE(GetProgramResourceName, isCallValid, context, programPacked, programInterface,
                       index, bufSize, length, name);
     }
 }
@@ -634,18 +641,19 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetProgramResourceiv(context, program, programInterface, index, propCount,
-                                          props, bufSize, length, params));
+             ValidateGetProgramResourceiv(context, programPacked, programInterface, index,
+                                          propCount, props, bufSize, length, params));
         if (isCallValid)
         {
-            context->getProgramResourceiv(program, programInterface, index, propCount, props,
+            context->getProgramResourceiv(programPacked, programInterface, index, propCount, props,
                                           bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetProgramResourceiv, isCallValid, context, program, programInterface, index,
-                      propCount, props, bufSize, length, params);
+        ANGLE_CAPTURE(GetProgramResourceiv, isCallValid, context, programPacked, programInterface,
+                      index, propCount, props, bufSize, length, params);
     }
 }
 
@@ -950,16 +958,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateShaderStorageBlockBinding(context, program, storageBlockIndex,
-                                                              storageBlockBinding));
+                            ValidateShaderStorageBlockBinding(
+                                context, programPacked, storageBlockIndex, storageBlockBinding));
         if (isCallValid)
         {
-            context->shaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
+            context->shaderStorageBlockBinding(programPacked, storageBlockIndex,
+                                               storageBlockBinding);
         }
-        ANGLE_CAPTURE(ShaderStorageBlockBinding, isCallValid, context, program, storageBlockIndex,
-                      storageBlockBinding);
+        ANGLE_CAPTURE(ShaderStorageBlockBinding, isCallValid, context, programPacked,
+                      storageBlockIndex, storageBlockBinding);
     }
 }
 
diff --git a/src/libGL/entry_points_gl_4_5_autogen.cpp b/src/libGL/entry_points_gl_4_5_autogen.cpp
index b722f75..a8da3d0 100644
--- a/src/libGL/entry_points_gl_4_5_autogen.cpp
+++ b/src/libGL/entry_points_gl_4_5_autogen.cpp
@@ -1858,14 +1858,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetnUniformdv(context, program, location, bufSize, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformdv(context, programPacked, location, bufSize, params));
         if (isCallValid)
         {
-            context->getnUniformdv(program, location, bufSize, params);
+            context->getnUniformdv(programPacked, location, bufSize, params);
         }
-        ANGLE_CAPTURE(GetnUniformdv, isCallValid, context, program, location, bufSize, params);
+        ANGLE_CAPTURE(GetnUniformdv, isCallValid, context, programPacked, location, bufSize,
+                      params);
     }
 }
 
@@ -1879,14 +1882,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetnUniformfv(context, program, location, bufSize, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformfv(context, programPacked, location, bufSize, params));
         if (isCallValid)
         {
-            context->getnUniformfv(program, location, bufSize, params);
+            context->getnUniformfv(programPacked, location, bufSize, params);
         }
-        ANGLE_CAPTURE(GetnUniformfv, isCallValid, context, program, location, bufSize, params);
+        ANGLE_CAPTURE(GetnUniformfv, isCallValid, context, programPacked, location, bufSize,
+                      params);
     }
 }
 
@@ -1900,14 +1906,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetnUniformiv(context, program, location, bufSize, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformiv(context, programPacked, location, bufSize, params));
         if (isCallValid)
         {
-            context->getnUniformiv(program, location, bufSize, params);
+            context->getnUniformiv(programPacked, location, bufSize, params);
         }
-        ANGLE_CAPTURE(GetnUniformiv, isCallValid, context, program, location, bufSize, params);
+        ANGLE_CAPTURE(GetnUniformiv, isCallValid, context, programPacked, location, bufSize,
+                      params);
     }
 }
 
@@ -1921,14 +1930,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetnUniformuiv(context, program, location, bufSize, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformuiv(context, programPacked, location, bufSize, params));
         if (isCallValid)
         {
-            context->getnUniformuiv(program, location, bufSize, params);
+            context->getnUniformuiv(programPacked, location, bufSize, params);
         }
-        ANGLE_CAPTURE(GetnUniformuiv, isCallValid, context, program, location, bufSize, params);
+        ANGLE_CAPTURE(GetnUniformuiv, isCallValid, context, programPacked, location, bufSize,
+                      params);
     }
 }
 
diff --git a/src/libGLESv2/entry_points_gles_2_0_autogen.cpp b/src/libGLESv2/entry_points_gles_2_0_autogen.cpp
index 2a1bb28..87a88b4 100644
--- a/src/libGLESv2/entry_points_gles_2_0_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_2_0_autogen.cpp
@@ -46,14 +46,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateAttachShader(context, program, shader));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateAttachShader(context, programPacked, shaderPacked));
         if (isCallValid)
         {
-            context->attachShader(program, shader);
+            context->attachShader(programPacked, shaderPacked);
         }
-        ANGLE_CAPTURE(AttachShader, isCallValid, context, program, shader);
+        ANGLE_CAPTURE(AttachShader, isCallValid, context, programPacked, shaderPacked);
     }
 }
 
@@ -68,14 +70,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateBindAttribLocation(context, program, index, name));
+                            ValidateBindAttribLocation(context, programPacked, index, name));
         if (isCallValid)
         {
-            context->bindAttribLocation(program, index, name);
+            context->bindAttribLocation(programPacked, index, name);
         }
-        ANGLE_CAPTURE(BindAttribLocation, isCallValid, context, program, index, name);
+        ANGLE_CAPTURE(BindAttribLocation, isCallValid, context, programPacked, index, name);
     }
 }
 
@@ -448,13 +451,15 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateCompileShader(context, shader));
+        bool isCallValid =
+            (context->skipValidation() || ValidateCompileShader(context, shaderPacked));
         if (isCallValid)
         {
-            context->compileShader(shader);
+            context->compileShader(shaderPacked);
         }
-        ANGLE_CAPTURE(CompileShader, isCallValid, context, shader);
+        ANGLE_CAPTURE(CompileShader, isCallValid, context, shaderPacked);
     }
 }
 
@@ -719,13 +724,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDeleteProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteProgram(context, programPacked));
         if (isCallValid)
         {
-            context->deleteProgram(program);
+            context->deleteProgram(programPacked);
         }
-        ANGLE_CAPTURE(DeleteProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(DeleteProgram, isCallValid, context, programPacked);
     }
 }
 
@@ -757,13 +764,15 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDeleteShader(context, shader));
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteShader(context, shaderPacked));
         if (isCallValid)
         {
-            context->deleteShader(shader);
+            context->deleteShader(shaderPacked);
         }
-        ANGLE_CAPTURE(DeleteShader, isCallValid, context, shader);
+        ANGLE_CAPTURE(DeleteShader, isCallValid, context, shaderPacked);
     }
 }
 
@@ -849,14 +858,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDetachShader(context, program, shader));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateDetachShader(context, programPacked, shaderPacked));
         if (isCallValid)
         {
-            context->detachShader(program, shader);
+            context->detachShader(programPacked, shaderPacked);
         }
-        ANGLE_CAPTURE(DetachShader, isCallValid, context, program, shader);
+        ANGLE_CAPTURE(DetachShader, isCallValid, context, programPacked, shaderPacked);
     }
 }
 
@@ -1210,16 +1221,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveAttrib(context, program, index, bufSize, length, size, type, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetActiveAttrib(context, programPacked, index, bufSize, length,
+                                                    size, type, name));
         if (isCallValid)
         {
-            context->getActiveAttrib(program, index, bufSize, length, size, type, name);
+            context->getActiveAttrib(programPacked, index, bufSize, length, size, type, name);
         }
-        ANGLE_CAPTURE(GetActiveAttrib, isCallValid, context, program, index, bufSize, length, size,
-                      type, name);
+        ANGLE_CAPTURE(GetActiveAttrib, isCallValid, context, programPacked, index, bufSize, length,
+                      size, type, name);
     }
 }
 
@@ -1241,16 +1253,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveUniform(context, program, index, bufSize, length, size, type, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetActiveUniform(context, programPacked, index, bufSize, length,
+                                                     size, type, name));
         if (isCallValid)
         {
-            context->getActiveUniform(program, index, bufSize, length, size, type, name);
+            context->getActiveUniform(programPacked, index, bufSize, length, size, type, name);
         }
-        ANGLE_CAPTURE(GetActiveUniform, isCallValid, context, program, index, bufSize, length, size,
-                      type, name);
+        ANGLE_CAPTURE(GetActiveUniform, isCallValid, context, programPacked, index, bufSize, length,
+                      size, type, name);
     }
 }
 
@@ -1268,14 +1281,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
+        ShaderProgramID *shadersPacked                = FromGL<ShaderProgramID *>(shaders);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetAttachedShaders(context, program, maxCount, count, shaders));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetAttachedShaders(context, programPacked, maxCount, count, shadersPacked));
         if (isCallValid)
         {
-            context->getAttachedShaders(program, maxCount, count, shaders);
+            context->getAttachedShaders(programPacked, maxCount, count, shadersPacked);
         }
-        ANGLE_CAPTURE(GetAttachedShaders, isCallValid, context, program, maxCount, count, shaders);
+        ANGLE_CAPTURE(GetAttachedShaders, isCallValid, context, programPacked, maxCount, count,
+                      shadersPacked);
     }
 }
 
@@ -1289,18 +1306,19 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() || ValidateGetAttribLocation(context, program, name));
+            (context->skipValidation() || ValidateGetAttribLocation(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getAttribLocation(program, name);
+            returnValue = context->getAttribLocation(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetAttribLocation, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetAttribLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -1455,14 +1473,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetProgramInfoLog(context, program, bufSize, length, infoLog));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramInfoLog(context, programPacked, bufSize, length, infoLog));
         if (isCallValid)
         {
-            context->getProgramInfoLog(program, bufSize, length, infoLog);
+            context->getProgramInfoLog(programPacked, bufSize, length, infoLog);
         }
-        ANGLE_CAPTURE(GetProgramInfoLog, isCallValid, context, program, bufSize, length, infoLog);
+        ANGLE_CAPTURE(GetProgramInfoLog, isCallValid, context, programPacked, bufSize, length,
+                      infoLog);
     }
 }
 
@@ -1476,14 +1497,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetProgramiv(context, program, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetProgramiv(context, programPacked, pname, params));
         if (isCallValid)
         {
-            context->getProgramiv(program, pname, params);
+            context->getProgramiv(programPacked, pname, params);
         }
-        ANGLE_CAPTURE(GetProgramiv, isCallValid, context, program, pname, params);
+        ANGLE_CAPTURE(GetProgramiv, isCallValid, context, programPacked, pname, params);
     }
 }
 
@@ -1518,14 +1540,17 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetShaderInfoLog(context, shader, bufSize, length, infoLog));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetShaderInfoLog(context, shaderPacked, bufSize, length, infoLog));
         if (isCallValid)
         {
-            context->getShaderInfoLog(shader, bufSize, length, infoLog);
+            context->getShaderInfoLog(shaderPacked, bufSize, length, infoLog);
         }
-        ANGLE_CAPTURE(GetShaderInfoLog, isCallValid, context, shader, bufSize, length, infoLog);
+        ANGLE_CAPTURE(GetShaderInfoLog, isCallValid, context, shaderPacked, bufSize, length,
+                      infoLog);
     }
 }
 
@@ -1567,14 +1592,16 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetShaderSource(context, shader, bufSize, length, source));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetShaderSource(context, shaderPacked, bufSize, length, source));
         if (isCallValid)
         {
-            context->getShaderSource(shader, bufSize, length, source);
+            context->getShaderSource(shaderPacked, bufSize, length, source);
         }
-        ANGLE_CAPTURE(GetShaderSource, isCallValid, context, shader, bufSize, length, source);
+        ANGLE_CAPTURE(GetShaderSource, isCallValid, context, shaderPacked, bufSize, length, source);
     }
 }
 
@@ -1588,14 +1615,15 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetShaderiv(context, shader, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetShaderiv(context, shaderPacked, pname, params));
         if (isCallValid)
         {
-            context->getShaderiv(shader, pname, params);
+            context->getShaderiv(shaderPacked, pname, params);
         }
-        ANGLE_CAPTURE(GetShaderiv, isCallValid, context, shader, pname, params);
+        ANGLE_CAPTURE(GetShaderiv, isCallValid, context, shaderPacked, pname, params);
     }
 }
 
@@ -1682,18 +1710,19 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformLocation(context, program, name));
+            (context->skipValidation() || ValidateGetUniformLocation(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getUniformLocation(program, name);
+            returnValue = context->getUniformLocation(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetUniformLocation, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetUniformLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -1712,14 +1741,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformfv(context, program, location, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformfv(context, programPacked, location, params));
         if (isCallValid)
         {
-            context->getUniformfv(program, location, params);
+            context->getUniformfv(programPacked, location, params);
         }
-        ANGLE_CAPTURE(GetUniformfv, isCallValid, context, program, location, params);
+        ANGLE_CAPTURE(GetUniformfv, isCallValid, context, programPacked, location, params);
     }
 }
 
@@ -1733,14 +1763,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformiv(context, program, location, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformiv(context, programPacked, location, params));
         if (isCallValid)
         {
-            context->getUniformiv(program, location, params);
+            context->getUniformiv(programPacked, location, params);
         }
-        ANGLE_CAPTURE(GetUniformiv, isCallValid, context, program, location, params);
+        ANGLE_CAPTURE(GetUniformiv, isCallValid, context, programPacked, location, params);
     }
 }
 
@@ -1916,17 +1947,18 @@
     GLboolean returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsProgram(context, program));
+        bool isCallValid = (context->skipValidation() || ValidateIsProgram(context, programPacked));
         if (isCallValid)
         {
-            returnValue = context->isProgram(program);
+            returnValue = context->isProgram(programPacked);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
         }
-        ANGLE_CAPTURE(IsProgram, isCallValid, context, program, returnValue);
+        ANGLE_CAPTURE(IsProgram, isCallValid, context, programPacked, returnValue);
     }
     else
     {
@@ -1972,17 +2004,18 @@
     GLboolean returnValue;
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsShader(context, shader));
+        bool isCallValid = (context->skipValidation() || ValidateIsShader(context, shaderPacked));
         if (isCallValid)
         {
-            returnValue = context->isShader(shader);
+            returnValue = context->isShader(shaderPacked);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
         }
-        ANGLE_CAPTURE(IsShader, isCallValid, context, shader, returnValue);
+        ANGLE_CAPTURE(IsShader, isCallValid, context, shaderPacked, returnValue);
     }
     else
     {
@@ -2043,13 +2076,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLinkProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateLinkProgram(context, programPacked));
         if (isCallValid)
         {
-            context->linkProgram(program);
+            context->linkProgram(programPacked);
         }
-        ANGLE_CAPTURE(LinkProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(LinkProgram, isCallValid, context, programPacked);
     }
 }
 
@@ -2217,16 +2252,17 @@
 
     if (context)
     {
+        const ShaderProgramID *shadersPacked          = FromGL<const ShaderProgramID *>(shaders);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateShaderBinary(context, count, shaders, binaryformat, binary, length));
+             ValidateShaderBinary(context, count, shadersPacked, binaryformat, binary, length));
         if (isCallValid)
         {
-            context->shaderBinary(count, shaders, binaryformat, binary, length);
+            context->shaderBinary(count, shadersPacked, binaryformat, binary, length);
         }
-        ANGLE_CAPTURE(ShaderBinary, isCallValid, context, count, shaders, binaryformat, binary,
-                      length);
+        ANGLE_CAPTURE(ShaderBinary, isCallValid, context, count, shadersPacked, binaryformat,
+                      binary, length);
     }
 }
 
@@ -2243,14 +2279,15 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateShaderSource(context, shader, count, string, length));
+                            ValidateShaderSource(context, shaderPacked, count, string, length));
         if (isCallValid)
         {
-            context->shaderSource(shader, count, string, length);
+            context->shaderSource(shaderPacked, count, string, length);
         }
-        ANGLE_CAPTURE(ShaderSource, isCallValid, context, shader, count, string, length);
+        ANGLE_CAPTURE(ShaderSource, isCallValid, context, shaderPacked, count, string, length);
     }
 }
 
@@ -2945,13 +2982,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateUseProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateUseProgram(context, programPacked));
         if (isCallValid)
         {
-            context->useProgram(program);
+            context->useProgram(programPacked);
         }
-        ANGLE_CAPTURE(UseProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(UseProgram, isCallValid, context, programPacked);
     }
 }
 
@@ -2962,13 +3001,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateValidateProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateValidateProgram(context, programPacked));
         if (isCallValid)
         {
-            context->validateProgram(program);
+            context->validateProgram(programPacked);
         }
-        ANGLE_CAPTURE(ValidateProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(ValidateProgram, isCallValid, context, programPacked);
     }
 }
 
diff --git a/src/libGLESv2/entry_points_gles_3_0_autogen.cpp b/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
index 7f9518e..2610e30 100644
--- a/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
@@ -873,17 +873,19 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetActiveUniformBlockName(context, program, uniformBlockIndex,
-                                                              bufSize, length, uniformBlockName));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetActiveUniformBlockName(context, programPacked, uniformBlockIndex, bufSize,
+                                               length, uniformBlockName));
         if (isCallValid)
         {
-            context->getActiveUniformBlockName(program, uniformBlockIndex, bufSize, length,
+            context->getActiveUniformBlockName(programPacked, uniformBlockIndex, bufSize, length,
                                                uniformBlockName);
         }
-        ANGLE_CAPTURE(GetActiveUniformBlockName, isCallValid, context, program, uniformBlockIndex,
-                      bufSize, length, uniformBlockName);
+        ANGLE_CAPTURE(GetActiveUniformBlockName, isCallValid, context, programPacked,
+                      uniformBlockIndex, bufSize, length, uniformBlockName);
     }
 }
 
@@ -901,16 +903,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveUniformBlockiv(context, program, uniformBlockIndex, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetActiveUniformBlockiv(context, programPacked,
+                                                            uniformBlockIndex, pname, params));
         if (isCallValid)
         {
-            context->getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+            context->getActiveUniformBlockiv(programPacked, uniformBlockIndex, pname, params);
         }
-        ANGLE_CAPTURE(GetActiveUniformBlockiv, isCallValid, context, program, uniformBlockIndex,
-                      pname, params);
+        ANGLE_CAPTURE(GetActiveUniformBlockiv, isCallValid, context, programPacked,
+                      uniformBlockIndex, pname, params);
     }
 }
 
@@ -930,15 +933,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetActiveUniformsiv(context, program, uniformCount,
+                            ValidateGetActiveUniformsiv(context, programPacked, uniformCount,
                                                         uniformIndices, pname, params));
         if (isCallValid)
         {
-            context->getActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+            context->getActiveUniformsiv(programPacked, uniformCount, uniformIndices, pname,
+                                         params);
         }
-        ANGLE_CAPTURE(GetActiveUniformsiv, isCallValid, context, program, uniformCount,
+        ANGLE_CAPTURE(GetActiveUniformsiv, isCallValid, context, programPacked, uniformCount,
                       uniformIndices, pname, params);
     }
 }
@@ -998,18 +1003,19 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetFragDataLocation(context, program, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetFragDataLocation(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getFragDataLocation(program, name);
+            returnValue = context->getFragDataLocation(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetFragDataLocation, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetFragDataLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -1122,15 +1128,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramBinary(context, program, bufSize, length, binaryFormat, binary));
+            (context->skipValidation() || ValidateGetProgramBinary(context, programPacked, bufSize,
+                                                                   length, binaryFormat, binary));
         if (isCallValid)
         {
-            context->getProgramBinary(program, bufSize, length, binaryFormat, binary);
+            context->getProgramBinary(programPacked, bufSize, length, binaryFormat, binary);
         }
-        ANGLE_CAPTURE(GetProgramBinary, isCallValid, context, program, bufSize, length,
+        ANGLE_CAPTURE(GetProgramBinary, isCallValid, context, programPacked, bufSize, length,
                       binaryFormat, binary);
     }
 }
@@ -1294,16 +1301,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetTransformFeedbackVarying(context, program, index, bufSize,
-                                                                length, size, type, name));
+                            ValidateGetTransformFeedbackVarying(context, programPacked, index,
+                                                                bufSize, length, size, type, name));
         if (isCallValid)
         {
-            context->getTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+            context->getTransformFeedbackVarying(programPacked, index, bufSize, length, size, type,
+                                                 name);
         }
-        ANGLE_CAPTURE(GetTransformFeedbackVarying, isCallValid, context, program, index, bufSize,
-                      length, size, type, name);
+        ANGLE_CAPTURE(GetTransformFeedbackVarying, isCallValid, context, programPacked, index,
+                      bufSize, length, size, type, name);
     }
 }
 
@@ -1317,18 +1326,19 @@
     GLuint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetUniformBlockIndex(context, program, uniformBlockName));
+                            ValidateGetUniformBlockIndex(context, programPacked, uniformBlockName));
         if (isCallValid)
         {
-            returnValue = context->getUniformBlockIndex(program, uniformBlockName);
+            returnValue = context->getUniformBlockIndex(programPacked, uniformBlockName);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>();
         }
-        ANGLE_CAPTURE(GetUniformBlockIndex, isCallValid, context, program, uniformBlockName,
+        ANGLE_CAPTURE(GetUniformBlockIndex, isCallValid, context, programPacked, uniformBlockName,
                       returnValue);
     }
     else
@@ -1351,16 +1361,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformIndices(context, program, uniformCount,
-                                                                    uniformNames, uniformIndices));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformIndices(context, programPacked, uniformCount,
+                                                      uniformNames, uniformIndices));
         if (isCallValid)
         {
-            context->getUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+            context->getUniformIndices(programPacked, uniformCount, uniformNames, uniformIndices);
         }
-        ANGLE_CAPTURE(GetUniformIndices, isCallValid, context, program, uniformCount, uniformNames,
-                      uniformIndices);
+        ANGLE_CAPTURE(GetUniformIndices, isCallValid, context, programPacked, uniformCount,
+                      uniformNames, uniformIndices);
     }
 }
 
@@ -1374,14 +1385,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetUniformuiv(context, program, location, params));
+                            ValidateGetUniformuiv(context, programPacked, location, params));
         if (isCallValid)
         {
-            context->getUniformuiv(program, location, params);
+            context->getUniformuiv(programPacked, location, params);
         }
-        ANGLE_CAPTURE(GetUniformuiv, isCallValid, context, program, location, params);
+        ANGLE_CAPTURE(GetUniformuiv, isCallValid, context, programPacked, location, params);
     }
 }
 
@@ -1692,14 +1704,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramBinary(context, program, binaryFormat, binary, length));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramBinary(context, programPacked, binaryFormat, binary, length));
         if (isCallValid)
         {
-            context->programBinary(program, binaryFormat, binary, length);
+            context->programBinary(programPacked, binaryFormat, binary, length);
         }
-        ANGLE_CAPTURE(ProgramBinary, isCallValid, context, program, binaryFormat, binary, length);
+        ANGLE_CAPTURE(ProgramBinary, isCallValid, context, programPacked, binaryFormat, binary,
+                      length);
     }
 }
 
@@ -1712,14 +1727,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramParameteri(context, program, pname, value));
+                            ValidateProgramParameteri(context, programPacked, pname, value));
         if (isCallValid)
         {
-            context->programParameteri(program, pname, value);
+            context->programParameteri(programPacked, pname, value);
         }
-        ANGLE_CAPTURE(ProgramParameteri, isCallValid, context, program, pname, value);
+        ANGLE_CAPTURE(ProgramParameteri, isCallValid, context, programPacked, pname, value);
     }
 }
 
@@ -2021,16 +2037,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTransformFeedbackVaryings(context, program, count, varyings, bufferMode));
+            (context->skipValidation() || ValidateTransformFeedbackVaryings(
+                                              context, programPacked, count, varyings, bufferMode));
         if (isCallValid)
         {
-            context->transformFeedbackVaryings(program, count, varyings, bufferMode);
+            context->transformFeedbackVaryings(programPacked, count, varyings, bufferMode);
         }
-        ANGLE_CAPTURE(TransformFeedbackVaryings, isCallValid, context, program, count, varyings,
-                      bufferMode);
+        ANGLE_CAPTURE(TransformFeedbackVaryings, isCallValid, context, programPacked, count,
+                      varyings, bufferMode);
     }
 }
 
@@ -2208,15 +2225,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformBlockBinding(context, program, uniformBlockIndex, uniformBlockBinding));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateUniformBlockBinding(context, programPacked, uniformBlockIndex,
+                                                        uniformBlockBinding));
         if (isCallValid)
         {
-            context->uniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+            context->uniformBlockBinding(programPacked, uniformBlockIndex, uniformBlockBinding);
         }
-        ANGLE_CAPTURE(UniformBlockBinding, isCallValid, context, program, uniformBlockIndex,
+        ANGLE_CAPTURE(UniformBlockBinding, isCallValid, context, programPacked, uniformBlockIndex,
                       uniformBlockBinding);
     }
 }
diff --git a/src/libGLESv2/entry_points_gles_3_1_autogen.cpp b/src/libGLESv2/entry_points_gles_3_1_autogen.cpp
index 9708872..7e99d83 100644
--- a/src/libGLESv2/entry_points_gles_3_1_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_3_1_autogen.cpp
@@ -29,14 +29,15 @@
     if (context)
     {
         ProgramPipelineID pipelinePacked              = FromGL<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateActiveShaderProgram(context, pipelinePacked, program));
+                            ValidateActiveShaderProgram(context, pipelinePacked, programPacked));
         if (isCallValid)
         {
-            context->activeShaderProgram(pipelinePacked, program);
+            context->activeShaderProgram(pipelinePacked, programPacked);
         }
-        ANGLE_CAPTURE(ActiveShaderProgram, isCallValid, context, pipelinePacked, program);
+        ANGLE_CAPTURE(ActiveShaderProgram, isCallValid, context, pipelinePacked, programPacked);
     }
 }
 
@@ -379,16 +380,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramInterfaceiv(context, program, programInterface, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetProgramInterfaceiv(context, programPacked, programInterface,
+                                                          pname, params));
         if (isCallValid)
         {
-            context->getProgramInterfaceiv(program, programInterface, pname, params);
+            context->getProgramInterfaceiv(programPacked, programInterface, pname, params);
         }
-        ANGLE_CAPTURE(GetProgramInterfaceiv, isCallValid, context, program, programInterface, pname,
-                      params);
+        ANGLE_CAPTURE(GetProgramInterfaceiv, isCallValid, context, programPacked, programInterface,
+                      pname, params);
     }
 }
 
@@ -457,20 +459,21 @@
     GLuint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetProgramResourceIndex(context, program, programInterface, name));
+             ValidateGetProgramResourceIndex(context, programPacked, programInterface, name));
         if (isCallValid)
         {
-            returnValue = context->getProgramResourceIndex(program, programInterface, name);
+            returnValue = context->getProgramResourceIndex(programPacked, programInterface, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceIndex, GLuint>();
         }
-        ANGLE_CAPTURE(GetProgramResourceIndex, isCallValid, context, program, programInterface,
-                      name, returnValue);
+        ANGLE_CAPTURE(GetProgramResourceIndex, isCallValid, context, programPacked,
+                      programInterface, name, returnValue);
     }
     else
     {
@@ -493,20 +496,22 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetProgramResourceLocation(context, program, programInterface, name));
+             ValidateGetProgramResourceLocation(context, programPacked, programInterface, name));
         if (isCallValid)
         {
-            returnValue = context->getProgramResourceLocation(program, programInterface, name);
+            returnValue =
+                context->getProgramResourceLocation(programPacked, programInterface, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetProgramResourceLocation, isCallValid, context, program, programInterface,
-                      name, returnValue);
+        ANGLE_CAPTURE(GetProgramResourceLocation, isCallValid, context, programPacked,
+                      programInterface, name, returnValue);
     }
     else
     {
@@ -532,16 +537,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetProgramResourceName(context, program, programInterface,
+                            ValidateGetProgramResourceName(context, programPacked, programInterface,
                                                            index, bufSize, length, name));
         if (isCallValid)
         {
-            context->getProgramResourceName(program, programInterface, index, bufSize, length,
+            context->getProgramResourceName(programPacked, programInterface, index, bufSize, length,
                                             name);
         }
-        ANGLE_CAPTURE(GetProgramResourceName, isCallValid, context, program, programInterface,
+        ANGLE_CAPTURE(GetProgramResourceName, isCallValid, context, programPacked, programInterface,
                       index, bufSize, length, name);
     }
 }
@@ -566,18 +572,19 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetProgramResourceiv(context, program, programInterface, index, propCount,
-                                          props, bufSize, length, params));
+             ValidateGetProgramResourceiv(context, programPacked, programInterface, index,
+                                          propCount, props, bufSize, length, params));
         if (isCallValid)
         {
-            context->getProgramResourceiv(program, programInterface, index, propCount, props,
+            context->getProgramResourceiv(programPacked, programInterface, index, propCount, props,
                                           bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetProgramResourceiv, isCallValid, context, program, programInterface, index,
-                      propCount, props, bufSize, length, params);
+        ANGLE_CAPTURE(GetProgramResourceiv, isCallValid, context, programPacked, programInterface,
+                      index, propCount, props, bufSize, length, params);
     }
 }
 
@@ -706,14 +713,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniform1f(context, program, location, v0));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniform1f(context, programPacked, location, v0));
         if (isCallValid)
         {
-            context->programUniform1f(program, location, v0);
+            context->programUniform1f(programPacked, location, v0);
         }
-        ANGLE_CAPTURE(ProgramUniform1f, isCallValid, context, program, location, v0);
+        ANGLE_CAPTURE(ProgramUniform1f, isCallValid, context, programPacked, location, v0);
     }
 }
 
@@ -730,14 +738,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform1fv(program, location, count, value);
+            context->programUniform1fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform1fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform1fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -750,14 +761,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniform1i(context, program, location, v0));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniform1i(context, programPacked, location, v0));
         if (isCallValid)
         {
-            context->programUniform1i(program, location, v0);
+            context->programUniform1i(programPacked, location, v0);
         }
-        ANGLE_CAPTURE(ProgramUniform1i, isCallValid, context, program, location, v0);
+        ANGLE_CAPTURE(ProgramUniform1i, isCallValid, context, programPacked, location, v0);
     }
 }
 
@@ -774,14 +786,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform1iv(program, location, count, value);
+            context->programUniform1iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform1iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform1iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -794,14 +809,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1ui(context, program, location, v0));
+                            ValidateProgramUniform1ui(context, programPacked, location, v0));
         if (isCallValid)
         {
-            context->programUniform1ui(program, location, v0);
+            context->programUniform1ui(programPacked, location, v0);
         }
-        ANGLE_CAPTURE(ProgramUniform1ui, isCallValid, context, program, location, v0);
+        ANGLE_CAPTURE(ProgramUniform1ui, isCallValid, context, programPacked, location, v0);
     }
 }
 
@@ -818,14 +834,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform1uiv(program, location, count, value);
+            context->programUniform1uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform1uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform1uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -839,14 +858,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2f(context, program, location, v0, v1));
+                            ValidateProgramUniform2f(context, programPacked, location, v0, v1));
         if (isCallValid)
         {
-            context->programUniform2f(program, location, v0, v1);
+            context->programUniform2f(programPacked, location, v0, v1);
         }
-        ANGLE_CAPTURE(ProgramUniform2f, isCallValid, context, program, location, v0, v1);
+        ANGLE_CAPTURE(ProgramUniform2f, isCallValid, context, programPacked, location, v0, v1);
     }
 }
 
@@ -863,14 +883,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform2fv(program, location, count, value);
+            context->programUniform2fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform2fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform2fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -883,14 +906,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2i(context, program, location, v0, v1));
+                            ValidateProgramUniform2i(context, programPacked, location, v0, v1));
         if (isCallValid)
         {
-            context->programUniform2i(program, location, v0, v1);
+            context->programUniform2i(programPacked, location, v0, v1);
         }
-        ANGLE_CAPTURE(ProgramUniform2i, isCallValid, context, program, location, v0, v1);
+        ANGLE_CAPTURE(ProgramUniform2i, isCallValid, context, programPacked, location, v0, v1);
     }
 }
 
@@ -907,14 +931,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform2iv(program, location, count, value);
+            context->programUniform2iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform2iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform2iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -927,14 +954,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2ui(context, program, location, v0, v1));
+                            ValidateProgramUniform2ui(context, programPacked, location, v0, v1));
         if (isCallValid)
         {
-            context->programUniform2ui(program, location, v0, v1);
+            context->programUniform2ui(programPacked, location, v0, v1);
         }
-        ANGLE_CAPTURE(ProgramUniform2ui, isCallValid, context, program, location, v0, v1);
+        ANGLE_CAPTURE(ProgramUniform2ui, isCallValid, context, programPacked, location, v0, v1);
     }
 }
 
@@ -951,14 +979,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform2uiv(program, location, count, value);
+            context->programUniform2uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform2uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform2uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -973,14 +1004,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3f(context, program, location, v0, v1, v2));
+                            ValidateProgramUniform3f(context, programPacked, location, v0, v1, v2));
         if (isCallValid)
         {
-            context->programUniform3f(program, location, v0, v1, v2);
+            context->programUniform3f(programPacked, location, v0, v1, v2);
         }
-        ANGLE_CAPTURE(ProgramUniform3f, isCallValid, context, program, location, v0, v1, v2);
+        ANGLE_CAPTURE(ProgramUniform3f, isCallValid, context, programPacked, location, v0, v1, v2);
     }
 }
 
@@ -997,14 +1029,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform3fv(program, location, count, value);
+            context->programUniform3fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform3fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform3fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1018,14 +1053,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3i(context, program, location, v0, v1, v2));
+                            ValidateProgramUniform3i(context, programPacked, location, v0, v1, v2));
         if (isCallValid)
         {
-            context->programUniform3i(program, location, v0, v1, v2);
+            context->programUniform3i(programPacked, location, v0, v1, v2);
         }
-        ANGLE_CAPTURE(ProgramUniform3i, isCallValid, context, program, location, v0, v1, v2);
+        ANGLE_CAPTURE(ProgramUniform3i, isCallValid, context, programPacked, location, v0, v1, v2);
     }
 }
 
@@ -1042,14 +1078,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform3iv(program, location, count, value);
+            context->programUniform3iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform3iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform3iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1063,14 +1102,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3ui(context, program, location, v0, v1, v2));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3ui(context, programPacked, location, v0, v1, v2));
         if (isCallValid)
         {
-            context->programUniform3ui(program, location, v0, v1, v2);
+            context->programUniform3ui(programPacked, location, v0, v1, v2);
         }
-        ANGLE_CAPTURE(ProgramUniform3ui, isCallValid, context, program, location, v0, v1, v2);
+        ANGLE_CAPTURE(ProgramUniform3ui, isCallValid, context, programPacked, location, v0, v1, v2);
     }
 }
 
@@ -1087,14 +1128,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform3uiv(program, location, count, value);
+            context->programUniform3uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform3uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform3uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1109,14 +1153,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4f(context, program, location, v0, v1, v2, v3));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4f(context, programPacked, location, v0, v1, v2, v3));
         if (isCallValid)
         {
-            context->programUniform4f(program, location, v0, v1, v2, v3);
+            context->programUniform4f(programPacked, location, v0, v1, v2, v3);
         }
-        ANGLE_CAPTURE(ProgramUniform4f, isCallValid, context, program, location, v0, v1, v2, v3);
+        ANGLE_CAPTURE(ProgramUniform4f, isCallValid, context, programPacked, location, v0, v1, v2,
+                      v3);
     }
 }
 
@@ -1133,14 +1180,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform4fv(program, location, count, value);
+            context->programUniform4fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform4fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform4fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1155,14 +1205,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4i(context, program, location, v0, v1, v2, v3));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4i(context, programPacked, location, v0, v1, v2, v3));
         if (isCallValid)
         {
-            context->programUniform4i(program, location, v0, v1, v2, v3);
+            context->programUniform4i(programPacked, location, v0, v1, v2, v3);
         }
-        ANGLE_CAPTURE(ProgramUniform4i, isCallValid, context, program, location, v0, v1, v2, v3);
+        ANGLE_CAPTURE(ProgramUniform4i, isCallValid, context, programPacked, location, v0, v1, v2,
+                      v3);
     }
 }
 
@@ -1179,14 +1232,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform4iv(program, location, count, value);
+            context->programUniform4iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform4iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform4iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1201,14 +1257,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4ui(context, program, location, v0, v1, v2, v3));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4ui(context, programPacked, location, v0, v1, v2, v3));
         if (isCallValid)
         {
-            context->programUniform4ui(program, location, v0, v1, v2, v3);
+            context->programUniform4ui(programPacked, location, v0, v1, v2, v3);
         }
-        ANGLE_CAPTURE(ProgramUniform4ui, isCallValid, context, program, location, v0, v1, v2, v3);
+        ANGLE_CAPTURE(ProgramUniform4ui, isCallValid, context, programPacked, location, v0, v1, v2,
+                      v3);
     }
 }
 
@@ -1225,14 +1284,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform4uiv(program, location, count, value);
+            context->programUniform4uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform4uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform4uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -1250,15 +1312,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix2fv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2fv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2fv(program, location, count, transpose, value);
+            context->programUniformMatrix2fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2fv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix2fv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -1277,16 +1340,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix2x3fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x3fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2x3fv(program, location, count, transpose, value);
+            context->programUniformMatrix2x3fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x3fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix2x3fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1304,16 +1368,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix2x4fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x4fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2x4fv(program, location, count, transpose, value);
+            context->programUniformMatrix2x4fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x4fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix2x4fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1331,15 +1396,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix3fv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3fv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3fv(program, location, count, transpose, value);
+            context->programUniformMatrix3fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3fv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix3fv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -1358,16 +1424,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix3x2fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x2fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3x2fv(program, location, count, transpose, value);
+            context->programUniformMatrix3x2fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x2fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix3x2fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1385,16 +1452,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix3x4fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x4fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3x4fv(program, location, count, transpose, value);
+            context->programUniformMatrix3x4fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x4fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix3x4fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1412,15 +1480,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix4fv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4fv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4fv(program, location, count, transpose, value);
+            context->programUniformMatrix4fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4fv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix4fv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -1439,16 +1508,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix4x2fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x2fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4x2fv(program, location, count, transpose, value);
+            context->programUniformMatrix4x2fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x2fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix4x2fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1466,16 +1536,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix4x3fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x3fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4x3fv(program, location, count, transpose, value);
+            context->programUniformMatrix4x3fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x3fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix4x3fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -1542,14 +1613,17 @@
     if (context)
     {
         ProgramPipelineID pipelinePacked              = FromGL<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateUseProgramStages(context, pipelinePacked, stages, program));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUseProgramStages(context, pipelinePacked, stages, programPacked));
         if (isCallValid)
         {
-            context->useProgramStages(pipelinePacked, stages, program);
+            context->useProgramStages(pipelinePacked, stages, programPacked);
         }
-        ANGLE_CAPTURE(UseProgramStages, isCallValid, context, pipelinePacked, stages, program);
+        ANGLE_CAPTURE(UseProgramStages, isCallValid, context, pipelinePacked, stages,
+                      programPacked);
     }
 }
 
diff --git a/src/libGLESv2/entry_points_gles_ext_autogen.cpp b/src/libGLESv2/entry_points_gles_ext_autogen.cpp
index 2743612..e9338c7 100644
--- a/src/libGLESv2/entry_points_gles_ext_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_ext_autogen.cpp
@@ -739,15 +739,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramivRobustANGLE(context, program, pname, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetProgramivRobustANGLE(context, programPacked, pname, bufSize,
+                                                            length, params));
         if (isCallValid)
         {
-            context->getProgramivRobust(program, pname, bufSize, length, params);
+            context->getProgramivRobust(programPacked, pname, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetProgramivRobustANGLE, isCallValid, context, program, pname, bufSize,
+        ANGLE_CAPTURE(GetProgramivRobustANGLE, isCallValid, context, programPacked, pname, bufSize,
                       length, params);
     }
 }
@@ -793,16 +794,17 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetShaderivRobustANGLE(context, shader, pname, bufSize, length, params));
+             ValidateGetShaderivRobustANGLE(context, shaderPacked, pname, bufSize, length, params));
         if (isCallValid)
         {
-            context->getShaderivRobust(shader, pname, bufSize, length, params);
+            context->getShaderivRobust(shaderPacked, pname, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetShaderivRobustANGLE, isCallValid, context, shader, pname, bufSize, length,
-                      params);
+        ANGLE_CAPTURE(GetShaderivRobustANGLE, isCallValid, context, shaderPacked, pname, bufSize,
+                      length, params);
     }
 }
 
@@ -880,16 +882,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetUniformfvRobustANGLE(context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformfvRobustANGLE(context, programPacked, location,
+                                                            bufSize, length, params));
         if (isCallValid)
         {
-            context->getUniformfvRobust(program, location, bufSize, length, params);
+            context->getUniformfvRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetUniformfvRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetUniformfvRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -907,16 +910,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetUniformivRobustANGLE(context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformivRobustANGLE(context, programPacked, location,
+                                                            bufSize, length, params));
         if (isCallValid)
         {
-            context->getUniformivRobust(program, location, bufSize, length, params);
+            context->getUniformivRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetUniformivRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetUniformivRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -1626,16 +1630,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetUniformuivRobustANGLE(context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformuivRobustANGLE(context, programPacked, location,
+                                                             bufSize, length, params));
         if (isCallValid)
         {
-            context->getUniformuivRobust(program, location, bufSize, length, params);
+            context->getUniformuivRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetUniformuivRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetUniformuivRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -1657,16 +1662,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetActiveUniformBlockivRobustANGLE(
-                                                             context, program, uniformBlockIndex,
-                                                             pname, bufSize, length, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetActiveUniformBlockivRobustANGLE(context, programPacked, uniformBlockIndex,
+                                                        pname, bufSize, length, params));
         if (isCallValid)
         {
-            context->getActiveUniformBlockivRobust(program, uniformBlockIndex, pname, bufSize,
+            context->getActiveUniformBlockivRobust(programPacked, uniformBlockIndex, pname, bufSize,
                                                    length, params);
         }
-        ANGLE_CAPTURE(GetActiveUniformBlockivRobustANGLE, isCallValid, context, program,
+        ANGLE_CAPTURE(GetActiveUniformBlockivRobustANGLE, isCallValid, context, programPacked,
                       uniformBlockIndex, pname, bufSize, length, params);
     }
 }
@@ -1915,16 +1922,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetProgramInterfaceivRobustANGLE(
-                                                             context, program, programInterface,
-                                                             pname, bufSize, length, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramInterfaceivRobustANGLE(context, programPacked, programInterface,
+                                                      pname, bufSize, length, params));
         if (isCallValid)
         {
-            context->getProgramInterfaceivRobust(program, programInterface, pname, bufSize, length,
-                                                 params);
+            context->getProgramInterfaceivRobust(programPacked, programInterface, pname, bufSize,
+                                                 length, params);
         }
-        ANGLE_CAPTURE(GetProgramInterfaceivRobustANGLE, isCallValid, context, program,
+        ANGLE_CAPTURE(GetProgramInterfaceivRobustANGLE, isCallValid, context, programPacked,
                       programInterface, pname, bufSize, length, params);
     }
 }
@@ -2130,16 +2139,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnUniformfvRobustANGLE(context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetnUniformfvRobustANGLE(context, programPacked, location,
+                                                             bufSize, length, params));
         if (isCallValid)
         {
-            context->getnUniformfvRobust(program, location, bufSize, length, params);
+            context->getnUniformfvRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetnUniformfvRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetnUniformfvRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -2157,16 +2167,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnUniformivRobustANGLE(context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetnUniformivRobustANGLE(context, programPacked, location,
+                                                             bufSize, length, params));
         if (isCallValid)
         {
-            context->getnUniformivRobust(program, location, bufSize, length, params);
+            context->getnUniformivRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetnUniformivRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetnUniformivRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -2184,16 +2195,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetnUniformuivRobustANGLE(
-                                              context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetnUniformuivRobustANGLE(context, programPacked, location,
+                                                              bufSize, length, params));
         if (isCallValid)
         {
-            context->getnUniformuivRobust(program, location, bufSize, length, params);
+            context->getnUniformuivRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetnUniformuivRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetnUniformuivRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -2714,16 +2726,17 @@
 
     if (context)
     {
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetTranslatedShaderSourceANGLE(context, shader, bufsize, length, source));
+            (context->skipValidation() || ValidateGetTranslatedShaderSourceANGLE(
+                                              context, shaderPacked, bufsize, length, source));
         if (isCallValid)
         {
-            context->getTranslatedShaderSource(shader, bufsize, length, source);
+            context->getTranslatedShaderSource(shaderPacked, bufsize, length, source);
         }
-        ANGLE_CAPTURE(GetTranslatedShaderSourceANGLE, isCallValid, context, shader, bufsize, length,
-                      source);
+        ANGLE_CAPTURE(GetTranslatedShaderSourceANGLE, isCallValid, context, shaderPacked, bufsize,
+                      length, source);
     }
 }
 
@@ -2738,14 +2751,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateBindUniformLocationCHROMIUM(context, program, location, name));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBindUniformLocationCHROMIUM(context, programPacked, location, name));
         if (isCallValid)
         {
-            context->bindUniformLocation(program, location, name);
+            context->bindUniformLocation(programPacked, location, name);
         }
-        ANGLE_CAPTURE(BindUniformLocationCHROMIUM, isCallValid, context, program, location, name);
+        ANGLE_CAPTURE(BindUniformLocationCHROMIUM, isCallValid, context, programPacked, location,
+                      name);
     }
 }
 
@@ -3542,15 +3558,17 @@
 
     if (context)
     {
+        ShaderProgramID programsPacked                = FromGL<ShaderProgramID>(programs);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateBindFragmentInputLocationCHROMIUM(
-                                                             context, programs, location, name));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBindFragmentInputLocationCHROMIUM(context, programsPacked, location, name));
         if (isCallValid)
         {
-            context->bindFragmentInputLocation(programs, location, name);
+            context->bindFragmentInputLocation(programsPacked, location, name);
         }
-        ANGLE_CAPTURE(BindFragmentInputLocationCHROMIUM, isCallValid, context, programs, location,
-                      name);
+        ANGLE_CAPTURE(BindFragmentInputLocationCHROMIUM, isCallValid, context, programsPacked,
+                      location, name);
     }
 }
 
@@ -3569,16 +3587,18 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
                             ValidateProgramPathFragmentInputGenCHROMIUM(
-                                context, program, location, genMode, components, coeffs));
+                                context, programPacked, location, genMode, components, coeffs));
         if (isCallValid)
         {
-            context->programPathFragmentInputGen(program, location, genMode, components, coeffs);
+            context->programPathFragmentInputGen(programPacked, location, genMode, components,
+                                                 coeffs);
         }
-        ANGLE_CAPTURE(ProgramPathFragmentInputGenCHROMIUM, isCallValid, context, program, location,
-                      genMode, components, coeffs);
+        ANGLE_CAPTURE(ProgramPathFragmentInputGenCHROMIUM, isCallValid, context, programPacked,
+                      location, genMode, components, coeffs);
     }
 }
 
@@ -3594,14 +3614,15 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateBindFragDataLocationEXT(context, program, color, name));
+                            ValidateBindFragDataLocationEXT(context, programPacked, color, name));
         if (isCallValid)
         {
-            context->bindFragDataLocation(program, color, name);
+            context->bindFragDataLocation(programPacked, color, name);
         }
-        ANGLE_CAPTURE(BindFragDataLocationEXT, isCallValid, context, program, color, name);
+        ANGLE_CAPTURE(BindFragDataLocationEXT, isCallValid, context, programPacked, color, name);
     }
 }
 
@@ -3618,16 +3639,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateBindFragDataLocationIndexedEXT(context, program, colorNumber, index, name));
+            (context->skipValidation() || ValidateBindFragDataLocationIndexedEXT(
+                                              context, programPacked, colorNumber, index, name));
         if (isCallValid)
         {
-            context->bindFragDataLocationIndexed(program, colorNumber, index, name);
+            context->bindFragDataLocationIndexed(programPacked, colorNumber, index, name);
         }
-        ANGLE_CAPTURE(BindFragDataLocationIndexedEXT, isCallValid, context, program, colorNumber,
-                      index, name);
+        ANGLE_CAPTURE(BindFragDataLocationIndexedEXT, isCallValid, context, programPacked,
+                      colorNumber, index, name);
     }
 }
 
@@ -3641,18 +3663,19 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetFragDataIndexEXT(context, program, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetFragDataIndexEXT(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getFragDataIndex(program, name);
+            returnValue = context->getFragDataIndex(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataIndexEXT, GLint>();
         }
-        ANGLE_CAPTURE(GetFragDataIndexEXT, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetFragDataIndexEXT, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -3675,20 +3698,22 @@
     GLint returnValue;
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramResourceLocationIndexEXT(context, program, programInterface, name));
+            (context->skipValidation() || ValidateGetProgramResourceLocationIndexEXT(
+                                              context, programPacked, programInterface, name));
         if (isCallValid)
         {
-            returnValue = context->getProgramResourceLocationIndex(program, programInterface, name);
+            returnValue =
+                context->getProgramResourceLocationIndex(programPacked, programInterface, name);
         }
         else
         {
             returnValue =
                 GetDefaultReturnValue<EntryPoint::GetProgramResourceLocationIndexEXT, GLint>();
         }
-        ANGLE_CAPTURE(GetProgramResourceLocationIndexEXT, isCallValid, context, program,
+        ANGLE_CAPTURE(GetProgramResourceLocationIndexEXT, isCallValid, context, programPacked,
                       programInterface, name, returnValue);
     }
     else
@@ -4621,14 +4646,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetnUniformfvEXT(context, program, location, bufSize, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformfvEXT(context, programPacked, location, bufSize, params));
         if (isCallValid)
         {
-            context->getnUniformfv(program, location, bufSize, params);
+            context->getnUniformfv(programPacked, location, bufSize, params);
         }
-        ANGLE_CAPTURE(GetnUniformfvEXT, isCallValid, context, program, location, bufSize, params);
+        ANGLE_CAPTURE(GetnUniformfvEXT, isCallValid, context, programPacked, location, bufSize,
+                      params);
     }
 }
 
@@ -4642,14 +4670,17 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetnUniformivEXT(context, program, location, bufSize, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformivEXT(context, programPacked, location, bufSize, params));
         if (isCallValid)
         {
-            context->getnUniformiv(program, location, bufSize, params);
+            context->getnUniformiv(programPacked, location, bufSize, params);
         }
-        ANGLE_CAPTURE(GetnUniformivEXT, isCallValid, context, program, location, bufSize, params);
+        ANGLE_CAPTURE(GetnUniformivEXT, isCallValid, context, programPacked, location, bufSize,
+                      params);
     }
 }
 
@@ -6019,15 +6050,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramBinaryOES(context, program, bufSize, length, binaryFormat, binary));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetProgramBinaryOES(context, programPacked, bufSize, length,
+                                                        binaryFormat, binary));
         if (isCallValid)
         {
-            context->getProgramBinary(program, bufSize, length, binaryFormat, binary);
+            context->getProgramBinary(programPacked, bufSize, length, binaryFormat, binary);
         }
-        ANGLE_CAPTURE(GetProgramBinaryOES, isCallValid, context, program, bufSize, length,
+        ANGLE_CAPTURE(GetProgramBinaryOES, isCallValid, context, programPacked, bufSize, length,
                       binaryFormat, binary);
     }
 }
@@ -6046,15 +6078,16 @@
 
     if (context)
     {
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateProgramBinaryOES(context, program, binaryFormat, binary, length));
+             ValidateProgramBinaryOES(context, programPacked, binaryFormat, binary, length));
         if (isCallValid)
         {
-            context->programBinary(program, binaryFormat, binary, length);
+            context->programBinary(programPacked, binaryFormat, binary, length);
         }
-        ANGLE_CAPTURE(ProgramBinaryOES, isCallValid, context, program, binaryFormat, binary,
+        ANGLE_CAPTURE(ProgramBinaryOES, isCallValid, context, programPacked, binaryFormat, binary,
                       length);
     }
 }
@@ -7057,14 +7090,15 @@
     {
         ASSERT(context == GetValidGlobalContext());
         ProgramPipelineID pipelinePacked              = FromGL<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateActiveShaderProgram(context, pipelinePacked, program));
+                            ValidateActiveShaderProgram(context, pipelinePacked, programPacked));
         if (isCallValid)
         {
-            context->activeShaderProgram(pipelinePacked, program);
+            context->activeShaderProgram(pipelinePacked, programPacked);
         }
-        ANGLE_CAPTURE(ActiveShaderProgram, isCallValid, context, pipelinePacked, program);
+        ANGLE_CAPTURE(ActiveShaderProgram, isCallValid, context, pipelinePacked, programPacked);
     }
 }
 
@@ -7138,14 +7172,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateAttachShader(context, program, shader));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateAttachShader(context, programPacked, shaderPacked));
         if (isCallValid)
         {
-            context->attachShader(program, shader);
+            context->attachShader(programPacked, shaderPacked);
         }
-        ANGLE_CAPTURE(AttachShader, isCallValid, context, program, shader);
+        ANGLE_CAPTURE(AttachShader, isCallValid, context, programPacked, shaderPacked);
     }
 }
 
@@ -7229,14 +7265,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateBindAttribLocation(context, program, index, name));
+                            ValidateBindAttribLocation(context, programPacked, index, name));
         if (isCallValid)
         {
-            context->bindAttribLocation(program, index, name);
+            context->bindAttribLocation(programPacked, index, name);
         }
-        ANGLE_CAPTURE(BindAttribLocation, isCallValid, context, program, index, name);
+        ANGLE_CAPTURE(BindAttribLocation, isCallValid, context, programPacked, index, name);
     }
 }
 
@@ -7335,14 +7372,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateBindFragDataLocationEXT(context, program, color, name));
+                            ValidateBindFragDataLocationEXT(context, programPacked, color, name));
         if (isCallValid)
         {
-            context->bindFragDataLocation(program, color, name);
+            context->bindFragDataLocation(programPacked, color, name);
         }
-        ANGLE_CAPTURE(BindFragDataLocationEXT, isCallValid, context, program, color, name);
+        ANGLE_CAPTURE(BindFragDataLocationEXT, isCallValid, context, programPacked, color, name);
     }
 }
 
@@ -7361,16 +7399,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateBindFragDataLocationIndexedEXT(context, program, colorNumber, index, name));
+            (context->skipValidation() || ValidateBindFragDataLocationIndexedEXT(
+                                              context, programPacked, colorNumber, index, name));
         if (isCallValid)
         {
-            context->bindFragDataLocationIndexed(program, colorNumber, index, name);
+            context->bindFragDataLocationIndexed(programPacked, colorNumber, index, name);
         }
-        ANGLE_CAPTURE(BindFragDataLocationIndexedEXT, isCallValid, context, program, colorNumber,
-                      index, name);
+        ANGLE_CAPTURE(BindFragDataLocationIndexedEXT, isCallValid, context, programPacked,
+                      colorNumber, index, name);
     }
 }
 
@@ -8432,13 +8471,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateCompileShader(context, shader));
+        bool isCallValid =
+            (context->skipValidation() || ValidateCompileShader(context, shaderPacked));
         if (isCallValid)
         {
-            context->compileShader(shader);
+            context->compileShader(shaderPacked);
         }
-        ANGLE_CAPTURE(CompileShader, isCallValid, context, shader);
+        ANGLE_CAPTURE(CompileShader, isCallValid, context, shaderPacked);
     }
 }
 
@@ -9225,13 +9266,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDeleteProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteProgram(context, programPacked));
         if (isCallValid)
         {
-            context->deleteProgram(program);
+            context->deleteProgram(programPacked);
         }
-        ANGLE_CAPTURE(DeleteProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(DeleteProgram, isCallValid, context, programPacked);
     }
 }
 
@@ -9403,13 +9446,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDeleteShader(context, shader));
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteShader(context, shaderPacked));
         if (isCallValid)
         {
-            context->deleteShader(shader);
+            context->deleteShader(shaderPacked);
         }
-        ANGLE_CAPTURE(DeleteShader, isCallValid, context, shader);
+        ANGLE_CAPTURE(DeleteShader, isCallValid, context, shaderPacked);
     }
 }
 
@@ -9604,14 +9649,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDetachShader(context, program, shader));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateDetachShader(context, programPacked, shaderPacked));
         if (isCallValid)
         {
-            context->detachShader(program, shader);
+            context->detachShader(programPacked, shaderPacked);
         }
-        ANGLE_CAPTURE(DetachShader, isCallValid, context, program, shader);
+        ANGLE_CAPTURE(DetachShader, isCallValid, context, programPacked, shaderPacked);
     }
 }
 
@@ -11412,16 +11459,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveAttrib(context, program, index, bufSize, length, size, type, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetActiveAttrib(context, programPacked, index, bufSize, length,
+                                                    size, type, name));
         if (isCallValid)
         {
-            context->getActiveAttrib(program, index, bufSize, length, size, type, name);
+            context->getActiveAttrib(programPacked, index, bufSize, length, size, type, name);
         }
-        ANGLE_CAPTURE(GetActiveAttrib, isCallValid, context, program, index, bufSize, length, size,
-                      type, name);
+        ANGLE_CAPTURE(GetActiveAttrib, isCallValid, context, programPacked, index, bufSize, length,
+                      size, type, name);
     }
 }
 
@@ -11445,16 +11493,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveUniform(context, program, index, bufSize, length, size, type, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetActiveUniform(context, programPacked, index, bufSize, length,
+                                                     size, type, name));
         if (isCallValid)
         {
-            context->getActiveUniform(program, index, bufSize, length, size, type, name);
+            context->getActiveUniform(programPacked, index, bufSize, length, size, type, name);
         }
-        ANGLE_CAPTURE(GetActiveUniform, isCallValid, context, program, index, bufSize, length, size,
-                      type, name);
+        ANGLE_CAPTURE(GetActiveUniform, isCallValid, context, programPacked, index, bufSize, length,
+                      size, type, name);
     }
 }
 
@@ -11475,17 +11524,19 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetActiveUniformBlockName(context, program, uniformBlockIndex,
-                                                              bufSize, length, uniformBlockName));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetActiveUniformBlockName(context, programPacked, uniformBlockIndex, bufSize,
+                                               length, uniformBlockName));
         if (isCallValid)
         {
-            context->getActiveUniformBlockName(program, uniformBlockIndex, bufSize, length,
+            context->getActiveUniformBlockName(programPacked, uniformBlockIndex, bufSize, length,
                                                uniformBlockName);
         }
-        ANGLE_CAPTURE(GetActiveUniformBlockName, isCallValid, context, program, uniformBlockIndex,
-                      bufSize, length, uniformBlockName);
+        ANGLE_CAPTURE(GetActiveUniformBlockName, isCallValid, context, programPacked,
+                      uniformBlockIndex, bufSize, length, uniformBlockName);
     }
 }
 
@@ -11505,16 +11556,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveUniformBlockiv(context, program, uniformBlockIndex, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetActiveUniformBlockiv(context, programPacked,
+                                                            uniformBlockIndex, pname, params));
         if (isCallValid)
         {
-            context->getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+            context->getActiveUniformBlockiv(programPacked, uniformBlockIndex, pname, params);
         }
-        ANGLE_CAPTURE(GetActiveUniformBlockiv, isCallValid, context, program, uniformBlockIndex,
-                      pname, params);
+        ANGLE_CAPTURE(GetActiveUniformBlockiv, isCallValid, context, programPacked,
+                      uniformBlockIndex, pname, params);
     }
 }
 
@@ -11536,15 +11588,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetActiveUniformsiv(context, program, uniformCount,
+                            ValidateGetActiveUniformsiv(context, programPacked, uniformCount,
                                                         uniformIndices, pname, params));
         if (isCallValid)
         {
-            context->getActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+            context->getActiveUniformsiv(programPacked, uniformCount, uniformIndices, pname,
+                                         params);
         }
-        ANGLE_CAPTURE(GetActiveUniformsiv, isCallValid, context, program, uniformCount,
+        ANGLE_CAPTURE(GetActiveUniformsiv, isCallValid, context, programPacked, uniformCount,
                       uniformIndices, pname, params);
     }
 }
@@ -11565,14 +11619,18 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
+        ShaderProgramID *shadersPacked                = FromGL<ShaderProgramID *>(shaders);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetAttachedShaders(context, program, maxCount, count, shaders));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetAttachedShaders(context, programPacked, maxCount, count, shadersPacked));
         if (isCallValid)
         {
-            context->getAttachedShaders(program, maxCount, count, shaders);
+            context->getAttachedShaders(programPacked, maxCount, count, shadersPacked);
         }
-        ANGLE_CAPTURE(GetAttachedShaders, isCallValid, context, program, maxCount, count, shaders);
+        ANGLE_CAPTURE(GetAttachedShaders, isCallValid, context, programPacked, maxCount, count,
+                      shadersPacked);
     }
 }
 
@@ -11589,18 +11647,19 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() || ValidateGetAttribLocation(context, program, name));
+            (context->skipValidation() || ValidateGetAttribLocation(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getAttribLocation(program, name);
+            returnValue = context->getAttribLocation(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetAttribLocation, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetAttribLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -11950,18 +12009,19 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetFragDataIndexEXT(context, program, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetFragDataIndexEXT(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getFragDataIndex(program, name);
+            returnValue = context->getFragDataIndex(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataIndexEXT, GLint>();
         }
-        ANGLE_CAPTURE(GetFragDataIndexEXT, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetFragDataIndexEXT, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -11983,18 +12043,19 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetFragDataLocation(context, program, name));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetFragDataLocation(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getFragDataLocation(program, name);
+            returnValue = context->getFragDataLocation(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetFragDataLocation, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetFragDataLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -12509,15 +12570,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramBinary(context, program, bufSize, length, binaryFormat, binary));
+            (context->skipValidation() || ValidateGetProgramBinary(context, programPacked, bufSize,
+                                                                   length, binaryFormat, binary));
         if (isCallValid)
         {
-            context->getProgramBinary(program, bufSize, length, binaryFormat, binary);
+            context->getProgramBinary(programPacked, bufSize, length, binaryFormat, binary);
         }
-        ANGLE_CAPTURE(GetProgramBinary, isCallValid, context, program, bufSize, length,
+        ANGLE_CAPTURE(GetProgramBinary, isCallValid, context, programPacked, bufSize, length,
                       binaryFormat, binary);
     }
 }
@@ -12540,15 +12602,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramBinaryOES(context, program, bufSize, length, binaryFormat, binary));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetProgramBinaryOES(context, programPacked, bufSize, length,
+                                                        binaryFormat, binary));
         if (isCallValid)
         {
-            context->getProgramBinary(program, bufSize, length, binaryFormat, binary);
+            context->getProgramBinary(programPacked, bufSize, length, binaryFormat, binary);
         }
-        ANGLE_CAPTURE(GetProgramBinaryOES, isCallValid, context, program, bufSize, length,
+        ANGLE_CAPTURE(GetProgramBinaryOES, isCallValid, context, programPacked, bufSize, length,
                       binaryFormat, binary);
     }
 }
@@ -12569,14 +12632,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetProgramInfoLog(context, program, bufSize, length, infoLog));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramInfoLog(context, programPacked, bufSize, length, infoLog));
         if (isCallValid)
         {
-            context->getProgramInfoLog(program, bufSize, length, infoLog);
+            context->getProgramInfoLog(programPacked, bufSize, length, infoLog);
         }
-        ANGLE_CAPTURE(GetProgramInfoLog, isCallValid, context, program, bufSize, length, infoLog);
+        ANGLE_CAPTURE(GetProgramInfoLog, isCallValid, context, programPacked, bufSize, length,
+                      infoLog);
     }
 }
 
@@ -12596,16 +12662,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramInterfaceiv(context, program, programInterface, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetProgramInterfaceiv(context, programPacked, programInterface,
+                                                          pname, params));
         if (isCallValid)
         {
-            context->getProgramInterfaceiv(program, programInterface, pname, params);
+            context->getProgramInterfaceiv(programPacked, programInterface, pname, params);
         }
-        ANGLE_CAPTURE(GetProgramInterfaceiv, isCallValid, context, program, programInterface, pname,
-                      params);
+        ANGLE_CAPTURE(GetProgramInterfaceiv, isCallValid, context, programPacked, programInterface,
+                      pname, params);
     }
 }
 
@@ -12682,20 +12749,21 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetProgramResourceIndex(context, program, programInterface, name));
+             ValidateGetProgramResourceIndex(context, programPacked, programInterface, name));
         if (isCallValid)
         {
-            returnValue = context->getProgramResourceIndex(program, programInterface, name);
+            returnValue = context->getProgramResourceIndex(programPacked, programInterface, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceIndex, GLuint>();
         }
-        ANGLE_CAPTURE(GetProgramResourceIndex, isCallValid, context, program, programInterface,
-                      name, returnValue);
+        ANGLE_CAPTURE(GetProgramResourceIndex, isCallValid, context, programPacked,
+                      programInterface, name, returnValue);
     }
     else
     {
@@ -12720,20 +12788,22 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetProgramResourceLocation(context, program, programInterface, name));
+             ValidateGetProgramResourceLocation(context, programPacked, programInterface, name));
         if (isCallValid)
         {
-            returnValue = context->getProgramResourceLocation(program, programInterface, name);
+            returnValue =
+                context->getProgramResourceLocation(programPacked, programInterface, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetProgramResourceLocation, isCallValid, context, program, programInterface,
-                      name, returnValue);
+        ANGLE_CAPTURE(GetProgramResourceLocation, isCallValid, context, programPacked,
+                      programInterface, name, returnValue);
     }
     else
     {
@@ -12758,20 +12828,22 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramResourceLocationIndexEXT(context, program, programInterface, name));
+            (context->skipValidation() || ValidateGetProgramResourceLocationIndexEXT(
+                                              context, programPacked, programInterface, name));
         if (isCallValid)
         {
-            returnValue = context->getProgramResourceLocationIndex(program, programInterface, name);
+            returnValue =
+                context->getProgramResourceLocationIndex(programPacked, programInterface, name);
         }
         else
         {
             returnValue =
                 GetDefaultReturnValue<EntryPoint::GetProgramResourceLocationIndexEXT, GLint>();
         }
-        ANGLE_CAPTURE(GetProgramResourceLocationIndexEXT, isCallValid, context, program,
+        ANGLE_CAPTURE(GetProgramResourceLocationIndexEXT, isCallValid, context, programPacked,
                       programInterface, name, returnValue);
     }
     else
@@ -12801,16 +12873,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetProgramResourceName(context, program, programInterface,
+                            ValidateGetProgramResourceName(context, programPacked, programInterface,
                                                            index, bufSize, length, name));
         if (isCallValid)
         {
-            context->getProgramResourceName(program, programInterface, index, bufSize, length,
+            context->getProgramResourceName(programPacked, programInterface, index, bufSize, length,
                                             name);
         }
-        ANGLE_CAPTURE(GetProgramResourceName, isCallValid, context, program, programInterface,
+        ANGLE_CAPTURE(GetProgramResourceName, isCallValid, context, programPacked, programInterface,
                       index, bufSize, length, name);
     }
 }
@@ -12837,18 +12910,19 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetProgramResourceiv(context, program, programInterface, index, propCount,
-                                          props, bufSize, length, params));
+             ValidateGetProgramResourceiv(context, programPacked, programInterface, index,
+                                          propCount, props, bufSize, length, params));
         if (isCallValid)
         {
-            context->getProgramResourceiv(program, programInterface, index, propCount, props,
+            context->getProgramResourceiv(programPacked, programInterface, index, propCount, props,
                                           bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetProgramResourceiv, isCallValid, context, program, programInterface, index,
-                      propCount, props, bufSize, length, params);
+        ANGLE_CAPTURE(GetProgramResourceiv, isCallValid, context, programPacked, programInterface,
+                      index, propCount, props, bufSize, length, params);
     }
 }
 
@@ -12866,14 +12940,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetProgramiv(context, program, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetProgramiv(context, programPacked, pname, params));
         if (isCallValid)
         {
-            context->getProgramiv(program, pname, params);
+            context->getProgramiv(programPacked, pname, params);
         }
-        ANGLE_CAPTURE(GetProgramiv, isCallValid, context, program, pname, params);
+        ANGLE_CAPTURE(GetProgramiv, isCallValid, context, programPacked, pname, params);
     }
 }
 
@@ -13262,14 +13337,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetShaderInfoLog(context, shader, bufSize, length, infoLog));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetShaderInfoLog(context, shaderPacked, bufSize, length, infoLog));
         if (isCallValid)
         {
-            context->getShaderInfoLog(shader, bufSize, length, infoLog);
+            context->getShaderInfoLog(shaderPacked, bufSize, length, infoLog);
         }
-        ANGLE_CAPTURE(GetShaderInfoLog, isCallValid, context, shader, bufSize, length, infoLog);
+        ANGLE_CAPTURE(GetShaderInfoLog, isCallValid, context, shaderPacked, bufSize, length,
+                      infoLog);
     }
 }
 
@@ -13318,14 +13396,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetShaderSource(context, shader, bufSize, length, source));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetShaderSource(context, shaderPacked, bufSize, length, source));
         if (isCallValid)
         {
-            context->getShaderSource(shader, bufSize, length, source);
+            context->getShaderSource(shaderPacked, bufSize, length, source);
         }
-        ANGLE_CAPTURE(GetShaderSource, isCallValid, context, shader, bufSize, length, source);
+        ANGLE_CAPTURE(GetShaderSource, isCallValid, context, shaderPacked, bufSize, length, source);
     }
 }
 
@@ -13343,14 +13423,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetShaderiv(context, shader, pname, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetShaderiv(context, shaderPacked, pname, params));
         if (isCallValid)
         {
-            context->getShaderiv(shader, pname, params);
+            context->getShaderiv(shaderPacked, pname, params);
         }
-        ANGLE_CAPTURE(GetShaderiv, isCallValid, context, shader, pname, params);
+        ANGLE_CAPTURE(GetShaderiv, isCallValid, context, shaderPacked, pname, params);
     }
 }
 
@@ -13811,16 +13892,18 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetTransformFeedbackVarying(context, program, index, bufSize,
-                                                                length, size, type, name));
+                            ValidateGetTransformFeedbackVarying(context, programPacked, index,
+                                                                bufSize, length, size, type, name));
         if (isCallValid)
         {
-            context->getTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+            context->getTransformFeedbackVarying(programPacked, index, bufSize, length, size, type,
+                                                 name);
         }
-        ANGLE_CAPTURE(GetTransformFeedbackVarying, isCallValid, context, program, index, bufSize,
-                      length, size, type, name);
+        ANGLE_CAPTURE(GetTransformFeedbackVarying, isCallValid, context, programPacked, index,
+                      bufSize, length, size, type, name);
     }
 }
 
@@ -13839,16 +13922,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetTranslatedShaderSourceANGLE(context, shader, bufsize, length, source));
+            (context->skipValidation() || ValidateGetTranslatedShaderSourceANGLE(
+                                              context, shaderPacked, bufsize, length, source));
         if (isCallValid)
         {
-            context->getTranslatedShaderSource(shader, bufsize, length, source);
+            context->getTranslatedShaderSource(shaderPacked, bufsize, length, source);
         }
-        ANGLE_CAPTURE(GetTranslatedShaderSourceANGLE, isCallValid, context, shader, bufsize, length,
-                      source);
+        ANGLE_CAPTURE(GetTranslatedShaderSourceANGLE, isCallValid, context, shaderPacked, bufsize,
+                      length, source);
     }
 }
 
@@ -13865,18 +13949,19 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetUniformBlockIndex(context, program, uniformBlockName));
+                            ValidateGetUniformBlockIndex(context, programPacked, uniformBlockName));
         if (isCallValid)
         {
-            returnValue = context->getUniformBlockIndex(program, uniformBlockName);
+            returnValue = context->getUniformBlockIndex(programPacked, uniformBlockName);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>();
         }
-        ANGLE_CAPTURE(GetUniformBlockIndex, isCallValid, context, program, uniformBlockName,
+        ANGLE_CAPTURE(GetUniformBlockIndex, isCallValid, context, programPacked, uniformBlockName,
                       returnValue);
     }
     else
@@ -13901,16 +13986,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformIndices(context, program, uniformCount,
-                                                                    uniformNames, uniformIndices));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformIndices(context, programPacked, uniformCount,
+                                                      uniformNames, uniformIndices));
         if (isCallValid)
         {
-            context->getUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+            context->getUniformIndices(programPacked, uniformCount, uniformNames, uniformIndices);
         }
-        ANGLE_CAPTURE(GetUniformIndices, isCallValid, context, program, uniformCount, uniformNames,
-                      uniformIndices);
+        ANGLE_CAPTURE(GetUniformIndices, isCallValid, context, programPacked, uniformCount,
+                      uniformNames, uniformIndices);
     }
 }
 
@@ -13927,18 +14013,19 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformLocation(context, program, name));
+            (context->skipValidation() || ValidateGetUniformLocation(context, programPacked, name));
         if (isCallValid)
         {
-            returnValue = context->getUniformLocation(program, name);
+            returnValue = context->getUniformLocation(programPacked, name);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
         }
-        ANGLE_CAPTURE(GetUniformLocation, isCallValid, context, program, name, returnValue);
+        ANGLE_CAPTURE(GetUniformLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
@@ -13961,14 +14048,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformfv(context, program, location, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformfv(context, programPacked, location, params));
         if (isCallValid)
         {
-            context->getUniformfv(program, location, params);
+            context->getUniformfv(programPacked, location, params);
         }
-        ANGLE_CAPTURE(GetUniformfv, isCallValid, context, program, location, params);
+        ANGLE_CAPTURE(GetUniformfv, isCallValid, context, programPacked, location, params);
     }
 }
 
@@ -13986,14 +14074,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetUniformiv(context, program, location, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformiv(context, programPacked, location, params));
         if (isCallValid)
         {
-            context->getUniformiv(program, location, params);
+            context->getUniformiv(programPacked, location, params);
         }
-        ANGLE_CAPTURE(GetUniformiv, isCallValid, context, program, location, params);
+        ANGLE_CAPTURE(GetUniformiv, isCallValid, context, programPacked, location, params);
     }
 }
 
@@ -14011,14 +14100,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetUniformuiv(context, program, location, params));
+                            ValidateGetUniformuiv(context, programPacked, location, params));
         if (isCallValid)
         {
-            context->getUniformuiv(program, location, params);
+            context->getUniformuiv(programPacked, location, params);
         }
-        ANGLE_CAPTURE(GetUniformuiv, isCallValid, context, program, location, params);
+        ANGLE_CAPTURE(GetUniformuiv, isCallValid, context, programPacked, location, params);
     }
 }
 
@@ -14205,14 +14295,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetnUniformfvEXT(context, program, location, bufSize, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformfvEXT(context, programPacked, location, bufSize, params));
         if (isCallValid)
         {
-            context->getnUniformfv(program, location, bufSize, params);
+            context->getnUniformfv(programPacked, location, bufSize, params);
         }
-        ANGLE_CAPTURE(GetnUniformfvEXT, isCallValid, context, program, location, bufSize, params);
+        ANGLE_CAPTURE(GetnUniformfvEXT, isCallValid, context, programPacked, location, bufSize,
+                      params);
     }
 }
 
@@ -14231,14 +14324,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateGetnUniformivEXT(context, program, location, bufSize, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformivEXT(context, programPacked, location, bufSize, params));
         if (isCallValid)
         {
-            context->getnUniformiv(program, location, bufSize, params);
+            context->getnUniformiv(programPacked, location, bufSize, params);
         }
-        ANGLE_CAPTURE(GetnUniformivEXT, isCallValid, context, program, location, bufSize, params);
+        ANGLE_CAPTURE(GetnUniformivEXT, isCallValid, context, programPacked, location, bufSize,
+                      params);
     }
 }
 
@@ -14585,17 +14681,18 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsProgram(context, program));
+        bool isCallValid = (context->skipValidation() || ValidateIsProgram(context, programPacked));
         if (isCallValid)
         {
-            returnValue = context->isProgram(program);
+            returnValue = context->isProgram(programPacked);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
         }
-        ANGLE_CAPTURE(IsProgram, isCallValid, context, program, returnValue);
+        ANGLE_CAPTURE(IsProgram, isCallValid, context, programPacked, returnValue);
     }
     else
     {
@@ -14820,17 +14917,18 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsShader(context, shader));
+        bool isCallValid = (context->skipValidation() || ValidateIsShader(context, shaderPacked));
         if (isCallValid)
         {
-            returnValue = context->isShader(shader);
+            returnValue = context->isShader(shaderPacked);
         }
         else
         {
             returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
         }
-        ANGLE_CAPTURE(IsShader, isCallValid, context, shader, returnValue);
+        ANGLE_CAPTURE(IsShader, isCallValid, context, shaderPacked, returnValue);
     }
     else
     {
@@ -15207,13 +15305,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLinkProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateLinkProgram(context, programPacked));
         if (isCallValid)
         {
-            context->linkProgram(program);
+            context->linkProgram(programPacked);
         }
-        ANGLE_CAPTURE(LinkProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(LinkProgram, isCallValid, context, programPacked);
     }
 }
 
@@ -16219,14 +16319,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramBinary(context, program, binaryFormat, binary, length));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramBinary(context, programPacked, binaryFormat, binary, length));
         if (isCallValid)
         {
-            context->programBinary(program, binaryFormat, binary, length);
+            context->programBinary(programPacked, binaryFormat, binary, length);
         }
-        ANGLE_CAPTURE(ProgramBinary, isCallValid, context, program, binaryFormat, binary, length);
+        ANGLE_CAPTURE(ProgramBinary, isCallValid, context, programPacked, binaryFormat, binary,
+                      length);
     }
 }
 
@@ -16246,15 +16349,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateProgramBinaryOES(context, program, binaryFormat, binary, length));
+             ValidateProgramBinaryOES(context, programPacked, binaryFormat, binary, length));
         if (isCallValid)
         {
-            context->programBinary(program, binaryFormat, binary, length);
+            context->programBinary(programPacked, binaryFormat, binary, length);
         }
-        ANGLE_CAPTURE(ProgramBinaryOES, isCallValid, context, program, binaryFormat, binary,
+        ANGLE_CAPTURE(ProgramBinaryOES, isCallValid, context, programPacked, binaryFormat, binary,
                       length);
     }
 }
@@ -16272,14 +16376,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramParameteri(context, program, pname, value));
+                            ValidateProgramParameteri(context, programPacked, pname, value));
         if (isCallValid)
         {
-            context->programParameteri(program, pname, value);
+            context->programParameteri(programPacked, pname, value);
         }
-        ANGLE_CAPTURE(ProgramParameteri, isCallValid, context, program, pname, value);
+        ANGLE_CAPTURE(ProgramParameteri, isCallValid, context, programPacked, pname, value);
     }
 }
 
@@ -16296,14 +16401,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniform1f(context, program, location, v0));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniform1f(context, programPacked, location, v0));
         if (isCallValid)
         {
-            context->programUniform1f(program, location, v0);
+            context->programUniform1f(programPacked, location, v0);
         }
-        ANGLE_CAPTURE(ProgramUniform1f, isCallValid, context, program, location, v0);
+        ANGLE_CAPTURE(ProgramUniform1f, isCallValid, context, programPacked, location, v0);
     }
 }
 
@@ -16322,14 +16428,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform1fv(program, location, count, value);
+            context->programUniform1fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform1fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform1fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16346,14 +16455,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniform1i(context, program, location, v0));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniform1i(context, programPacked, location, v0));
         if (isCallValid)
         {
-            context->programUniform1i(program, location, v0);
+            context->programUniform1i(programPacked, location, v0);
         }
-        ANGLE_CAPTURE(ProgramUniform1i, isCallValid, context, program, location, v0);
+        ANGLE_CAPTURE(ProgramUniform1i, isCallValid, context, programPacked, location, v0);
     }
 }
 
@@ -16372,14 +16482,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform1iv(program, location, count, value);
+            context->programUniform1iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform1iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform1iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16396,14 +16509,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1ui(context, program, location, v0));
+                            ValidateProgramUniform1ui(context, programPacked, location, v0));
         if (isCallValid)
         {
-            context->programUniform1ui(program, location, v0);
+            context->programUniform1ui(programPacked, location, v0);
         }
-        ANGLE_CAPTURE(ProgramUniform1ui, isCallValid, context, program, location, v0);
+        ANGLE_CAPTURE(ProgramUniform1ui, isCallValid, context, programPacked, location, v0);
     }
 }
 
@@ -16422,14 +16536,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform1uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform1uiv(program, location, count, value);
+            context->programUniform1uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform1uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform1uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16448,14 +16565,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2f(context, program, location, v0, v1));
+                            ValidateProgramUniform2f(context, programPacked, location, v0, v1));
         if (isCallValid)
         {
-            context->programUniform2f(program, location, v0, v1);
+            context->programUniform2f(programPacked, location, v0, v1);
         }
-        ANGLE_CAPTURE(ProgramUniform2f, isCallValid, context, program, location, v0, v1);
+        ANGLE_CAPTURE(ProgramUniform2f, isCallValid, context, programPacked, location, v0, v1);
     }
 }
 
@@ -16474,14 +16592,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform2fv(program, location, count, value);
+            context->programUniform2fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform2fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform2fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16496,14 +16617,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2i(context, program, location, v0, v1));
+                            ValidateProgramUniform2i(context, programPacked, location, v0, v1));
         if (isCallValid)
         {
-            context->programUniform2i(program, location, v0, v1);
+            context->programUniform2i(programPacked, location, v0, v1);
         }
-        ANGLE_CAPTURE(ProgramUniform2i, isCallValid, context, program, location, v0, v1);
+        ANGLE_CAPTURE(ProgramUniform2i, isCallValid, context, programPacked, location, v0, v1);
     }
 }
 
@@ -16522,14 +16644,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform2iv(program, location, count, value);
+            context->programUniform2iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform2iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform2iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16547,14 +16672,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2ui(context, program, location, v0, v1));
+                            ValidateProgramUniform2ui(context, programPacked, location, v0, v1));
         if (isCallValid)
         {
-            context->programUniform2ui(program, location, v0, v1);
+            context->programUniform2ui(programPacked, location, v0, v1);
         }
-        ANGLE_CAPTURE(ProgramUniform2ui, isCallValid, context, program, location, v0, v1);
+        ANGLE_CAPTURE(ProgramUniform2ui, isCallValid, context, programPacked, location, v0, v1);
     }
 }
 
@@ -16573,14 +16699,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform2uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform2uiv(program, location, count, value);
+            context->programUniform2uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform2uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform2uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16600,14 +16729,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3f(context, program, location, v0, v1, v2));
+                            ValidateProgramUniform3f(context, programPacked, location, v0, v1, v2));
         if (isCallValid)
         {
-            context->programUniform3f(program, location, v0, v1, v2);
+            context->programUniform3f(programPacked, location, v0, v1, v2);
         }
-        ANGLE_CAPTURE(ProgramUniform3f, isCallValid, context, program, location, v0, v1, v2);
+        ANGLE_CAPTURE(ProgramUniform3f, isCallValid, context, programPacked, location, v0, v1, v2);
     }
 }
 
@@ -16626,14 +16756,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform3fv(program, location, count, value);
+            context->programUniform3fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform3fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform3fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16653,14 +16786,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3i(context, program, location, v0, v1, v2));
+                            ValidateProgramUniform3i(context, programPacked, location, v0, v1, v2));
         if (isCallValid)
         {
-            context->programUniform3i(program, location, v0, v1, v2);
+            context->programUniform3i(programPacked, location, v0, v1, v2);
         }
-        ANGLE_CAPTURE(ProgramUniform3i, isCallValid, context, program, location, v0, v1, v2);
+        ANGLE_CAPTURE(ProgramUniform3i, isCallValid, context, programPacked, location, v0, v1, v2);
     }
 }
 
@@ -16679,14 +16813,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform3iv(program, location, count, value);
+            context->programUniform3iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform3iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform3iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16706,14 +16843,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3ui(context, program, location, v0, v1, v2));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3ui(context, programPacked, location, v0, v1, v2));
         if (isCallValid)
         {
-            context->programUniform3ui(program, location, v0, v1, v2);
+            context->programUniform3ui(programPacked, location, v0, v1, v2);
         }
-        ANGLE_CAPTURE(ProgramUniform3ui, isCallValid, context, program, location, v0, v1, v2);
+        ANGLE_CAPTURE(ProgramUniform3ui, isCallValid, context, programPacked, location, v0, v1, v2);
     }
 }
 
@@ -16732,14 +16871,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform3uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform3uiv(program, location, count, value);
+            context->programUniform3uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform3uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform3uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16760,14 +16902,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4f(context, program, location, v0, v1, v2, v3));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4f(context, programPacked, location, v0, v1, v2, v3));
         if (isCallValid)
         {
-            context->programUniform4f(program, location, v0, v1, v2, v3);
+            context->programUniform4f(programPacked, location, v0, v1, v2, v3);
         }
-        ANGLE_CAPTURE(ProgramUniform4f, isCallValid, context, program, location, v0, v1, v2, v3);
+        ANGLE_CAPTURE(ProgramUniform4f, isCallValid, context, programPacked, location, v0, v1, v2,
+                      v3);
     }
 }
 
@@ -16786,14 +16931,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4fv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4fv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform4fv(program, location, count, value);
+            context->programUniform4fv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform4fv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform4fv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16814,14 +16962,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4i(context, program, location, v0, v1, v2, v3));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4i(context, programPacked, location, v0, v1, v2, v3));
         if (isCallValid)
         {
-            context->programUniform4i(program, location, v0, v1, v2, v3);
+            context->programUniform4i(programPacked, location, v0, v1, v2, v3);
         }
-        ANGLE_CAPTURE(ProgramUniform4i, isCallValid, context, program, location, v0, v1, v2, v3);
+        ANGLE_CAPTURE(ProgramUniform4i, isCallValid, context, programPacked, location, v0, v1, v2,
+                      v3);
     }
 }
 
@@ -16840,14 +16991,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4iv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4iv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform4iv(program, location, count, value);
+            context->programUniform4iv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform4iv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform4iv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16868,14 +17022,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4ui(context, program, location, v0, v1, v2, v3));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4ui(context, programPacked, location, v0, v1, v2, v3));
         if (isCallValid)
         {
-            context->programUniform4ui(program, location, v0, v1, v2, v3);
+            context->programUniform4ui(programPacked, location, v0, v1, v2, v3);
         }
-        ANGLE_CAPTURE(ProgramUniform4ui, isCallValid, context, program, location, v0, v1, v2, v3);
+        ANGLE_CAPTURE(ProgramUniform4ui, isCallValid, context, programPacked, location, v0, v1, v2,
+                      v3);
     }
 }
 
@@ -16894,14 +17051,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateProgramUniform4uiv(context, program, location, count, value));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4uiv(context, programPacked, location, count, value));
         if (isCallValid)
         {
-            context->programUniform4uiv(program, location, count, value);
+            context->programUniform4uiv(programPacked, location, count, value);
         }
-        ANGLE_CAPTURE(ProgramUniform4uiv, isCallValid, context, program, location, count, value);
+        ANGLE_CAPTURE(ProgramUniform4uiv, isCallValid, context, programPacked, location, count,
+                      value);
     }
 }
 
@@ -16921,15 +17081,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix2fv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2fv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2fv(program, location, count, transpose, value);
+            context->programUniformMatrix2fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2fv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix2fv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -16950,16 +17111,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix2x3fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x3fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2x3fv(program, location, count, transpose, value);
+            context->programUniformMatrix2x3fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x3fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix2x3fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -16979,16 +17141,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix2x4fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x4fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix2x4fv(program, location, count, transpose, value);
+            context->programUniformMatrix2x4fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x4fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix2x4fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -17008,15 +17171,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix3fv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3fv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3fv(program, location, count, transpose, value);
+            context->programUniformMatrix3fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3fv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix3fv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -17037,16 +17201,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix3x2fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x2fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3x2fv(program, location, count, transpose, value);
+            context->programUniformMatrix3x2fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x2fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix3x2fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -17066,16 +17231,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix3x4fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x4fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix3x4fv(program, location, count, transpose, value);
+            context->programUniformMatrix3x4fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x4fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix3x4fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -17095,15 +17261,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniformMatrix4fv(context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4fv(context, programPacked, location, count,
+                                                            transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4fv(program, location, count, transpose, value);
+            context->programUniformMatrix4fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4fv, isCallValid, context, program, location, count,
+        ANGLE_CAPTURE(ProgramUniformMatrix4fv, isCallValid, context, programPacked, location, count,
                       transpose, value);
     }
 }
@@ -17124,16 +17291,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix4x2fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x2fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4x2fv(program, location, count, transpose, value);
+            context->programUniformMatrix4x2fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x2fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix4x2fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -17153,16 +17321,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProgramUniformMatrix4x3fv(
-                                              context, program, location, count, transpose, value));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x3fv(context, programPacked, location,
+                                                              count, transpose, value));
         if (isCallValid)
         {
-            context->programUniformMatrix4x3fv(program, location, count, transpose, value);
+            context->programUniformMatrix4x3fv(programPacked, location, count, transpose, value);
         }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x3fv, isCallValid, context, program, location, count,
-                      transpose, value);
+        ANGLE_CAPTURE(ProgramUniformMatrix4x3fv, isCallValid, context, programPacked, location,
+                      count, transpose, value);
     }
 }
 
@@ -17936,16 +18105,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        const ShaderProgramID *shadersPacked          = FromGL<const ShaderProgramID *>(shaders);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateShaderBinary(context, count, shaders, binaryformat, binary, length));
+             ValidateShaderBinary(context, count, shadersPacked, binaryformat, binary, length));
         if (isCallValid)
         {
-            context->shaderBinary(count, shaders, binaryformat, binary, length);
+            context->shaderBinary(count, shadersPacked, binaryformat, binary, length);
         }
-        ANGLE_CAPTURE(ShaderBinary, isCallValid, context, count, shaders, binaryformat, binary,
-                      length);
+        ANGLE_CAPTURE(ShaderBinary, isCallValid, context, count, shadersPacked, binaryformat,
+                      binary, length);
     }
 }
 
@@ -17964,14 +18134,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
-                            ValidateShaderSource(context, shader, count, string, length));
+                            ValidateShaderSource(context, shaderPacked, count, string, length));
         if (isCallValid)
         {
-            context->shaderSource(shader, count, string, length);
+            context->shaderSource(shaderPacked, count, string, length);
         }
-        ANGLE_CAPTURE(ShaderSource, isCallValid, context, shader, count, string, length);
+        ANGLE_CAPTURE(ShaderSource, isCallValid, context, shaderPacked, count, string, length);
     }
 }
 
@@ -19347,16 +19518,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTransformFeedbackVaryings(context, program, count, varyings, bufferMode));
+            (context->skipValidation() || ValidateTransformFeedbackVaryings(
+                                              context, programPacked, count, varyings, bufferMode));
         if (isCallValid)
         {
-            context->transformFeedbackVaryings(program, count, varyings, bufferMode);
+            context->transformFeedbackVaryings(programPacked, count, varyings, bufferMode);
         }
-        ANGLE_CAPTURE(TransformFeedbackVaryings, isCallValid, context, program, count, varyings,
-                      bufferMode);
+        ANGLE_CAPTURE(TransformFeedbackVaryings, isCallValid, context, programPacked, count,
+                      varyings, bufferMode);
     }
 }
 
@@ -19972,15 +20144,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformBlockBinding(context, program, uniformBlockIndex, uniformBlockBinding));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateUniformBlockBinding(context, programPacked, uniformBlockIndex,
+                                                        uniformBlockBinding));
         if (isCallValid)
         {
-            context->uniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+            context->uniformBlockBinding(programPacked, uniformBlockIndex, uniformBlockBinding);
         }
-        ANGLE_CAPTURE(UniformBlockBinding, isCallValid, context, program, uniformBlockIndex,
+        ANGLE_CAPTURE(UniformBlockBinding, isCallValid, context, programPacked, uniformBlockIndex,
                       uniformBlockBinding);
     }
 }
@@ -20289,13 +20462,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateUseProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateUseProgram(context, programPacked));
         if (isCallValid)
         {
-            context->useProgram(program);
+            context->useProgram(programPacked);
         }
-        ANGLE_CAPTURE(UseProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(UseProgram, isCallValid, context, programPacked);
     }
 }
 
@@ -20314,14 +20489,17 @@
     {
         ASSERT(context == GetValidGlobalContext());
         ProgramPipelineID pipelinePacked              = FromGL<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateUseProgramStages(context, pipelinePacked, stages, program));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUseProgramStages(context, pipelinePacked, stages, programPacked));
         if (isCallValid)
         {
-            context->useProgramStages(pipelinePacked, stages, program);
+            context->useProgramStages(pipelinePacked, stages, programPacked);
         }
-        ANGLE_CAPTURE(UseProgramStages, isCallValid, context, pipelinePacked, stages, program);
+        ANGLE_CAPTURE(UseProgramStages, isCallValid, context, pipelinePacked, stages,
+                      programPacked);
     }
 }
 
@@ -20333,13 +20511,15 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateValidateProgram(context, program));
+        bool isCallValid =
+            (context->skipValidation() || ValidateValidateProgram(context, programPacked));
         if (isCallValid)
         {
-            context->validateProgram(program);
+            context->validateProgram(programPacked);
         }
-        ANGLE_CAPTURE(ValidateProgram, isCallValid, context, program);
+        ANGLE_CAPTURE(ValidateProgram, isCallValid, context, programPacked);
     }
 }
 
@@ -21009,14 +21189,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                              = (context->skipValidation() ||
-                            ValidateBindUniformLocationCHROMIUM(context, program, location, name));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBindUniformLocationCHROMIUM(context, programPacked, location, name));
         if (isCallValid)
         {
-            context->bindUniformLocation(program, location, name);
+            context->bindUniformLocation(programPacked, location, name);
         }
-        ANGLE_CAPTURE(BindUniformLocationCHROMIUM, isCallValid, context, program, location, name);
+        ANGLE_CAPTURE(BindUniformLocationCHROMIUM, isCallValid, context, programPacked, location,
+                      name);
     }
 }
 
@@ -21731,15 +21914,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programsPacked                = FromGL<ShaderProgramID>(programs);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateBindFragmentInputLocationCHROMIUM(
-                                                             context, programs, location, name));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBindFragmentInputLocationCHROMIUM(context, programsPacked, location, name));
         if (isCallValid)
         {
-            context->bindFragmentInputLocation(programs, location, name);
+            context->bindFragmentInputLocation(programsPacked, location, name);
         }
-        ANGLE_CAPTURE(BindFragmentInputLocationCHROMIUM, isCallValid, context, programs, location,
-                      name);
+        ANGLE_CAPTURE(BindFragmentInputLocationCHROMIUM, isCallValid, context, programsPacked,
+                      location, name);
     }
 }
 
@@ -21760,16 +21945,18 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                              = (context->skipValidation() ||
                             ValidateProgramPathFragmentInputGenCHROMIUM(
-                                context, program, location, genMode, components, coeffs));
+                                context, programPacked, location, genMode, components, coeffs));
         if (isCallValid)
         {
-            context->programPathFragmentInputGen(program, location, genMode, components, coeffs);
+            context->programPathFragmentInputGen(programPacked, location, genMode, components,
+                                                 coeffs);
         }
-        ANGLE_CAPTURE(ProgramPathFragmentInputGenCHROMIUM, isCallValid, context, program, location,
-                      genMode, components, coeffs);
+        ANGLE_CAPTURE(ProgramPathFragmentInputGenCHROMIUM, isCallValid, context, programPacked,
+                      location, genMode, components, coeffs);
     }
 }
 
@@ -22082,15 +22269,16 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramivRobustANGLE(context, program, pname, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetProgramivRobustANGLE(context, programPacked, pname, bufSize,
+                                                            length, params));
         if (isCallValid)
         {
-            context->getProgramivRobust(program, pname, bufSize, length, params);
+            context->getProgramivRobust(programPacked, pname, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetProgramivRobustANGLE, isCallValid, context, program, pname, bufSize,
+        ANGLE_CAPTURE(GetProgramivRobustANGLE, isCallValid, context, programPacked, pname, bufSize,
                       length, params);
     }
 }
@@ -22143,16 +22331,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID shaderPacked                  = FromGL<ShaderProgramID>(shader);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
-             ValidateGetShaderivRobustANGLE(context, shader, pname, bufSize, length, params));
+             ValidateGetShaderivRobustANGLE(context, shaderPacked, pname, bufSize, length, params));
         if (isCallValid)
         {
-            context->getShaderivRobust(shader, pname, bufSize, length, params);
+            context->getShaderivRobust(shaderPacked, pname, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetShaderivRobustANGLE, isCallValid, context, shader, pname, bufSize, length,
-                      params);
+        ANGLE_CAPTURE(GetShaderivRobustANGLE, isCallValid, context, shaderPacked, pname, bufSize,
+                      length, params);
     }
 }
 
@@ -22236,16 +22425,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetUniformfvRobustANGLE(context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformfvRobustANGLE(context, programPacked, location,
+                                                            bufSize, length, params));
         if (isCallValid)
         {
-            context->getUniformfvRobust(program, location, bufSize, length, params);
+            context->getUniformfvRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetUniformfvRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetUniformfvRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -22265,16 +22455,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetUniformivRobustANGLE(context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformivRobustANGLE(context, programPacked, location,
+                                                            bufSize, length, params));
         if (isCallValid)
         {
-            context->getUniformivRobust(program, location, bufSize, length, params);
+            context->getUniformivRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetUniformivRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetUniformivRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -23034,16 +23225,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetUniformuivRobustANGLE(context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetUniformuivRobustANGLE(context, programPacked, location,
+                                                             bufSize, length, params));
         if (isCallValid)
         {
-            context->getUniformuivRobust(program, location, bufSize, length, params);
+            context->getUniformuivRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetUniformuivRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetUniformuivRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -23067,16 +23259,18 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetActiveUniformBlockivRobustANGLE(
-                                                             context, program, uniformBlockIndex,
-                                                             pname, bufSize, length, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetActiveUniformBlockivRobustANGLE(context, programPacked, uniformBlockIndex,
+                                                        pname, bufSize, length, params));
         if (isCallValid)
         {
-            context->getActiveUniformBlockivRobust(program, uniformBlockIndex, pname, bufSize,
+            context->getActiveUniformBlockivRobust(programPacked, uniformBlockIndex, pname, bufSize,
                                                    length, params);
         }
-        ANGLE_CAPTURE(GetActiveUniformBlockivRobustANGLE, isCallValid, context, program,
+        ANGLE_CAPTURE(GetActiveUniformBlockivRobustANGLE, isCallValid, context, programPacked,
                       uniformBlockIndex, pname, bufSize, length, params);
     }
 }
@@ -23343,16 +23537,18 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetProgramInterfaceivRobustANGLE(
-                                                             context, program, programInterface,
-                                                             pname, bufSize, length, params));
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramInterfaceivRobustANGLE(context, programPacked, programInterface,
+                                                      pname, bufSize, length, params));
         if (isCallValid)
         {
-            context->getProgramInterfaceivRobust(program, programInterface, pname, bufSize, length,
-                                                 params);
+            context->getProgramInterfaceivRobust(programPacked, programInterface, pname, bufSize,
+                                                 length, params);
         }
-        ANGLE_CAPTURE(GetProgramInterfaceivRobustANGLE, isCallValid, context, program,
+        ANGLE_CAPTURE(GetProgramInterfaceivRobustANGLE, isCallValid, context, programPacked,
                       programInterface, pname, bufSize, length, params);
     }
 }
@@ -23572,16 +23768,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnUniformfvRobustANGLE(context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetnUniformfvRobustANGLE(context, programPacked, location,
+                                                             bufSize, length, params));
         if (isCallValid)
         {
-            context->getnUniformfvRobust(program, location, bufSize, length, params);
+            context->getnUniformfvRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetnUniformfvRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetnUniformfvRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -23601,16 +23798,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnUniformivRobustANGLE(context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetnUniformivRobustANGLE(context, programPacked, location,
+                                                             bufSize, length, params));
         if (isCallValid)
         {
-            context->getnUniformivRobust(program, location, bufSize, length, params);
+            context->getnUniformivRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetnUniformivRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetnUniformivRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
@@ -23630,16 +23828,17 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
+        ShaderProgramID programPacked                 = FromGL<ShaderProgramID>(program);
         std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetnUniformuivRobustANGLE(
-                                              context, program, location, bufSize, length, params));
+        bool isCallValid                              = (context->skipValidation() ||
+                            ValidateGetnUniformuivRobustANGLE(context, programPacked, location,
+                                                              bufSize, length, params));
         if (isCallValid)
         {
-            context->getnUniformuivRobust(program, location, bufSize, length, params);
+            context->getnUniformuivRobust(programPacked, location, bufSize, length, params);
         }
-        ANGLE_CAPTURE(GetnUniformuivRobustANGLE, isCallValid, context, program, location, bufSize,
-                      length, params);
+        ANGLE_CAPTURE(GetnUniformuivRobustANGLE, isCallValid, context, programPacked, location,
+                      bufSize, length, params);
     }
 }
 
diff --git a/src/tests/gl_tests/VulkanUniformUpdatesTest.cpp b/src/tests/gl_tests/VulkanUniformUpdatesTest.cpp
index a995851..f64bb94 100644
--- a/src/tests/gl_tests/VulkanUniformUpdatesTest.cpp
+++ b/src/tests/gl_tests/VulkanUniformUpdatesTest.cpp
@@ -42,7 +42,7 @@
     {
         // Hack the angle!
         const gl::Context *context = static_cast<gl::Context *>(getEGLWindow()->getContext());
-        const gl::Program *program = context->getProgramResolveLink(handle);
+        const gl::Program *program = context->getProgramResolveLink({handle});
         return rx::vk::GetImpl(program);
     }