Only allocate the streaming index buffers when they are first needed.

BUG=angle:520

Change-Id: I111e4fd830ad19f6a4ff50749ba891fc14f9154b
Reviewed-on: https://chromium-review.googlesource.com/217100
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libGLESv2/renderer/d3d/IndexDataManager.cpp b/src/libGLESv2/renderer/d3d/IndexDataManager.cpp
index a2c5738..cd775c1 100644
--- a/src/libGLESv2/renderer/d3d/IndexDataManager.cpp
+++ b/src/libGLESv2/renderer/d3d/IndexDataManager.cpp
@@ -58,26 +58,10 @@
 }
 
 IndexDataManager::IndexDataManager(Renderer *renderer)
-    : mRenderer(renderer)
+    : mRenderer(renderer),
+      mStreamingBufferShort(NULL),
+      mStreamingBufferInt(NULL)
 {
-    mStreamingBufferShort = new StreamingIndexBufferInterface(mRenderer);
-    if (!mStreamingBufferShort->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_SHORT))
-    {
-        SafeDelete(mStreamingBufferShort);
-    }
-
-    mStreamingBufferInt = new StreamingIndexBufferInterface(mRenderer);
-    if (!mStreamingBufferInt->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_INT))
-    {
-        SafeDelete(mStreamingBufferInt);
-    }
-
-    if (!mStreamingBufferShort)
-    {
-        // Make sure both buffers are deleted.
-        SafeDelete(mStreamingBufferInt);
-        ERR("Failed to allocate the streaming index buffer(s).");
-    }
 }
 
 IndexDataManager::~IndexDataManager()
@@ -88,11 +72,6 @@
 
 GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer *buffer, const GLvoid *indices, TranslatedIndexData *translated)
 {
-    if (!mStreamingBufferShort)
-    {
-        return GL_OUT_OF_MEMORY;
-    }
-
     const gl::Type &typeInfo = gl::GetTypeInfo(type);
 
     GLenum destinationIndexType = (type == GL_UNSIGNED_INT) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
@@ -164,7 +143,11 @@
 
     if (!directStorage && !indexBuffer)
     {
-        indexBuffer = (destinationIndexType == GL_UNSIGNED_INT) ? mStreamingBufferInt : mStreamingBufferShort;
+        GLenum err = getStreamingIndexBuffer(destinationIndexType, &indexBuffer);
+        if (err != GL_NO_ERROR)
+        {
+            return err;
+        }
 
         unsigned int convertCount = count;
 
@@ -234,4 +217,43 @@
     return GL_NO_ERROR;
 }
 
+GLenum IndexDataManager::getStreamingIndexBuffer(GLenum destinationIndexType, IndexBufferInterface **outBuffer)
+{
+    ASSERT(outBuffer);
+    if (destinationIndexType == GL_UNSIGNED_INT)
+    {
+        if (!mStreamingBufferInt)
+        {
+            mStreamingBufferInt = new StreamingIndexBufferInterface(mRenderer);
+            if (!mStreamingBufferInt->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_INT))
+            {
+                SafeDelete(mStreamingBufferInt);
+                ERR("Failed to allocate the streaming GL_UNSIGNED_INT index buffer.");
+                return GL_OUT_OF_MEMORY;
+            }
+        }
+
+        *outBuffer = mStreamingBufferInt;
+        return GL_NO_ERROR;
+    }
+    else
+    {
+        ASSERT(destinationIndexType == GL_UNSIGNED_SHORT);
+
+        if (!mStreamingBufferShort)
+        {
+            mStreamingBufferShort = new StreamingIndexBufferInterface(mRenderer);
+            if (!mStreamingBufferShort->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_SHORT))
+            {
+                SafeDelete(mStreamingBufferShort);
+                ERR("Failed to allocate the streaming GL_UNSIGNED_SHORT index buffer.");
+                return GL_OUT_OF_MEMORY;
+            }
+        }
+
+        *outBuffer = mStreamingBufferShort;
+        return GL_NO_ERROR;
+    }
+}
+
 }