panfrost: Include glue for out-of-tree legacy code
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Tue, 5 Feb 2019 05:13:50 +0000 (05:13 +0000)
committerAlyssa Rosenzweig <alyssa@rosenzweig.io>
Thu, 7 Feb 2019 01:58:32 +0000 (01:58 +0000)
In addition to the DRM interface in active development, for legacy
kernels Panfrost has a small, optional, out-of-tree glue repository. For
various reasons, this legacy code should not be included in Mesa proper,
but this commit allows it to coexist peacefully with upstream Panfrost.
If the nondrm repo is cloned/symlinked to the directory
`src/gallium/drivers/panfrost/nondrm`, legacy functionality will be
built. Otherwise, the driver will build normally, though a runtime error
message will be printed if a legacy kernel is detected.

This workaround is icky, but it allows a nearly-upstream Panfrost to
work on real hardware, today. Ideally, this patch will be reverted when
the Panfrost kernel module is mature and we drop legacy support.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
src/gallium/drivers/panfrost/.gitignore [new file with mode: 0644]
src/gallium/drivers/panfrost/meson.build
src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pan_screen.c
src/gallium/drivers/panfrost/pan_screen.h

diff --git a/src/gallium/drivers/panfrost/.gitignore b/src/gallium/drivers/panfrost/.gitignore
new file mode 100644 (file)
index 0000000..9d2c2c1
--- /dev/null
@@ -0,0 +1 @@
+nondrm
index 9b90035d691ac95f2b4cf01b793719394a99dd5c..5e799eae11965bb3dc7f15f2d21ad4efbc0140cf 100644 (file)
@@ -39,7 +39,7 @@ files_panfrost = files(
   'pan_blending.c',
   'pan_blend_shaders.c',
   'pan_wallpaper.c',
-  'pan_pretty_print.c'
+  'pan_pretty_print.c',
 )
 
 inc_panfrost = [
@@ -53,6 +53,21 @@ inc_panfrost = [
   include_directories('midgard'),
 ]
 
+compile_args_panfrost = [
+  '-DGALLIUM_PANFROST',
+  '-Wno-pointer-arith'
+]
+
+overlay = join_paths(meson.source_root(), meson.current_source_dir(), 'nondrm/pan_nondrm.c')
+nondrm_overlay_check = run_command('ls', overlay)
+has_nondrm_overlay = nondrm_overlay_check.returncode() == 0
+
+if has_nondrm_overlay
+  files_panfrost += files('nondrm/pan_nondrm.c')
+  inc_panfrost += include_directories('nondrm/include')
+  compile_args_panfrost += '-DPAN_NONDRM_OVERLAY'
+endif
+
 midgard_nir_algebraic_c = custom_target(
   'midgard_nir_algebraic.c',
   input : 'midgard/midgard_nir_algebraic.py',
@@ -73,11 +88,11 @@ libpanfrost = static_library(
     idep_nir
   ],
   include_directories : inc_panfrost,
-  c_args : [c_vis_args, c_msvc_compat_args],
+  c_args : [c_vis_args, c_msvc_compat_args, compile_args_panfrost],
 )
 
 driver_panfrost = declare_dependency(
-  compile_args : ['-DGALLIUM_PANFROST', '-Wno-pointer-arith'],
+  compile_args : compile_args_panfrost,
   link_with : [libpanfrost, libpanfrostwinsys],
 )
 
index 0551d553182abd8115bed0903f429a981033ade7..fb4130362e07a34c28cf393e556acfdb7f11edff 100644 (file)
@@ -1431,7 +1431,8 @@ panfrost_submit_frame(struct panfrost_context *ctx, bool flush_immediate)
 
 #ifndef DRY_RUN
         
-       int fragment_id = screen->driver->submit_vs_fs_job(ctx, has_draws);
+        bool is_scanout = panfrost_is_scanout(ctx);
+        int fragment_id = screen->driver->submit_vs_fs_job(ctx, has_draws, is_scanout);
 
         /* If visual, we can stall a frame */
 
index d2ea5a692f5d1a1a01e0e9000bc8ea8df420a8ef..5ee3b4c6006795ccdbd7202ac83b1e7599e26238 100644 (file)
@@ -50,7 +50,8 @@
 #include "pan_context.h"
 #include "midgard/midgard_compile.h"
 
-#include "pan_drm.h"
+struct panfrost_driver *panfrost_create_drm_driver(int fd);
+struct panfrost_driver *panfrost_create_nondrm_driver(int fd);
 
 static const char *
 panfrost_get_name(struct pipe_screen *screen)
@@ -539,8 +540,12 @@ panfrost_create_screen(int fd, struct renderonly *ro, bool is_drm)
         if (is_drm) {
                 screen->driver = panfrost_create_drm_driver(fd);
         } else {
-                fprintf(stderr, "Legacy (non-DRM) drivers are not supported in upstream Mesa\n");
+#ifdef PAN_NONDRM_OVERLAY
+                screen->driver = panfrost_create_nondrm_driver(fd);
+#else
+                fprintf(stderr, "Legacy (non-DRM) operation requires out-of-tree overlay\n");
                 return NULL;
+#endif
         }
 
 #ifdef DUMP_PERFORMANCE_COUNTERS
index 4c8fe8dd720ea3b854ec9cafdbef5e4ef255bf0a..59787c8017c08aef7a4a29d7d9f7b153c7ed93f0 100644 (file)
@@ -53,7 +53,7 @@ struct panfrost_driver {
        void (*unmap_bo) (struct panfrost_context *ctx, struct pipe_transfer *transfer);
        void (*destroy_bo) (struct panfrost_screen *screen, struct panfrost_bo *bo);
 
-       int (*submit_vs_fs_job) (struct panfrost_context *ctx, bool has_draws);
+       int (*submit_vs_fs_job) (struct panfrost_context *ctx, bool has_draws, bool is_scanout);
        void (*force_flush_fragment) (struct panfrost_context *ctx);
        void (*allocate_slab) (struct panfrost_screen *screen,
                               struct panfrost_memory *mem,