Do not call postResolveLink in Program::deserialize. postResolveLink assumes the program is currently linked, which is not the case in Program::deserialize. It makes calls to set uniforms which is not always expected by the backend. Call postResolveLink after the backend has linked when loading program binaries. Bug: angleproject:6073, angleproject:8183 Change-Id: Idacb81040ea79a7df51917aaa27c77b25df7d5cd Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4588410 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp index beea55a..40c6d06 100644 --- a/src/libANGLE/Program.cpp +++ b/src/libANGLE/Program.cpp
@@ -1309,12 +1309,6 @@ return; } - if (linkingState->linkingFromBinary) - { - // All internal Program state is already loaded from the binary. - return; - } - // According to GLES 3.0/3.1 spec for LinkProgram and UseProgram, // Only successfully linked program can replace the executables. ASSERT(mLinked); @@ -1327,6 +1321,12 @@ // Must be called after markUnusedUniformLocations. postResolveLink(context); + if (linkingState->linkingFromBinary) + { + // All internal Program state is already loaded from the binary. + return; + } + // Save to the program cache. std::lock_guard<std::mutex> cacheLock(context->getProgramCacheMutex()); MemoryProgramCache *cache = context->getMemoryProgramCache(); @@ -3687,7 +3687,6 @@ mState.mExecutable->updateTransformFeedbackStrides(); } - postResolveLink(context); mState.mExecutable->updateCanDrawWith(); if (context->getShareGroup()->getFrameCaptureShared()->enabled())
diff --git a/src/tests/angle_end2end_tests_expectations.txt b/src/tests/angle_end2end_tests_expectations.txt index 4ceb077..8cffb6e 100644 --- a/src/tests/angle_end2end_tests_expectations.txt +++ b/src/tests/angle_end2end_tests_expectations.txt
@@ -18,8 +18,6 @@ 6063 GLES : SimpleStateChangeTestES31.DrawThenChangeFBOThenDrawThenFlushInAnotherThreadThenDrawIndexed/* = SKIP // Crashes in setUniformValuesFromBindingQualifiers() because mUniformRealLocationMap is not // initialized when the program is loaded from cache. -6073 OPENGL : ProgramInterfaceTestES31.ReloadFromCacheShouldNotCrash/ES3_1_OpenGL__cached = SKIP -6073 GLES : ProgramInterfaceTestES31.ReloadFromCacheShouldNotCrash/ES3_1_OpenGLES__cached = SKIP 6142 VULKAN : BlitFramebufferTest.BlitDepthStencilPixelByPixel/* = SKIP 6153 VULKAN WIN INTEL : GLSLTest_ES31.StructAndArrayEqualOperator/* = SKIP 6153 VULKAN PIXEL4ORXL : GLSLTest_ES31.StructAndArrayEqualOperator/* = SKIP