Adjust the amount of streaming buffer space required for instanced attributes.

TRAC #19489 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@970 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 8ca9c6e7
...@@ -2254,7 +2254,7 @@ GLenum Context::applyVertexBuffer(GLint first, GLsizei count, GLsizei instances) ...@@ -2254,7 +2254,7 @@ GLenum Context::applyVertexBuffer(GLint first, GLsizei count, GLsizei instances)
{ {
TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS]; TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS];
GLenum err = mVertexDataManager->prepareVertexData(first, count, attributes); GLenum err = mVertexDataManager->prepareVertexData(first, count, attributes, instances);
if (err != GL_NO_ERROR) if (err != GL_NO_ERROR)
{ {
return err; return err;
......
...@@ -65,7 +65,7 @@ VertexDataManager::~VertexDataManager() ...@@ -65,7 +65,7 @@ VertexDataManager::~VertexDataManager()
} }
} }
std::size_t VertexDataManager::writeAttributeData(ArrayVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute) std::size_t VertexDataManager::writeAttributeData(ArrayVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute, GLsizei instances)
{ {
Buffer *buffer = attribute.mBoundBuffer.get(); Buffer *buffer = attribute.mBoundBuffer.get();
...@@ -78,7 +78,7 @@ std::size_t VertexDataManager::writeAttributeData(ArrayVertexBuffer *vertexBuffe ...@@ -78,7 +78,7 @@ std::size_t VertexDataManager::writeAttributeData(ArrayVertexBuffer *vertexBuffe
if (vertexBuffer) if (vertexBuffer)
{ {
output = vertexBuffer->map(attribute, spaceRequired(attribute, count), &streamOffset); output = vertexBuffer->map(attribute, spaceRequired(attribute, count, instances), &streamOffset);
} }
if (output == NULL) if (output == NULL)
...@@ -116,7 +116,7 @@ std::size_t VertexDataManager::writeAttributeData(ArrayVertexBuffer *vertexBuffe ...@@ -116,7 +116,7 @@ std::size_t VertexDataManager::writeAttributeData(ArrayVertexBuffer *vertexBuffe
return streamOffset; return streamOffset;
} }
GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *translated) GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *translated, GLsizei instances)
{ {
if (!mStreamingBuffer) if (!mStreamingBuffer)
{ {
...@@ -144,7 +144,7 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat ...@@ -144,7 +144,7 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat
if (staticBuffer->size() == 0) if (staticBuffer->size() == 0)
{ {
int totalCount = elementsInBuffer(attribs[i], buffer->size()); int totalCount = elementsInBuffer(attribs[i], buffer->size());
staticBuffer->addRequiredSpace(spaceRequired(attribs[i], totalCount)); staticBuffer->addRequiredSpace(spaceRequired(attribs[i], totalCount, 0));
} }
else if (staticBuffer->lookupAttribute(attribs[i]) == -1) else if (staticBuffer->lookupAttribute(attribs[i]) == -1)
{ {
...@@ -159,19 +159,19 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat ...@@ -159,19 +159,19 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat
if (staticBuffer == previousStaticBuffer) if (staticBuffer == previousStaticBuffer)
{ {
mStreamingBuffer->addRequiredSpace(spaceRequired(attribs[previous], count)); mStreamingBuffer->addRequiredSpace(spaceRequired(attribs[previous], count, instances));
} }
} }
} }
mStreamingBuffer->addRequiredSpace(spaceRequired(attribs[i], count)); mStreamingBuffer->addRequiredSpace(spaceRequired(attribs[i], count, instances));
buffer->invalidateStaticData(); buffer->invalidateStaticData();
} }
} }
else else
{ {
mStreamingBuffer->addRequiredSpace(spaceRequired(attribs[i], count)); mStreamingBuffer->addRequiredSpace(spaceRequired(attribs[i], count, instances));
} }
} }
} }
...@@ -225,7 +225,7 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat ...@@ -225,7 +225,7 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat
int totalCount = elementsInBuffer(attribs[i], buffer->size()); int totalCount = elementsInBuffer(attribs[i], buffer->size());
int startIndex = attribs[i].mOffset / attribs[i].stride(); int startIndex = attribs[i].mOffset / attribs[i].stride();
streamOffset = writeAttributeData(staticBuffer, -startIndex, totalCount, attribs[i]); streamOffset = writeAttributeData(staticBuffer, -startIndex, totalCount, attribs[i], 0);
} }
if (streamOffset != -1) if (streamOffset != -1)
...@@ -235,7 +235,7 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat ...@@ -235,7 +235,7 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat
} }
else else
{ {
streamOffset = writeAttributeData(mStreamingBuffer, start, count, attribs[i]); streamOffset = writeAttributeData(mStreamingBuffer, start, count, attribs[i], instances);
} }
if (streamOffset == -1) if (streamOffset == -1)
...@@ -304,9 +304,18 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat ...@@ -304,9 +304,18 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat
return GL_NO_ERROR; return GL_NO_ERROR;
} }
std::size_t VertexDataManager::spaceRequired(const VertexAttribute &attrib, std::size_t count) const std::size_t VertexDataManager::spaceRequired(const VertexAttribute &attrib, std::size_t count, GLsizei instances) const
{ {
return formatConverter(attrib).outputElementSize * count; size_t elementSize = formatConverter(attrib).outputElementSize;
if (instances == 0 || attrib.mDivisor == 0)
{
return elementSize * count;
}
else
{
return elementSize * ((instances + attrib.mDivisor - 1) / attrib.mDivisor);
}
} }
// Mapping from OpenGL-ES vertex attrib type to D3D decl type: // Mapping from OpenGL-ES vertex attrib type to D3D decl type:
......
...@@ -118,13 +118,13 @@ class VertexDataManager ...@@ -118,13 +118,13 @@ class VertexDataManager
void dirtyCurrentValue(int index) { mDirtyCurrentValue[index] = true; } void dirtyCurrentValue(int index) { mDirtyCurrentValue[index] = true; }
GLenum prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *outAttribs); GLenum prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *outAttribs, GLsizei instances);
private: private:
DISALLOW_COPY_AND_ASSIGN(VertexDataManager); DISALLOW_COPY_AND_ASSIGN(VertexDataManager);
std::size_t spaceRequired(const VertexAttribute &attrib, std::size_t count) const; std::size_t spaceRequired(const VertexAttribute &attrib, std::size_t count, GLsizei instances) const;
std::size_t writeAttributeData(ArrayVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute); std::size_t writeAttributeData(ArrayVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute, GLsizei instances);
Context *const mContext; Context *const mContext;
IDirect3DDevice9 *const mDevice; IDirect3DDevice9 *const mDevice;
......
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