diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 28a5828a275..a6cdad72c47 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -2885,7 +2885,7 @@ dri2_create_drm_image_mesa(_EGLDisplay *disp, const EGLint *attr_list) dri2_img->dri_image = dri2_dpy->image->createImage(dri2_dpy->dri_screen_render_gpu, attrs.Width, - attrs.Height, format, dri_use, dri2_img); + attrs.Height, format, NULL, 0, dri_use, dri2_img); if (dri2_img->dri_image == NULL) { free(dri2_img); _eglError(EGL_BAD_ALLOC, "dri2_create_drm_image_mesa"); diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index 054f2f13ae8..a4b1910c2a5 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -492,7 +492,7 @@ get_front_bo(struct dri2_egl_surface *dri2_surf, unsigned int format) } else if (dri2_surf->base.Type == EGL_PBUFFER_BIT) { dri2_surf->dri_image_front = dri2_dpy->image->createImage( dri2_dpy->dri_screen_render_gpu, dri2_surf->base.Width, - dri2_surf->base.Height, format, 0, NULL); + dri2_surf->base.Height, format, NULL, 0, 0, NULL); if (!dri2_surf->dri_image_front) { _eglLog(_EGL_WARNING, "dri2_image_front allocation failed"); return -1; diff --git a/src/egl/drivers/dri2/platform_device.c b/src/egl/drivers/dri2/platform_device.c index 9b2e7da246f..cdaac929a96 100644 --- a/src/egl/drivers/dri2/platform_device.c +++ b/src/egl/drivers/dri2/platform_device.c @@ -50,7 +50,7 @@ device_alloc_image(struct dri2_egl_display *dri2_dpy, { return dri2_dpy->image->createImage( dri2_dpy->dri_screen_render_gpu, dri2_surf->base.Width, - dri2_surf->base.Height, dri2_surf->visual, 0, NULL); + dri2_surf->base.Height, dri2_surf->visual, NULL, 0, 0, NULL); } static void diff --git a/src/egl/drivers/dri2/platform_surfaceless.c b/src/egl/drivers/dri2/platform_surfaceless.c index 4b69874d3f6..2f6e54bd8e0 100644 --- a/src/egl/drivers/dri2/platform_surfaceless.c +++ b/src/egl/drivers/dri2/platform_surfaceless.c @@ -45,7 +45,7 @@ surfaceless_alloc_image(struct dri2_egl_display *dri2_dpy, { return dri2_dpy->image->createImage( dri2_dpy->dri_screen_render_gpu, dri2_surf->base.Width, - dri2_surf->base.Height, dri2_surf->visual, 0, NULL); + dri2_surf->base.Height, dri2_surf->visual, NULL, 0, 0, NULL); } static void diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index 23d2ebf9586..45bff9c3766 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -1148,12 +1148,13 @@ dri2_get_modifier_num_planes(__DRIscreen *_screen, } static __DRIimage * -dri2_create_image_common(__DRIscreen *_screen, - int width, int height, - int format, unsigned int use, - const uint64_t *modifiers, - const unsigned count, - void *loaderPrivate) +dri2_create_image(__DRIscreen *_screen, + int width, int height, + int format, + const uint64_t *modifiers, + const unsigned _count, + unsigned int use, + void *loaderPrivate) { const struct dri2_format_mapping *map = dri2_get_mapping_by_format(format); struct dri_screen *screen = dri_screen(_screen); @@ -1161,10 +1162,25 @@ dri2_create_image_common(__DRIscreen *_screen, __DRIimage *img; struct pipe_resource templ; unsigned tex_usage = 0; + unsigned count = _count; if (!map) return NULL; + if (count == 1 && modifiers[0] == DRM_FORMAT_MOD_INVALID) { + count = 0; + modifiers = NULL; + } else if (count == 1 && modifiers[0] == DRM_FORMAT_MOD_LINEAR && + !pscreen->resource_create_with_modifiers) { + count = 0; + modifiers = NULL; + use |= __DRI_IMAGE_USE_LINEAR; + } + else if ((count > 1 || modifiers) && + !pscreen->resource_create_with_modifiers) { + return NULL; + } + if (pscreen->is_format_supported(pscreen, map->pipe_format, screen->target, 0, 0, PIPE_BIND_RENDER_TARGET)) tex_usage |= PIPE_BIND_RENDER_TARGET; @@ -1235,27 +1251,6 @@ dri2_create_image_common(__DRIscreen *_screen, return img; } -static __DRIimage * -dri2_create_image(__DRIscreen *_screen, - int width, int height, int format, - unsigned int use, void *loaderPrivate) -{ - return dri2_create_image_common(_screen, width, height, format, use, - NULL /* modifiers */, 0 /* count */, - loaderPrivate); -} - -static __DRIimage * -dri2_create_image_with_modifiers(__DRIscreen *dri_screen, - int width, int height, int format, - const uint64_t *modifiers, - const unsigned count, unsigned int use, - void *loaderPrivate) -{ - return dri2_create_image_common(dri_screen, width, height, format, use, - modifiers, count, loaderPrivate); -} - static bool dri2_query_image_common(__DRIimage *image, int attrib, int *value) { @@ -1932,7 +1927,6 @@ static const __DRIimageExtension dri2ImageExtensionTempl = { .getCapabilities = dri2_get_capabilities, .mapImage = dri2_map_image, .unmapImage = dri2_unmap_image, - .createImageWithModifiers = NULL, .queryDmaBufFormats = NULL, .queryDmaBufModifiers = NULL, .queryDmaBufFormatModifierAttribs = NULL, @@ -1957,7 +1951,6 @@ const __DRIimageExtension driVkImageExtension = { .getCapabilities = dri2_get_capabilities, .mapImage = dri2_map_image, .unmapImage = dri2_unmap_image, - .createImageWithModifiers = dri2_create_image_with_modifiers, .queryDmaBufFormats = dri2_query_dma_buf_formats, .queryDmaBufModifiers = dri2_query_dma_buf_modifiers, .queryDmaBufFormatModifierAttribs = dri2_query_dma_buf_format_modifier_attribs, @@ -2209,10 +2202,6 @@ dri2_init_screen_extensions(struct dri_screen *screen, nExt = &screen->screen_extensions[ARRAY_SIZE(dri_screen_extensions_base)]; screen->image_extension = dri2ImageExtensionTempl; - if (pscreen->resource_create_with_modifiers) { - screen->image_extension.createImageWithModifiers = - dri2_create_image_with_modifiers; - } if (pscreen->get_param(pscreen, PIPE_CAP_NATIVE_FENCE_FD)) { screen->image_extension.setInFenceFd = dri2_set_in_fence_fd; diff --git a/src/gallium/include/mesa_interface.h b/src/gallium/include/mesa_interface.h index 13ba3e4c2b0..abaeaa0e807 100644 --- a/src/gallium/include/mesa_interface.h +++ b/src/gallium/include/mesa_interface.h @@ -1429,11 +1429,6 @@ struct __DRIimageExtensionRec { void (*destroyImage)(__DRIimage *image); - __DRIimage *(*createImage)(__DRIscreen *screen, - int width, int height, int format, - unsigned int use, - void *loaderPrivate); - unsigned char (*queryImage)(__DRIimage *image, int attrib, int *value); /** @@ -1635,6 +1630,10 @@ struct __DRIimageExtensionRec { * Creates an image with implementation's favorite modifiers and the * provided usage flags. * + * Passing either zero modifiers, or a modifier list consisting only + * of DRM_FORMAT_MOD_INVALID, allows the implementation to select a + * layout with implicit modifiers. + * * The created image should be destroyed with destroyImage(). * * Returns the new DRIimage. The chosen modifier can be obtained later on @@ -1644,12 +1643,12 @@ struct __DRIimageExtensionRec { * * \since 19 */ - __DRIimage *(*createImageWithModifiers)(__DRIscreen *screen, - int width, int height, int format, - const uint64_t *modifiers, - const unsigned int modifier_count, - unsigned int use, - void *loaderPrivate); + __DRIimage *(*createImage)(__DRIscreen *screen, + int width, int height, int format, + const uint64_t *modifiers, + const unsigned int modifier_count, + unsigned int use, + void *loaderPrivate); /** * Set an in-fence-fd on the image. If a fence-fd is already set diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 6ed8ca6c319..2570aeab8a1 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -972,11 +972,6 @@ gbm_dri_bo_create(struct gbm_device *gbm, /* Gallium drivers requires shared in order to get the handle/stride */ dri_use |= __DRI_IMAGE_USE_SHARE; - if (modifiers && !dri->image->createImageWithModifiers) { - errno = ENOSYS; - goto failed; - } - /* If the driver supports fixed-rate compression, filter the acceptable * modifiers by the compression rate. */ if (modifiers && dri->image->queryCompressionModifiers) { @@ -1154,14 +1149,8 @@ gbm_dri_surface_create(struct gbm_device *gbm, uint32_t format, uint32_t flags, const uint64_t *modifiers, const unsigned count) { - struct gbm_dri_device *dri = gbm_dri_device(gbm); struct gbm_dri_surface *surf; - if (modifiers && !dri->image->createImageWithModifiers) { - errno = ENOSYS; - return NULL; - } - if (count) assert(modifiers); diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c index 3306e52fde3..59131daf300 100644 --- a/src/loader/loader_dri3_helper.c +++ b/src/loader/loader_dri3_helper.c @@ -1462,8 +1462,7 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format, if (draw->dri_screen_render_gpu == draw->dri_screen_display_gpu) { #ifdef HAVE_DRI3_MODIFIERS if (draw->multiplanes_available && - draw->ext->image->queryDmaBufModifiers && - draw->ext->image->createImageWithModifiers) { + draw->ext->image->queryDmaBufModifiers) { xcb_dri3_get_supported_modifiers_cookie_t mod_cookie; xcb_dri3_get_supported_modifiers_reply_t *mod_reply; xcb_generic_error_t *error = NULL; @@ -1528,11 +1527,10 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format, if (!buffer->image) goto no_image; } else { - buffer->image = draw->ext->image->createImage(draw->dri_screen_render_gpu, - width, height, - format, - 0, - buffer); + buffer->image = + draw->ext->image->createImage(draw->dri_screen_render_gpu, + width, height, format, + NULL, 0, 0, buffer); if (!buffer->image) goto no_image; @@ -1546,6 +1544,7 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format, draw->ext->image->createImage(draw->dri_screen_display_gpu, width, height, dri3_linear_format_for_format(draw, format), + NULL, 0, __DRI_IMAGE_USE_SHARE | __DRI_IMAGE_USE_LINEAR | __DRI_IMAGE_USE_BACKBUFFER | @@ -1557,14 +1556,15 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format, if (!pixmap_buffer) { buffer->linear_buffer = draw->ext->image->createImage(draw->dri_screen_render_gpu, - width, height, - dri3_linear_format_for_format(draw, format), - __DRI_IMAGE_USE_SHARE | - __DRI_IMAGE_USE_LINEAR | - __DRI_IMAGE_USE_BACKBUFFER | - __DRI_IMAGE_USE_SCANOUT | - __DRI_IMAGE_USE_PRIME_BUFFER, - buffer); + width, height, + dri3_linear_format_for_format(draw, format), + NULL, 0, + __DRI_IMAGE_USE_SHARE | + __DRI_IMAGE_USE_LINEAR | + __DRI_IMAGE_USE_BACKBUFFER | + __DRI_IMAGE_USE_SCANOUT | + __DRI_IMAGE_USE_PRIME_BUFFER, + buffer); pixmap_buffer = buffer->linear_buffer; if (!buffer->linear_buffer) { diff --git a/src/loader/loader_dri_helper.c b/src/loader/loader_dri_helper.c index c22e2a1a86a..fc3d095a2c5 100644 --- a/src/loader/loader_dri_helper.c +++ b/src/loader/loader_dri_helper.c @@ -38,7 +38,7 @@ __DRIimage *loader_dri_create_image(__DRIscreen *screen, unsigned int modifiers_count, void *loaderPrivate) { - if (modifiers && modifiers_count > 0 && image->createImageWithModifiers) { + if (modifiers && modifiers_count > 0) { bool has_valid_modifier = false; int i; @@ -56,15 +56,10 @@ __DRIimage *loader_dri_create_image(__DRIscreen *screen, } if (!has_valid_modifier) return NULL; - - return image->createImageWithModifiers(screen, width, height, - dri_format, modifiers, - modifiers_count, dri_usage, - loaderPrivate); } - /* No modifier given or fallback to the legacy createImage allowed */ - return image->createImage(screen, width, height, dri_format, dri_usage, + return image->createImage(screen, width, height, dri_format, + modifiers, modifiers_count, dri_usage, loaderPrivate); }