Commit c67323a9 by Jamie Madill Committed by Commit Bot

Squash State dirty bits to below 64.

This will dramatically speed up performance on 64-bit systems due to the efficiency of angle::BitSet64. Improves performance of the GL back-end on benchmarks quite a bit. Squashes the Pack and Unpack states together. Also moves the current value dirty bits to a single dirty bit, with a separate set for each attribute. Also squashes a multisample dirty bit. Also fixes an incorrect dirty bit in StateManagerGL. We may want to implement a semi-fast version of BitSet64 for 32-bit systems if we find performance is not satisfactory. BUG=angleproject:2188 Change-Id: I4616782bf75413252ede3e3ac752b9ccdb9aab49 Reviewed-on: https://chromium-review.googlesource.com/722423Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 1d7be50a
......@@ -389,23 +389,11 @@ Context::Context(rx::EGLImplFactory *implFactory,
}
// Initialize dirty bit masks
// TODO(jmadill): additional ES3 state
mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ALIGNMENT);
mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ROW_LENGTH);
mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_IMAGES);
mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_ROWS);
mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_PIXELS);
mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
// No dirty objects.
// Readpixels uses the pack state and read FBO
mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ALIGNMENT);
mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ROW_LENGTH);
mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_ROWS);
mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_PIXELS);
mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
......
......@@ -585,7 +585,8 @@ void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
{
ASSERT(maskNumber < mMaxSampleMaskWords);
mSampleMaskValues[maskNumber] = mask;
mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK_WORD_0 + maskNumber);
// TODO(jmadill): Use a child dirty bit if we ever use more than two words.
mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
}
GLbitfield State::getSampleMaskWord(GLuint maskNumber) const
......@@ -1340,13 +1341,13 @@ void State::setCopyWriteBufferBinding(const Context *context, Buffer *buffer)
void State::setPixelPackBufferBinding(const Context *context, Buffer *buffer)
{
mPack.pixelBuffer.set(context, buffer);
mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
mDirtyBits.set(DIRTY_BIT_PACK_STATE);
}
void State::setPixelUnpackBufferBinding(const Context *context, Buffer *buffer)
{
mUnpack.pixelBuffer.set(context, buffer);
mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
}
Buffer *State::getTargetBuffer(GLenum target) const
......@@ -1406,21 +1407,24 @@ void State::setVertexAttribf(GLuint index, const GLfloat values[4])
{
ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
mVertexAttribCurrentValues[index].setFloatValues(values);
mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
mDirtyCurrentValues.set(index);
}
void State::setVertexAttribu(GLuint index, const GLuint values[4])
{
ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
mDirtyCurrentValues.set(index);
}
void State::setVertexAttribi(GLuint index, const GLint values[4])
{
ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
mVertexAttribCurrentValues[index].setIntValues(values);
mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
mDirtyCurrentValues.set(index);
}
void State::setVertexAttribPointer(const Context *context,
......@@ -1458,7 +1462,7 @@ const void *State::getVertexAttribPointer(unsigned int attribNum) const
void State::setPackAlignment(GLint alignment)
{
mPack.alignment = alignment;
mDirtyBits.set(DIRTY_BIT_PACK_ALIGNMENT);
mDirtyBits.set(DIRTY_BIT_PACK_STATE);
}
GLint State::getPackAlignment() const
......@@ -1469,7 +1473,7 @@ GLint State::getPackAlignment() const
void State::setPackReverseRowOrder(bool reverseRowOrder)
{
mPack.reverseRowOrder = reverseRowOrder;
mDirtyBits.set(DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
mDirtyBits.set(DIRTY_BIT_PACK_STATE);
}
bool State::getPackReverseRowOrder() const
......@@ -1480,7 +1484,7 @@ bool State::getPackReverseRowOrder() const
void State::setPackRowLength(GLint rowLength)
{
mPack.rowLength = rowLength;
mDirtyBits.set(DIRTY_BIT_PACK_ROW_LENGTH);
mDirtyBits.set(DIRTY_BIT_PACK_STATE);
}
GLint State::getPackRowLength() const
......@@ -1491,7 +1495,7 @@ GLint State::getPackRowLength() const
void State::setPackSkipRows(GLint skipRows)
{
mPack.skipRows = skipRows;
mDirtyBits.set(DIRTY_BIT_PACK_SKIP_ROWS);
mDirtyBits.set(DIRTY_BIT_PACK_STATE);
}
GLint State::getPackSkipRows() const
......@@ -1502,7 +1506,7 @@ GLint State::getPackSkipRows() const
void State::setPackSkipPixels(GLint skipPixels)
{
mPack.skipPixels = skipPixels;
mDirtyBits.set(DIRTY_BIT_PACK_SKIP_PIXELS);
mDirtyBits.set(DIRTY_BIT_PACK_STATE);
}
GLint State::getPackSkipPixels() const
......@@ -1523,7 +1527,7 @@ PixelPackState &State::getPackState()
void State::setUnpackAlignment(GLint alignment)
{
mUnpack.alignment = alignment;
mDirtyBits.set(DIRTY_BIT_UNPACK_ALIGNMENT);
mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
}
GLint State::getUnpackAlignment() const
......@@ -1534,7 +1538,7 @@ GLint State::getUnpackAlignment() const
void State::setUnpackRowLength(GLint rowLength)
{
mUnpack.rowLength = rowLength;
mDirtyBits.set(DIRTY_BIT_UNPACK_ROW_LENGTH);
mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
}
GLint State::getUnpackRowLength() const
......@@ -1545,7 +1549,7 @@ GLint State::getUnpackRowLength() const
void State::setUnpackImageHeight(GLint imageHeight)
{
mUnpack.imageHeight = imageHeight;
mDirtyBits.set(DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
}
GLint State::getUnpackImageHeight() const
......@@ -1556,7 +1560,7 @@ GLint State::getUnpackImageHeight() const
void State::setUnpackSkipImages(GLint skipImages)
{
mUnpack.skipImages = skipImages;
mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_IMAGES);
mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
}
GLint State::getUnpackSkipImages() const
......@@ -1567,7 +1571,7 @@ GLint State::getUnpackSkipImages() const
void State::setUnpackSkipRows(GLint skipRows)
{
mUnpack.skipRows = skipRows;
mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_ROWS);
mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
}
GLint State::getUnpackSkipRows() const
......@@ -1578,7 +1582,7 @@ GLint State::getUnpackSkipRows() const
void State::setUnpackSkipPixels(GLint skipPixels)
{
mUnpack.skipPixels = skipPixels;
mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_PIXELS);
mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
}
GLint State::getUnpackSkipPixels() const
......@@ -2436,4 +2440,11 @@ Error State::clearUnclearedActiveTextures(const Context *context)
return NoError();
}
AttributesMask State::getAndResetDirtyCurrentValues() const
{
AttributesMask retVal = mDirtyCurrentValues;
mDirtyCurrentValues.reset();
return retVal;
}
} // namespace gl
......@@ -390,9 +390,8 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable
DIRTY_BIT_SAMPLE_COVERAGE_ENABLED,
DIRTY_BIT_SAMPLE_COVERAGE,
DIRTY_BIT_SAMPLE_MASK_ENABLED,
DIRTY_BIT_SAMPLE_MASK_WORD_0,
DIRTY_BIT_SAMPLE_MASK_WORD_MAX = DIRTY_BIT_SAMPLE_MASK_WORD_0 + MAX_SAMPLE_MASK_WORDS,
DIRTY_BIT_DEPTH_TEST_ENABLED = DIRTY_BIT_SAMPLE_MASK_WORD_MAX,
DIRTY_BIT_SAMPLE_MASK,
DIRTY_BIT_DEPTH_TEST_ENABLED,
DIRTY_BIT_DEPTH_FUNC,
DIRTY_BIT_DEPTH_MASK,
DIRTY_BIT_STENCIL_TEST_ENABLED,
......@@ -413,19 +412,8 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable
DIRTY_BIT_CLEAR_COLOR,
DIRTY_BIT_CLEAR_DEPTH,
DIRTY_BIT_CLEAR_STENCIL,
DIRTY_BIT_UNPACK_ALIGNMENT,
DIRTY_BIT_UNPACK_ROW_LENGTH,
DIRTY_BIT_UNPACK_IMAGE_HEIGHT,
DIRTY_BIT_UNPACK_SKIP_IMAGES,
DIRTY_BIT_UNPACK_SKIP_ROWS,
DIRTY_BIT_UNPACK_SKIP_PIXELS,
DIRTY_BIT_UNPACK_BUFFER_BINDING,
DIRTY_BIT_PACK_ALIGNMENT,
DIRTY_BIT_PACK_REVERSE_ROW_ORDER,
DIRTY_BIT_PACK_ROW_LENGTH,
DIRTY_BIT_PACK_SKIP_ROWS,
DIRTY_BIT_PACK_SKIP_PIXELS,
DIRTY_BIT_PACK_BUFFER_BINDING,
DIRTY_BIT_UNPACK_STATE,
DIRTY_BIT_PACK_STATE,
DIRTY_BIT_DITHER_ENABLED,
DIRTY_BIT_GENERATE_MIPMAP_HINT,
DIRTY_BIT_SHADER_DERIVATIVE_HINT,
......@@ -446,12 +434,13 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable
DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ, // CHROMIUM_path_rendering path projection matrix
DIRTY_BIT_PATH_RENDERING_STENCIL_STATE,
DIRTY_BIT_FRAMEBUFFER_SRGB, // GL_EXT_sRGB_write_control
DIRTY_BIT_CURRENT_VALUE_0,
DIRTY_BIT_CURRENT_VALUE_MAX = DIRTY_BIT_CURRENT_VALUE_0 + MAX_VERTEX_ATTRIBS,
DIRTY_BIT_INVALID = DIRTY_BIT_CURRENT_VALUE_MAX,
DIRTY_BIT_MAX = DIRTY_BIT_INVALID,
DIRTY_BIT_CURRENT_VALUES,
DIRTY_BIT_INVALID,
DIRTY_BIT_MAX = DIRTY_BIT_INVALID,
};
static_assert(DIRTY_BIT_MAX <= 64, "State dirty bits must be capped at 64");
// TODO(jmadill): Consider storing dirty objects in a list instead of by binding.
enum DirtyObjectType
{
......@@ -479,6 +468,10 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable
void syncDirtyObject(const Context *context, GLenum target);
void setObjectDirty(GLenum target);
// This actually clears the current value dirty bits.
// TODO(jmadill): Pass mutable dirty bits into Impl.
AttributesMask getAndResetDirtyCurrentValues() const;
void setImageUnit(const Context *context,
GLuint unit,
Texture *texture,
......@@ -629,6 +622,7 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable
DirtyBits mDirtyBits;
DirtyObjects mDirtyObjects;
mutable AttributesMask mDirtyCurrentValues;
};
} // namespace gl
......
......@@ -969,16 +969,16 @@ void StateManager11::syncState(const gl::Context *context, const gl::State::Dirt
}
vao11->markAllAttributeDivisorsForAdjustment(numViews);
}
break;
}
break;
default:
if (dirtyBit >= gl::State::DIRTY_BIT_CURRENT_VALUE_0 &&
dirtyBit < gl::State::DIRTY_BIT_CURRENT_VALUE_MAX)
case gl::State::DIRTY_BIT_CURRENT_VALUES:
{
for (auto attribIndex : state.getAndResetDirtyCurrentValues())
{
size_t attribIndex =
static_cast<size_t>(dirtyBit - gl::State::DIRTY_BIT_CURRENT_VALUE_0);
invalidateCurrentValueAttrib(attribIndex);
}
}
default:
break;
}
}
......
......@@ -353,6 +353,7 @@ class StateManagerGL final : angle::NonCopyable
const bool mIsMultiviewEnabled;
gl::State::DirtyBits mLocalDirtyBits;
gl::AttributesMask mLocalDirtyCurrentValues;
// ANGLE_multiview dirty bits.
angle::BitSet<MULTIVIEW_DIRTY_BIT_MAX> mMultiviewDirtyBits;
......
......@@ -572,9 +572,8 @@ void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits
case gl::State::DIRTY_BIT_SAMPLE_MASK_ENABLED:
WARN() << "DIRTY_BIT_SAMPLE_MASK_ENABLED unimplemented";
break;
case gl::State::DIRTY_BIT_SAMPLE_MASK_WORD_0:
case gl::State::DIRTY_BIT_SAMPLE_MASK_WORD_0 + 1:
WARN() << "DIRTY_BIT_SAMPLE_MASK_WORD unimplemented";
case gl::State::DIRTY_BIT_SAMPLE_MASK:
WARN() << "DIRTY_BIT_SAMPLE_MASK unimplemented";
break;
case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
WARN() << "DIRTY_BIT_DEPTH_TEST_ENABLED unimplemented";
......@@ -638,44 +637,11 @@ void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits
case gl::State::DIRTY_BIT_CLEAR_STENCIL:
WARN() << "DIRTY_BIT_CLEAR_STENCIL unimplemented";
break;
case gl::State::DIRTY_BIT_UNPACK_ALIGNMENT:
WARN() << "DIRTY_BIT_UNPACK_ALIGNMENT unimplemented";
case gl::State::DIRTY_BIT_UNPACK_STATE:
WARN() << "DIRTY_BIT_UNPACK_STATE unimplemented";
break;
case gl::State::DIRTY_BIT_UNPACK_ROW_LENGTH:
WARN() << "DIRTY_BIT_UNPACK_ROW_LENGTH unimplemented";
break;
case gl::State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT:
WARN() << "DIRTY_BIT_UNPACK_IMAGE_HEIGHT unimplemented";
break;
case gl::State::DIRTY_BIT_UNPACK_SKIP_IMAGES:
WARN() << "DIRTY_BIT_UNPACK_SKIP_IMAGES unimplemented";
break;
case gl::State::DIRTY_BIT_UNPACK_SKIP_ROWS:
WARN() << "DIRTY_BIT_UNPACK_SKIP_ROWS unimplemented";
break;
case gl::State::DIRTY_BIT_UNPACK_SKIP_PIXELS:
WARN() << "DIRTY_BIT_UNPACK_SKIP_PIXELS unimplemented";
break;
case gl::State::DIRTY_BIT_UNPACK_BUFFER_BINDING:
WARN() << "DIRTY_BIT_UNPACK_BUFFER_BINDING unimplemented";
break;
case gl::State::DIRTY_BIT_PACK_ALIGNMENT:
WARN() << "DIRTY_BIT_PACK_ALIGNMENT unimplemented";
break;
case gl::State::DIRTY_BIT_PACK_REVERSE_ROW_ORDER:
WARN() << "DIRTY_BIT_PACK_REVERSE_ROW_ORDER unimplemented";
break;
case gl::State::DIRTY_BIT_PACK_ROW_LENGTH:
WARN() << "DIRTY_BIT_PACK_ROW_LENGTH unimplemented";
break;
case gl::State::DIRTY_BIT_PACK_SKIP_ROWS:
WARN() << "DIRTY_BIT_PACK_SKIP_ROWS unimplemented";
break;
case gl::State::DIRTY_BIT_PACK_SKIP_PIXELS:
WARN() << "DIRTY_BIT_PACK_SKIP_PIXELS unimplemented";
break;
case gl::State::DIRTY_BIT_PACK_BUFFER_BINDING:
WARN() << "DIRTY_BIT_PACK_BUFFER_BINDING unimplemented";
case gl::State::DIRTY_BIT_PACK_STATE:
WARN() << "DIRTY_BIT_PACK_STATE unimplemented";
break;
case gl::State::DIRTY_BIT_DITHER_ENABLED:
WARN() << "DIRTY_BIT_DITHER_ENABLED unimplemented";
......@@ -745,16 +711,11 @@ void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits
case gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB:
WARN() << "DIRTY_BIT_FRAMEBUFFER_SRGB unimplemented";
break;
case gl::State::DIRTY_BIT_CURRENT_VALUES:
WARN() << "DIRTY_BIT_CURRENT_VALUES unimplemented";
break;
default:
if (dirtyBit >= gl::State::DIRTY_BIT_CURRENT_VALUE_0 &&
dirtyBit < gl::State::DIRTY_BIT_CURRENT_VALUE_MAX)
{
WARN() << "DIRTY_BIT_CURRENT_VALUE unimplemented";
}
else
{
UNREACHABLE();
}
UNREACHABLE();
break;
}
}
......
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