[Mesa-dev] [PATCH] loader: fix the no-modifiers case

Rob Clark robdclark at gmail.com
Tue Jan 22 19:45:45 UTC 2019


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 <robdclark at gmail.com>
---
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



More information about the mesa-dev mailing list