Mesa (main): glx: create DRI screen for display GPU incase of prime
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jun 3 09:33:49 UTC 2021
Module: Mesa
Branch: main
Commit: 55d1b8f929bbba58734bc7b1f79a6f53ab5aa0e8
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=55d1b8f929bbba58734bc7b1f79a6f53ab5aa0e8
Author: Yogesh Mohanmarimuthu <yogesh.mohanmarimuthu at amd.com>
Date: Mon May 3 23:40:28 2021 +0530
glx: create DRI screen for display GPU incase of prime
The created DRI screen can be used to allocate VRAM memory from
display GPU in case of prime.
v2: add comments to make code readable (Pierre-Eric)
remove driver name match check
v3: keep old path for non-mesa driver (Michel Dänzer)
v4: fallback if driver not found for display GPU (Michel Dänzer)
fallback if create screen fail for display gpu (Michel Dänzer)
Signed-off-by: Yogesh Mohanmarimuthu <yogesh.mohanmarimuthu at amd.com>
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10595>
---
src/glx/dri3_glx.c | 34 ++++++++++++++++++++++++++++++++--
src/glx/dri3_priv.h | 6 ++++++
src/loader/loader_dri3_helper.h | 3 +++
3 files changed, 41 insertions(+), 2 deletions(-)
diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
index 980bd222d16..db1b079663f 100644
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -395,6 +395,7 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable,
return NULL;
}
+ pdraw->loader_drawable.dri_screen_display_gpu = psc->driScreenDisplayGPU;
return &pdraw->base;
}
@@ -607,8 +608,13 @@ dri3_destroy_screen(struct glx_screen *base)
struct dri3_screen *psc = (struct dri3_screen *) base;
/* Free the direct rendering per screen data */
- if (psc->is_different_gpu)
+ if (psc->is_different_gpu) {
+ if (psc->driScreenDisplayGPU) {
+ loader_dri3_close_screen(psc->driScreenDisplayGPU);
+ (*psc->core->destroyScreen) (psc->driScreenDisplayGPU);
+ }
close(psc->fd_display_gpu);
+ }
loader_dri3_close_screen(psc->driScreen);
(*psc->core->destroyScreen) (psc->driScreen);
driDestroyConfigs(psc->driver_configs);
@@ -836,7 +842,7 @@ dri3_create_screen(int screen, struct glx_display * priv)
struct dri3_screen *psc;
__GLXDRIscreen *psp;
struct glx_config *configs = NULL, *visuals = NULL;
- char *driverName, *tmp;
+ char *driverName, *driverNameDisplayGPU, *tmp;
int i;
psc = calloc(1, sizeof *psc);
@@ -900,6 +906,27 @@ dri3_create_screen(int screen, struct glx_display * priv)
goto handle_error;
}
+ if (psc->is_different_gpu) {
+ driverNameDisplayGPU = loader_get_driver_for_fd(psc->fd_display_gpu);
+ if (driverNameDisplayGPU) {
+
+ /* check if driver name is matching so that non mesa drivers
+ * will not crash. Also need this check since image extension
+ * pointer from render gpu is shared with display gpu. Image
+ * extension pointer is shared because it keeps things simple.
+ */
+ if (strcmp(driverName, driverNameDisplayGPU) == 0) {
+ psc->driScreenDisplayGPU =
+ psc->image_driver->createNewScreen2(screen, psc->fd_display_gpu,
+ pdp->loader_extensions,
+ extensions,
+ &driver_configs, psc);
+ }
+
+ free(driverNameDisplayGPU);
+ }
+ }
+
psc->driScreen =
psc->image_driver->createNewScreen2(screen, psc->fd,
pdp->loader_extensions,
@@ -1019,6 +1046,9 @@ handle_error:
if (psc->driScreen)
psc->core->destroyScreen(psc->driScreen);
psc->driScreen = NULL;
+ if (psc->driScreenDisplayGPU)
+ psc->core->destroyScreen(psc->driScreenDisplayGPU);
+ psc->driScreenDisplayGPU = NULL;
if (psc->fd >= 0)
close(psc->fd);
if (psc->fd_display_gpu >= 0)
diff --git a/src/glx/dri3_priv.h b/src/glx/dri3_priv.h
index 4ccc832f281..c0e833c16ef 100644
--- a/src/glx/dri3_priv.h
+++ b/src/glx/dri3_priv.h
@@ -89,6 +89,12 @@ struct dri3_screen {
__DRIscreen *driScreen;
__GLXDRIscreen vtable;
+ /* DRI screen is created for display GPU in case of prime.
+ * This screen is used to allocate linear_buffer from
+ * display GPU space in dri3_alloc_render_buffer() function.
+ */
+ __DRIscreen *driScreenDisplayGPU;
+
const __DRIimageExtension *image;
const __DRIimageDriverExtension *image_driver;
const __DRIcoreExtension *core;
diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h
index 5191c89e7f2..a256c377e6e 100644
--- a/src/loader/loader_dri3_helper.h
+++ b/src/loader/loader_dri3_helper.h
@@ -128,6 +128,9 @@ struct loader_dri3_drawable {
bool is_different_gpu;
bool multiplanes_available;
+ /* DRI screen created for display GPU in case of prime */
+ __DRIscreen *dri_screen_display_gpu;
+
/* Present extension capabilities
*/
uint32_t present_capabilities;
More information about the mesa-commit
mailing list