On Tue, Jan 22, 2019 at 11:45 AM Rob Clark <robdcl...@gmail.com> wrote: > > Normally modifiers take precendence over use flags, as they are more > explicit. But if the driver supports modifiers, but the xserver does > not, then we should fallback to the old mechanism of allocating a buffer > using 'use' flags. > > Fixes: 069fdd5f9facbd72fb6a289696c7b74e3237e70f > Signed-off-by: Rob Clark <robdcl...@gmail.com>
Reviewed-by: Kristian H. Kristensen <hoegsb...@chromium.org> > --- > Backport note: This fixes an issue with enabling UBWC in freedreno/a6xx > (which is something I'd like to land soonish, but not something that > exists yet in release branches). Unless a similar issue is reported in > other drivers, this may not be worth backporting to release branches, at > least not until it has had some soak time in master. > > Backtrace to explain the issue: > > Breakpoint 1, fd_resource_create_with_modifiers (pscreen=0x574ae0, > tmpl=0x7fffffdbf0, modifiers=0x7fffffdb38, count=1) > at ../src/gallium/drivers/freedreno/freedreno_resource.c:838 > 838 struct fd_screen *screen = fd_screen(pscreen); > 1: *tmpl = {reference = {count = 0}, width0 = 800, height0 = 600, depth0 = > 1, array_size = 1, format = PIPE_FORMAT_B8G8R8A8_UNORM, > target = PIPE_TEXTURE_2D, last_level = 0, nr_samples = 0, > nr_storage_samples = 0, usage = 0, bind = 1572874, flags = 0, next = 0x0, > screen = 0x0} > (gdb) bt > #0 fd_resource_create_with_modifiers (pscreen=0x574ae0, tmpl=0x7fffffdbf0, > modifiers=0x7fffffdb38, count=1) at > ../src/gallium/drivers/freedreno/freedreno_resource.c:838 > #1 0x0000007fbde33330 in fd_resource_create (pscreen=0x574ae0, > tmpl=0x7fffffdbf0) at > ../src/gallium/drivers/freedreno/freedreno_resource.c:956 > #2 0x0000007fbe54e2a4 in u_transfer_helper_resource_create > (pscreen=0x574ae0, templ=0x7fffffdbf0) at > ../src/gallium/auxiliary/util/u_transfer_helper.c:126 > #3 0x0000007fbdcc8148 in dri2_create_image_common (_screen=0x570530, > width=800, height=600, format=4099, use=19, modifiers=0x0, count=0, > loaderPrivate=0x6c4160) at ../src/gallium/state_trackers/dri/dri2.c:1039 > #4 0x0000007fbdcc8214 in dri2_create_image (_screen=0x570530, width=800, > height=600, format=4099, use=19, loaderPrivate=0x6c4160) at > ../src/gallium/state_trackers/dri/dri2.c:1061 > #5 0x0000007fbec89a30 in dri3_alloc_render_buffer (draw=0x531418, > format=4099, width=800, height=600, depth=24) at > ../src/loader/loader_dri3_helper.c:1341 > #6 0x0000007fbec8aab4 in dri3_get_buffer (driDrawable=0x5387b0, > format=4099, buffer_type=loader_dri3_buffer_back, draw=0x531418) at > ../src/loader/loader_dri3_helper.c:1822 > #7 0x0000007fbec8b10c in loader_dri3_get_buffers (driDrawable=0x5387b0, > format=4099, stamp=0x64d480, loaderPrivate=0x531418, buffer_mask=1, > buffers=0x7fffffdf20) at ../src/loader/loader_dri3_helper.c:2021 > #8 0x0000007fbdcc68c4 in dri_image_drawable_get_buffers > (drawable=0x64d480, images=0x7fffffdf20, statts=0x65ee90, statts_count=2) at > ../src/gallium/state_trackers/dri/dri2.c:339 > #9 0x0000007fbdcc6c44 in dri2_allocate_textures (ctx=0x5a7540, > drawable=0x64d480, statts=0x65ee90, statts_count=2) at > ../src/gallium/state_trackers/dri/dri2.c:466 > #10 0x0000007fbdccb580 in dri_st_framebuffer_validate (stctx=0x535cf0, > stfbi=0x64d480, statts=0x65ee90, count=2, out=0x7fffffe0c8) at > ../src/gallium/state_trackers/dri/dri_drawable.c:85 > #11 0x0000007fbe048c84 in st_framebuffer_validate (stfb=0x65e9c0, > st=0x535cf0) at ../src/mesa/state_tracker/st_manager.c:222 > #12 0x0000007fbe04a884 in st_api_make_current (stapi=0x7fbe8d90d8 > <st_gl_api>, stctxi=0x535cf0, stdrawi=0x64d480, streadi=0x64d480) at > ../src/mesa/state_tracker/st_manager.c:1074 > #13 0x0000007fbdccaf44 in dri_make_current (cPriv=0x67bdc0, > driDrawPriv=0x5387b0, driReadPriv=0x5387b0) at > ../src/gallium/state_trackers/dri/dri_context.c:301 > #14 0x0000007fbdcc2910 in driBindContext (pcp=0x67bdc0, pdp=0x5387b0, > prp=0x5387b0) at ../src/mesa/drivers/dri/common/dri_util.c:579 > #15 0x0000007fbec6b7e0 in dri3_bind_context (context=0x51ccd0, > old=0x7fbecd0798 <dummyContext>, draw=2097154, read=2097154) at > ../src/glx/dri3_glx.c:210 > #16 0x0000007fbec4b010 in MakeContextCurrent (dpy=0x503d00, draw=2097154, > read=2097154, gc_user=0x51ccd0) at ../src/glx/glxcurrent.c:220 > #17 0x0000007fbec4b184 in glXMakeCurrent (dpy=0x503d00, draw=2097154, > gc=0x51ccd0) at ../src/glx/glxcurrent.c:267 > #18 0x0000007fbee8deac in ?? () from /lib64/libGLX.so.0 > #19 0x0000007fbee8f7d4 in ?? () from /lib64/libGLX.so.0 > #20 0x000000000040b330 in GLStateGLX::valid() () > #21 0x0000000000409a28 in CanvasGeneric::do_make_current() () > #22 0x000000000040a4f0 in CanvasGeneric::reset() () > #23 0x0000000000406714 in main () > (gdb) > > In dri3_alloc_render_buffer() the request gets turned into > createImageWithModifiers() but in dri2_create_image_common() it gets > turned back into pscreen->create_resource() (ie. without modifiers) so > we've lost the information from the 'use' flags that the buffer is > shared and cannot differentiate the allocation from other internal > buffer allocations. > > src/loader/loader_dri3_helper.c | 20 ++++++++++++++------ > 1 file changed, 14 insertions(+), 6 deletions(-) > > diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c > index 20fe4cbdabc..ad9b9d87b05 100644 > --- a/src/loader/loader_dri3_helper.c > +++ b/src/loader/loader_dri3_helper.c > @@ -1319,12 +1319,20 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable > *draw, unsigned int format, > > free(mod_reply); > > - buffer->image = > draw->ext->image->createImageWithModifiers(draw->dri_screen, > - width, > height, > - format, > - > modifiers, > - count, > - buffer); > + /* don't use createImageWithModifiers() if we have no > + * modifiers, other things depend on the use flags when > + * there are no modifiers to know that a buffer can be > + * shared. > + */ > + if (modifiers) { > + buffer->image = > draw->ext->image->createImageWithModifiers(draw->dri_screen, > + > width, height, > + > format, > + > modifiers, > + count, > + > buffer); > + } > + > free(modifiers); > } > #endif > -- > 2.20.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev