From d09ee469f0e02b89ca986e581c7efb3ce2ac5a06 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 7 Apr 2022 14:28:55 -0400 Subject: [PATCH] kopper: add a dmabuf-free image interface for use with sw drivers 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 Part-of: --- .../drivers/zink/ci/zink-lvp-fails.txt | 1 - src/gallium/frontends/dri/dri2.c | 22 +++++++++++++++++++ src/gallium/frontends/dri/kopper.c | 18 ++++++++++++++- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/ci/zink-lvp-fails.txt b/src/gallium/drivers/zink/ci/zink-lvp-fails.txt index ebb8786b37e..9b57347b1c8 100644 --- a/src/gallium/drivers/zink/ci/zink-lvp-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-lvp-fails.txt @@ -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 diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index 1d96adab987..63ac9d5c0ee 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -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 } }; diff --git a/src/gallium/frontends/dri/kopper.c b/src/gallium/frontends/dri/kopper.c index e4d4e0661ea..caf99c544b7 100644 --- a/src/gallium/frontends/dri/kopper.c +++ b/src/gallium/frontends/dri/kopper.c @@ -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 &&