On Fri, Mar 7, 2014 at 2:04 AM, Jose Fonseca <jfons...@vmware.com> wrote: > > > ----- Original Message ----- >> Am 06.03.2014 18:32, schrieb Jose Fonseca: >> > >> > >> > ----- Original Message ----- >> >> >> >> >> >> ----- Original Message ----- >> >>> On 03/06/2014 09:59 AM, jfons...@vmware.com wrote: >> >>>> From: José Fonseca <jfons...@vmware.com> >> >>>> >> >>>> With the recent SRGB changes all my automated OpenGL llvmpipe tests >> >>>> (piglit, conform, glretrace) start asserting with the backtrace below. >> >>>> >> >>>> I'm hoping this change will fix it. I'm not entirely sure, as this >> >>>> doesn't happen in my development machine (the bug probably depends on >> >>>> the exact X visual). >> >>>> >> >>>> Anyway, it seems the sensible thing to do here. >> >>>> >> >>>> Program terminated with signal 5, Trace/breakpoint trap. >> >>>> #0 _debug_assert_fail (expr=expr@entry=0x7fa324df2ed7 "0", >> >>>> file=file@entry=0x7fa324e3fc30 "src/mesa/state_tracker/st_format.c", >> >>>> line=line@entry=758, function=function@entry=0x7fa324e40160 >> >>>> <__func__.34798> "st_pipe_format_to_mesa_format") at >> >>>> src/gallium/auxiliary/util/u_debug.c:281 >> >>>> #0 _debug_assert_fail (expr=expr@entry=0x7fa324df2ed7 "0", >> >>>> file=file@entry=0x7fa324e3fc30 "src/mesa/state_tracker/st_format.c", >> >>>> line=line@entry=758, function=function@entry=0x7fa324e40160 >> >>>> <__func__.34798> "st_pipe_format_to_mesa_format") at >> >>>> src/gallium/auxiliary/util/u_debug.c:281 >> >>>> No locals. >> >>>> #1 0x00007fa3241d22b3 in st_pipe_format_to_mesa_format >> >>>> (format=format@entry=PIPE_FORMAT_R8G8B8A8_SRGB) at >> >>>> src/mesa/state_tracker/st_format.c:758 >> >>>> __func__ = "st_pipe_format_to_mesa_format" >> >>>> #2 0x00007fa3241c8ec5 in st_new_renderbuffer_fb >> >>>> (format=format@entry=PIPE_FORMAT_R8G8B8A8_SRGB, samples=0, >> >>>> sw=<optimised out>) at src/mesa/state_tracker/st_cb_fbo.c:295 >> >>>> strb = 0x19e8420 >> >>>> #3 0x00007fa32409d355 in st_framebuffer_add_renderbuffer >> >>>> (stfb=stfb@entry=0x19e7fa0, idx=<optimised out>) at >> >>>> src/mesa/state_tracker/st_manager.c:314 >> >>>> rb = <optimised out> >> >>>> format = PIPE_FORMAT_R8G8B8A8_SRGB >> >>>> sw = <optimised out> >> >>>> #4 0x00007fa32409e635 in st_framebuffer_create (st=0x19e7fa0, >> >>>> st=0x19e7fa0, stfbi=0x19e7a30) at >> >>>> src/mesa/state_tracker/st_manager.c:458 >> >>>> stfb = 0x19e7fa0 >> >>>> mode = {rgbMode = 1 '\001', floatMode = 0 '\000', >> >>>> colorIndexMode = 0 '\000', doubleBufferMode = 0, stereoMode >> >>>> = >> >>>> 0, haveAccumBuffer = 0 '\000', haveDepthBuffer = 1 '\001', >> >>>> haveStencilBuffer = 1 '\001', redBits = 8, greenBits = 8, >> >>>> blueBits = 8, alphaBits = 8, redMask = 0, greenMask = 0, >> >>>> blueMask = 0, alphaMask = 0, rgbBits = 32, indexBits = 0, >> >>>> accumRedBits = 0, accumGreenBits = 0, accumBlueBits = 0, >> >>>> accumAlphaBits = 0, depthBits = 24, stencilBits = 8, >> >>>> numAuxBuffers = 0, level = 0, visualRating = 0, >> >>>> transparentPixel = 0, transparentRed = 0, transparentGreen = >> >>>> 0, transparentBlue = 0, transparentAlpha = 0, >> >>>> transparentIndex >> >>>> = 0, sampleBuffers = 0, samples = 0, maxPbufferWidth = 0, >> >>>> maxPbufferHeight = 0, maxPbufferPixels = 0, >> >>>> optimalPbufferWidth = 0, optimalPbufferHeight = 0, >> >>>> swapMethod >> >>>> = 0, bindToTextureRgb = 0, bindToTextureRgba = 0, >> >>>> bindToMipmapTexture = 0, bindToTextureTargets = 0, yInverted >> >>>> = >> >>>> 0, sRGBCapable = 1} >> >>>> idx = <optimised out> >> >>>> #5 st_framebuffer_reuse_or_create (st=st@entry=0x19dfce0, >> >>>> fb=<optimised out>, stfbi=stfbi@entry=0x19e7a30) at >> >>>> src/mesa/state_tracker/st_manager.c:728 >> >>>> No locals. >> >>>> #6 0x00007fa32409e8cc in st_api_make_current (stapi=<optimised >> >>>> out>, >> >>>> stctxi=0x19dfce0, stdrawi=0x19e7a30, streadi=0x19e7a30) at >> >>>> src/mesa/state_tracker/st_manager.c:747 >> >>>> st = 0x19dfce0 >> >>>> stdraw = 0x640064 >> >>>> stread = 0x1300000006 >> >>>> ret = <optimised out> >> >>>> #7 0x00007fa324074a20 in XMesaMakeCurrent2 (c=c@entry=0x195bb00, >> >>>> drawBuffer=0x19e7e90, readBuffer=0x19e7e90) at >> >>>> src/gallium/state_trackers/glx/xlib/xm_api.c:1194 >> >>>> No locals. >> >>>> #8 0x00007fa3240783c8 in glXMakeContextCurrent (dpy=0x194e900, >> >>>> draw=8388610, read=8388610, ctx=0x195bac0) at >> >>>> src/gallium/state_trackers/glx/xlib/glx_api.c:1177 >> >>>> drawBuffer = <optimised out> >> >>>> readBuffer = <optimised out> >> >>>> xmctx = 0x195bb00 >> >>>> glxCtx = 0x195bac0 >> >>>> firsttime = 0 '\000' >> >>>> no_rast = 0 '\000' >> >>>> #9 0x00007fa32407852f in glXMakeCurrent (dpy=<optimised out>, >> >>>> drawable=<optimised out>, ctx=<optimised out>) at >> >>>> src/gallium/state_trackers/glx/xlib/glx_api.c:1211 >> >>>> No locals. >> >>>> --- >> >>>> src/mesa/state_tracker/st_format.c | 2 ++ >> >>>> 1 file changed, 2 insertions(+) >> >>>> >> >>>> diff --git a/src/mesa/state_tracker/st_format.c >> >>>> b/src/mesa/state_tracker/st_format.c >> >>>> index 25577ac..0311a2b 100644 >> >>>> --- a/src/mesa/state_tracker/st_format.c >> >>>> +++ b/src/mesa/state_tracker/st_format.c >> >>>> @@ -753,6 +753,8 @@ st_pipe_format_to_mesa_format(enum pipe_format >> >>>> format) >> >>>> >> >>>> case PIPE_FORMAT_B8G8R8X8_SRGB: >> >>>> return MESA_FORMAT_B8G8R8X8_SRGB; >> >>>> + case PIPE_FORMAT_R8G8B8A8_SRGB: >> >>>> + return MESA_FORMAT_B8G8R8A8_SRGB; >> >>> >> >>> >> >>> Hmm, we don't have a MESA_FORMAT_R8G8B8A8_SRGB to match that pipe format >> >>> so I'm not sure this is correct. >> >> >> >> >> >>> But if this fixes the crash, it's >> >>> better than nothing. Acked-by: Brian Paul <bri...@vmware.com> >> >> >> >> I'm hoping it does. I'm actually not sure as I couln't repro. I hope it >> >> doesn't only moves the symptom away... >> > >> > I think you're right, the problem won't go completely away so soon. >> > >> > I think the problem is the st_manager.c changes in commit >> > 4c68c6dcffe6c738d563eb0e0650bb865a5457b2 . In particular these lines: >> > >> > if (_mesa_is_desktop_gl(st->ctx)) { >> > struct pipe_screen *screen = st->pipe->screen; >> > const enum pipe_format srgb_format = >> > util_format_srgb(stfbi->visual->color_format); >> > >> > if (srgb_format != PIPE_FORMAT_NONE && >> > screen->is_format_supported(screen, srgb_format, >> > PIPE_TEXTURE_2D, >> > stfbi->visual->samples, >> > PIPE_BIND_RENDER_TARGET)) >> > mode.sRGBCapable = GL_TRUE; >> > } >> > >> > We are adding the sRGBCapable visual and using SRGB format if the pipe >> > drivers supports the SRGB variant, but we are not checking that the SRGB >> > format variant actually exists in Mesa. >> > >> > I think we'll need to comment out this `mode.sRGBCapable = GL_TRUE` >> > assignment until this is addressed. >> > >> >> Hmm yes that looks messy. I guess an option (other than adding this >> format to mesa which probably would be a good idea) could be to ditch >> the assert from st_pipe_format_to_mesa_format() (the reverse function >> doesn't have it neither), then run that format through this function >> here and don't set the sRGBCapable bit if the return value was >> PIPE_FORMAT_NONE. > >> Though I still don't understand why conform suddenly needs srgb formats. > > I wonder if it is a matter of luck: some visuals have srgb, others don't, > conform doesn't specify, and gets one at random? Promoting a linear format to the corresponding sRGB format gives the framebuffer the capability for sRGB writes. Whether sRGB writes are enabled still depends on GL_FRAMEBUFFER_SRGB. But yeah, you will get a random value when querying the winsys fbo for GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING (instead of always GL_LINEAR).
How about the attached patch? It gives sRGB capability only to framebuffers with formats recognized by mesa core. > > Jose > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev -- o...@lunarg.com
From a600bf561a9c3d5776fd60d3ae3d14bd4ab417e6 Mon Sep 17 00:00:00 2001 From: Chia-I Wu <olva...@gmail.com> Date: Fri, 7 Mar 2014 11:39:24 +0800 Subject: [PATCH] st/mesa: avoid sRGB format without a matching mesa format Calling util_format_srgb() blindly may return a pipe format that has no matching mesa format. It will cause an assertion failure in st_pipe_format_to_mesa_format(), and probably other mysterious behaviors in a release build. --- src/mesa/state_tracker/st_manager.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c index 68cb5de..5219504 100644 --- a/src/mesa/state_tracker/st_manager.c +++ b/src/mesa/state_tracker/st_manager.c @@ -438,8 +438,22 @@ st_framebuffer_create(struct st_context *st, */ if (_mesa_is_desktop_gl(st->ctx)) { struct pipe_screen *screen = st->pipe->screen; - const enum pipe_format srgb_format = - util_format_srgb(stfbi->visual->color_format); + enum pipe_format srgb_format; + + /* + * We could not blindly call util_format_srgb() because the returned + * format may not be recognized by mesa core. + */ + switch (stfbi->visual->color_format) { + case PIPE_FORMAT_B8G8R8A8_UNORM: + case PIPE_FORMAT_R8G8B8X8_UNORM: + case PIPE_FORMAT_B8G8R8X8_UNORM: + srgb_format = util_format_srgb(stfbi->visual->color_format); + break; + default: + srgb_format = PIPE_FORMAT_NONE; + break; + } if (srgb_format != PIPE_FORMAT_NONE && screen->is_format_supported(screen, srgb_format, -- 1.8.5.3
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev