ES31: Add support for bindImageTexture on GL backend

This patch refers to https://chromium-review.googlesource.com/c/380636/

BUG=angleproject:1987

Change-Id: If621eed6ecaa7298214843a2a133801ca1487b03
Reviewed-on: https://chromium-review.googlesource.com/462088
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/MemoryProgramCache.cpp b/src/libANGLE/MemoryProgramCache.cpp
index 7853a00..a7c6dc1 100644
--- a/src/libANGLE/MemoryProgramCache.cpp
+++ b/src/libANGLE/MemoryProgramCache.cpp
@@ -198,10 +198,9 @@
                   "All bits of DrawBufferMask can be contained in an uint32_t");
     state->mActiveOutputVariables = stream.readInt<uint32_t>();
 
-    unsigned int low            = stream.readInt<unsigned int>();
-    unsigned int high           = stream.readInt<unsigned int>();
-    state->mSamplerUniformRange = RangeUI(low, high);
-
+    unsigned int samplerRangeLow  = stream.readInt<unsigned int>();
+    unsigned int samplerRangeHigh = stream.readInt<unsigned int>();
+    state->mSamplerUniformRange   = RangeUI(samplerRangeLow, samplerRangeHigh);
     unsigned int samplerCount = stream.readInt<unsigned int>();
     for (unsigned int samplerIndex = 0; samplerIndex < samplerCount; ++samplerIndex)
     {
@@ -210,6 +209,17 @@
         state->mSamplerBindings.emplace_back(SamplerBinding(textureType, bindingCount));
     }
 
+    unsigned int imageRangeLow  = stream.readInt<unsigned int>();
+    unsigned int imageRangeHigh = stream.readInt<unsigned int>();
+    state->mImageUniformRange   = RangeUI(imageRangeLow, imageRangeHigh);
+    unsigned int imageCount     = stream.readInt<unsigned int>();
+    for (unsigned int imageIndex = 0; imageIndex < imageCount; ++imageIndex)
+    {
+        GLuint boundImageUnit = stream.readInt<unsigned int>();
+        size_t elementCount   = stream.readInt<size_t>();
+        state->mImageBindings.emplace_back(ImageBinding(boundImageUnit, elementCount));
+    }
+
     return program->getImplementation()->load(context, infoLog, &stream);
 }
 
@@ -343,6 +353,16 @@
         stream.writeInt(samplerBinding.boundTextureUnits.size());
     }
 
+    stream.writeInt(state.getImageUniformRange().low());
+    stream.writeInt(state.getImageUniformRange().high());
+
+    stream.writeInt(state.getImageBindings().size());
+    for (const auto &imageBinding : state.getImageBindings())
+    {
+        stream.writeInt(imageBinding.boundImageUnit);
+        stream.writeInt(imageBinding.elementCount);
+    }
+
     program->getImplementation()->save(&stream);
 
     ASSERT(binaryOut);