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;