Commit 87db7c52 by Jamie Madill Committed by Commit Bot

D3D11: Minor cleanup to DrawCallVertexParams.

The 'firstVertexDefinitelyZero' argument didn't actually have any behavioural change to the code, so remove it. Also add an explicit call to resolve the index range, instead of doing it implicitly when certain values were queried. Bug: angleproject:2389 Change-Id: I377c79006bfa541183fe94d0ed199fbaa1132afc Reviewed-on: https://chromium-review.googlesource.com/948786 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 0cec82a5
...@@ -1644,10 +1644,10 @@ gl::Error Renderer11::drawElements(const gl::Context *context, ...@@ -1644,10 +1644,10 @@ gl::Error Renderer11::drawElements(const gl::Context *context,
const auto &lazyIndexRange = context->getParams<gl::HasIndexRange>(); const auto &lazyIndexRange = context->getParams<gl::HasIndexRange>();
DrawCallVertexParams vertexParams(lazyIndexRange, 0, instances);
bool usePrimitiveRestartWorkaround = bool usePrimitiveRestartWorkaround =
UsePrimitiveRestartWorkaround(glState.isPrimitiveRestartEnabled(), type); UsePrimitiveRestartWorkaround(glState.isPrimitiveRestartEnabled(), type);
DrawCallVertexParams vertexParams(!usePrimitiveRestartWorkaround, lazyIndexRange, 0, instances);
ANGLE_TRY(mStateManager.applyIndexBuffer(context, indices, count, type, lazyIndexRange, ANGLE_TRY(mStateManager.applyIndexBuffer(context, indices, count, type, lazyIndexRange,
usePrimitiveRestartWorkaround)); usePrimitiveRestartWorkaround));
ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, true)); ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, true));
...@@ -1821,11 +1821,16 @@ gl::Error Renderer11::drawElementsIndirect(const gl::Context *context, ...@@ -1821,11 +1821,16 @@ gl::Error Renderer11::drawElementsIndirect(const gl::Context *context,
reinterpret_cast<const void *>(static_cast<uintptr_t>(firstIndex * typeInfo.bytes)); reinterpret_cast<const void *>(static_cast<uintptr_t>(firstIndex * typeInfo.bytes));
gl::HasIndexRange lazyIndexRange(const_cast<gl::Context *>(context), count, type, indices); gl::HasIndexRange lazyIndexRange(const_cast<gl::Context *>(context), count, type, indices);
DrawCallVertexParams vertexParams(lazyIndexRange, baseVertex, instances);
// We must explicitly resolve the index range for the slow-path indirect drawElements to make
// sure we are using the correct 'baseVertex'. This parameter does not exist for the direct
// drawElements.
vertexParams.ensureIndexRangeResolved();
ANGLE_TRY(mStateManager.applyIndexBuffer(context, indices, count, type, lazyIndexRange, ANGLE_TRY(mStateManager.applyIndexBuffer(context, indices, count, type, lazyIndexRange,
usePrimitiveRestartWorkaround)); usePrimitiveRestartWorkaround));
DrawCallVertexParams vertexParams(false, lazyIndexRange, baseVertex, instances);
ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, true)); ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, true));
int baseVertexLocation = -static_cast<int>(lazyIndexRange.getIndexRange().value().start); int baseVertexLocation = -static_cast<int>(lazyIndexRange.getIndexRange().value().start);
......
...@@ -3194,35 +3194,29 @@ DrawCallVertexParams::DrawCallVertexParams(GLint firstVertex, ...@@ -3194,35 +3194,29 @@ DrawCallVertexParams::DrawCallVertexParams(GLint firstVertex,
} }
// Use when in a drawElements call. // Use when in a drawElements call.
DrawCallVertexParams::DrawCallVertexParams(bool firstVertexDefinitelyZero, DrawCallVertexParams::DrawCallVertexParams(const gl::HasIndexRange &hasIndexRange,
const gl::HasIndexRange &hasIndexRange,
GLint baseVertex, GLint baseVertex,
GLsizei instances) GLsizei instances)
: mHasIndexRange(&hasIndexRange), : mHasIndexRange(&hasIndexRange),
mFirstVertex(), mFirstVertex(baseVertex),
mVertexCount(0), mVertexCount(0),
mInstances(instances), mInstances(instances),
mBaseVertex(baseVertex) mBaseVertex(baseVertex)
{ {
if (firstVertexDefinitelyZero)
{
mFirstVertex = baseVertex;
}
} }
GLint DrawCallVertexParams::firstVertex() const GLint DrawCallVertexParams::firstVertex() const
{ {
if (!mFirstVertex.valid()) // In some cases we can know the first vertex will be fixed at zero, if we're on the "fast
{ // path". In these cases the index range is not resolved. If the first vertex is not zero,
ensureResolved(); // however, then it must be because the index range is resolved.
ASSERT(mFirstVertex.valid()); ASSERT(mFirstVertex == 0 || mHasIndexRange == nullptr);
} return mFirstVertex;
return mFirstVertex.value();
} }
GLsizei DrawCallVertexParams::vertexCount() const GLsizei DrawCallVertexParams::vertexCount() const
{ {
ensureResolved(); ASSERT(mHasIndexRange == nullptr);
return mVertexCount; return mVertexCount;
} }
...@@ -3231,18 +3225,19 @@ GLsizei DrawCallVertexParams::instances() const ...@@ -3231,18 +3225,19 @@ GLsizei DrawCallVertexParams::instances() const
return mInstances; return mInstances;
} }
void DrawCallVertexParams::ensureResolved() const void DrawCallVertexParams::ensureIndexRangeResolved() const
{ {
if (mHasIndexRange) if (mHasIndexRange == nullptr)
{ {
ASSERT(!mFirstVertex.valid() || mFirstVertex == mBaseVertex); return;
// Resolve the index range now if we need to.
const auto &indexRange = mHasIndexRange->getIndexRange().value();
mFirstVertex = mBaseVertex + static_cast<GLint>(indexRange.start);
mVertexCount = static_cast<GLsizei>(indexRange.vertexCount());
mHasIndexRange = nullptr;
} }
// This call will resolve the index range.
const gl::IndexRange &indexRange = mHasIndexRange->getIndexRange().value();
mFirstVertex = mBaseVertex + static_cast<GLint>(indexRange.start);
mVertexCount = static_cast<GLsizei>(indexRange.vertexCount());
mHasIndexRange = nullptr;
} }
// OnConstantBufferDirtyReceiver implementation. // OnConstantBufferDirtyReceiver implementation.
......
...@@ -148,8 +148,7 @@ class DrawCallVertexParams final : angle::NonCopyable ...@@ -148,8 +148,7 @@ class DrawCallVertexParams final : angle::NonCopyable
DrawCallVertexParams(GLint firstVertex, GLsizei vertexCount, GLsizei instances); DrawCallVertexParams(GLint firstVertex, GLsizei vertexCount, GLsizei instances);
// Use when in a drawElements call. // Use when in a drawElements call.
DrawCallVertexParams(bool firstVertexDefinitelyZero, DrawCallVertexParams(const gl::HasIndexRange &hasIndexRange,
const gl::HasIndexRange &hasIndexRange,
GLint baseVertex, GLint baseVertex,
GLsizei instances); GLsizei instances);
...@@ -160,11 +159,11 @@ class DrawCallVertexParams final : angle::NonCopyable ...@@ -160,11 +159,11 @@ class DrawCallVertexParams final : angle::NonCopyable
GLsizei vertexCount() const; GLsizei vertexCount() const;
GLsizei instances() const; GLsizei instances() const;
private: void ensureIndexRangeResolved() const;
void ensureResolved() const;
private:
mutable const gl::HasIndexRange *mHasIndexRange; mutable const gl::HasIndexRange *mHasIndexRange;
mutable Optional<GLint> mFirstVertex; mutable GLint mFirstVertex;
mutable GLsizei mVertexCount; mutable GLsizei mVertexCount;
GLsizei mInstances; GLsizei mInstances;
GLint mBaseVertex; GLint mBaseVertex;
......
...@@ -315,6 +315,8 @@ gl::Error VertexArray11::updateDirtyAndDynamicAttribs(const gl::Context *context ...@@ -315,6 +315,8 @@ gl::Error VertexArray11::updateDirtyAndDynamicAttribs(const gl::Context *context
if (mDynamicAttribsMask.any()) if (mDynamicAttribsMask.any())
{ {
vertexParams.ensureIndexRangeResolved();
auto activeDynamicAttribs = (mDynamicAttribsMask & activeLocations); auto activeDynamicAttribs = (mDynamicAttribsMask & activeLocations);
if (activeDynamicAttribs.none()) if (activeDynamicAttribs.none())
{ {
......
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