X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fegl%2Fdrivers%2Fdri2%2Fegl_dri2.c;h=60e0db3c7818c67583a49b70f516e0447eab0d72;hb=7d5a13ebf31edab412a06c075b847fc9f0137da1;hp=e1e8faaa79837659e4652cf6687ea53d46e55aa5;hpb=d32c458de76c9e0cc08c9ee1a7de23c3fca69298;p=mesa.git diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index e1e8faaa798..60e0db3c781 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -62,6 +62,7 @@ #include "egl_dri2.h" #include "GL/mesa_glinterop.h" #include "loader/loader.h" +#include "util/os_file.h" #include "util/u_atomic.h" #include "util/u_vector.h" #include "mapi/glapi/glapi.h" @@ -85,41 +86,49 @@ #define NUM_ATTRIBS 12 static const struct dri2_pbuffer_visual { + const char *format_name; unsigned int dri_image_format; int rgba_shifts[4]; unsigned int rgba_sizes[4]; } dri2_pbuffer_visuals[] = { { + "ABGR16F", __DRI_IMAGE_FORMAT_ABGR16161616F, { 0, 16, 32, 48 }, { 16, 16, 16, 16 } }, { + "XBGR16F", __DRI_IMAGE_FORMAT_XBGR16161616F, { 0, 16, 32, -1 }, { 16, 16, 16, 0 } }, { + "A2RGB10", __DRI_IMAGE_FORMAT_ARGB2101010, { 20, 10, 0, 30 }, { 10, 10, 10, 2 } }, { + "X2RGB10", __DRI_IMAGE_FORMAT_XRGB2101010, { 20, 10, 0, -1 }, { 10, 10, 10, 0 } }, { + "ARGB8888", __DRI_IMAGE_FORMAT_ARGB8888, { 16, 8, 0, 24 }, { 8, 8, 8, 8 } }, { + "RGB888", __DRI_IMAGE_FORMAT_XRGB8888, { 16, 8, 0, -1 }, { 8, 8, 8, 0 } }, { + "RGB565", __DRI_IMAGE_FORMAT_RGB565, { 11, 5, 0, -1 }, { 5, 6, 5, 0 } @@ -634,6 +643,39 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id, return conf; } +EGLBoolean +dri2_add_pbuffer_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *disp) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + unsigned int format_count[ARRAY_SIZE(dri2_pbuffer_visuals)] = { 0 }; + unsigned int config_count = 0; + + for (unsigned i = 0; dri2_dpy->driver_configs[i] != NULL; i++) { + for (unsigned j = 0; j < ARRAY_SIZE(dri2_pbuffer_visuals); j++) { + struct dri2_egl_config *dri2_conf; + + dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i], + config_count + 1, EGL_PBUFFER_BIT, NULL, + dri2_pbuffer_visuals[j].rgba_shifts, dri2_pbuffer_visuals[j].rgba_sizes); + + if (dri2_conf) { + if (dri2_conf->base.ConfigID == config_count + 1) + config_count++; + format_count[j]++; + } + } + } + + for (unsigned i = 0; i < ARRAY_SIZE(format_count); i++) { + if (!format_count[i]) { + _eglLog(_EGL_DEBUG, "No DRI config supports native format %s", + dri2_pbuffer_visuals[i].format_name); + } + } + + return (config_count != 0); +} + __DRIimage * dri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data) { @@ -781,9 +823,11 @@ dri2_load_driver_common(_EGLDisplay *disp, if (!extensions) return EGL_FALSE; - if (!dri2_bind_extensions(dri2_dpy, driver_extensions, extensions, false)) + if (!dri2_bind_extensions(dri2_dpy, driver_extensions, extensions, false)) { + dlclose(dri2_dpy->driver); + dri2_dpy->driver = NULL; return EGL_FALSE; - + } dri2_dpy->driver_extensions = extensions; dri2_bind_extensions(dri2_dpy, optional_driver_extensions, extensions, true); @@ -963,11 +1007,6 @@ dri2_setup_screen(_EGLDisplay *disp) if (dri2_dpy->image->base.version >= 8 && dri2_dpy->image->createImageFromDmaBufs) { disp->Extensions.EXT_image_dma_buf_import = EGL_TRUE; - } - if (dri2_dpy->image->base.version >= 15 && - dri2_dpy->image->createImageFromDmaBufs2 && - dri2_dpy->image->queryDmaBufFormats && - dri2_dpy->image->queryDmaBufModifiers) { disp->Extensions.EXT_image_dma_buf_import_modifiers = EGL_TRUE; } #endif @@ -1856,6 +1895,8 @@ dri2_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *disp, const EGLint *attrib_list) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + if (!dri2_dpy->vtbl->create_pixmap_surface) + return NULL; return dri2_dpy->vtbl->create_pixmap_surface(drv, disp, conf, native_pixmap, attrib_list); } @@ -1865,6 +1906,8 @@ dri2_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf, const EGLint *attrib_list) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + if (!dri2_dpy->vtbl->create_pbuffer_surface) + return NULL; return dri2_dpy->vtbl->create_pbuffer_surface(drv, disp, conf, attrib_list); } @@ -1948,8 +1991,11 @@ dri2_swap_buffers_with_damage(_EGLDriver *drv, _EGLDisplay *disp, if (ctx && surf) dri2_surf_update_fence_fd(ctx, disp, surf); - ret = dri2_dpy->vtbl->swap_buffers_with_damage(drv, disp, surf, - rects, n_rects); + if (dri2_dpy->vtbl->swap_buffers_with_damage) + ret = dri2_dpy->vtbl->swap_buffers_with_damage(drv, disp, surf, + rects, n_rects); + else + ret = dri2_dpy->vtbl->swap_buffers(drv, disp, surf); /* SwapBuffers marks the end of the frame; reset the damage region for * use again next time. @@ -3418,7 +3464,7 @@ dri2_dup_native_fence_fd(_EGLDriver *drv, _EGLDisplay *disp, _EGLSync *sync) return EGL_NO_NATIVE_FENCE_FD_ANDROID; } - return dup(sync->SyncFd); + return os_dupfd_cloexec(sync->SyncFd); } static void