Index data manager uses direct buffers for indices if possible.
TRAC #22297
Signed-off-by: Jamie Madill
Signed-off-by: Nicolas Capens
Author: Geoff Lang
git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1887 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/IndexDataManager.cpp b/src/libGLESv2/renderer/IndexDataManager.cpp
index e58a5ae..783e46a 100644
--- a/src/libGLESv2/renderer/IndexDataManager.cpp
+++ b/src/libGLESv2/renderer/IndexDataManager.cpp
@@ -128,9 +128,11 @@
intptr_t offset = reinterpret_cast<intptr_t>(indices);
bool alignedOffset = false;
+ BufferStorage *storage = NULL;
+
if (buffer != NULL)
{
- BufferStorage *storage = buffer->getStorage();
+ storage = buffer->getStorage();
switch (type)
{
@@ -152,10 +154,18 @@
StaticIndexBufferInterface *staticBuffer = buffer ? buffer->getStaticIndexBuffer() : NULL;
IndexBufferInterface *indexBuffer = streamingBuffer;
- BufferStorage *storage = buffer ? buffer->getStorage() : NULL;
+ bool directStorage = alignedOffset && storage && storage->supportsDirectBinding() &&
+ destinationIndexType == type;
UINT streamOffset = 0;
- if (staticBuffer && staticBuffer->getIndexType() == type && alignedOffset)
+ if (directStorage)
+ {
+ indexBuffer = streamingBuffer;
+ streamOffset = offset;
+ storage->markBufferUsage();
+ computeRange(type, indices, count, &translated->minIndex, &translated->maxIndex);
+ }
+ else if (staticBuffer && staticBuffer->getIndexType() == type && alignedOffset)
{
indexBuffer = staticBuffer;
streamOffset = staticBuffer->lookupRange(offset, count, &translated->minIndex, &translated->maxIndex);
@@ -219,8 +229,9 @@
}
}
+ translated->storage = directStorage ? storage : NULL;
translated->indexBuffer = indexBuffer->getIndexBuffer();
- translated->serial = indexBuffer->getSerial();
+ translated->serial = directStorage ? storage->getSerial() : indexBuffer->getSerial();
translated->startIndex = streamOffset / indexTypeSize(destinationIndexType);
translated->startOffset = streamOffset;