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;
+ }
+}
+
}