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, ...@@ -389,23 +389,11 @@ Context::Context(rx::EGLImplFactory *implFactory,
} }
// Initialize dirty bit masks // Initialize dirty bit masks
// TODO(jmadill): additional ES3 state mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_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);
// No dirty objects. // No dirty objects.
// Readpixels uses the pack state and read FBO // Readpixels uses the pack state and read FBO
mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ALIGNMENT); mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
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);
mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER); mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED); mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
......
...@@ -585,7 +585,8 @@ void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask) ...@@ -585,7 +585,8 @@ void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
{ {
ASSERT(maskNumber < mMaxSampleMaskWords); ASSERT(maskNumber < mMaxSampleMaskWords);
mSampleMaskValues[maskNumber] = mask; 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 GLbitfield State::getSampleMaskWord(GLuint maskNumber) const
...@@ -1340,13 +1341,13 @@ void State::setCopyWriteBufferBinding(const Context *context, Buffer *buffer) ...@@ -1340,13 +1341,13 @@ void State::setCopyWriteBufferBinding(const Context *context, Buffer *buffer)
void State::setPixelPackBufferBinding(const Context *context, Buffer *buffer) void State::setPixelPackBufferBinding(const Context *context, Buffer *buffer)
{ {
mPack.pixelBuffer.set(context, 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) void State::setPixelUnpackBufferBinding(const Context *context, Buffer *buffer)
{ {
mUnpack.pixelBuffer.set(context, 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 Buffer *State::getTargetBuffer(GLenum target) const
...@@ -1406,21 +1407,24 @@ void State::setVertexAttribf(GLuint index, const GLfloat values[4]) ...@@ -1406,21 +1407,24 @@ void State::setVertexAttribf(GLuint index, const GLfloat values[4])
{ {
ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size()); ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
mVertexAttribCurrentValues[index].setFloatValues(values); 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]) void State::setVertexAttribu(GLuint index, const GLuint values[4])
{ {
ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size()); ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
mVertexAttribCurrentValues[index].setUnsignedIntValues(values); 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]) void State::setVertexAttribi(GLuint index, const GLint values[4])
{ {
ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size()); ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
mVertexAttribCurrentValues[index].setIntValues(values); 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, void State::setVertexAttribPointer(const Context *context,
...@@ -1458,7 +1462,7 @@ const void *State::getVertexAttribPointer(unsigned int attribNum) const ...@@ -1458,7 +1462,7 @@ const void *State::getVertexAttribPointer(unsigned int attribNum) const
void State::setPackAlignment(GLint alignment) void State::setPackAlignment(GLint alignment)
{ {
mPack.alignment = alignment; mPack.alignment = alignment;
mDirtyBits.set(DIRTY_BIT_PACK_ALIGNMENT); mDirtyBits.set(DIRTY_BIT_PACK_STATE);
} }
GLint State::getPackAlignment() const GLint State::getPackAlignment() const
...@@ -1469,7 +1473,7 @@ GLint State::getPackAlignment() const ...@@ -1469,7 +1473,7 @@ GLint State::getPackAlignment() const
void State::setPackReverseRowOrder(bool reverseRowOrder) void State::setPackReverseRowOrder(bool reverseRowOrder)
{ {
mPack.reverseRowOrder = reverseRowOrder; mPack.reverseRowOrder = reverseRowOrder;
mDirtyBits.set(DIRTY_BIT_PACK_REVERSE_ROW_ORDER); mDirtyBits.set(DIRTY_BIT_PACK_STATE);
} }
bool State::getPackReverseRowOrder() const bool State::getPackReverseRowOrder() const
...@@ -1480,7 +1484,7 @@ bool State::getPackReverseRowOrder() const ...@@ -1480,7 +1484,7 @@ bool State::getPackReverseRowOrder() const
void State::setPackRowLength(GLint rowLength) void State::setPackRowLength(GLint rowLength)
{ {
mPack.rowLength = rowLength; mPack.rowLength = rowLength;
mDirtyBits.set(DIRTY_BIT_PACK_ROW_LENGTH); mDirtyBits.set(DIRTY_BIT_PACK_STATE);
} }
GLint State::getPackRowLength() const GLint State::getPackRowLength() const
...@@ -1491,7 +1495,7 @@ GLint State::getPackRowLength() const ...@@ -1491,7 +1495,7 @@ GLint State::getPackRowLength() const
void State::setPackSkipRows(GLint skipRows) void State::setPackSkipRows(GLint skipRows)
{ {
mPack.skipRows = skipRows; mPack.skipRows = skipRows;
mDirtyBits.set(DIRTY_BIT_PACK_SKIP_ROWS); mDirtyBits.set(DIRTY_BIT_PACK_STATE);
} }
GLint State::getPackSkipRows() const GLint State::getPackSkipRows() const
...@@ -1502,7 +1506,7 @@ GLint State::getPackSkipRows() const ...@@ -1502,7 +1506,7 @@ GLint State::getPackSkipRows() const
void State::setPackSkipPixels(GLint skipPixels) void State::setPackSkipPixels(GLint skipPixels)
{ {
mPack.skipPixels = skipPixels; mPack.skipPixels = skipPixels;
mDirtyBits.set(DIRTY_BIT_PACK_SKIP_PIXELS); mDirtyBits.set(DIRTY_BIT_PACK_STATE);
} }
GLint State::getPackSkipPixels() const GLint State::getPackSkipPixels() const
...@@ -1523,7 +1527,7 @@ PixelPackState &State::getPackState() ...@@ -1523,7 +1527,7 @@ PixelPackState &State::getPackState()
void State::setUnpackAlignment(GLint alignment) void State::setUnpackAlignment(GLint alignment)
{ {
mUnpack.alignment = alignment; mUnpack.alignment = alignment;
mDirtyBits.set(DIRTY_BIT_UNPACK_ALIGNMENT); mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
} }
GLint State::getUnpackAlignment() const GLint State::getUnpackAlignment() const
...@@ -1534,7 +1538,7 @@ GLint State::getUnpackAlignment() const ...@@ -1534,7 +1538,7 @@ GLint State::getUnpackAlignment() const
void State::setUnpackRowLength(GLint rowLength) void State::setUnpackRowLength(GLint rowLength)
{ {
mUnpack.rowLength = rowLength; mUnpack.rowLength = rowLength;
mDirtyBits.set(DIRTY_BIT_UNPACK_ROW_LENGTH); mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
} }
GLint State::getUnpackRowLength() const GLint State::getUnpackRowLength() const
...@@ -1545,7 +1549,7 @@ GLint State::getUnpackRowLength() const ...@@ -1545,7 +1549,7 @@ GLint State::getUnpackRowLength() const
void State::setUnpackImageHeight(GLint imageHeight) void State::setUnpackImageHeight(GLint imageHeight)
{ {
mUnpack.imageHeight = imageHeight; mUnpack.imageHeight = imageHeight;
mDirtyBits.set(DIRTY_BIT_UNPACK_IMAGE_HEIGHT); mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
} }
GLint State::getUnpackImageHeight() const GLint State::getUnpackImageHeight() const
...@@ -1556,7 +1560,7 @@ GLint State::getUnpackImageHeight() const ...@@ -1556,7 +1560,7 @@ GLint State::getUnpackImageHeight() const
void State::setUnpackSkipImages(GLint skipImages) void State::setUnpackSkipImages(GLint skipImages)
{ {
mUnpack.skipImages = skipImages; mUnpack.skipImages = skipImages;
mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_IMAGES); mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
} }
GLint State::getUnpackSkipImages() const GLint State::getUnpackSkipImages() const
...@@ -1567,7 +1571,7 @@ GLint State::getUnpackSkipImages() const ...@@ -1567,7 +1571,7 @@ GLint State::getUnpackSkipImages() const
void State::setUnpackSkipRows(GLint skipRows) void State::setUnpackSkipRows(GLint skipRows)
{ {
mUnpack.skipRows = skipRows; mUnpack.skipRows = skipRows;
mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_ROWS); mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
} }
GLint State::getUnpackSkipRows() const GLint State::getUnpackSkipRows() const
...@@ -1578,7 +1582,7 @@ GLint State::getUnpackSkipRows() const ...@@ -1578,7 +1582,7 @@ GLint State::getUnpackSkipRows() const
void State::setUnpackSkipPixels(GLint skipPixels) void State::setUnpackSkipPixels(GLint skipPixels)
{ {
mUnpack.skipPixels = skipPixels; mUnpack.skipPixels = skipPixels;
mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_PIXELS); mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
} }
GLint State::getUnpackSkipPixels() const GLint State::getUnpackSkipPixels() const
...@@ -2436,4 +2440,11 @@ Error State::clearUnclearedActiveTextures(const Context *context) ...@@ -2436,4 +2440,11 @@ Error State::clearUnclearedActiveTextures(const Context *context)
return NoError(); return NoError();
} }
AttributesMask State::getAndResetDirtyCurrentValues() const
{
AttributesMask retVal = mDirtyCurrentValues;
mDirtyCurrentValues.reset();
return retVal;
}
} // namespace gl } // namespace gl
...@@ -390,9 +390,8 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable ...@@ -390,9 +390,8 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable
DIRTY_BIT_SAMPLE_COVERAGE_ENABLED, DIRTY_BIT_SAMPLE_COVERAGE_ENABLED,
DIRTY_BIT_SAMPLE_COVERAGE, DIRTY_BIT_SAMPLE_COVERAGE,
DIRTY_BIT_SAMPLE_MASK_ENABLED, DIRTY_BIT_SAMPLE_MASK_ENABLED,
DIRTY_BIT_SAMPLE_MASK_WORD_0, DIRTY_BIT_SAMPLE_MASK,
DIRTY_BIT_SAMPLE_MASK_WORD_MAX = DIRTY_BIT_SAMPLE_MASK_WORD_0 + MAX_SAMPLE_MASK_WORDS, DIRTY_BIT_DEPTH_TEST_ENABLED,
DIRTY_BIT_DEPTH_TEST_ENABLED = DIRTY_BIT_SAMPLE_MASK_WORD_MAX,
DIRTY_BIT_DEPTH_FUNC, DIRTY_BIT_DEPTH_FUNC,
DIRTY_BIT_DEPTH_MASK, DIRTY_BIT_DEPTH_MASK,
DIRTY_BIT_STENCIL_TEST_ENABLED, DIRTY_BIT_STENCIL_TEST_ENABLED,
...@@ -413,19 +412,8 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable ...@@ -413,19 +412,8 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable
DIRTY_BIT_CLEAR_COLOR, DIRTY_BIT_CLEAR_COLOR,
DIRTY_BIT_CLEAR_DEPTH, DIRTY_BIT_CLEAR_DEPTH,
DIRTY_BIT_CLEAR_STENCIL, DIRTY_BIT_CLEAR_STENCIL,
DIRTY_BIT_UNPACK_ALIGNMENT, DIRTY_BIT_UNPACK_STATE,
DIRTY_BIT_UNPACK_ROW_LENGTH, DIRTY_BIT_PACK_STATE,
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_DITHER_ENABLED, DIRTY_BIT_DITHER_ENABLED,
DIRTY_BIT_GENERATE_MIPMAP_HINT, DIRTY_BIT_GENERATE_MIPMAP_HINT,
DIRTY_BIT_SHADER_DERIVATIVE_HINT, DIRTY_BIT_SHADER_DERIVATIVE_HINT,
...@@ -446,12 +434,13 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable ...@@ -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_MATRIX_PROJ, // CHROMIUM_path_rendering path projection matrix
DIRTY_BIT_PATH_RENDERING_STENCIL_STATE, DIRTY_BIT_PATH_RENDERING_STENCIL_STATE,
DIRTY_BIT_FRAMEBUFFER_SRGB, // GL_EXT_sRGB_write_control DIRTY_BIT_FRAMEBUFFER_SRGB, // GL_EXT_sRGB_write_control
DIRTY_BIT_CURRENT_VALUE_0, DIRTY_BIT_CURRENT_VALUES,
DIRTY_BIT_CURRENT_VALUE_MAX = DIRTY_BIT_CURRENT_VALUE_0 + MAX_VERTEX_ATTRIBS, DIRTY_BIT_INVALID,
DIRTY_BIT_INVALID = DIRTY_BIT_CURRENT_VALUE_MAX,
DIRTY_BIT_MAX = 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. // TODO(jmadill): Consider storing dirty objects in a list instead of by binding.
enum DirtyObjectType enum DirtyObjectType
{ {
...@@ -479,6 +468,10 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable ...@@ -479,6 +468,10 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable
void syncDirtyObject(const Context *context, GLenum target); void syncDirtyObject(const Context *context, GLenum target);
void setObjectDirty(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, void setImageUnit(const Context *context,
GLuint unit, GLuint unit,
Texture *texture, Texture *texture,
...@@ -629,6 +622,7 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable ...@@ -629,6 +622,7 @@ class State : public OnAttachmentDirtyReceiver, angle::NonCopyable
DirtyBits mDirtyBits; DirtyBits mDirtyBits;
DirtyObjects mDirtyObjects; DirtyObjects mDirtyObjects;
mutable AttributesMask mDirtyCurrentValues;
}; };
} // namespace gl } // namespace gl
......
...@@ -969,16 +969,16 @@ void StateManager11::syncState(const gl::Context *context, const gl::State::Dirt ...@@ -969,16 +969,16 @@ void StateManager11::syncState(const gl::Context *context, const gl::State::Dirt
} }
vao11->markAllAttributeDivisorsForAdjustment(numViews); vao11->markAllAttributeDivisorsForAdjustment(numViews);
} }
}
break; break;
default: }
if (dirtyBit >= gl::State::DIRTY_BIT_CURRENT_VALUE_0 && case gl::State::DIRTY_BIT_CURRENT_VALUES:
dirtyBit < gl::State::DIRTY_BIT_CURRENT_VALUE_MAX) {
for (auto attribIndex : state.getAndResetDirtyCurrentValues())
{ {
size_t attribIndex =
static_cast<size_t>(dirtyBit - gl::State::DIRTY_BIT_CURRENT_VALUE_0);
invalidateCurrentValueAttrib(attribIndex); invalidateCurrentValueAttrib(attribIndex);
} }
}
default:
break; break;
} }
} }
......
...@@ -514,7 +514,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment, ...@@ -514,7 +514,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment,
mUnpackAlignment = alignment; mUnpackAlignment = alignment;
mFunctions->pixelStorei(GL_UNPACK_ALIGNMENT, mUnpackAlignment); mFunctions->pixelStorei(GL_UNPACK_ALIGNMENT, mUnpackAlignment);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_ALIGNMENT); mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_STATE);
} }
if (mUnpackRowLength != rowLength) if (mUnpackRowLength != rowLength)
...@@ -522,7 +522,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment, ...@@ -522,7 +522,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment,
mUnpackRowLength = rowLength; mUnpackRowLength = rowLength;
mFunctions->pixelStorei(GL_UNPACK_ROW_LENGTH, mUnpackRowLength); mFunctions->pixelStorei(GL_UNPACK_ROW_LENGTH, mUnpackRowLength);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_ROW_LENGTH); mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_STATE);
} }
if (mUnpackSkipRows != skipRows) if (mUnpackSkipRows != skipRows)
...@@ -530,7 +530,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment, ...@@ -530,7 +530,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment,
mUnpackSkipRows = skipRows; mUnpackSkipRows = skipRows;
mFunctions->pixelStorei(GL_UNPACK_SKIP_ROWS, mUnpackSkipRows); mFunctions->pixelStorei(GL_UNPACK_SKIP_ROWS, mUnpackSkipRows);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_SKIP_ROWS); mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_STATE);
} }
if (mUnpackSkipPixels != skipPixels) if (mUnpackSkipPixels != skipPixels)
...@@ -538,7 +538,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment, ...@@ -538,7 +538,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment,
mUnpackSkipPixels = skipPixels; mUnpackSkipPixels = skipPixels;
mFunctions->pixelStorei(GL_UNPACK_SKIP_PIXELS, mUnpackSkipPixels); mFunctions->pixelStorei(GL_UNPACK_SKIP_PIXELS, mUnpackSkipPixels);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_SKIP_PIXELS); mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_STATE);
} }
if (mUnpackImageHeight != imageHeight) if (mUnpackImageHeight != imageHeight)
...@@ -546,7 +546,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment, ...@@ -546,7 +546,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment,
mUnpackImageHeight = imageHeight; mUnpackImageHeight = imageHeight;
mFunctions->pixelStorei(GL_UNPACK_IMAGE_HEIGHT, mUnpackImageHeight); mFunctions->pixelStorei(GL_UNPACK_IMAGE_HEIGHT, mUnpackImageHeight);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT); mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_STATE);
} }
if (mUnpackSkipImages != skipImages) if (mUnpackSkipImages != skipImages)
...@@ -554,7 +554,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment, ...@@ -554,7 +554,7 @@ void StateManagerGL::setPixelUnpackState(GLint alignment,
mUnpackSkipImages = skipImages; mUnpackSkipImages = skipImages;
mFunctions->pixelStorei(GL_UNPACK_SKIP_IMAGES, mUnpackSkipImages); mFunctions->pixelStorei(GL_UNPACK_SKIP_IMAGES, mUnpackSkipImages);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_SKIP_IMAGES); mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_STATE);
} }
bindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer); bindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
...@@ -582,7 +582,7 @@ void StateManagerGL::setPixelPackState(GLint alignment, ...@@ -582,7 +582,7 @@ void StateManagerGL::setPixelPackState(GLint alignment,
mPackAlignment = alignment; mPackAlignment = alignment;
mFunctions->pixelStorei(GL_PACK_ALIGNMENT, mPackAlignment); mFunctions->pixelStorei(GL_PACK_ALIGNMENT, mPackAlignment);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_PACK_ALIGNMENT); mLocalDirtyBits.set(gl::State::DIRTY_BIT_PACK_STATE);
} }
if (mPackRowLength != rowLength) if (mPackRowLength != rowLength)
...@@ -590,7 +590,7 @@ void StateManagerGL::setPixelPackState(GLint alignment, ...@@ -590,7 +590,7 @@ void StateManagerGL::setPixelPackState(GLint alignment,
mPackRowLength = rowLength; mPackRowLength = rowLength;
mFunctions->pixelStorei(GL_PACK_ROW_LENGTH, mPackRowLength); mFunctions->pixelStorei(GL_PACK_ROW_LENGTH, mPackRowLength);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_ROW_LENGTH); mLocalDirtyBits.set(gl::State::DIRTY_BIT_PACK_STATE);
} }
if (mPackSkipRows != skipRows) if (mPackSkipRows != skipRows)
...@@ -598,7 +598,7 @@ void StateManagerGL::setPixelPackState(GLint alignment, ...@@ -598,7 +598,7 @@ void StateManagerGL::setPixelPackState(GLint alignment,
mPackSkipRows = skipRows; mPackSkipRows = skipRows;
mFunctions->pixelStorei(GL_PACK_SKIP_ROWS, mPackSkipRows); mFunctions->pixelStorei(GL_PACK_SKIP_ROWS, mPackSkipRows);
// TODO: set dirty bit once one exists mLocalDirtyBits.set(gl::State::DIRTY_BIT_PACK_STATE);
} }
if (mPackSkipPixels != skipPixels) if (mPackSkipPixels != skipPixels)
...@@ -606,7 +606,7 @@ void StateManagerGL::setPixelPackState(GLint alignment, ...@@ -606,7 +606,7 @@ void StateManagerGL::setPixelPackState(GLint alignment,
mPackSkipPixels = skipPixels; mPackSkipPixels = skipPixels;
mFunctions->pixelStorei(GL_PACK_SKIP_PIXELS, mPackSkipPixels); mFunctions->pixelStorei(GL_PACK_SKIP_PIXELS, mPackSkipPixels);
// TODO: set dirty bit once one exists mLocalDirtyBits.set(gl::State::DIRTY_BIT_PACK_STATE);
} }
bindBuffer(GL_PIXEL_PACK_BUFFER, packBuffer); bindBuffer(GL_PIXEL_PACK_BUFFER, packBuffer);
...@@ -1069,7 +1069,8 @@ void StateManagerGL::setAttributeCurrentData(size_t index, ...@@ -1069,7 +1069,8 @@ void StateManagerGL::setAttributeCurrentData(size_t index,
UNREACHABLE(); UNREACHABLE();
} }
mLocalDirtyBits.set(gl::State::DIRTY_BIT_CURRENT_VALUE_0 + index); mLocalDirtyBits.set(gl::State::DIRTY_BIT_CURRENT_VALUES);
mLocalDirtyCurrentValues.set(index);
} }
} }
...@@ -1362,7 +1363,7 @@ void StateManagerGL::setSampleMaski(GLuint maskNumber, GLbitfield mask) ...@@ -1362,7 +1363,7 @@ void StateManagerGL::setSampleMaski(GLuint maskNumber, GLbitfield mask)
mSampleMaskValues[maskNumber] = mask; mSampleMaskValues[maskNumber] = mask;
mFunctions->sampleMaski(maskNumber, mask); mFunctions->sampleMaski(maskNumber, mask);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_SAMPLE_MASK_WORD_0 + maskNumber); mLocalDirtyBits.set(gl::State::DIRTY_BIT_SAMPLE_MASK);
} }
} }
...@@ -1673,7 +1674,7 @@ void StateManagerGL::syncState(const gl::Context *context, const gl::State::Dirt ...@@ -1673,7 +1674,7 @@ void StateManagerGL::syncState(const gl::Context *context, const gl::State::Dirt
{ {
const gl::State &state = context->getGLState(); const gl::State &state = context->getGLState();
// The the current framebuffer binding sometimes requires resetting the srgb blending // Changing the draw framebuffer binding sometimes requires resetting srgb blending.
if (glDirtyBits[gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING]) if (glDirtyBits[gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING])
{ {
if (mFunctions->standard == STANDARD_GL_DESKTOP) if (mFunctions->standard == STANDARD_GL_DESKTOP)
...@@ -1897,56 +1898,10 @@ void StateManagerGL::syncState(const gl::Context *context, const gl::State::Dirt ...@@ -1897,56 +1898,10 @@ void StateManagerGL::syncState(const gl::Context *context, const gl::State::Dirt
case gl::State::DIRTY_BIT_CLEAR_STENCIL: case gl::State::DIRTY_BIT_CLEAR_STENCIL:
setClearStencil(state.getStencilClearValue()); setClearStencil(state.getStencilClearValue());
break; break;
case gl::State::DIRTY_BIT_UNPACK_ALIGNMENT: case gl::State::DIRTY_BIT_UNPACK_STATE:
// TODO(jmadill): split this
setPixelUnpackState(state.getUnpackState()); setPixelUnpackState(state.getUnpackState());
break; break;
case gl::State::DIRTY_BIT_UNPACK_ROW_LENGTH: case gl::State::DIRTY_BIT_PACK_STATE:
// TODO(jmadill): split this
setPixelUnpackState(state.getUnpackState());
break;
case gl::State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT:
// TODO(jmadill): split this
setPixelUnpackState(state.getUnpackState());
break;
case gl::State::DIRTY_BIT_UNPACK_SKIP_IMAGES:
// TODO(jmadill): split this
setPixelUnpackState(state.getUnpackState());
break;
case gl::State::DIRTY_BIT_UNPACK_SKIP_ROWS:
// TODO(jmadill): split this
setPixelUnpackState(state.getUnpackState());
break;
case gl::State::DIRTY_BIT_UNPACK_SKIP_PIXELS:
// TODO(jmadill): split this
setPixelUnpackState(state.getUnpackState());
break;
case gl::State::DIRTY_BIT_UNPACK_BUFFER_BINDING:
// TODO(jmadill): split this
setPixelUnpackState(state.getUnpackState());
break;
case gl::State::DIRTY_BIT_PACK_ALIGNMENT:
// TODO(jmadill): split this
setPixelPackState(state.getPackState());
break;
case gl::State::DIRTY_BIT_PACK_REVERSE_ROW_ORDER:
// TODO(jmadill): split this
setPixelPackState(state.getPackState());
break;
case gl::State::DIRTY_BIT_PACK_ROW_LENGTH:
// TODO(jmadill): split this
setPixelPackState(state.getPackState());
break;
case gl::State::DIRTY_BIT_PACK_SKIP_ROWS:
// TODO(jmadill): split this
setPixelPackState(state.getPackState());
break;
case gl::State::DIRTY_BIT_PACK_SKIP_PIXELS:
// TODO(jmadill): split this
setPixelPackState(state.getPackState());
break;
case gl::State::DIRTY_BIT_PACK_BUFFER_BINDING:
// TODO(jmadill): split this
setPixelPackState(state.getPackState()); setPixelPackState(state.getPackState());
break; break;
case gl::State::DIRTY_BIT_DITHER_ENABLED: case gl::State::DIRTY_BIT_DITHER_ENABLED:
...@@ -2025,34 +1980,31 @@ void StateManagerGL::syncState(const gl::Context *context, const gl::State::Dirt ...@@ -2025,34 +1980,31 @@ void StateManagerGL::syncState(const gl::Context *context, const gl::State::Dirt
case gl::State::DIRTY_BIT_SAMPLE_MASK_ENABLED: case gl::State::DIRTY_BIT_SAMPLE_MASK_ENABLED:
setSampleMaskEnabled(state.isSampleMaskEnabled()); setSampleMaskEnabled(state.isSampleMaskEnabled());
break; break;
default: case gl::State::DIRTY_BIT_SAMPLE_MASK:
{ {
if (dirtyBit >= gl::State::DIRTY_BIT_CURRENT_VALUE_0 && for (GLuint maskNumber = 0; maskNumber < state.getMaxSampleMaskWords();
dirtyBit < gl::State::DIRTY_BIT_CURRENT_VALUE_MAX) ++maskNumber)
{ {
size_t attribIndex = setSampleMaski(maskNumber, state.getSampleMaskWord(maskNumber));
static_cast<size_t>(dirtyBit) - gl::State::DIRTY_BIT_CURRENT_VALUE_0; }
setAttributeCurrentData(attribIndex,
state.getVertexAttribCurrentValue(attribIndex));
break; break;
} }
else if (dirtyBit >= gl::State::DIRTY_BIT_SAMPLE_MASK_WORD_0 && case gl::State::DIRTY_BIT_CURRENT_VALUES:
dirtyBit < gl::State::DIRTY_BIT_SAMPLE_MASK_WORD_MAX)
{ {
GLuint maskNumber = gl::AttributesMask combinedMask =
static_cast<GLuint>(dirtyBit) - gl::State::DIRTY_BIT_SAMPLE_MASK_WORD_0; (state.getAndResetDirtyCurrentValues() | mLocalDirtyCurrentValues);
// Only set the available sample mask values. mLocalDirtyCurrentValues.reset();
if (maskNumber < state.getMaxSampleMaskWords())
for (auto attribIndex : combinedMask)
{ {
setSampleMaski(maskNumber, state.getSampleMaskWord(maskNumber)); setAttributeCurrentData(attribIndex,
state.getVertexAttribCurrentValue(attribIndex));
} }
break; break;
} }
else default:
{
UNREACHABLE(); UNREACHABLE();
} break;
}
} }
mLocalDirtyBits.reset(); mLocalDirtyBits.reset();
......
...@@ -353,6 +353,7 @@ class StateManagerGL final : angle::NonCopyable ...@@ -353,6 +353,7 @@ class StateManagerGL final : angle::NonCopyable
const bool mIsMultiviewEnabled; const bool mIsMultiviewEnabled;
gl::State::DirtyBits mLocalDirtyBits; gl::State::DirtyBits mLocalDirtyBits;
gl::AttributesMask mLocalDirtyCurrentValues;
// ANGLE_multiview dirty bits. // ANGLE_multiview dirty bits.
angle::BitSet<MULTIVIEW_DIRTY_BIT_MAX> mMultiviewDirtyBits; angle::BitSet<MULTIVIEW_DIRTY_BIT_MAX> mMultiviewDirtyBits;
......
...@@ -572,9 +572,8 @@ void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits ...@@ -572,9 +572,8 @@ void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits
case gl::State::DIRTY_BIT_SAMPLE_MASK_ENABLED: case gl::State::DIRTY_BIT_SAMPLE_MASK_ENABLED:
WARN() << "DIRTY_BIT_SAMPLE_MASK_ENABLED unimplemented"; WARN() << "DIRTY_BIT_SAMPLE_MASK_ENABLED unimplemented";
break; break;
case gl::State::DIRTY_BIT_SAMPLE_MASK_WORD_0: case gl::State::DIRTY_BIT_SAMPLE_MASK:
case gl::State::DIRTY_BIT_SAMPLE_MASK_WORD_0 + 1: WARN() << "DIRTY_BIT_SAMPLE_MASK unimplemented";
WARN() << "DIRTY_BIT_SAMPLE_MASK_WORD unimplemented";
break; break;
case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED: case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
WARN() << "DIRTY_BIT_DEPTH_TEST_ENABLED unimplemented"; WARN() << "DIRTY_BIT_DEPTH_TEST_ENABLED unimplemented";
...@@ -638,44 +637,11 @@ void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits ...@@ -638,44 +637,11 @@ void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits
case gl::State::DIRTY_BIT_CLEAR_STENCIL: case gl::State::DIRTY_BIT_CLEAR_STENCIL:
WARN() << "DIRTY_BIT_CLEAR_STENCIL unimplemented"; WARN() << "DIRTY_BIT_CLEAR_STENCIL unimplemented";
break; break;
case gl::State::DIRTY_BIT_UNPACK_ALIGNMENT: case gl::State::DIRTY_BIT_UNPACK_STATE:
WARN() << "DIRTY_BIT_UNPACK_ALIGNMENT unimplemented"; WARN() << "DIRTY_BIT_UNPACK_STATE unimplemented";
break; break;
case gl::State::DIRTY_BIT_UNPACK_ROW_LENGTH: case gl::State::DIRTY_BIT_PACK_STATE:
WARN() << "DIRTY_BIT_UNPACK_ROW_LENGTH unimplemented"; WARN() << "DIRTY_BIT_PACK_STATE 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";
break; break;
case gl::State::DIRTY_BIT_DITHER_ENABLED: case gl::State::DIRTY_BIT_DITHER_ENABLED:
WARN() << "DIRTY_BIT_DITHER_ENABLED unimplemented"; WARN() << "DIRTY_BIT_DITHER_ENABLED unimplemented";
...@@ -745,16 +711,11 @@ void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits ...@@ -745,16 +711,11 @@ void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits
case gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB: case gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB:
WARN() << "DIRTY_BIT_FRAMEBUFFER_SRGB unimplemented"; WARN() << "DIRTY_BIT_FRAMEBUFFER_SRGB unimplemented";
break; break;
case gl::State::DIRTY_BIT_CURRENT_VALUES:
WARN() << "DIRTY_BIT_CURRENT_VALUES unimplemented";
break;
default: 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; 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