Many multithread tests were resolved by properly initializing threads for Xlib in dEQP. However, the following category of tests continues to be intermittent: dEQP-EGL.functional.sharing.gles2.multithread for example: dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source.create_texture_render Took 39 ms. Standard Output [18] (0) Begin -- eglBindAPI(EGL_OPENGL_ES_API) [22] (0) End -- eglBindAPI() [24] (0) Begin -- eglCreateContext(0x1fb2230, 0x29b2fc0, EGL_NO_CONTEXT, { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }) [550] (0) End -- 0x7f27f8001320 = eglCreateContext() [556] (0) Begin -- eglCreatePbufferSurface(0x1fb2230, 0x29b2fc0, { EGL_WIDTH, 400, EGL_HEIGHT, 400, EGL_NONE }) [557] (1) Begin -- eglBindAPI(EGL_OPENGL_ES_API) [560] (1) End -- eglBindAPI() [563] (1) Begin -- eglCreateContext(0x1fb2230, 0x29b2fc0, 0x7f27f8001320, { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }) [598] (0) End -- 0x7f27f803dfb0= eglCreatePbufferSurface() [804] (1) End -- 0x7f280003a770 = eglCreateContext() [810] (1) Begin -- eglCreatePbufferSurface(0x1fb2230, 0x29b2fc0, { EGL_WIDTH, 400, EGL_HEIGHT, 400, EGL_NONE }) [812] (0) Begin -- eglMakeCurrent(0x1fb2230, 0x7f27f803dfb0, 0x7f27f803dfb0, 0x7f27f8001320) [840] (1) End -- 0x7f2800038700= eglCreatePbufferSurface() [844] (1) Begin -- eglMakeCurrent(0x1fb2230, 0x7f2800038700, 0x7f2800038700, 0x7f280003a770) [998] (0) End -- eglMakeCurrent() [1002] (0) Begin -- glGetString(GL_EXTENSIONS) [1007] (0) End -- glGetString() [1028] (0) Begin -- eglGetProcAddress("glEGLImageTargetTexture2DOES") [1031] (0) End -- 0x7f2808d793c0 = eglGetProcAddress() [1034] (0) Begin -- glCreateShader(35633) [1037] (0) End -- 1 = glCreateShader(35633) [1038] (0) Begin -- glFinish() [1059] (0) End -- glFinish() [1063] (0) Begin -- glShaderSource(1, 1, "attribute highp vec2 a_pos; varying mediump vec2 v_pos; void main(void) { v_pos = a_pos; gl_Position = vec4(a_pos, 0.0, 1.0); } ", DE_NULL) [1075] (0) End -- glShaderSource() [1076] (0) Begin -- glFinish() [1079] (0) End -- glFinish() [1082] (0) Begin -- glCompileShader(1) [1163] (1) End -- eglMakeCurrent() [1167] (1) Begin -- glGetString(GL_EXTENSIONS) [1169] (1) End -- glGetString() [1188] (1) Begin -- eglGetProcAddress("glEGLImageTargetTexture2DOES") [1191] (1) End -- 0x7f2808d793c0 = eglGetProcAddress() [1310] (0) End -- glCompileShader() [1312] (0) Begin -- glFinish() [1314] (0) End -- glFinish() [1316] (0) Begin -- glCreateShader(35632) [1318] (0) End -- 2 = glCreateShader(35632) [1318] (0) Begin -- glFinish() [1319] (0) End -- glFinish() [1321] (0) Begin -- glShaderSource(2, 1, "varying mediump vec2 v_pos; uniform sampler2D u_sampler; void main(void) { gl_FragColor = texture2D(u_sampler, v_pos); } ", DE_NULL) [1323] (0) End -- glShaderSource() [1324] (0) Begin -- glFinish() [1324] (0) End -- glFinish() [1326] (0) Begin -- glCompileShader(2) [3798] (0) End -- glCompileShader() [3800] (0) Begin -- glFinish() [3803] (0) End -- glFinish() [3806] (0) Begin -- glCreateProgram() [3809] (0) End -- 3 = glCreateProgram() [3810] (0) Begin -- glFinish() [3811] (0) End -- glFinish() [3812] (0) Begin -- glAttachShader(3, 2) [3814] (0) End -- glAttachShader() [3814] (0) Begin -- glFinish() [3815] (0) End -- glFinish() [3817] (0) Begin -- glAttachShader(3, 1) [3818] (0) End -- glAttachShader() [3819] (0) Begin -- glFinish() [3820] (0) End -- glFinish() [3821] (0) Begin -- glLinkProgram(3) [5217] (0) End -- glLinkProgram() [5219] (0) Begin -- glFinish() [5222] (0) End -- glFinish() [5228] (0) Begin -- glGenTextures(1, { 0 }) [5233] (0) End -- glGenTextures(1, { 1 }) [5234] (0) Begin -- glFinish() [5235] (0) End -- glFinish() [5291] (0) Begin -- glBindTexture(GL_TEXTURE_2D, 1) [5293] (0) End -- glBindTexture() [5295] (0) Begin -- glTexImage2D(GL_TEXTURE_2D, 0, 6408, 256, 256, 0, 6408, 5121, data) [9278] (0) End -- glTexImage2D() [9280] (0) Begin -- glBindTexture(GL_TEXTURE_2D, 0) [9281] (0) End -- glBindTexture() [9282] (0) Begin -- glFinish() [9293] (0) End -- glFinish() [9296] (0) Begin -- glBindTexture(GL_TEXTURE_2D, 1) [9298] (0) End -- glBindTexture() [9298] (0) Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) [9300] (0) End -- glTexParameteri() [9301] (0) Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) [9302] (0) End -- glTexParameteri() [9302] (0) Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) [9303] (0) End -- glTexParameteri() [9304] (0) Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) [9305] (0) End -- glTexParameteri() [9307] (0) Begin -- eglCreateImageKHR(0x1fb2230, 0x7f27f8001320, EGL_GL_TEXTURE_2D_KHR, 1, { EGL_GL_TEXTURE_LEVEL_KHR, 0, EGL_NONE }) [9311] (0) End -- 0x7f27f8041920 = eglCreateImageKHR() [9311] (0) Begin -- glBindTexture(GL_TEXTURE_2D, 0) [9312] (0) End -- glBindTexture() [9313] (0) Begin -- glFinish() [9314] (0) End -- glFinish() [9316] (0) Begin -- glGenTextures(1, { 0 }) [9318] (0) End -- glGenTextures(1, { 2 }) [9319] (0) Begin -- glFinish() [9320] (0) End -- glFinish() [9322] (0) Begin -- glBindTexture(GL_TEXTURE_2D, 2) [9323] (0) End -- glBindTexture() [9324] (0) Begin -- glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, 0x7f27f8041920) [9326] (0) End -- glEGLImageTargetTexture2DOES() [9327] (0) Begin -- glBindTexture(GL_TEXTURE_2D, 0) [9328] (0) End -- glBindTexture() [9329] (0) Begin -- glFinish() [9330] (0) End -- glFinish() [9334] (0) Begin -- glDeleteTextures(1, { 1 }) [9338] (0) End -- glDeleteTextures() [9338] (1) Begin -- glClearColor(0.5f, 0.5f, 0.5f, 1.0f) [9340] (0) Begin -- glFinish() [9341] (0) End -- glFinish() [9341] (1) End -- glClearColor() [9343] (1) Begin -- glClear(GL_COLOR_BUFFER_BIT) [9344] (0) Begin -- glClearColor(0.5f, 0.5f, 0.5f, 1.0f) [9345] (0) End -- glClearColor() [9346] (0) Begin -- glClear(GL_COLOR_BUFFER_BIT) [13580] (0) End -- glClear() [13580] (1) End -- glClear() [13583] (0) Begin -- glUseProgram(3) [13583] (1) Begin -- glUseProgram(3) [13587] (0) End -- glUseProgram() [13587] (1) End -- glUseProgram() [13588] (0) Begin -- glBindTexture(GL_TEXTURE_2D, 2) [13588] (1) Begin -- glBindTexture(GL_TEXTURE_2D, 2) [13591] (0) End -- glBindTexture() [13592] (0) Begin -- glGetUniformLocation(3, "u_sampler") [13594] (1) End -- glBindTexture() [13595] (0) End -- glGetUniformLocation() [13595] (1) Begin -- glGetUniformLocation(3, "u_sampler") [13597] (0) Begin -- glUniform1i(0, 0) [13597] (1) End -- glGetUniformLocation() [13599] (0) End -- glUniform1i() [13599] (1) Begin -- glUniform1i(0, 0) [13600] (0) Begin -- glGetAttribLocation(3, "a_pos") [13600] (1) End -- glUniform1i() [13602] (0) End -- 0 = glGetAttribLocation() [13602] (1) Begin -- glGetAttribLocation(3, "a_pos") [13604] (0) Begin -- glEnableVertexAttribArray(0) [13604] (1) End -- 0 = glGetAttribLocation() [13605] (1) Begin -- glEnableVertexAttribArray(0) [13606] (0) End -- glEnableVertexAttribArray() [13607] (0) Begin -- glBindBuffer(GL_ARRAY_BUFFER, 0) [13607] (1) End -- glEnableVertexAttribArray() [13608] (1) Begin -- glBindBuffer(GL_ARRAY_BUFFER, 0) [13609] (0) End -- glBindBuffer() [13609] (1) End -- glBindBuffer() [13611] (0) Begin -- glVertexAttribPointer(0, GL_FLOAT, GL_FALSE, 0, <data>) [13611] (1) Begin -- glVertexAttribPointer(0, GL_FLOAT, GL_FALSE, 0, <data>) [13613] (0) End -- glVertexAttribPointer() [13613] (1) End -- glVertexAttribPointer() [13614] (0) Begin -- glDrawArrays(GL_TRIANGLES, 0, 6) [13614] (1) Begin -- glDrawArrays(GL_TRIANGLES, 0, 6) [13665] (0) End -- glDrawArrays() [13667] (0) Begin -- glBindBuffer(GL_ARRAY_BUFFER, 0) [13669] (0) End -- glBindBuffer() [13670] (0) Begin -- glBindTexture(GL_TEXTURE_2D, 0) [13672] (0) End -- glBindTexture() [13674] (0) Begin -- glDisableVertexAttribArray(0) [13675] (0) End -- glDisableVertexAttribArray() [13677] (0) Begin -- glUseProgram(0) [13695] (0) End -- glUseProgram() [13697] (0) Begin -- glFinish() [14026] (0) End -- glFinish() [14219] (0) Begin -- glReadPixels(0, 0, 400, 400, 6408, 5121, <data>) [14604] (1) End -- glDrawArrays() [14606] (1) Begin -- glBindBuffer(GL_ARRAY_BUFFER, 0) [14608] (1) End -- glBindBuffer() [14610] (1) Begin -- glBindTexture(GL_TEXTURE_2D, 0) [14620] (1) End -- glBindTexture() [14622] (1) Begin -- glDisableVertexAttribArray(0) [14624] (1) End -- glDisableVertexAttribArray() [14625] (1) Begin -- glUseProgram(0) [14638] (1) End -- glUseProgram() [14640] (1) Begin -- glFinish() [14916] (1) End -- glFinish() [15102] (1) Begin -- glReadPixels(0, 0, 400, 400, 6408, 5121, <data>) [18283] (0) End -- glReadPixels() [18761] (0) Begin -- glFinish() [18766] (0) End -- glFinish() [22079] (1) End -- glReadPixels() [22441] (1) Begin -- glFinish() [22444] (1) End -- glFinish() [22450] (1) Begin -- eglMakeCurrent(0x1fb2230, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT) [22453] (0) Begin -- CompareData [22454] (1) End -- eglMakeCurrent() [22458] (1) Begin -- eglDestroyContext(0x1fb2230, 0x7f280003a770) [22718] (1) End -- eglDestroyContext() [22721] (1) Begin -- eglDestroySurface(0x1fb2230, 0x7f2800038700) [22749] (1) End -- eglDestroySurface() [32001] (0) CompareData passed [32003] (0) End -- CompareData [32007] (0) Begin -- glDeleteTextures(1, { 2 }) [32012] (0) End -- glDeleteTextures() [32013] (0) Begin -- glFinish() [32016] (0) End -- glFinish() [32018] (0) Begin -- eglDestroyImageKHR(0x1fb2230, 0x7f27f8041920) [32060] (0) End -- eglDestroyImageKHR() [32061] (0) Begin -- glFinish() [32062] (0) End -- glFinish() [32065] (0) Begin -- glDeleteShader(1) [32069] (0) End -- glDeleteShader() [32069] (0) Begin -- glFinish() [32070] (0) End -- glFinish() [32072] (0) Begin -- glDeleteShader(2) [32075] (0) End -- glDeleteShader() [32075] (0) Begin -- glFinish() [32076] (0) End -- glFinish() [32078] (0) Begin -- glDeleteProgram(3) [32117] (0) tcu::Exception 'deleteProgram(program): glGetError() returned GL_INVALID_VALUE at teglGLES2SharingThreadedTests.cpp:1532'
Updating status .. I did a script to run dEQP test 'x' times (and abort if failed) to investigate spurious failures. It seems tests with 'texture_source' ("Image management tests with texture source") fail sometimes and to be precise only the ones with 'config.render' set, others (1256 remaining tests) pass fine even with hundreds of iterations. Failure happens always at shader program deletion, I will attempt to isolate further from here.
Created attachment 128670 [details] Backtrace of crash in dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source.create_texture_render Attached is a backtrace of the crash in dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source.create_texture_render. Repo versions: mesa: master@d6545f2 deqp: nougat-cts-dev@4acf725 with local patches deqp-target: x11_egl Crashing line is src/mesa/main/shaderobj.c:253: 248│ void 249│ _mesa_reference_shader_program_(struct gl_context *ctx, 250│ struct gl_shader_program **ptr, 251│ struct gl_shader_program *shProg) 252│ { **253│ assert(ptr); 254│ if (*ptr == shProg) { 255│ /* no-op */ 256│ return; 257│ } See attachment for full backtrace.
(In reply to Chad Versace from comment #2) > Created attachment 128670 [details] > Backtrace of crash in > dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source. > create_texture_render > > Attached is a backtrace of the crash in > dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source. > create_texture_render. > > Repo versions: > mesa: master@d6545f2 > > deqp: nougat-cts-dev@4acf725 with local patches > deqp-target: x11_egl > > Crashing line is src/mesa/main/shaderobj.c:253: > > 248│ void > 249│ _mesa_reference_shader_program_(struct gl_context *ctx, > 250│ struct gl_shader_program **ptr, > 251│ struct gl_shader_program *shProg) > 252│ { > **253│ assert(ptr); > 254│ if (*ptr == shProg) { > 255│ /* no-op */ > 256│ return; > 257│ } And sometimes I see the crash on a different line in the same function: 248│ void 249│ _mesa_reference_shader_program_(struct gl_context *ctx, 250│ struct gl_shader_program **ptr, 251│ struct gl_shader_program *shProg) 252│ { 253│ assert(ptr); 254│ if (*ptr == shProg) { 255│ /* no-op */ 256│ return; 257│ } 258│ if (*ptr) { 259│ /* Unreference the old shader program */ 260│ GLboolean deleteFlag = GL_FALSE; 261│ struct gl_shader_program *old = *ptr; 262│ **263├> assert(old->RefCount > 0);
Fix submitted to mesa-dev. https://lists.freedesktop.org/archives/mesa-dev/2016-December/139021.html https://patchwork.freedesktop.org/patch/129481/ From: Chad Versace <chadversary@chromium.org> To: mesa-dev@lists.freedesktop.org Subject: [PATCH] mesa/shaderobj: Fix races on refcounts Date: Tue, 27 Dec 2016 14:45:53 -0800 Message-Id: <20161227224553.56135-1-chadversary@chromium.org>
(In reply to Chad Versace from comment #4) > Fix submitted to mesa-dev. > > https://lists.freedesktop.org/archives/mesa-dev/2016-December/139021.html > https://patchwork.freedesktop.org/patch/129481/ > > From: Chad Versace <chadversary@chromium.org> > To: mesa-dev@lists.freedesktop.org > Subject: [PATCH] mesa/shaderobj: Fix races on refcounts > Date: Tue, 27 Dec 2016 14:45:53 -0800 > Message-Id: <20161227224553.56135-1-chadversary@chromium.org> Superb! I was trying to tackle this by adding more locking but did not get it pass.
Patch is pushed.
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.