Capture/Replay: Handle Gen/Delete ProgramPipelines

Enable the test that failed compilation before.

Bug: angleproject:6180
Change-Id: Id15a5b82c8ee5dab291090375d15ce93b8908535
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3139900
Commit-Queue: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/capture/FrameCapture.cpp b/src/libANGLE/capture/FrameCapture.cpp
index 7e85060..84d3db6 100644
--- a/src/libANGLE/capture/FrameCapture.cpp
+++ b/src/libANGLE/capture/FrameCapture.cpp
@@ -4912,6 +4912,35 @@
             break;
         }
 
+        case EntryPoint::GLDeleteProgramPipelines:
+        case EntryPoint::GLDeleteProgramPipelinesEXT:
+        {
+            GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
+            const gl::ProgramPipelineID *pipelineIDs =
+                call.params
+                    .getParam("pipelinesPacked", ParamType::TProgramPipelineIDConstPointer, 1)
+                    .value.ProgramPipelineIDPointerVal;
+            for (GLsizei i = 0; i < count; i++)
+            {
+                handleDeletedResource(pipelineIDs[i]);
+            }
+            break;
+        }
+
+        case EntryPoint::GLGenProgramPipelines:
+        case EntryPoint::GLGenProgramPipelinesEXT:
+        {
+            GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
+            const gl::ProgramPipelineID *pipelineIDs =
+                call.params.getParam("pipelinesPacked", ParamType::TProgramPipelineIDPointer, 1)
+                    .value.ProgramPipelineIDPointerVal;
+            for (GLsizei i = 0; i < count; i++)
+            {
+                handleGennedResource(pipelineIDs[i]);
+            }
+            break;
+        }
+
         case EntryPoint::GLDeleteSync:
         {
             GLsync sync = call.params.getParam("sync", ParamType::TGLsync, 0).value.GLsyncVal;
diff --git a/src/libANGLE/capture/capture_gles_ext_params.cpp b/src/libANGLE/capture/capture_gles_ext_params.cpp
index 2b65095..a124253 100644
--- a/src/libANGLE/capture/capture_gles_ext_params.cpp
+++ b/src/libANGLE/capture/capture_gles_ext_params.cpp
@@ -3567,7 +3567,7 @@
                                                       const ProgramPipelineID *pipelinesPacked,
                                                       angle::ParamCapture *paramCapture)
 {
-    UNIMPLEMENTED();
+    CaptureArray(pipelinesPacked, n, paramCapture);
 }
 
 void CaptureGenProgramPipelinesEXT_pipelinesPacked(const State &glState,
@@ -3576,7 +3576,7 @@
                                                    ProgramPipelineID *pipelinesPacked,
                                                    angle::ParamCapture *paramCapture)
 {
-    UNIMPLEMENTED();
+    CaptureGenHandles(n, pipelinesPacked, paramCapture);
 }
 
 void CaptureGetProgramPipelineInfoLogEXT_length(const State &glState,
diff --git a/src/tests/capture_replay_tests/capture_replay_expectations.txt b/src/tests/capture_replay_tests/capture_replay_expectations.txt
index 1dd3df4..55294cc 100644
--- a/src/tests/capture_replay_tests/capture_replay_expectations.txt
+++ b/src/tests/capture_replay_tests/capture_replay_expectations.txt
@@ -152,7 +152,6 @@
 6335 DEBUG : VulkanExternalImageTest.ShouldImportSemaphoreOpaqueFd/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
 
 # Skip because CompileFailed
-6180 : ProgramPipelineTest.GenerateProgramPipelineObjectEXT/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
 6180 : ReadPixelsPBOTest.ExistingDataPreserved/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
 6180 : UniformTestES3.ReturnsOnlyOneArrayElement/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE