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@amd.com>
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10595>
This commit is contained in:
Yogesh Mohanmarimuthu 2021-05-03 23:22:28 +05:30 committed by Marge Bot
parent dac2c210d6
commit 55d1b8f929
3 changed files with 41 additions and 2 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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;