Introduce a gl::BufferState class.

This state can share vital pieces of information with the impl.
The most elementary state is the buffer size, which then the
impl doesn't need to replicate.

BUG=angleproject:1579

Change-Id: I341393c64a6e49de65c1d53b1bad2fa143209862
Reviewed-on: https://chromium-review.googlesource.com/406644
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/tests/perf_tests/IndexDataManagerTest.cpp b/src/tests/perf_tests/IndexDataManagerTest.cpp
index df7bc24..696b81b 100644
--- a/src/tests/perf_tests/IndexDataManagerTest.cpp
+++ b/src/tests/perf_tests/IndexDataManagerTest.cpp
@@ -11,6 +11,7 @@
 
 #include <gmock/gmock.h>
 
+#include "angle_unittests_utils.h"
 #include "libANGLE/renderer/d3d/BufferD3D.h"
 #include "libANGLE/renderer/d3d/IndexBuffer.h"
 #include "libANGLE/renderer/d3d/IndexDataManager.h"
@@ -75,11 +76,7 @@
 class MockBufferD3D : public rx::BufferD3D
 {
   public:
-    MockBufferD3D(rx::BufferFactoryD3D *factory)
-        : BufferD3D(factory),
-          mData()
-    {
-    }
+    MockBufferD3D(rx::BufferFactoryD3D *factory) : BufferD3D(mockState, factory), mData() {}
 
     // BufferImpl
     gl::Error setData(GLenum target, const void *data, size_t size, GLenum) override
@@ -112,9 +109,30 @@
     }
 
   private:
+    gl::BufferState mockState;
     std::vector<uint8_t> mData;
 };
 
+class MockGLFactoryD3D : public rx::MockGLFactory
+{
+  public:
+    MockGLFactoryD3D(MockBufferFactoryD3D *bufferFactory) : mBufferFactory(bufferFactory) {}
+
+    rx::BufferImpl *createBuffer(const gl::BufferState &state) override
+    {
+        MockBufferD3D *mockBufferD3D = new MockBufferD3D(mBufferFactory);
+
+        EXPECT_CALL(*mBufferFactory, createVertexBuffer())
+            .WillOnce(Return(nullptr))
+            .RetiresOnSaturation();
+        mockBufferD3D->initializeStaticData();
+
+        return mockBufferD3D;
+    }
+
+    MockBufferFactoryD3D *mBufferFactory;
+};
+
 class IndexDataManagerPerfTest : public ANGLEPerfTest
 {
   public:
@@ -125,27 +143,19 @@
     rx::IndexDataManager mIndexDataManager;
     GLsizei mIndexCount;
     unsigned int mBufferSize;
-    MockBufferFactoryD3D mMockFactory;
+    MockBufferFactoryD3D mMockBufferFactory;
+    MockGLFactoryD3D mMockGLFactory;
     gl::Buffer mIndexBuffer;
 };
 
-MockBufferD3D *InitMockBufferD3D(MockBufferFactoryD3D *mockFactory)
-{
-    MockBufferD3D *mockBufferD3D = new MockBufferD3D(mockFactory);
-
-    EXPECT_CALL(*mockFactory, createVertexBuffer()).WillOnce(Return(nullptr)).RetiresOnSaturation();
-    mockBufferD3D->initializeStaticData();
-
-    return mockBufferD3D;
-}
-
 IndexDataManagerPerfTest::IndexDataManagerPerfTest()
     : ANGLEPerfTest("IndexDataManger", "_run"),
-      mIndexDataManager(&mMockFactory, rx::RENDERER_D3D11),
+      mIndexDataManager(&mMockBufferFactory, rx::RENDERER_D3D11),
       mIndexCount(4000),
       mBufferSize(mIndexCount * sizeof(GLushort)),
-      mMockFactory(mBufferSize, GL_UNSIGNED_SHORT),
-      mIndexBuffer(InitMockBufferD3D(&mMockFactory), 1)
+      mMockBufferFactory(mBufferSize, GL_UNSIGNED_SHORT),
+      mMockGLFactory(&mMockBufferFactory),
+      mIndexBuffer(&mMockGLFactory, 1)
 {
     std::vector<GLushort> indexData(mIndexCount);
     for (GLsizei index = 0; index < mIndexCount; ++index)
@@ -173,4 +183,4 @@
     run();
 }
 
-}
+}  // anonymous namespace