d3dadapter9: Support software renderer on any DRI device
authorPatrick Rudolph <siro@das-labor.org>
Thu, 28 Feb 2019 17:13:39 +0000 (18:13 +0100)
committerAxel Davy <davyaxel0@gmail.com>
Sat, 9 Mar 2019 12:57:49 +0000 (13:57 +0100)
If D3D_ALWAYS_SOFTWARE is set for debugging purposes,
run on any DRI enabled platform.
Instead of probing for a compatible gallium driver (which might
fail if there's none) always use the KMS DRI software renderer.

Allows to run nine on i915 when D3D_ALWAYS_SOFTWARE=1.

Signed-off-by: Patrick Rudolph <siro@das-labor.org>
Reviewed-by: Axel Davy <davyaxel0@gmail.com>
src/gallium/targets/d3dadapter9/drm.c

index 1d01d4a067cc9d1e5631033211a5bcdb265a5ff0..28dbd2ef9db2636cd5d727c426ce71c1873cbc85 100644 (file)
@@ -205,6 +205,7 @@ drm_create_adapter( int fd,
     struct d3dadapter9drm_context *ctx = CALLOC_STRUCT(d3dadapter9drm_context);
     HRESULT hr;
     bool different_device;
+    bool software_device;
     const struct drm_conf_ret *throttle_ret = NULL;
     const struct drm_conf_ret *dmabuf_ret = NULL;
     driOptionCache defaultInitOptions;
@@ -222,7 +223,11 @@ drm_create_adapter( int fd,
     ctx->fd = fd;
     ctx->base.linear_framebuffer = different_device;
 
-    if (!pipe_loader_drm_probe_fd(&ctx->dev, fd)) {
+    const char *force_sw = getenv("D3D_ALWAYS_SOFTWARE");
+    software_device = force_sw && !strcmp(force_sw, "1");
+
+    if ((software_device && !pipe_loader_sw_probe_kms(&ctx->dev, fd)) ||
+        (!software_device && !pipe_loader_drm_probe_fd(&ctx->dev, fd))) {
         ERR("Failed to probe drm fd %d.\n", fd);
         FREE(ctx);
         close(fd);
@@ -236,13 +241,20 @@ drm_create_adapter( int fd,
         return D3DERR_DRIVERINTERNALERROR;
     }
 
-    dmabuf_ret = pipe_loader_configuration(ctx->dev, DRM_CONF_SHARE_FD);
-    throttle_ret = pipe_loader_configuration(ctx->dev, DRM_CONF_THROTTLE);
-    if (!dmabuf_ret || !dmabuf_ret->val.val_bool) {
-        ERR("The driver is not capable of dma-buf sharing."
-            "Abandon to load nine state tracker\n");
-        drm_destroy(&ctx->base);
-        return D3DERR_DRIVERINTERNALERROR;
+    if (!software_device) {
+        /*
+         * The software renderer isn't a DRM device and doesn't support
+         * pipe_loader_configuration.
+         * The KMS winsys supports SHARE_FD, so skip this check.
+         */
+        dmabuf_ret = pipe_loader_configuration(ctx->dev, DRM_CONF_SHARE_FD);
+        throttle_ret = pipe_loader_configuration(ctx->dev, DRM_CONF_THROTTLE);
+        if (!dmabuf_ret || !dmabuf_ret->val.val_bool) {
+            ERR("The driver is not capable of dma-buf sharing."
+                "Abandon to load nine state tracker\n");
+            drm_destroy(&ctx->base);
+            return D3DERR_DRIVERINTERNALERROR;
+        }
     }
 
     if (throttle_ret && throttle_ret->val.val_int != -1) {