Commit 3f2b4e7f by Qin Jiajia Committed by Commit Bot

Fix the crash in angle_deqp_gles31_tests

This crash only happened on a compute test which following a render test. This root case was that after the render test, mVertexArray11 became an invalid pointer. However, compute test still went to the common path to use mVertexArray11. mVertexArray11 is never updated since compute shader doesn't need to triger DIRTY_BIT_VERTEX_ARRAY_BINDING. This patch adds checking to avoid compute test to use mVertexArray11. Besides, more ASSERT checking are added to convenient debugging. Bug: angleproject:3518, angleproject:1663, angleproject:2619 Change-Id: I446214110d762fc259899cef7635f369fa1f59a7 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1652866Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jiajia Qin <jiajia.qin@intel.com>
parent 85fef1bc
...@@ -390,6 +390,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator>>=(std::size_t po ...@@ -390,6 +390,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator>>=(std::size_t po
template <size_t N, typename BitsT, typename ParamT> template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set() BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set()
{ {
ASSERT(mBits == (mBits & Mask(N)));
mBits = Mask(N); mBits = Mask(N);
return *this; return *this;
} }
...@@ -397,6 +398,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set() ...@@ -397,6 +398,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set()
template <size_t N, typename BitsT, typename ParamT> template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set(ParamT pos, bool value) BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set(ParamT pos, bool value)
{ {
ASSERT(mBits == (mBits & Mask(N)));
if (value) if (value)
{ {
mBits |= Bit(pos) & Mask(N); mBits |= Bit(pos) & Mask(N);
...@@ -411,6 +413,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set(ParamT pos, bool value ...@@ -411,6 +413,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set(ParamT pos, bool value
template <size_t N, typename BitsT, typename ParamT> template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset() BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset()
{ {
ASSERT(mBits == (mBits & Mask(N)));
mBits = 0; mBits = 0;
return *this; return *this;
} }
...@@ -418,6 +421,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset() ...@@ -418,6 +421,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset()
template <size_t N, typename BitsT, typename ParamT> template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset(ParamT pos) BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset(ParamT pos)
{ {
ASSERT(mBits == (mBits & Mask(N)));
mBits &= ~Bit(pos); mBits &= ~Bit(pos);
return *this; return *this;
} }
...@@ -425,6 +429,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset(ParamT pos) ...@@ -425,6 +429,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset(ParamT pos)
template <size_t N, typename BitsT, typename ParamT> template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip() BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip()
{ {
ASSERT(mBits == (mBits & Mask(N)));
mBits ^= Mask(N); mBits ^= Mask(N);
return *this; return *this;
} }
...@@ -432,6 +437,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip() ...@@ -432,6 +437,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip()
template <size_t N, typename BitsT, typename ParamT> template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip(ParamT pos) BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip(ParamT pos)
{ {
ASSERT(mBits == (mBits & Mask(N)));
mBits ^= Bit(pos) & Mask(N); mBits ^= Bit(pos) & Mask(N);
return *this; return *this;
} }
......
...@@ -1142,24 +1142,30 @@ void StateManager11::syncState(const gl::Context *context, const gl::State::Dirt ...@@ -1142,24 +1142,30 @@ void StateManager11::syncState(const gl::Context *context, const gl::State::Dirt
break; break;
case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE: case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
{ {
mInternalDirtyBits.set(DIRTY_BIT_PRIMITIVE_TOPOLOGY);
invalidateShaders(); invalidateShaders();
invalidateVertexBuffer();
invalidateRenderTarget();
invalidateTexturesAndSamplers(); invalidateTexturesAndSamplers();
invalidateProgramUniforms(); invalidateProgramUniforms();
invalidateProgramUniformBuffers(); invalidateProgramUniformBuffers();
invalidateProgramAtomicCounterBuffers(); invalidateProgramAtomicCounterBuffers();
invalidateProgramShaderStorageBuffers(); invalidateProgramShaderStorageBuffers();
invalidateDriverUniforms(); invalidateDriverUniforms();
// If OVR_multiview2 is enabled, the attribute divisor has to be updated for each const gl::Program *program = state.getProgram();
// binding. When using compute, there could be no vertex array. if (!program || !program->hasLinkedShaderStage(gl::ShaderType::Compute))
if (mIsMultiviewEnabled && mVertexArray11)
{ {
ASSERT(mProgramD3D); mInternalDirtyBits.set(DIRTY_BIT_PRIMITIVE_TOPOLOGY);
const gl::ProgramState &programState = mProgramD3D->getState(); invalidateVertexBuffer();
int numViews = programState.usesMultiview() ? programState.getNumViews() : 1; invalidateRenderTarget();
mVertexArray11->markAllAttributeDivisorsForAdjustment(numViews); // If OVR_multiview2 is enabled, the attribute divisor has to be updated for
// each binding. When using compute, there could be no vertex array.
if (mIsMultiviewEnabled && mVertexArray11)
{
ASSERT(mProgramD3D);
ASSERT(mVertexArray11 == GetImplAs<VertexArray11>(state.getVertexArray()));
const gl::ProgramState &programState = mProgramD3D->getState();
int numViews =
programState.usesMultiview() ? programState.getNumViews() : 1;
mVertexArray11->markAllAttributeDivisorsForAdjustment(numViews);
}
} }
break; break;
} }
......
...@@ -87,7 +87,6 @@ ...@@ -87,7 +87,6 @@
1442 D3D11 : dEQP-GLES31.functional.debug.error_groups.case_3 = FAIL 1442 D3D11 : dEQP-GLES31.functional.debug.error_groups.case_3 = FAIL
1442 D3D11 : dEQP-GLES31.functional.debug.error_groups.case_9 = FAIL 1442 D3D11 : dEQP-GLES31.functional.debug.error_groups.case_9 = FAIL
1442 D3D11 : dEQP-GLES31.functional.debug.error_groups.case_10 = FAIL 1442 D3D11 : dEQP-GLES31.functional.debug.error_groups.case_10 = FAIL
1663 D3D11 : dEQP-GLES31.functional.draw_indirect.compute_interop.* = FAIL
1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_lowp_geometry = FAIL 1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_lowp_geometry = FAIL
1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_mediump_geometry = FAIL 1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_mediump_geometry = FAIL
...@@ -505,7 +504,6 @@ ...@@ -505,7 +504,6 @@
1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_lowp_geometry = FAIL 1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_lowp_geometry = FAIL
1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_mediump_geometry = FAIL 1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_mediump_geometry = FAIL
1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_highp_geometry = FAIL 1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_highp_geometry = FAIL
2619 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.uniform.findLSBMinusOne.highp_compute = FAIL
1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_constants.geometry_shader.* = FAIL 1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_constants.geometry_shader.* = FAIL
1941 D3D11 : dEQP-GLES31.functional.state_query.program.geometry_shader_state_get_programiv = FAIL 1941 D3D11 : dEQP-GLES31.functional.state_query.program.geometry_shader_state_get_programiv = FAIL
1941 D3D11 : dEQP-GLES31.functional.geometry_shading.query.* = FAIL 1941 D3D11 : dEQP-GLES31.functional.geometry_shading.query.* = FAIL
......
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