vc4: Fall back to renderonly if the vc4 driver doesn't have v3d.
authorEric Anholt <eric@anholt.net>
Sat, 27 Oct 2018 01:19:37 +0000 (18:19 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 26 Apr 2019 22:02:03 +0000 (15:02 -0700)
I have a platform with vc4 display but V3D 4.x.  We can fall back on
kmsro's probing to bring up the v3d gallium driver.

Acked-by: Rob Clark <robdclark@chromium.org>
src/gallium/drivers/vc4/meson.build
src/gallium/winsys/vc4/drm/meson.build
src/gallium/winsys/vc4/drm/vc4_drm_winsys.c

index 617578d4593c7795ac7b7995c11b69162d652e5d..5ce5af5f6b40c3b4d996f746b50740ade81ffcef 100644 (file)
@@ -96,7 +96,6 @@ if host_machine.cpu_family() == 'arm'
   vc4_c_args += '-DUSE_ARM_ASM'
 endif
 
-dep_simpenrose = dependency('simpenrose', required : false)
 if dep_simpenrose.found()
   vc4_c_args += '-DUSE_VC4_SIMULATOR'
 endif
index 58216dc5f545d9f16919082d8f61383465de0600..55c85734e04309f7c0f0b404683623ef5866373d 100644 (file)
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
+dep_simpenrose = dependency('simpenrose', required : false)
+
+vc4_winsys_c_args = []
+if with_gallium_kmsro
+  vc4_winsys_c_args += '-DGALLIUM_KMSRO'
+endif
+
+if dep_simpenrose.found()
+  vc4_winsys_c_args += '-DUSE_VC4_SIMULATOR'
+endif
+
 libvc4winsys = static_library(
   'vc4winsys',
   files('vc4_drm_winsys.c'),
   include_directories : [
     inc_src, inc_include,
-    inc_gallium, inc_gallium_aux, inc_gallium_drivers,
+    inc_gallium, inc_gallium_aux, inc_gallium_drivers, inc_gallium_winsys,
   ],
-  c_args : [c_vis_args],
+  c_args : [c_vis_args, vc4_winsys_c_args],
 )
index 73717d25fe4c1fef170284f4160c2d696525cb7a..4215857d06b512594887a8dc2312562f0b90c03f 100644 (file)
 
 #include <unistd.h>
 #include <fcntl.h>
+#include <sys/ioctl.h>
 
 #include "renderonly/renderonly.h"
+#include "kmsro/drm/kmsro_drm_public.h"
 #include "vc4_drm_public.h"
 #include "vc4/vc4_screen.h"
+#include "drm-uapi/vc4_drm.h"
 
 struct pipe_screen *
 vc4_drm_screen_create(int fd)
 {
-   return vc4_screen_create(fcntl(fd, F_DUPFD_CLOEXEC, 3), NULL);
+   bool v3d_present = true;
+
+#ifndef USE_VC4_SIMULATOR
+   struct drm_vc4_get_param ident0 = {
+      .param = DRM_VC4_PARAM_V3D_IDENT0,
+   };
+
+   int ret = ioctl(fd, DRM_IOCTL_VC4_GET_PARAM, &ident0);
+   v3d_present = ret == 0;
+#endif
+
+   if (v3d_present)
+      return vc4_screen_create(fcntl(fd, F_DUPFD_CLOEXEC, 3), NULL);
+
+#ifdef GALLIUM_KMSRO
+   return kmsro_drm_screen_create(fd);
+#endif
+
+   return NULL;
 }
 
 struct pipe_screen *