Split the context-private part of the state cache

In preparation for passing it directly to entry point implementations,
ensuring no access to the share-group-accessible part.

Bug: angleproject:8224
Change-Id: I705e6a8fb5204bab71caffff4dcb56d16c3d6e10
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4678782
Reviewed-by: Charlie Lao <cclao@google.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
This commit is contained in:
Shahbaz Youssefi
2023-07-11 15:20:09 -04:00
committed by Angle LUCI CQ
parent 40111c68dd
commit 491c2a5496
4 changed files with 103 additions and 115 deletions

View File

@@ -9717,7 +9717,7 @@ void Context::setLogicOpEnabledForGLES1(bool enabled)
{
// Same implementation as ContextPrivateEnable(GL_COLOR_LOGIC_OP), without the GLES1 forwarding.
getMutablePrivateState()->setLogicOpEnabled(enabled);
onContextPrivateCapChange();
getPrivateStateCache().onCapChange();
}
egl::Error Context::releaseHighPowerGPU()
@@ -10038,8 +10038,7 @@ StateCache::StateCache()
mCachedBasicDrawElementsError(kInvalidPointer),
mCachedProgramPipelineError(kInvalidPointer),
mCachedTransformFeedbackActiveUnpaused(false),
mCachedCanDraw(false),
mIsCachedBasicDrawStatesErrorValid(true)
mCachedCanDraw(false)
{
mCachedValidDrawModes.fill(false);
}
@@ -10152,11 +10151,13 @@ void StateCache::updateBasicDrawElementsError()
mCachedBasicDrawElementsError = kInvalidPointer;
}
intptr_t StateCache::getBasicDrawStatesErrorImpl(const Context *context) const
intptr_t StateCache::getBasicDrawStatesErrorImpl(const Context *context,
const PrivateStateCache *privateStateCache) const
{
ASSERT(mCachedBasicDrawStatesErrorString == kInvalidPointer ||
!mIsCachedBasicDrawStatesErrorValid);
ASSERT(mCachedBasicDrawStatesErrorCode == GL_NO_ERROR || !mIsCachedBasicDrawStatesErrorValid);
!privateStateCache->isCachedBasicDrawStatesErrorValid());
ASSERT(mCachedBasicDrawStatesErrorCode == GL_NO_ERROR ||
!privateStateCache->isCachedBasicDrawStatesErrorValid());
// Only assign the error code after ValidateDrawStates has completed. ValidateDrawStates calls
// updateBasicDrawStatesError in some cases and resets the value mid-call.
@@ -10170,7 +10171,7 @@ intptr_t StateCache::getBasicDrawStatesErrorImpl(const Context *context) const
ASSERT((mCachedBasicDrawStatesErrorString == 0) ==
(mCachedBasicDrawStatesErrorCode == GL_NO_ERROR));
mIsCachedBasicDrawStatesErrorValid = true;
privateStateCache->setCachedBasicDrawStatesErrorValid();
return mCachedBasicDrawStatesErrorString;
}
@@ -10243,21 +10244,6 @@ void StateCache::onDrawFramebufferChange(Context *context)
updateBasicDrawStatesError();
}
void StateCache::onContextPrivateCapChange(Context *context)
{
mIsCachedBasicDrawStatesErrorValid = false;
}
void StateCache::onContextPrivateStencilStateChange(Context *context)
{
mIsCachedBasicDrawStatesErrorValid = false;
}
void StateCache::onContextPrivateDefaultVertexAttributeChange(Context *context)
{
mIsCachedBasicDrawStatesErrorValid = false;
}
void StateCache::onActiveTextureChange(Context *context)
{
updateBasicDrawStatesError();
@@ -10291,21 +10277,6 @@ void StateCache::onShaderStorageBufferStateChange(Context *context)
updateBasicDrawStatesError();
}
void StateCache::onContextPrivateColorMaskChange(Context *context)
{
mIsCachedBasicDrawStatesErrorValid = false;
}
void StateCache::onContextPrivateBlendFuncIndexedChange(Context *context)
{
mIsCachedBasicDrawStatesErrorValid = false;
}
void StateCache::onContextPrivateBlendEquationChange(Context *context)
{
mIsCachedBasicDrawStatesErrorValid = false;
}
void StateCache::setValidDrawModes(bool pointsOK,
bool linesOK,
bool trisOK,
@@ -10509,4 +10480,16 @@ void StateCache::updateCanDraw(Context *context)
(context->isGLES1() || (context->getState().getProgramExecutable() &&
context->getState().getProgramExecutable()->hasVertexShader()));
}
bool StateCache::isCurrentContext(const Context *context,
const PrivateStateCache *privateStateCache) const
{
// Ensure that the state cache is not queried by any context other than the one that owns it.
return &context->getStateCache() == this &&
&context->getPrivateStateCache() == privateStateCache;
}
PrivateStateCache::PrivateStateCache() : mIsCachedBasicDrawStatesErrorValid(true) {}
PrivateStateCache::~PrivateStateCache() = default;
} // namespace gl

View File

@@ -116,6 +116,34 @@ enum class VertexAttribTypeCase
ValidSize3or4 = 3,
};
// Part of StateCache (see below) that is private to the context and is inaccessible to other
// contexts.
class PrivateStateCache final : angle::NonCopyable
{
public:
PrivateStateCache();
~PrivateStateCache();
void onCapChange() { mIsCachedBasicDrawStatesErrorValid = false; }
void onColorMaskChange() { mIsCachedBasicDrawStatesErrorValid = false; }
void onDefaultVertexAttributeChange() { mIsCachedBasicDrawStatesErrorValid = false; }
void onBlendFuncIndexedChange() { mIsCachedBasicDrawStatesErrorValid = false; }
void onBlendEquationChange() { mIsCachedBasicDrawStatesErrorValid = false; }
void onStencilStateChange() { mIsCachedBasicDrawStatesErrorValid = false; }
bool isCachedBasicDrawStatesErrorValid() const { return mIsCachedBasicDrawStatesErrorValid; }
void setCachedBasicDrawStatesErrorValid() const { mIsCachedBasicDrawStatesErrorValid = true; }
private:
// StateCache::mCachedBasicDrawStatesError* may be invalidated through numerous calls (see the
// comment on getBasicDrawStatesErrorString), some of which may originate from other contexts
// (through the observer interface). However, ContextPrivate* helpers may also need to
// invalidate the draw states, but they are called without holding the share group lock. The
// following tracks whether StateCache::mCachedBasicDrawStatesError* values are valid and is
// accessed only by the context itself.
mutable bool mIsCachedBasicDrawStatesErrorValid;
};
// Helper class for managing cache variables and state changes.
class StateCache final : angle::NonCopyable
{
@@ -155,26 +183,31 @@ class StateCache final : angle::NonCopyable
// 4. onVertexArrayStateChange.
// 5. onVertexArrayBufferStateChange.
// 6. onDrawFramebufferChange.
// 7. onContextPrivateCapChange.
// 8. onContextPrivateStencilStateChange.
// 9. onContextPrivateDefaultVertexAttributeChange.
// 10. onActiveTextureChange.
// 11. onQueryChange.
// 12. onActiveTransformFeedbackChange.
// 13. onUniformBufferStateChange.
// 14. onContextPrivateColorMaskChange.
// 15. onBufferBindingChange.
// 16. onContextPrivateBlendFuncIndexedChange.
// 17. onContextPrivateBlendEquationChange.
intptr_t getBasicDrawStatesErrorString(const Context *context) const
// 7. onActiveTextureChange.
// 8. onQueryChange.
// 9. onActiveTransformFeedbackChange.
// 10. onUniformBufferStateChange.
// 11. onBufferBindingChange.
//
// Additionally, the following in PrivateStateCache can lead to updateBasicDrawStatesError:
// 1. onCapChange.
// 2. onStencilStateChange.
// 3. onDefaultVertexAttributeChange.
// 4. onColorMaskChange.
// 5. onBlendFuncIndexedChange.
// 6. onBlendEquationChange.
intptr_t getBasicDrawStatesErrorString(const Context *context,
const PrivateStateCache *privateStateCache) const
{
if (mIsCachedBasicDrawStatesErrorValid &&
// This is only ever called with the context that owns this state cache
ASSERT(isCurrentContext(context, privateStateCache));
if (privateStateCache->isCachedBasicDrawStatesErrorValid() &&
mCachedBasicDrawStatesErrorString != kInvalidPointer)
{
return mCachedBasicDrawStatesErrorString;
}
return getBasicDrawStatesErrorImpl(context);
return getBasicDrawStatesErrorImpl(context, privateStateCache);
}
// The GL error enum to use when generating errors due to failed draw states. Only valid if
@@ -283,18 +316,10 @@ class StateCache final : angle::NonCopyable
void onAtomicCounterBufferStateChange(Context *context);
void onShaderStorageBufferStateChange(Context *context);
void onBufferBindingChange(Context *context);
// The following state change notifications are only called from context-private state change
// functions. They only affect the draw validation cache which is also context-private (i.e.
// not accessed by other contexts in the share group). Note that context-private state change
// functions are called without holding the share group lock.
void onContextPrivateCapChange(Context *context);
void onContextPrivateColorMaskChange(Context *context);
void onContextPrivateDefaultVertexAttributeChange(Context *context);
void onContextPrivateBlendFuncIndexedChange(Context *context);
void onContextPrivateBlendEquationChange(Context *context);
void onContextPrivateStencilStateChange(Context *context);
private:
bool isCurrentContext(const Context *context, const PrivateStateCache *privateStateCache) const;
// Cache update functions.
void updateActiveAttribsMask(Context *context);
void updateVertexElementLimits(Context *context);
@@ -318,7 +343,8 @@ class StateCache final : angle::NonCopyable
bool triAdjOK,
bool patchOK);
intptr_t getBasicDrawStatesErrorImpl(const Context *context) const;
intptr_t getBasicDrawStatesErrorImpl(const Context *context,
const PrivateStateCache *privateStateCache) const;
intptr_t getProgramPipelineErrorImpl(const Context *context) const;
intptr_t getBasicDrawElementsErrorImpl(const Context *context) const;
@@ -363,14 +389,6 @@ class StateCache final : angle::NonCopyable
mCachedIntegerVertexAttribTypesValidation;
bool mCachedCanDraw;
// mCachedBasicDrawStatesError* may be invalidated through numerous calls (see the comment on
// getBasicDrawStatesErrorString), some of which may originate from other contexts (through the
// observer interface). However, ContextPrivate* helpers may also need to invalidate the draw
// states, but they are called without holding the share group lock. The following tracks
// whether mCachedBasicDrawStatesError* values are valid and is accessed only by the context
// itself.
mutable bool mIsCachedBasicDrawStatesErrorValid;
};
using VertexArrayMap = ResourceMap<VertexArray, VertexArrayID>;
@@ -575,24 +593,6 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
// To be used **only** directly by the entry points.
PrivateState *getMutablePrivateState() { return mState.getMutablePrivateState(); }
GLES1State *getMutableGLES1State() { return mState.getMutableGLES1State(); }
void onContextPrivateCapChange() { mStateCache.onContextPrivateCapChange(this); }
void onContextPrivateColorMaskChange() { mStateCache.onContextPrivateColorMaskChange(this); }
void onContextPrivateDefaultVertexAttributeChange()
{
mStateCache.onContextPrivateDefaultVertexAttributeChange(this);
}
void onContextPrivateBlendFuncIndexedChange()
{
mStateCache.onContextPrivateBlendFuncIndexedChange(this);
}
void onContextPrivateBlendEquationChange()
{
mStateCache.onContextPrivateBlendEquationChange(this);
}
void onContextPrivateStencilStateChange()
{
mStateCache.onContextPrivateStencilStateChange(this);
}
bool skipValidation() const
{
@@ -658,6 +658,9 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
const StateCache &getStateCache() const { return mStateCache; }
StateCache &getStateCache() { return mStateCache; }
const PrivateStateCache &getPrivateStateCache() const { return mPrivateStateCache; }
PrivateStateCache &getPrivateStateCache() { return mPrivateStateCache; }
void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
void onSamplerUniformChange(size_t textureUnitIndex);
@@ -884,6 +887,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
state::DirtyObjects mDrawDirtyObjects;
StateCache mStateCache;
PrivateStateCache mPrivateStateCache;
state::DirtyObjects mTexImageDirtyObjects;
state::DirtyObjects mReadPixelsDirtyObjects;

View File

@@ -73,7 +73,7 @@ void ContextPrivateColorMask(Context *context,
{
context->getMutablePrivateState()->setColorMask(ConvertToBool(red), ConvertToBool(green),
ConvertToBool(blue), ConvertToBool(alpha));
context->onContextPrivateColorMaskChange();
context->getPrivateStateCache().onColorMaskChange();
}
void ContextPrivateColorMaski(Context *context,
@@ -85,7 +85,7 @@ void ContextPrivateColorMaski(Context *context,
{
context->getMutablePrivateState()->setColorMaskIndexed(
ConvertToBool(r), ConvertToBool(g), ConvertToBool(b), ConvertToBool(a), index);
context->onContextPrivateColorMaskChange();
context->getPrivateStateCache().onColorMaskChange();
}
void ContextPrivateDepthMask(Context *context, GLboolean flag)
@@ -96,25 +96,25 @@ void ContextPrivateDepthMask(Context *context, GLboolean flag)
void ContextPrivateDisable(Context *context, GLenum cap)
{
context->getMutablePrivateState()->setEnableFeature(cap, false);
context->onContextPrivateCapChange();
context->getPrivateStateCache().onCapChange();
}
void ContextPrivateDisablei(Context *context, GLenum target, GLuint index)
{
context->getMutablePrivateState()->setEnableFeatureIndexed(target, false, index);
context->onContextPrivateCapChange();
context->getPrivateStateCache().onCapChange();
}
void ContextPrivateEnable(Context *context, GLenum cap)
{
context->getMutablePrivateState()->setEnableFeature(cap, true);
context->onContextPrivateCapChange();
context->getPrivateStateCache().onCapChange();
}
void ContextPrivateEnablei(Context *context, GLenum target, GLuint index)
{
context->getMutablePrivateState()->setEnableFeatureIndexed(target, true, index);
context->onContextPrivateCapChange();
context->getPrivateStateCache().onCapChange();
}
void ContextPrivateActiveTexture(Context *context, GLenum texture)
@@ -196,42 +196,42 @@ void ContextPrivateVertexAttrib1f(Context *context, GLuint index, GLfloat x)
{
GLfloat vals[4] = {x, 0, 0, 1};
context->getMutablePrivateState()->setVertexAttribf(index, vals);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttrib1fv(Context *context, GLuint index, const GLfloat *values)
{
GLfloat vals[4] = {values[0], 0, 0, 1};
context->getMutablePrivateState()->setVertexAttribf(index, vals);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttrib2f(Context *context, GLuint index, GLfloat x, GLfloat y)
{
GLfloat vals[4] = {x, y, 0, 1};
context->getMutablePrivateState()->setVertexAttribf(index, vals);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttrib2fv(Context *context, GLuint index, const GLfloat *values)
{
GLfloat vals[4] = {values[0], values[1], 0, 1};
context->getMutablePrivateState()->setVertexAttribf(index, vals);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttrib3f(Context *context, GLuint index, GLfloat x, GLfloat y, GLfloat z)
{
GLfloat vals[4] = {x, y, z, 1};
context->getMutablePrivateState()->setVertexAttribf(index, vals);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttrib3fv(Context *context, GLuint index, const GLfloat *values)
{
GLfloat vals[4] = {values[0], values[1], values[2], 1};
context->getMutablePrivateState()->setVertexAttribf(index, vals);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttrib4f(Context *context,
@@ -243,13 +243,13 @@ void ContextPrivateVertexAttrib4f(Context *context,
{
GLfloat vals[4] = {x, y, z, w};
context->getMutablePrivateState()->setVertexAttribf(index, vals);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttrib4fv(Context *context, GLuint index, const GLfloat *values)
{
context->getMutablePrivateState()->setVertexAttribf(index, values);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttribI4i(Context *context,
@@ -261,13 +261,13 @@ void ContextPrivateVertexAttribI4i(Context *context,
{
GLint vals[4] = {x, y, z, w};
context->getMutablePrivateState()->setVertexAttribi(index, vals);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttribI4iv(Context *context, GLuint index, const GLint *values)
{
context->getMutablePrivateState()->setVertexAttribi(index, values);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttribI4ui(Context *context,
@@ -279,13 +279,13 @@ void ContextPrivateVertexAttribI4ui(Context *context,
{
GLuint vals[4] = {x, y, z, w};
context->getMutablePrivateState()->setVertexAttribu(index, vals);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateVertexAttribI4uiv(Context *context, GLuint index, const GLuint *values)
{
context->getMutablePrivateState()->setVertexAttribu(index, values);
context->onContextPrivateDefaultVertexAttributeChange();
context->getPrivateStateCache().onDefaultVertexAttributeChange();
}
void ContextPrivateViewport(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
@@ -370,19 +370,19 @@ void ContextPrivateBlendColor(Context *context,
void ContextPrivateBlendEquation(Context *context, GLenum mode)
{
context->getMutablePrivateState()->setBlendEquation(mode, mode);
context->onContextPrivateBlendEquationChange();
context->getPrivateStateCache().onBlendEquationChange();
}
void ContextPrivateBlendEquationi(Context *context, GLuint buf, GLenum mode)
{
context->getMutablePrivateState()->setBlendEquationIndexed(mode, mode, buf);
context->onContextPrivateBlendEquationChange();
context->getPrivateStateCache().onBlendEquationChange();
}
void ContextPrivateBlendEquationSeparate(Context *context, GLenum modeRGB, GLenum modeAlpha)
{
context->getMutablePrivateState()->setBlendEquation(modeRGB, modeAlpha);
context->onContextPrivateBlendEquationChange();
context->getPrivateStateCache().onBlendEquationChange();
}
void ContextPrivateBlendEquationSeparatei(Context *context,
@@ -391,7 +391,7 @@ void ContextPrivateBlendEquationSeparatei(Context *context,
GLenum modeAlpha)
{
context->getMutablePrivateState()->setBlendEquationIndexed(modeRGB, modeAlpha, buf);
context->onContextPrivateBlendEquationChange();
context->getPrivateStateCache().onBlendEquationChange();
}
void ContextPrivateBlendFunc(Context *context, GLenum sfactor, GLenum dfactor)
@@ -404,7 +404,7 @@ void ContextPrivateBlendFunci(Context *context, GLuint buf, GLenum src, GLenum d
context->getMutablePrivateState()->setBlendFactorsIndexed(src, dst, src, dst, buf);
if (context->getState().noSimultaneousConstantColorAndAlphaBlendFunc())
{
context->onContextPrivateBlendFuncIndexedChange();
context->getPrivateStateCache().onBlendFuncIndexedChange();
}
}
@@ -428,7 +428,7 @@ void ContextPrivateBlendFuncSeparatei(Context *context,
buf);
if (context->getState().noSimultaneousConstantColorAndAlphaBlendFunc())
{
context->onContextPrivateBlendFuncIndexedChange();
context->getPrivateStateCache().onBlendFuncIndexedChange();
}
}
@@ -454,7 +454,7 @@ void ContextPrivateStencilFuncSeparate(Context *context,
context->getMutablePrivateState()->setStencilBackParams(func, clampedRef, mask);
}
context->onContextPrivateStencilStateChange();
context->getPrivateStateCache().onStencilStateChange();
}
void ContextPrivateStencilMask(Context *context, GLuint mask)
@@ -474,7 +474,7 @@ void ContextPrivateStencilMaskSeparate(Context *context, GLenum face, GLuint mas
context->getMutablePrivateState()->setStencilBackWritemask(mask);
}
context->onContextPrivateStencilStateChange();
context->getPrivateStateCache().onStencilStateChange();
}
void ContextPrivateStencilOp(Context *context, GLenum fail, GLenum zfail, GLenum zpass)

View File

@@ -432,7 +432,8 @@ ANGLE_INLINE bool ValidateDrawBase(const Context *context,
angle::EntryPoint entryPoint,
PrimitiveMode mode)
{
intptr_t drawStatesError = context->getStateCache().getBasicDrawStatesErrorString(context);
intptr_t drawStatesError = context->getStateCache().getBasicDrawStatesErrorString(
context, &context->getPrivateStateCache());
if (drawStatesError)
{
const char *errorMessage = reinterpret_cast<const char *>(drawStatesError);