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
parent db1899ce
......@@ -128,9 +128,11 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
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 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
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 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
}
}
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;
......
......@@ -35,6 +35,7 @@ struct TranslatedIndexData
UINT startOffset; // In bytes
IndexBuffer *indexBuffer;
BufferStorage *storage;
unsigned int serial;
};
......
......@@ -906,12 +906,28 @@ GLenum Renderer11::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementAr
if (err == GL_NO_ERROR)
{
if (indexInfo->serial != mAppliedIBSerial || indexInfo->startOffset != mAppliedIBOffset)
if (indexInfo->storage)
{
if (indexInfo->serial != mAppliedStorageIBSerial || indexInfo->startOffset != mAppliedIBOffset)
{
BufferStorage11 *storage = BufferStorage11::makeBufferStorage11(indexInfo->storage);
IndexBuffer11* indexBuffer = IndexBuffer11::makeIndexBuffer11(indexInfo->indexBuffer);
mDeviceContext->IASetIndexBuffer(storage->getBuffer(), indexBuffer->getIndexFormat(), indexInfo->startOffset);
mAppliedIBSerial = 0;
mAppliedStorageIBSerial = storage->getSerial();
mAppliedIBOffset = indexInfo->startOffset;
}
}
else if (indexInfo->serial != mAppliedIBSerial || indexInfo->startOffset != mAppliedIBOffset)
{
IndexBuffer11* indexBuffer = IndexBuffer11::makeIndexBuffer11(indexInfo->indexBuffer);
mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexInfo->startOffset);
mAppliedIBSerial = indexInfo->serial;
mAppliedStorageIBSerial = 0;
mAppliedIBOffset = indexInfo->startOffset;
}
}
......@@ -1046,6 +1062,7 @@ void Renderer11::drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices,
mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexBufferOffset);
mAppliedIBSerial = mLineLoopIB->getSerial();
mAppliedStorageIBSerial = 0;
mAppliedIBOffset = indexBufferOffset;
}
......@@ -1144,6 +1161,7 @@ void Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indic
mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexBufferOffset);
mAppliedIBSerial = mTriangleFanIB->getSerial();
mAppliedStorageIBSerial = 0;
mAppliedIBOffset = indexBufferOffset;
}
......@@ -1696,6 +1714,7 @@ void Renderer11::markAllStateDirty()
mForceSetViewport = true;
mAppliedIBSerial = 0;
mAppliedStorageIBSerial = 0;
mAppliedIBOffset = 0;
mAppliedProgramBinarySerial = 0;
......
......@@ -284,6 +284,7 @@ class Renderer11 : public Renderer
float mCurFar;
unsigned int mAppliedIBSerial;
unsigned int mAppliedStorageIBSerial;
unsigned int mAppliedIBOffset;
unsigned int mAppliedProgramBinarySerial;
......
......@@ -1362,6 +1362,9 @@ GLenum Renderer9::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArr
if (err == GL_NO_ERROR)
{
// Directly binding the storage buffer is not supported for d3d9
ASSERT(indexInfo->storage == NULL);
if (indexInfo->serial != mAppliedIBSerial)
{
IndexBuffer9* indexBuffer = IndexBuffer9::makeIndexBuffer9(indexInfo->indexBuffer);
......
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