dri: further collapse dri_screen creation

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30619>
This commit is contained in:
Mike Blumenkrantz 2024-08-01 08:38:35 -04:00 committed by Marge Bot
parent af6d3fdf6e
commit 764e17eb03
5 changed files with 32 additions and 76 deletions

View file

@ -2011,35 +2011,22 @@ dri2_create_drawable(struct dri_screen *screen, const struct gl_config *visual,
*
* Returns the struct gl_config supported by this driver.
*/
const __DRIconfig **
struct pipe_screen *
dri2_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{
const __DRIconfig **configs;
struct pipe_screen *pscreen = NULL;
#ifdef HAVE_LIBDRM
if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd, false))
pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred);
#endif
if (!pscreen)
return NULL;
configs = dri_init_screen(screen, pscreen);
if (!configs)
goto fail;
screen->can_share_buffer = true;
screen->auto_fake_front = dri_with_format(screen);
screen->create_drawable = dri2_create_drawable;
return configs;
#ifdef HAVE_LIBDRM
if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd, false))
pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred);
#endif
fail:
pipe_loader_release(&screen->dev, 1);
return NULL;
return pscreen;
}
/**
@ -2047,36 +2034,20 @@ fail:
*
* Returns the struct gl_config supported by this driver.
*/
const __DRIconfig **
struct pipe_screen *
dri_swrast_kms_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{
#if defined(HAVE_SWRAST)
const __DRIconfig **configs;
struct pipe_screen *pscreen = NULL;
#ifdef HAVE_DRISW_KMS
if (pipe_loader_sw_probe_kms(&screen->dev, screen->fd))
pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred);
#endif
if (!pscreen)
return NULL;
configs = dri_init_screen(screen, pscreen);
if (!configs)
goto fail;
screen->can_share_buffer = false;
screen->auto_fake_front = dri_with_format(screen);
screen->create_drawable = dri2_create_drawable;
return configs;
#if defined(HAVE_DRISW_KMS) && defined(HAVE_SWRAST)
if (pipe_loader_sw_probe_kms(&screen->dev, screen->fd))
pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred);
#endif
fail:
pipe_loader_release(&screen->dev, 1);
#endif // HAVE_SWRAST
return NULL;
return pscreen;
}
int

View file

@ -215,13 +215,13 @@ dri_release_screen(struct dri_screen * screen);
void
dri_destroy_screen(struct dri_screen *screen);
const __DRIconfig **
struct pipe_screen *
dri2_init_screen(struct dri_screen *screen, bool driver_name_is_inferred);
const __DRIconfig **
struct pipe_screen *
dri_swrast_kms_init_screen(struct dri_screen *screen, bool driver_name_is_inferred);
const __DRIconfig **
struct pipe_screen *
kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred);
const __DRIconfig **
struct pipe_screen *
drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred);
extern const struct __DriverAPIRec dri_swrast_kms_driver_api;

View file

@ -132,22 +132,28 @@ driCreateNewScreen3(int scrn, int fd,
(void) mtx_init(&screen->opencl_func_mutex, mtx_plain);
struct pipe_screen *pscreen = NULL;
switch (type) {
case DRI_SCREEN_DRI3:
*driver_configs = dri2_init_screen(screen, driver_name_is_inferred);
pscreen = dri2_init_screen(screen, driver_name_is_inferred);
break;
case DRI_SCREEN_KOPPER:
*driver_configs = kopper_init_screen(screen, driver_name_is_inferred);
pscreen = kopper_init_screen(screen, driver_name_is_inferred);
break;
case DRI_SCREEN_SWRAST:
*driver_configs = drisw_init_screen(screen, driver_name_is_inferred);
pscreen = drisw_init_screen(screen, driver_name_is_inferred);
break;
case DRI_SCREEN_KMS_SWRAST:
*driver_configs = dri_swrast_kms_init_screen(screen, driver_name_is_inferred);
pscreen = dri_swrast_kms_init_screen(screen, driver_name_is_inferred);
break;
default:
unreachable("unknown dri screen type");
}
if (pscreen == NULL) {
dri_destroy_screen(screen);
return NULL;
}
*driver_configs = dri_init_screen(screen, pscreen);
if (*driver_configs == NULL) {
dri_destroy_screen(screen);
return NULL;

View file

@ -622,11 +622,10 @@ drisw_create_drawable(struct dri_screen *screen, const struct gl_config * visual
return drawable;
}
const __DRIconfig **
struct pipe_screen *
drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{
const __DRIswrastLoaderExtension *loader = screen->swrast_loader;
const __DRIconfig **configs;
struct pipe_screen *pscreen = NULL;
const struct drisw_loader_funcs *lf = &drisw_lf;
@ -636,6 +635,7 @@ drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
if (loader->putImageShm)
lf = &drisw_shm_lf;
}
screen->create_drawable = drisw_create_drawable;
bool success = false;
#ifdef HAVE_DRISW_KMS
@ -648,19 +648,7 @@ drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
if (success)
pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred);
if (!pscreen)
return NULL;
configs = dri_init_screen(screen, pscreen);
if (!configs)
goto fail;
screen->create_drawable = drisw_create_drawable;
return configs;
fail:
pipe_loader_release(&screen->dev, 1);
return NULL;
return pscreen;
}
/* swrast copy sub buffer entrypoint. */

View file

@ -56,10 +56,9 @@ static struct dri_drawable *
kopper_create_drawable(struct dri_screen *screen, const struct gl_config *visual,
bool isPixmap, void *loaderPrivate);
const __DRIconfig **
struct pipe_screen *
kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{
const __DRIconfig **configs;
struct pipe_screen *pscreen = NULL;
if (!screen->kopper_loader) {
@ -70,6 +69,7 @@ kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
}
screen->can_share_buffer = true;
screen->create_drawable = kopper_create_drawable;
bool success;
#ifdef HAVE_LIBDRM
@ -87,19 +87,10 @@ kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
if (!pscreen)
return NULL;
configs = dri_init_screen(screen, pscreen);
if (!configs)
goto fail;
assert(pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY));
screen->is_sw = zink_kopper_is_cpu(pscreen);
screen->create_drawable = kopper_create_drawable;
return configs;
fail:
pipe_loader_release(&screen->dev, 1);
return NULL;
return pscreen;
}
// copypasta alert