diff options
author | Konstantin Pugin <ria.freelander@gmail.com> | 2022-07-21 00:46:07 +0300 |
---|---|---|
committer | Konstantin <ria.freelander@gmail.com> | 2023-11-07 17:59:24 +0300 |
commit | 3caf7aa88d31450f116589d68ff66f78285f0e33 (patch) | |
tree | ccc7a8aa71ca4e3aa665a2ff8a6042203145f44c | |
parent | 141e7dd8a373eafe28fb4f6433671979fb4c59a7 (diff) |
glamor: add glvnd_vendor private
This commit adds an ability to store a glvnd vendor in Glamor
structures, which can be used for initialize some vendor-based values
without hooking into DDX internals. Also this adds setting this value
into Xorg and Xwayland
Signed-off-by: Konstantin Pugin <ria.freelander@gmail.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Acked-by: Emma Anholt <emma@anholt.net>
-rw-r--r-- | glamor/glamor.c | 26 | ||||
-rw-r--r-- | glamor/glamor.h | 6 | ||||
-rw-r--r-- | glamor/glamor_egl.c | 5 | ||||
-rw-r--r-- | glamor/glamor_priv.h | 1 | ||||
-rw-r--r-- | hw/xwayland/xwayland-glamor.c | 1 |
5 files changed, 39 insertions, 0 deletions
diff --git a/glamor/glamor.c b/glamor/glamor.c index 9bd2b90db..565bd67f1 100644 --- a/glamor/glamor.c +++ b/glamor/glamor.c @@ -933,6 +933,7 @@ glamor_close_screen(ScreenPtr screen) glamor_priv = glamor_get_screen_private(screen); glamor_sync_close(screen); glamor_composite_glyphs_fini(screen); + glamor_set_glvnd_vendor(screen, NULL); screen->CloseScreen = glamor_priv->saved_procs.close_screen; screen->CreateGC = glamor_priv->saved_procs.create_gc; @@ -966,6 +967,31 @@ glamor_fini(ScreenPtr screen) } void +glamor_set_glvnd_vendor(ScreenPtr screen, const char *vendor_name) +{ + glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); + + if (!glamor_priv) + return; + + if (glamor_priv->glvnd_vendor) + free(glamor_priv->glvnd_vendor); + + glamor_priv->glvnd_vendor = xnfstrdup(vendor_name); +} + +const char * +glamor_get_glvnd_vendor(ScreenPtr screen) +{ + glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); + + if (!glamor_priv) + return NULL; + + return glamor_priv->glvnd_vendor; +} + +void glamor_enable_dri3(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); diff --git a/glamor/glamor.h b/glamor/glamor.h index 31157471d..f5634b7e7 100644 --- a/glamor/glamor.h +++ b/glamor/glamor.h @@ -120,6 +120,12 @@ extern _X_EXPORT void glamor_clear_pixmap(PixmapPtr pixmap); extern _X_EXPORT void glamor_block_handler(ScreenPtr screen); +/* This function should be called after glamor_init, + * but before adding a glamor GLX provider */ +extern _X_EXPORT void glamor_set_glvnd_vendor(ScreenPtr screen, + const char *vendor); +extern _X_EXPORT const char *glamor_get_glvnd_vendor(ScreenPtr screen); + extern _X_EXPORT PixmapPtr glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth, unsigned int usage); extern _X_EXPORT Bool glamor_destroy_pixmap(PixmapPtr pixmap); diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c index 9bdff24c5..c1142e34d 100644 --- a/glamor/glamor_egl.c +++ b/glamor/glamor_egl.c @@ -887,6 +887,7 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx) #ifdef DRI3 glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); #endif + const char *gbm_backend_name; glamor_egl->saved_close_screen = screen->CloseScreen; screen->CloseScreen = glamor_egl_close_screen; @@ -899,6 +900,10 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx) glamor_ctx->make_current = glamor_egl_make_current; + gbm_backend_name = gbm_device_get_backend_name(glamor_egl->gbm); + /* Mesa uses "drm" as backend name, in that case, just do nothing */ + if (gbm_backend_name && strcmp(gbm_backend_name, "drm") != 0) + glamor_set_glvnd_vendor(screen, gbm_backend_name); #ifdef DRI3 /* Tell the core that we have the interfaces for import/export * of pixmaps. diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h index 33072cb3b..610af5315 100644 --- a/glamor/glamor_priv.h +++ b/glamor/glamor_priv.h @@ -336,6 +336,7 @@ typedef struct glamor_screen_private { int flags; ScreenPtr screen; int dri3_enabled; + char *glvnd_vendor; Bool suppress_gl_out_of_memory_logging; Bool logged_any_fbo_allocation_failure; diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c index c6aa8eb17..b4fba65c0 100644 --- a/hw/xwayland/xwayland-glamor.c +++ b/hw/xwayland/xwayland-glamor.c @@ -77,6 +77,7 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx) { struct xwl_screen *xwl_screen = xwl_screen_get(screen); + glamor_set_glvnd_vendor(screen, xwl_screen->glvnd_vendor); glamor_enable_dri3(screen); glamor_ctx->ctx = xwl_screen->egl_context; glamor_ctx->display = xwl_screen->egl_display; |