kopper: add a dmabuf-free image interface for use with sw drivers
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Thu, 7 Apr 2022 18:28:55 +0000 (14:28 -0400)
committerMarge Bot <emma+marge@anholt.net>
Thu, 7 Apr 2022 20:08:10 +0000 (20:08 +0000)
sw drivers don't support modifiers or dmabufs or any of that, so separate
interfaces are needed to avoid advertising extensions that will only lead
to crashes

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15802>

src/gallium/drivers/zink/ci/zink-lvp-fails.txt
src/gallium/frontends/dri/dri2.c
src/gallium/frontends/dri/kopper.c

index ebb8786..9b57347 100644 (file)
@@ -14,7 +14,6 @@ spec@egl_chromium_sync_control@conformance@eglGetSyncValuesCHROMIUM_ust_test,Fai
 spec@egl_khr_gl_colorspace@srgb,Crash
 spec@ext_framebuffer_blit@fbo-sys-blit,Fail
 spec@ext_framebuffer_blit@fbo-sys-sub-blit,Fail
-spec@ext_image_dma_buf_import@ext_image_dma_buf_import-export-tex,Crash
 
 dEQP-GLES2.functional.clipping.point.wide_point_clip,Fail
 dEQP-GLES2.functional.clipping.point.wide_point_clip_viewport_center,Fail
index 1d96ada..63ac9d5 100644 (file)
@@ -1899,6 +1899,28 @@ const __DRIimageExtension driVkImageExtension = {
     .createImageWithModifiers2    = dri2_create_image_with_modifiers2,
 };
 
+const __DRIimageExtension driVkImageExtensionSw = {
+    .base = { __DRI_IMAGE, 20 },
+
+    .createImageFromName          = dri2_create_image_from_name,
+    .createImageFromRenderbuffer  = dri2_create_image_from_renderbuffer,
+    .destroyImage                 = dri2_destroy_image,
+    .createImage                  = dri2_create_image,
+    .queryImage                   = dri2_query_image,
+    .dupImage                     = dri2_dup_image,
+    .validateUsage                = dri2_validate_usage,
+    .createImageFromNames         = dri2_from_names,
+    .fromPlanar                   = dri2_from_planar,
+    .createImageFromTexture       = dri2_create_from_texture,
+    .createImageFromFds           = dri2_from_fds,
+    .createImageFromFds2          = dri2_from_fds2,
+    .blitImage                    = dri2_blit_image,
+    .getCapabilities              = dri2_get_capabilities,
+    .mapImage                     = dri2_map_image,
+    .unmapImage                   = dri2_unmap_image,
+    .createImageFromRenderbuffer2 = dri2_create_image_from_renderbuffer2,
+};
+
 static const __DRIrobustnessExtension dri2Robustness = {
    .base = { __DRI2_ROBUSTNESS, 1 }
 };
index e4d4e06..caf99c5 100644 (file)
@@ -54,6 +54,7 @@ struct kopper_screen {
 };
 
 extern const __DRIimageExtension driVkImageExtension;
+extern const __DRIimageExtension driVkImageExtensionSw;
 
 static void
 kopper_flush_drawable(__DRIdrawable *dPriv)
@@ -95,6 +96,18 @@ static const __DRIextension *drivk_screen_extensions[] = {
    NULL
 };
 
+static const __DRIextension *drivk_sw_screen_extensions[] = {
+   &driTexBufferExtension.base,
+   &dri2RendererQueryExtension.base,
+   &dri2ConfigQueryExtension.base,
+   &dri2FenceExtension.base,
+   &dri2Robustness.base,
+   &driVkImageExtensionSw.base,
+   &dri2FlushControlExtension.base,
+   &driVkFlushExtension.base,
+   NULL
+};
+
 static const __DRIconfig **
 kopper_init_screen(__DRIscreen * sPriv)
 {
@@ -137,7 +150,10 @@ kopper_init_screen(__DRIscreen * sPriv)
    assert(pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY));
    screen->has_reset_status_query = true;
    screen->lookup_egl_image = dri2_lookup_egl_image;
-   sPriv->extensions = drivk_screen_extensions;
+   if (pscreen->get_param(pscreen, PIPE_CAP_DMABUF))
+      sPriv->extensions = drivk_screen_extensions;
+   else
+      sPriv->extensions = drivk_sw_screen_extensions;
 
    const __DRIimageLookupExtension *image = sPriv->dri2.image;
    if (image &&