ES31: Add atomic counter buffer data size

BUG=angleproject:1729
TEST=dEQP-GLES31.functional.ssbo.layout.*
     dEQP-GLES31.functional.compute.basic.atomic_counter*

Change-Id: Ic78c0f089fd539c0b1064e8405d63505456dbc01
Reviewed-on: https://chromium-review.googlesource.com/777958
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/gl/ProgramGL.cpp b/src/libANGLE/renderer/gl/ProgramGL.cpp
index 16455de..fc4aebb 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -635,6 +635,32 @@
     return true;
 }
 
+void ProgramGL::getAtomicCounterBufferSizeMap(std::map<int, unsigned int> *sizeMapOut) const
+{
+    if (mFunctions->getProgramInterfaceiv == nullptr)
+    {
+        return;
+    }
+
+    int resourceCount = 0;
+    mFunctions->getProgramInterfaceiv(mProgramID, GL_ATOMIC_COUNTER_BUFFER, GL_ACTIVE_RESOURCES,
+                                      &resourceCount);
+
+    for (int index = 0; index < resourceCount; index++)
+    {
+        constexpr int kPropCount             = 2;
+        std::array<GLenum, kPropCount> props = {{GL_BUFFER_BINDING, GL_BUFFER_DATA_SIZE}};
+        std::array<GLint, kPropCount> params;
+        GLsizei length;
+        mFunctions->getProgramResourceiv(mProgramID, GL_ATOMIC_COUNTER_BUFFER, index, kPropCount,
+                                         props.data(), kPropCount, &length, params.data());
+        ASSERT(kPropCount == length);
+        int bufferBinding           = params[0];
+        unsigned int bufferDataSize = params[1];
+        sizeMapOut->insert(std::pair<int, unsigned int>(bufferBinding, bufferDataSize));
+    }
+}
+
 void ProgramGL::setPathFragmentInputGen(const std::string &inputName,
                                         GLenum genMode,
                                         GLint components,
@@ -889,6 +915,11 @@
     };
     resources.shaderStorageBlockLinker.linkBlocks(getShaderStorageBlockSize,
                                                   getShaderStorageBlockMemberInfo);
+
+    // Gather atomic counter buffer info.
+    std::map<int, unsigned int> sizeMap;
+    getAtomicCounterBufferSizeMap(&sizeMap);
+    resources.atomicCounterBufferLinker.link(sizeMap);
 }
 
 }  // namespace rx