Commit 1c134e6c by Geoff Lang

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

BUG=angle:520 Change-Id: I111e4fd830ad19f6a4ff50749ba891fc14f9154b Reviewed-on: https://chromium-review.googlesource.com/217100Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 23ba30e4
...@@ -58,26 +58,10 @@ static void ConvertIndices(GLenum sourceType, GLenum destinationType, const void ...@@ -58,26 +58,10 @@ static void ConvertIndices(GLenum sourceType, GLenum destinationType, const void
} }
IndexDataManager::IndexDataManager(Renderer *renderer) 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() IndexDataManager::~IndexDataManager()
...@@ -88,11 +72,6 @@ IndexDataManager::~IndexDataManager() ...@@ -88,11 +72,6 @@ IndexDataManager::~IndexDataManager()
GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer *buffer, const GLvoid *indices, TranslatedIndexData *translated) 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); const gl::Type &typeInfo = gl::GetTypeInfo(type);
GLenum destinationIndexType = (type == GL_UNSIGNED_INT) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT; GLenum destinationIndexType = (type == GL_UNSIGNED_INT) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
...@@ -164,7 +143,11 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer ...@@ -164,7 +143,11 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
if (!directStorage && !indexBuffer) 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; unsigned int convertCount = count;
...@@ -234,4 +217,43 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer ...@@ -234,4 +217,43 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
return GL_NO_ERROR; 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;
}
}
} }
...@@ -27,6 +27,7 @@ class Buffer; ...@@ -27,6 +27,7 @@ class Buffer;
namespace rx namespace rx
{ {
class IndexBufferInterface;
class StaticIndexBufferInterface; class StaticIndexBufferInterface;
class StreamingIndexBufferInterface; class StreamingIndexBufferInterface;
class IndexBuffer; class IndexBuffer;
...@@ -54,6 +55,8 @@ class IndexDataManager ...@@ -54,6 +55,8 @@ class IndexDataManager
GLenum prepareIndexData(GLenum type, GLsizei count, gl::Buffer *arrayElementBuffer, const GLvoid *indices, TranslatedIndexData *translated); GLenum prepareIndexData(GLenum type, GLsizei count, gl::Buffer *arrayElementBuffer, const GLvoid *indices, TranslatedIndexData *translated);
private: private:
GLenum getStreamingIndexBuffer(GLenum destinationIndexType, IndexBufferInterface **outBuffer);
DISALLOW_COPY_AND_ASSIGN(IndexDataManager); DISALLOW_COPY_AND_ASSIGN(IndexDataManager);
Renderer *const mRenderer; Renderer *const mRenderer;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment