зеркало из https://github.com/AvaloniaUI/angle.git
Guard against data race with MemoryProgramCache.
Uses the display global mutex. Caught with angle_end2end_tests MultithreadingTest and TSAN. Bug: b/168744561 Change-Id: I5a60346cb5f95ff506dc166604eeae501863a774 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2415182 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Courtney Goeltzenleuchter <courtneygo@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
This commit is contained in:
Родитель
5f8af83fe9
Коммит
4043b9d103
|
@ -8475,6 +8475,11 @@ void Context::onGPUSwitch()
|
|||
initRendererString();
|
||||
}
|
||||
|
||||
std::mutex &Context::getProgramCacheMutex() const
|
||||
{
|
||||
return mDisplay->getProgramCacheMutex();
|
||||
}
|
||||
|
||||
// ErrorSet implementation.
|
||||
ErrorSet::ErrorSet(Context *context) : mContext(context) {}
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#ifndef LIBANGLE_CONTEXT_H_
|
||||
#define LIBANGLE_CONTEXT_H_
|
||||
|
||||
#include <mutex>
|
||||
#include <set>
|
||||
#include <string>
|
||||
|
||||
|
@ -506,6 +507,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
|
|||
angle::Result prepareForDispatch();
|
||||
|
||||
MemoryProgramCache *getMemoryProgramCache() const { return mMemoryProgramCache; }
|
||||
std::mutex &getProgramCacheMutex() const;
|
||||
|
||||
bool hasBeenCurrent() const { return mHasBeenCurrent; }
|
||||
egl::Display *getDisplay() const { return mDisplay; }
|
||||
|
|
|
@ -256,6 +256,7 @@ class Display final : public LabeledObject,
|
|||
egl::Error handleGPUSwitch();
|
||||
|
||||
std::mutex &getDisplayGlobalMutex() { return mDisplayGlobalMutex; }
|
||||
std::mutex &getProgramCacheMutex() { return mProgramCacheMutex; }
|
||||
|
||||
private:
|
||||
Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice);
|
||||
|
@ -327,6 +328,7 @@ class Display final : public LabeledObject,
|
|||
std::vector<angle::ScratchBuffer> mZeroFilledBuffers;
|
||||
|
||||
std::mutex mDisplayGlobalMutex;
|
||||
std::mutex mProgramCacheMutex;
|
||||
};
|
||||
|
||||
} // namespace egl
|
||||
|
|
|
@ -1437,6 +1437,7 @@ angle::Result Program::linkImpl(const Context *context)
|
|||
// TODO: http://anglebug.com/4530: Enable program caching for separable programs
|
||||
if (cache && !isSeparable())
|
||||
{
|
||||
std::lock_guard<std::mutex> cacheLock(context->getProgramCacheMutex());
|
||||
angle::Result cacheResult = cache->getProgram(context, this, &programHash);
|
||||
ANGLE_TRY(cacheResult);
|
||||
|
||||
|
@ -1658,6 +1659,7 @@ void Program::resolveLinkImpl(const Context *context)
|
|||
postResolveLink(context);
|
||||
|
||||
// Save to the program cache.
|
||||
std::lock_guard<std::mutex> cacheLock(context->getProgramCacheMutex());
|
||||
MemoryProgramCache *cache = context->getMemoryProgramCache();
|
||||
// TODO: http://anglebug.com/4530: Enable program caching for separable programs
|
||||
if (cache && !isSeparable() &&
|
||||
|
|
Загрузка…
Ссылка в новой задаче