Commit 1528f5f1 by Gregoire Payen de La Garanderie Committed by Jamie Madill

Fix the calculation of the D3D stream output offset in the D3D11 backend

Also add an extra check in BindBufferBase/Range that XFB is not active. BUG=angle:898 Change-Id: I0d61ebaa0674b0a375cc35efa614b021a6901eac Reviewed-on: https://chromium-review.googlesource.com/243892Tested-by: 's avatarGregoire Payen de La Garanderie <Gregory.Payen@imgtec.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent f685991d
......@@ -1220,7 +1220,7 @@ void Renderer11::applyTransformFeedbackBuffers(const gl::State& state)
Buffer11 *storage = Buffer11::makeBuffer11(curXFBBuffer->getImplementation());
ID3D11Buffer *d3dBuffer = storage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
mCurrentD3DOffsets[i] = (mAppliedTFBuffers[i] != d3dBuffer && mAppliedTFOffsets[i] != curXFBOffset) ?
mCurrentD3DOffsets[i] = (mAppliedTFBuffers[i] != d3dBuffer || mAppliedTFOffsets[i] != curXFBOffset) ?
static_cast<UINT>(curXFBOffset) : -1;
mAppliedTFBuffers[i] = d3dBuffer;
}
......
......@@ -1096,18 +1096,27 @@ void GL_APIENTRY BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi
switch (target)
{
case GL_TRANSFORM_FEEDBACK_BUFFER:
// size and offset must be a multiple of 4
if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
case GL_TRANSFORM_FEEDBACK_BUFFER:
{
context->recordError(Error(GL_INVALID_VALUE));
return;
}
// size and offset must be a multiple of 4
if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
{
context->recordError(Error(GL_INVALID_VALUE));
return;
}
context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
context->bindGenericTransformFeedbackBuffer(buffer);
break;
// Cannot bind a transform feedback buffer if the current transform feedback is active (3.0.4 pg 91 section 2.15.2)
TransformFeedback *curTransformFeedback = context->getState().getCurrentTransformFeedback();
if (curTransformFeedback && curTransformFeedback->isStarted())
{
context->recordError(Error(GL_INVALID_OPERATION));
return;
}
context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
context->bindGenericTransformFeedbackBuffer(buffer);
break;
}
case GL_UNIFORM_BUFFER:
......@@ -1168,11 +1177,20 @@ void GL_APIENTRY BindBufferBase(GLenum target, GLuint index, GLuint buffer)
switch (target)
{
case GL_TRANSFORM_FEEDBACK_BUFFER:
context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
context->bindGenericTransformFeedbackBuffer(buffer);
break;
case GL_TRANSFORM_FEEDBACK_BUFFER:
{
// Cannot bind a transform feedback buffer if the current transform feedback is active (3.0.4 pg 91 section 2.15.2)
TransformFeedback *curTransformFeedback = context->getState().getCurrentTransformFeedback();
if (curTransformFeedback && curTransformFeedback->isStarted())
{
context->recordError(Error(GL_INVALID_OPERATION));
return;
}
context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
context->bindGenericTransformFeedbackBuffer(buffer);
break;
}
case GL_UNIFORM_BUFFER:
context->bindIndexedUniformBuffer(buffer, index, 0, 0);
context->bindGenericUniformBuffer(buffer);
......
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