Commit 8299bb0f by Shannon Woods

Store XFB buffers in a vector in State.

BUG=angle:685 Change-Id: I4bff717f716ba21633c59244560fd56f41f587ed Reviewed-on: https://chromium-review.googlesource.com/219806Tested-by: 's avatarShannon Woods <shannonwoods@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent f3acaf9e
...@@ -97,7 +97,7 @@ Context::Context(int clientVersion, const gl::Context *shareContext, rx::Rendere ...@@ -97,7 +97,7 @@ Context::Context(int clientVersion, const gl::Context *shareContext, rx::Rendere
} }
bindGenericTransformFeedbackBuffer(0); bindGenericTransformFeedbackBuffer(0);
for (int i = 0; i < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++) for (unsigned int i = 0; i < mCaps.maxTransformFeedbackSeparateAttributes; i++)
{ {
bindIndexedTransformFeedbackBuffer(0, i, 0, -1); bindIndexedTransformFeedbackBuffer(0, i, 0, -1);
} }
...@@ -1580,14 +1580,7 @@ bool Context::applyTransformFeedbackBuffers() ...@@ -1580,14 +1580,7 @@ bool Context::applyTransformFeedbackBuffers()
TransformFeedback *curTransformFeedback = mState.getCurrentTransformFeedback(); TransformFeedback *curTransformFeedback = mState.getCurrentTransformFeedback();
if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused()) if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
{ {
Buffer *transformFeedbackBuffers[IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS]; mRenderer->applyTransformFeedbackBuffers(mState);
GLintptr transformFeedbackOffsets[IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS];
for (size_t i = 0; i < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++)
{
transformFeedbackBuffers[i] = mState.getIndexedTransformFeedbackBuffer(i);
transformFeedbackOffsets[i] = mState.getIndexedTransformFeedbackBufferOffset(i);
}
mRenderer->applyTransformFeedbackBuffers(transformFeedbackBuffers, transformFeedbackOffsets);
return true; return true;
} }
else else
...@@ -1598,7 +1591,7 @@ bool Context::applyTransformFeedbackBuffers() ...@@ -1598,7 +1591,7 @@ bool Context::applyTransformFeedbackBuffers()
void Context::markTransformFeedbackUsage() void Context::markTransformFeedbackUsage()
{ {
for (size_t i = 0; i < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++) for (size_t i = 0; i < mCaps.maxTransformFeedbackSeparateAttributes; i++)
{ {
Buffer *buffer = mState.getIndexedTransformFeedbackBuffer(i); Buffer *buffer = mState.getIndexedTransformFeedbackBuffer(i);
if (buffer) if (buffer)
......
...@@ -121,6 +121,7 @@ void State::initialize(const Caps& caps, GLuint clientVersion) ...@@ -121,6 +121,7 @@ void State::initialize(const Caps& caps, GLuint clientVersion)
} }
mUniformBuffers.resize(caps.maxCombinedUniformBlocks); mUniformBuffers.resize(caps.maxCombinedUniformBlocks);
mTransformFeedbackBuffers.resize(caps.maxTransformFeedbackSeparateAttributes);
mSamplerTextures[GL_TEXTURE_2D].resize(caps.maxCombinedTextureImageUnits); mSamplerTextures[GL_TEXTURE_2D].resize(caps.maxCombinedTextureImageUnits);
mSamplerTextures[GL_TEXTURE_CUBE_MAP].resize(caps.maxCombinedTextureImageUnits); mSamplerTextures[GL_TEXTURE_CUBE_MAP].resize(caps.maxCombinedTextureImageUnits);
...@@ -171,14 +172,14 @@ void State::reset() ...@@ -171,14 +172,14 @@ void State::reset()
mGenericUniformBuffer.set(NULL); mGenericUniformBuffer.set(NULL);
mGenericTransformFeedbackBuffer.set(NULL); mGenericTransformFeedbackBuffer.set(NULL);
for (UniformBufferVector::iterator bufItr = mUniformBuffers.begin(); bufItr != mUniformBuffers.end(); ++bufItr) for (BufferVector::iterator bufItr = mUniformBuffers.begin(); bufItr != mUniformBuffers.end(); ++bufItr)
{ {
bufItr->set(NULL); bufItr->set(NULL);
} }
for (int i = 0; i < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++) for (BufferVector::iterator bufItr = mTransformFeedbackBuffers.begin(); bufItr != mTransformFeedbackBuffers.end(); ++bufItr)
{ {
mTransformFeedbackBuffers[i].set(NULL); bufItr->set(NULL);
} }
mCopyReadBuffer.set(NULL); mCopyReadBuffer.set(NULL);
...@@ -971,25 +972,30 @@ void State::setIndexedTransformFeedbackBufferBinding(GLuint index, Buffer *buffe ...@@ -971,25 +972,30 @@ void State::setIndexedTransformFeedbackBufferBinding(GLuint index, Buffer *buffe
GLuint State::getIndexedTransformFeedbackBufferId(GLuint index) const GLuint State::getIndexedTransformFeedbackBufferId(GLuint index) const
{ {
ASSERT(index < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS); ASSERT(static_cast<size_t>(index) < mTransformFeedbackBuffers.size());
return mTransformFeedbackBuffers[index].id(); return mTransformFeedbackBuffers[index].id();
} }
Buffer *State::getIndexedTransformFeedbackBuffer(GLuint index) const Buffer *State::getIndexedTransformFeedbackBuffer(GLuint index) const
{ {
ASSERT(index < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS); ASSERT(static_cast<size_t>(index) < mTransformFeedbackBuffers.size());
return mTransformFeedbackBuffers[index].get(); return mTransformFeedbackBuffers[index].get();
} }
GLuint State::getIndexedTransformFeedbackBufferOffset(GLuint index) const GLuint State::getIndexedTransformFeedbackBufferOffset(GLuint index) const
{ {
ASSERT(index < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS); ASSERT(static_cast<size_t>(index) < mTransformFeedbackBuffers.size());
return mTransformFeedbackBuffers[index].getOffset(); return mTransformFeedbackBuffers[index].getOffset();
} }
size_t State::getTransformFeedbackBufferIndexRange() const
{
return mTransformFeedbackBuffers.size();
}
void State::setCopyReadBufferBinding(Buffer *buffer) void State::setCopyReadBufferBinding(Buffer *buffer)
{ {
mCopyReadBuffer.set(buffer); mCopyReadBuffer.set(buffer);
...@@ -1371,7 +1377,7 @@ bool State::getIndexedIntegerv(GLenum target, GLuint index, GLint *data) ...@@ -1371,7 +1377,7 @@ bool State::getIndexedIntegerv(GLenum target, GLuint index, GLint *data)
switch (target) switch (target)
{ {
case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
if (index < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS) if (static_cast<size_t>(index) < mTransformFeedbackBuffers.size())
{ {
*data = mTransformFeedbackBuffers[index].id(); *data = mTransformFeedbackBuffers[index].id();
} }
...@@ -1394,13 +1400,13 @@ bool State::getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data) ...@@ -1394,13 +1400,13 @@ bool State::getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data)
switch (target) switch (target)
{ {
case GL_TRANSFORM_FEEDBACK_BUFFER_START: case GL_TRANSFORM_FEEDBACK_BUFFER_START:
if (index < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS) if (static_cast<size_t>(index) < mTransformFeedbackBuffers.size())
{ {
*data = mTransformFeedbackBuffers[index].getOffset(); *data = mTransformFeedbackBuffers[index].getOffset();
} }
break; break;
case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
if (index < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS) if (static_cast<size_t>(index) < mTransformFeedbackBuffers.size())
{ {
*data = mTransformFeedbackBuffers[index].getSize(); *data = mTransformFeedbackBuffers[index].getSize();
} }
......
...@@ -197,6 +197,7 @@ class State ...@@ -197,6 +197,7 @@ class State
GLuint getIndexedTransformFeedbackBufferId(GLuint index) const; GLuint getIndexedTransformFeedbackBufferId(GLuint index) const;
Buffer *getIndexedTransformFeedbackBuffer(GLuint index) const; Buffer *getIndexedTransformFeedbackBuffer(GLuint index) const;
GLuint getIndexedTransformFeedbackBufferOffset(GLuint index) const; GLuint getIndexedTransformFeedbackBufferOffset(GLuint index) const;
size_t getTransformFeedbackBufferIndexRange() const;
// GL_COPY_[READ/WRITE]_BUFFER // GL_COPY_[READ/WRITE]_BUFFER
void setCopyReadBufferBinding(Buffer *buffer); void setCopyReadBufferBinding(Buffer *buffer);
...@@ -300,12 +301,12 @@ class State ...@@ -300,12 +301,12 @@ class State
ActiveQueryMap mActiveQueries; ActiveQueryMap mActiveQueries;
BindingPointer<Buffer> mGenericUniformBuffer; BindingPointer<Buffer> mGenericUniformBuffer;
typedef std::vector< OffsetBindingPointer<Buffer> > UniformBufferVector; typedef std::vector< OffsetBindingPointer<Buffer> > BufferVector;
UniformBufferVector mUniformBuffers; BufferVector mUniformBuffers;
BindingPointer<TransformFeedback> mTransformFeedback; BindingPointer<TransformFeedback> mTransformFeedback;
BindingPointer<Buffer> mGenericTransformFeedbackBuffer; BindingPointer<Buffer> mGenericTransformFeedbackBuffer;
OffsetBindingPointer<Buffer> mTransformFeedbackBuffers[IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS]; BufferVector mTransformFeedbackBuffers;
BindingPointer<Buffer> mCopyReadBuffer; BindingPointer<Buffer> mCopyReadBuffer;
BindingPointer<Buffer> mCopyWriteBuffer; BindingPointer<Buffer> mCopyWriteBuffer;
......
...@@ -134,7 +134,7 @@ class Renderer ...@@ -134,7 +134,7 @@ class Renderer
virtual bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount) = 0; virtual bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount) = 0;
virtual gl::Error applyVertexBuffer(const gl::State &state, GLint first, GLsizei count, GLsizei instances) = 0; virtual gl::Error applyVertexBuffer(const gl::State &state, GLint first, GLsizei count, GLsizei instances) = 0;
virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) = 0; virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) = 0;
virtual void applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuffers[], GLintptr offsets[]) = 0; virtual void applyTransformFeedbackBuffers(const gl::State& state) = 0;
virtual gl::Error drawArrays(GLenum mode, GLsizei count, GLsizei instances, bool transformFeedbackActive) = 0; virtual gl::Error drawArrays(GLenum mode, GLsizei count, GLsizei instances, bool transformFeedbackActive) = 0;
virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
......
...@@ -986,28 +986,25 @@ gl::Error Renderer11::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elemen ...@@ -986,28 +986,25 @@ gl::Error Renderer11::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elemen
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
void Renderer11::applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuffers[], GLintptr offsets[]) void Renderer11::applyTransformFeedbackBuffers(const gl::State& state)
{ {
ID3D11Buffer* d3dBuffers[gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS]; size_t numXFBBindings = state.getTransformFeedbackBufferIndexRange();
UINT d3dOffsets[gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS]; ASSERT(numXFBBindings <= gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS);
bool requiresUpdate = false; bool requiresUpdate = false;
for (size_t i = 0; i < gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++) for (size_t i = 0; i < numXFBBindings; i++)
{ {
if (transformFeedbackBuffers[i]) gl::Buffer *curXFBBuffer = state.getIndexedTransformFeedbackBuffer(i);
GLintptr curXFBOffset = state.getIndexedTransformFeedbackBufferOffset(i);
ID3D11Buffer *d3dBuffer = NULL;
if (curXFBBuffer)
{ {
Buffer11 *storage = Buffer11::makeBuffer11(transformFeedbackBuffers[i]->getImplementation()); Buffer11 *storage = Buffer11::makeBuffer11(curXFBBuffer->getImplementation());
ID3D11Buffer *buffer = storage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK); d3dBuffer = storage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
d3dBuffers[i] = buffer;
d3dOffsets[i] = (mAppliedTFBuffers[i] != buffer) ? static_cast<UINT>(offsets[i]) : -1;
}
else
{
d3dBuffers[i] = NULL;
d3dOffsets[i] = 0;
} }
if (d3dBuffers[i] != mAppliedTFBuffers[i] || offsets[i] != mAppliedTFOffsets[i]) // TODO: mAppliedTFBuffers and friends should also be kept in a vector.
if (d3dBuffer != mAppliedTFBuffers[i] || curXFBOffset != mAppliedTFOffsets[i])
{ {
requiresUpdate = true; requiresUpdate = true;
} }
...@@ -1015,12 +1012,29 @@ void Renderer11::applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuff ...@@ -1015,12 +1012,29 @@ void Renderer11::applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuff
if (requiresUpdate) if (requiresUpdate)
{ {
mDeviceContext->SOSetTargets(ArraySize(d3dBuffers), d3dBuffers, d3dOffsets); for (size_t i = 0; i < numXFBBindings; ++i)
for (size_t i = 0; i < gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++)
{ {
mAppliedTFBuffers[i] = d3dBuffers[i]; gl::Buffer *curXFBBuffer = state.getIndexedTransformFeedbackBuffer(i);
mAppliedTFOffsets[i] = offsets[i]; GLintptr curXFBOffset = state.getIndexedTransformFeedbackBufferOffset(i);
if (curXFBBuffer)
{
Buffer11 *storage = Buffer11::makeBuffer11(curXFBBuffer->getImplementation());
ID3D11Buffer *d3dBuffer = storage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
mCurrentD3DOffsets[i] = (mAppliedTFBuffers[i] != d3dBuffer && mAppliedTFOffsets[i] != curXFBOffset) ?
static_cast<UINT>(curXFBOffset) : -1;
mAppliedTFBuffers[i] = d3dBuffer;
}
else
{
mAppliedTFBuffers[i] = NULL;
mCurrentD3DOffsets[i] = 0;
}
mAppliedTFOffsets[i] = curXFBOffset;
} }
mDeviceContext->SOSetTargets(numXFBBindings, mAppliedTFBuffers, mCurrentD3DOffsets);
} }
} }
......
...@@ -84,7 +84,7 @@ class Renderer11 : public Renderer ...@@ -84,7 +84,7 @@ class Renderer11 : public Renderer
virtual gl::Error applyUniforms(const ProgramImpl &program, const std::vector<gl::LinkedUniform*> &uniformArray); virtual gl::Error applyUniforms(const ProgramImpl &program, const std::vector<gl::LinkedUniform*> &uniformArray);
virtual gl::Error applyVertexBuffer(const gl::State &state, GLint first, GLsizei count, GLsizei instances); virtual gl::Error applyVertexBuffer(const gl::State &state, GLint first, GLsizei count, GLsizei instances);
virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo); virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
virtual void applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuffers[], GLintptr offsets[]); virtual void applyTransformFeedbackBuffers(const gl::State &state);
virtual gl::Error drawArrays(GLenum mode, GLsizei count, GLsizei instances, bool transformFeedbackActive); virtual gl::Error drawArrays(GLenum mode, GLsizei count, GLsizei instances, bool transformFeedbackActive);
virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
...@@ -289,8 +289,14 @@ class Renderer11 : public Renderer ...@@ -289,8 +289,14 @@ class Renderer11 : public Renderer
unsigned int mAppliedIBOffset; unsigned int mAppliedIBOffset;
// Currently applied transform feedback buffers // Currently applied transform feedback buffers
ID3D11Buffer *mAppliedTFBuffers[gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS]; ID3D11Buffer *mAppliedTFBuffers[gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS]; // Tracks the current D3D buffers
GLintptr mAppliedTFOffsets[gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS]; // in use for streamout
GLintptr mAppliedTFOffsets[gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS]; // Tracks the current GL-specified
// buffer offsets to transform feedback
// buffers
UINT mCurrentD3DOffsets[gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS]; // Tracks the D3D buffer offsets,
// which may differ from GLs, due
// to different append behavior
// Currently applied shaders // Currently applied shaders
ID3D11VertexShader *mAppliedVertexShader; ID3D11VertexShader *mAppliedVertexShader;
......
...@@ -1304,7 +1304,7 @@ gl::Error Renderer9::applyIndexBuffer(const GLvoid *indices, gl::Buffer *element ...@@ -1304,7 +1304,7 @@ gl::Error Renderer9::applyIndexBuffer(const GLvoid *indices, gl::Buffer *element
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
void Renderer9::applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuffers[], GLintptr offsets[]) void Renderer9::applyTransformFeedbackBuffers(const gl::State& state)
{ {
UNREACHABLE(); UNREACHABLE();
} }
......
...@@ -84,7 +84,7 @@ class Renderer9 : public Renderer ...@@ -84,7 +84,7 @@ class Renderer9 : public Renderer
virtual gl::Error applyVertexBuffer(const gl::State &state, GLint first, GLsizei count, GLsizei instances); virtual gl::Error applyVertexBuffer(const gl::State &state, GLint first, GLsizei count, GLsizei instances);
virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo); virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
virtual void applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuffers[], GLintptr offsets[]); virtual void applyTransformFeedbackBuffers(const gl::State& state);
virtual gl::Error drawArrays(GLenum mode, GLsizei count, GLsizei instances, bool transformFeedbackActive); virtual gl::Error drawArrays(GLenum mode, GLsizei count, GLsizei instances, bool transformFeedbackActive);
virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
......
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