Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
On Tue, Jan 22, 2019 at 10:20 PM Kristian Høgsberg <hoegsb...@gmail.com> wrote: > > 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev