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 ...@@ -128,9 +128,11 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
intptr_t offset = reinterpret_cast<intptr_t>(indices); intptr_t offset = reinterpret_cast<intptr_t>(indices);
bool alignedOffset = false; bool alignedOffset = false;
BufferStorage *storage = NULL;
if (buffer != NULL) if (buffer != NULL)
{ {
BufferStorage *storage = buffer->getStorage(); storage = buffer->getStorage();
switch (type) switch (type)
{ {
...@@ -152,10 +154,18 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer ...@@ -152,10 +154,18 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
StaticIndexBufferInterface *staticBuffer = buffer ? buffer->getStaticIndexBuffer() : NULL; StaticIndexBufferInterface *staticBuffer = buffer ? buffer->getStaticIndexBuffer() : NULL;
IndexBufferInterface *indexBuffer = streamingBuffer; IndexBufferInterface *indexBuffer = streamingBuffer;
BufferStorage *storage = buffer ? buffer->getStorage() : NULL; bool directStorage = alignedOffset && storage && storage->supportsDirectBinding() &&
destinationIndexType == type;
UINT streamOffset = 0; 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; indexBuffer = staticBuffer;
streamOffset = staticBuffer->lookupRange(offset, count, &translated->minIndex, &translated->maxIndex); streamOffset = staticBuffer->lookupRange(offset, count, &translated->minIndex, &translated->maxIndex);
...@@ -219,8 +229,9 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer ...@@ -219,8 +229,9 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
} }
} }
translated->storage = directStorage ? storage : NULL;
translated->indexBuffer = indexBuffer->getIndexBuffer(); translated->indexBuffer = indexBuffer->getIndexBuffer();
translated->serial = indexBuffer->getSerial(); translated->serial = directStorage ? storage->getSerial() : indexBuffer->getSerial();
translated->startIndex = streamOffset / indexTypeSize(destinationIndexType); translated->startIndex = streamOffset / indexTypeSize(destinationIndexType);
translated->startOffset = streamOffset; translated->startOffset = streamOffset;
......
...@@ -35,6 +35,7 @@ struct TranslatedIndexData ...@@ -35,6 +35,7 @@ struct TranslatedIndexData
UINT startOffset; // In bytes UINT startOffset; // In bytes
IndexBuffer *indexBuffer; IndexBuffer *indexBuffer;
BufferStorage *storage;
unsigned int serial; unsigned int serial;
}; };
......
...@@ -906,12 +906,28 @@ GLenum Renderer11::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementAr ...@@ -906,12 +906,28 @@ GLenum Renderer11::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementAr
if (err == GL_NO_ERROR) 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); IndexBuffer11* indexBuffer = IndexBuffer11::makeIndexBuffer11(indexInfo->indexBuffer);
mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexInfo->startOffset); mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexInfo->startOffset);
mAppliedIBSerial = indexInfo->serial; mAppliedIBSerial = indexInfo->serial;
mAppliedStorageIBSerial = 0;
mAppliedIBOffset = indexInfo->startOffset; mAppliedIBOffset = indexInfo->startOffset;
} }
} }
...@@ -1046,6 +1062,7 @@ void Renderer11::drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, ...@@ -1046,6 +1062,7 @@ void Renderer11::drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices,
mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexBufferOffset); mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexBufferOffset);
mAppliedIBSerial = mLineLoopIB->getSerial(); mAppliedIBSerial = mLineLoopIB->getSerial();
mAppliedStorageIBSerial = 0;
mAppliedIBOffset = indexBufferOffset; mAppliedIBOffset = indexBufferOffset;
} }
...@@ -1144,6 +1161,7 @@ void Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indic ...@@ -1144,6 +1161,7 @@ void Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indic
mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexBufferOffset); mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexBufferOffset);
mAppliedIBSerial = mTriangleFanIB->getSerial(); mAppliedIBSerial = mTriangleFanIB->getSerial();
mAppliedStorageIBSerial = 0;
mAppliedIBOffset = indexBufferOffset; mAppliedIBOffset = indexBufferOffset;
} }
...@@ -1696,6 +1714,7 @@ void Renderer11::markAllStateDirty() ...@@ -1696,6 +1714,7 @@ void Renderer11::markAllStateDirty()
mForceSetViewport = true; mForceSetViewport = true;
mAppliedIBSerial = 0; mAppliedIBSerial = 0;
mAppliedStorageIBSerial = 0;
mAppliedIBOffset = 0; mAppliedIBOffset = 0;
mAppliedProgramBinarySerial = 0; mAppliedProgramBinarySerial = 0;
......
...@@ -284,6 +284,7 @@ class Renderer11 : public Renderer ...@@ -284,6 +284,7 @@ class Renderer11 : public Renderer
float mCurFar; float mCurFar;
unsigned int mAppliedIBSerial; unsigned int mAppliedIBSerial;
unsigned int mAppliedStorageIBSerial;
unsigned int mAppliedIBOffset; unsigned int mAppliedIBOffset;
unsigned int mAppliedProgramBinarySerial; unsigned int mAppliedProgramBinarySerial;
......
...@@ -1362,6 +1362,9 @@ GLenum Renderer9::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArr ...@@ -1362,6 +1362,9 @@ GLenum Renderer9::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArr
if (err == GL_NO_ERROR) if (err == GL_NO_ERROR)
{ {
// Directly binding the storage buffer is not supported for d3d9
ASSERT(indexInfo->storage == NULL);
if (indexInfo->serial != mAppliedIBSerial) if (indexInfo->serial != mAppliedIBSerial)
{ {
IndexBuffer9* indexBuffer = IndexBuffer9::makeIndexBuffer9(indexInfo->indexBuffer); 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