[nouveau] running kmscube causes pushbuf error
I noticed that "kmscube -c 1" fails [1] with nouveau (GTX 1080 Ti).
Debugging this, I found that a buffer object is created with only NOUVEAU_BO_GART in nvc0_miptree_create() [2] but later pinned to VRAM and then when validating the push buffer [3], nouveau_bo_validate() returns an error because it can't migrate to VRAM and bo->pin_count > 0.
I tried this change which seems to "fix" it but I don't know if that will break other programs.
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c
index e93d66c71b6..2ddcb76dea0 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c
@@ -528,7 +528,7 @@ nvc0_miptree_create(struct pipe_screen *pscreen,
}
bo_config.nvc0.tile_mode = mt->level[0].tile_mode;
- if (!bo_config.nvc0.memtype && (pt->usage == PIPE_USAGE_STAGING || pt->bind & PIPE_BIND_SHARED))
+ if (!bo_config.nvc0.memtype && pt->usage == PIPE_USAGE_STAGING)
mt->base.domain = NOUVEAU_BO_GART;
else
mt->base.domain = NV_VRAM_DOMAIN(nouveau_screen(pscreen));
[1]:
Using display 0x23b1a20 with EGL version 1.5
===================================
EGL information:
version: "1.5"
vendor: "Mesa Project"
client extensions: "EGL_EXT_client_extensions EGL_EXT_device_base EGL_EXT_device_enumeration EGL_EXT_device_query EGL_EXT_platform_base EGL_KHR_client_get_all_proc_addresses EGL_KHR_debug EGL_EXT_platform_device EGL_EXT_platform_wayland EGL_KHR_platform_wayland EGL_EXT_platform_x11 EGL_KHR_platform_x11 EGL_EXT_platform_xcb EGL_MESA_platform_gbm EGL_KHR_platform_gbm EGL_MESA_platform_surfaceless"
display extensions: "EGL_ANDROID_blob_cache EGL_EXT_buffer_age EGL_EXT_create_context_robustness EGL_EXT_image_dma_buf_import EGL_EXT_image_dma_buf_import_modifiers EGL_KHR_cl_event2 EGL_KHR_config_attribs EGL_KHR_context_flush_control EGL_KHR_create_context EGL_KHR_create_context_no_error EGL_KHR_fence_sync EGL_KHR_get_all_proc_addresses EGL_KHR_gl_colorspace EGL_KHR_gl_renderbuffer_image EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_3D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_no_config_context EGL_KHR_reusable_sync EGL_KHR_surfaceless_context EGL_EXT_pixel_format_float EGL_KHR_wait_sync EGL_MESA_configless_context EGL_MESA_drm_image EGL_MESA_image_dma_buf_export EGL_MESA_query_driver EGL_WL_bind_wayland_display "
===================================
OpenGL ES 2.x information:
version: "OpenGL ES 3.2 Mesa 23.2.0-devel (git-60cfe15d79)"
shading language version: "OpenGL ES GLSL ES 3.20"
vendor: "Mesa"
renderer: "NV132"
extensions: "GL_EXT_blend_minmax GL_EXT_multi_draw_arrays GL_EXT_texture_filter_anisotropic GL_EXT_texture_compression_s3tc GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc GL_EXT_texture_format_BGRA8888 GL_OES_compressed_ETC1_RGB8_texture GL_OES_depth24 GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_mapbuffer GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_stencil8 GL_OES_texture_3D GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_vertex_half_float GL_EXT_draw_instanced GL_EXT_texture_sRGB_decode GL_OES_EGL_image GL_OES_depth_texture GL_AMD_performance_monitor GL_OES_packed_depth_stencil GL_EXT_texture_type_2_10_10_10_REV GL_NV_conditional_render GL_OES_get_program_binary GL_APPLE_texture_max_level GL_EXT_discard_framebuffer GL_EXT_read_format_bgra GL_NV_pack_subimage GL_EXT_frag_depth GL_NV_fbo_color_attachments GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_vertex_array_object GL_OES_viewport_array GL_ANGLE_pack_reverse_row_order GL_ANGLE_texture_compression_dxt3 GL_ANGLE_texture_compression_dxt5 GL_EXT_occlusion_query_boolean GL_EXT_robustness GL_EXT_texture_rg GL_EXT_unpack_subimage GL_NV_draw_buffers GL_NV_read_buffer GL_NV_read_depth GL_NV_read_depth_stencil GL_NV_read_stencil GL_EXT_draw_buffers GL_EXT_instanced_arrays GL_EXT_map_buffer_range GL_KHR_debug GL_KHR_robustness GL_KHR_texture_compression_astc_ldr GL_NV_generate_mipmap_sRGB GL_NV_pixel_buffer_object GL_OES_depth_texture_cube_map GL_OES_required_internalformat GL_OES_surfaceless_context GL_EXT_color_buffer_float GL_EXT_debug_label GL_EXT_sRGB_write_control GL_EXT_separate_shader_objects GL_EXT_shader_group_vote GL_EXT_shader_implicit_conversions GL_EXT_shader_integer_mix GL_EXT_tessellation_point_size GL_EXT_tessellation_shader GL_ANDROID_extension_pack_es31a GL_EXT_base_instance GL_EXT_compressed_ETC1_RGB8_sub_texture GL_EXT_copy_image GL_EXT_draw_buffers_indexed GL_EXT_draw_elements_base_vertex GL_EXT_gpu_shader5 GL_EXT_polygon_offset_clamp GL_EXT_primitive_bounding_box GL_EXT_render_snorm GL_EXT_shader_io_blocks GL_EXT_texture_border_clamp GL_EXT_texture_buffer GL_EXT_texture_cube_map_array GL_EXT_texture_norm16 GL_EXT_texture_view GL_KHR_blend_equation_advanced GL_KHR_context_flush_control GL_KHR_robust_buffer_access_behavior GL_NV_image_formats GL_NV_shader_noperspective_interpolation GL_OES_copy_image GL_OES_draw_buffers_indexed GL_OES_draw_elements_base_vertex GL_OES_gpu_shader5 GL_OES_primitive_bounding_box GL_OES_sample_shading GL_OES_sample_variables GL_OES_shader_io_blocks GL_OES_shader_multisample_interpolation GL_OES_tessellation_point_size GL_OES_tessellation_shader GL_OES_texture_border_clamp GL_OES_texture_buffer GL_OES_texture_cube_map_array GL_OES_texture_stencil8 GL_OES_texture_storage_multisample_2d_array GL_OES_texture_view GL_EXT_blend_func_extended GL_EXT_buffer_storage GL_EXT_float_blend GL_EXT_geometry_point_size GL_EXT_geometry_shader GL_EXT_texture_filter_minmax GL_EXT_texture_sRGB_R8 GL_KHR_no_error GL_KHR_texture_compression_astc_sliced_3d GL_NV_conservative_raster GL_NV_conservative_raster_dilate GL_NV_conservative_raster_pre_snap_triangles GL_NV_sample_locations GL_NV_viewport_array2 GL_NV_viewport_swizzle GL_OES_EGL_image_external_essl3 GL_OES_geometry_point_size GL_OES_geometry_shader GL_OES_shader_image_atomic GL_EXT_clear_texture GL_EXT_clip_cull_distance GL_EXT_disjoint_timer_query GL_EXT_texture_compression_s3tc_srgb GL_EXT_window_rectangles GL_MESA_shader_integer_functions GL_EXT_clip_control GL_EXT_color_buffer_half_float GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_texture_compression_bptc GL_EXT_texture_mirror_clamp_to_edge GL_KHR_parallel_shader_compile GL_EXT_EGL_image_storage GL_EXT_texture_shadow_lod GL_MESA_framebuffer_flip_y GL_EXT_demote_to_helper_invocation GL_EXT_depth_clamp GL_EXT_texture_query_lod GL_MESA_bgra "
===================================
nouveau: kernel rejected pushbuf: Invalid argument
nouveau: ch2: krec 0 pushes 1 bufs 6 relocs 0
nouveau: ch2: buf 00000000 0000000b 00000004 00000004 00000000 0x7f6dc2f7f000 0xaf0000 0x80000
nouveau: ch2: buf 00000001 00000008 00000002 00000002 00000000 (nil) 0xa00000 0xd0000
nouveau: ch2: buf 00000002 0000000a 00000002 00000002 00000000 (nil) 0xad0000 0x20000
nouveau: ch2: buf 00000003 00000006 00000004 00000000 00000004 0x7f6dce35a000 0x14000 0x1000
nouveau: ch2: buf 00000004 0000000f 00000004 00000000 00000004 (nil) 0x7f00000 0xf00000
nouveau: ch2: buf 00000005 00000011 00000004 00000000 00000004 (nil) 0x8e00000 0xf00000
nouveau: ch2: psh 00000000 0000000ce4 0000000e78
nouveau: 0x200203fd
nouveau: 0x07800000
nouveau: 0x04380000
nouveau: 0x20090200
nouveau: 0x00000000
nouveau: 0x08e00000
nouveau: 0x00001e00
nouveau: 0x00000438
nouveau: 0x000000e6
nouveau: 0x00001000
nouveau: 0x00000001
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x2001054e
nouveau: 0x00000000
nouveau: 0x20010487
nouveau: 0x0fac6881
nouveau: 0x80000574
nouveau: 0x800101d5
nouveau: 0x200308e0
nouveau: 0x00010000
nouveau: 0x00000000
nouveau: 0x00aa0000
nouveau: 0xa04108e3
nouveau: 0x000001a0
nouveau: 0x80008000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x80008000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x02a60060
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x80008000
nouveau: 0x00000000
nouveau: 0x0fac6881
nouveau: 0x00000000
nouveau: 0x023ba810
nouveau: 0x00000000
nouveau: 0xcbcb3688
nouveau: 0x00007f6d
nouveau: 0x80008000
nouveau: 0x00000000
nouveau: 0x02388b00
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x80008000
nouveau: 0x00000001
nouveau: 0x00000000
nouveau: 0x00000000
nouveau: 0x00000033
nouveau: 0x00000000
nouveau: 0x022ca610
nouveau: 0x00000000
nouveau: 0x80008000
nouveau: 0x00007ffd
nouveau: 0x023e1c60
nouveau: 0x00000000
nouveau: 0x023e1f98
nouveau: 0x00000000
nouveau: 0x00001002
nouveau: 0x00000000
nouveau: 0x80008000
nouveau: 0x00000000
nouveau: 0x0fe8b7ec
nouveau: 0x00007ffd
nouveau: 0x023e2714
nouveau: 0x00000000
nouveau: 0xce252eb6
nouveau: 0x00007f6d
nouveau: 0x80008000
nouveau: 0x00000000
nouveau: 0xce385bca
nouveau: 0x00007f6d
nouveau: 0x000001ae
nouveau: 0x00000000
nouveau: 0xcbcb1eab
nouveau: 0x00007f6d
nouveau: 0x20040478
nouveau: 0x88888888
nouveau: 0x88888888
nouveau: 0x88888888
nouveau: 0x88888888
nouveau: 0x20040360
nouveau: 0x3f000000
nouveau: 0x3f000000
nouveau: 0x3f000000
nouveau: 0x3f800000
nouveau: 0x20010674
nouveau: 0x0000003c
[2]:
#0 abi16_bo_init
(bo=bo@entry=0x8f8e30, alignment=alignment@entry=4096, config=config@entry=0x7fffffffd120) at ../nouveau/abi16.c:358
// This passes flags to abi16_bo_init()
#1 0x00007ffff7370539 in nouveau_bo_new
(dev=dev@entry=0x5a0300, flags=536870914, align=align@entry=4096, size=15728640, config=config@entry=0x7fffffffd120, pbo=pbo@entry=0x8f8d10)
at ../nouveau/nouveau.c:650
// flags = mt->base.domain | NOUVEAU_BO_NOSNOOP
#2 0x00007ffff56bb109 in nvc0_miptree_create
(pscreen=0x89b7b0, templ=<optimized out>, modifiers=<optimized out>, count=<optimized out>) at ../src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c:541
#3 0x00007ffff4cadced in dri2_create_image_common
(_screen=0x8970a0, width=1920, height=<optimized out>, format=4098, use=3, modifiers=0x89fab0, count=1, loaderPrivate=0x8f8be0)
at ../src/gallium/frontends/dri/dri2.c:1255
#4 0x00007ffff7e9beef in gbm_dri_bo_create
(gbm=0x826410, width=1920, height=1080, format=875713112, usage=<optimized out>, modifiers=0x89fab0, count=1) at ../src/gbm/backends/dri/gbm_dri.c:1148
#5 0x00007ffff7e9aeb6 in gbm_bo_create_with_modifiers
(gbm=<optimized out>, width=<optimized out>, height=<optimized out>, format=<optimized out>, modifiers=<optimized out>, count=<optimized out>)
at ../src/gbm/main/gbm.c:522
#6 0x00007ffff7e72a0c in get_back_bo (dri2_surf=dri2_surf@entry=0x8f8040)
at ../src/egl/drivers/dri2/platform_drm.c:249
#7 0x00007ffff7e72a64 in dri2_drm_image_get_buffers
(driDrawable=<optimized out>, format=<optimized out>, stamp=<optimized out>, loaderPrivate=0x8f8040, buffer_mask=<optimized out>, buffers=0x7fffffffd430)
at ../src/egl/drivers/dri2/platform_drm.c:391
#8 0x00007ffff4cb050f in dri_image_drawable_get_buffers
(drawable=drawable@entry=0x8f8430, images=images@entry=0x7fffffffd430, statts=statts@entry=0x8f8af0, statts_count=statts_count@entry=1)
at ../src/gallium/frontends/dri/dri2.c:316
#9 0x00007ffff4cb0678 in dri2_allocate_textures
(ctx=0x89fe90, drawable=0x8f8430, statts=0x8f8af0, statts_count=1)
at ../src/gallium/frontends/dri/dri2.c:488
#10 0x00007ffff4cb22ae in dri_st_framebuffer_validate
(st=<optimized out>, pdrawable=0x8f8430, statts=0x8f8af0, count=<optimized out>, out=0x7fffffffd620, resolve=0x7fffffffd5e8)
at ../src/gallium/frontends/dri/dri_drawable.c:79
#11 0x00007ffff4d7e20c in st_framebuffer_validate
(stfb=0x8f8690, st=st@entry=0x8f0840)
at ../src/mesa/state_tracker/st_manager.c:239
#12 0x00007ffff4d7f0e2 in st_api_make_current
(st=0x8f0840, stdrawi=stdrawi@entry=0x8f8430, streadi=streadi@entry=0x8f8430) at ../src/mesa/state_tracker/st_manager.c:1144
#13 0x00007ffff4cb1de2 in dri_make_current
(ctx=0x89fe90, draw=0x8f8430, read=0x8f8430)
at ../src/gallium/frontends/dri/dri_context.c:350
#14 0x00007ffff4cb59ee in driBindContext
(pcp=<optimized out>, pdp=<optimized out>, prp=<optimized out>)
at ../src/gallium/frontends/dri/dri_util.c:699
#15 0x00007ffff7e6dacc in dri2_make_current
(disp=0x8c5910, dsurf=0x8f8040, rsurf=0x8f8040, ctx=<optimized out>)
at ../src/egl/drivers/dri2/egl_dri2.c:1674
#16 0x00007ffff7e59a0e in eglMakeCurrent
(dpy=<optimized out>, draw=0x8f8040, read=<optimized out>, ctx=<optimized out>) at ../src/egl/main/eglapi.c:972
#17 0x0000000000405af7 in init_egl
(egl=0x578900 <gl>, gbm=0x5788c0 <gbm>, samples=0) at ../common.c:407
#18 0x000000000040648d in init_cube_smooth (gbm=0x5788c0 <gbm>, samples=0)
at ../cube-smooth.c:225
#19 0x000000000040b98a in main (argc=3, argv=0x7fffffffdcf8)
at ../kmscube.c:231
[3]:
// This is the Push that triggers the validate failure
#0 abi16_bo_init
(bo=bo@entry=0xfaf700, alignment=alignment@entry=4096, config=config@entry=0x0) at ../nouveau/abi16.c:358
#1 0x00007ffff7370539 in nouveau_bo_new
(dev=0x5a0300, flags=flags@entry=2, align=align@entry=4096, size=size@entry=4096, config=config@entry=0x0, pbo=0xfaf6c8) at ../nouveau/nouveau.c:650
#2 0x00007ffff5673b3d in nouveau_fence_new
(nv=nv@entry=0x8cab70, fence=fence@entry=0x8cb050)
at ../src/gallium/drivers/nouveau/nouveau_fence.c:43
#3 0x00007ffff5673e2a in _nouveau_fence_next (nv=nv@entry=0x8cab70)
at ../src/gallium/drivers/nouveau/nouveau_fence.c:298
#4 0x00007ffff56b7c79 in nvc0_default_kick_notify (context=0x8cab70)
at ../src/gallium/drivers/nouveau/nvc0/nvc0_context.c:285
#5 0x00007ffff56757e7 in nouveau_pushbuf_cb (push=<optimized out>)
at ../src/gallium/drivers/nouveau/nouveau_screen.c:210
#6 0x00007ffff73715ce in pushbuf_submit
(push=push@entry=0x8ce810, chan=<optimized out>)
at ../nouveau/pushbuf.c:329
#7 0x00007ffff7371827 in pushbuf_flush (push=push@entry=0x8ce810)
at ../nouveau/pushbuf.c:408
#8 0x00007ffff73723f0 in nouveau_pushbuf_kick
(push=push@entry=0x8ce810, chan=<optimized out>)
at ../nouveau/pushbuf.c:782
#9 0x00007ffff56b83c9 in PUSH_KICK (push=0x8ce810)
at ../src/gallium/drivers/nouveau/nouveau_winsys.h:98
#10 nvc0_flush (pipe=0x8cab70, fence=<optimized out>, flags=<optimized out>)
at ../src/gallium/drivers/nouveau/nvc0/nvc0_context.c:88
#11 0x00007ffff4d7f32b in st_context_flush
(st=st@entry=0x8f0840, flags=2, fence=fence@entry=0x7fffffffd7b8, before_flush_cb=0x7ffff4cb2a50 <notify_before_flush_cb>, args=args@entry=0x7fffffffd7c0)
at ../src/mesa/state_tracker/st_manager.c:822
#12 0x00007ffff4cb2c90 in dri_flush
(cPriv=<optimized out>, dPriv=0x8f8430, flags=5, reason=<optimized out>)
at ../src/gallium/frontends/dri/dri_drawable.c:537
#13 0x00007ffff7e72b34 in dri2_drm_swap_buffers (disp=0x8c5910, draw=0x8f8040)
at ../src/egl/drivers/dri2/platform_drm.c:434
#14 0x00007ffff7e6bd73 in dri2_swap_buffers (disp=0x8c5910, surf=0x8f8040)
at ../src/egl/drivers/dri2/egl_dri2.c:1881
#15 0x00007ffff7e5c73d in eglSwapBuffers
(dpy=<optimized out>, surface=0x8f8040) at ../src/egl/main/eglapi.c:1434
#16 0x0000000000409f5b in legacy_run (gbm=0x5788c0 <gbm>, egl=0x578900 <gl>)
at ../drm-legacy.c:99
#17 0x000000000040baa7 in main (argc=3, argv=0x7fffffffdcf8)
at ../kmscube.c:256