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. * 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) dri2_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{ {
const __DRIconfig **configs;
struct pipe_screen *pscreen = NULL; 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->can_share_buffer = true;
screen->auto_fake_front = dri_with_format(screen); screen->auto_fake_front = dri_with_format(screen);
screen->create_drawable = dri2_create_drawable; 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: return pscreen;
pipe_loader_release(&screen->dev, 1);
return NULL;
} }
/** /**
@ -2047,36 +2034,20 @@ fail:
* *
* Returns the struct gl_config supported by this driver. * 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) 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; 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->can_share_buffer = false;
screen->auto_fake_front = dri_with_format(screen); screen->auto_fake_front = dri_with_format(screen);
screen->create_drawable = dri2_create_drawable; 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: return pscreen;
pipe_loader_release(&screen->dev, 1);
#endif // HAVE_SWRAST
return NULL;
} }
int int

View file

@ -215,13 +215,13 @@ dri_release_screen(struct dri_screen * screen);
void void
dri_destroy_screen(struct dri_screen *screen); dri_destroy_screen(struct dri_screen *screen);
const __DRIconfig ** struct pipe_screen *
dri2_init_screen(struct dri_screen *screen, bool driver_name_is_inferred); 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); 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); 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); drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred);
extern const struct __DriverAPIRec dri_swrast_kms_driver_api; 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); (void) mtx_init(&screen->opencl_func_mutex, mtx_plain);
struct pipe_screen *pscreen = NULL;
switch (type) { switch (type) {
case DRI_SCREEN_DRI3: case DRI_SCREEN_DRI3:
*driver_configs = dri2_init_screen(screen, driver_name_is_inferred); pscreen = dri2_init_screen(screen, driver_name_is_inferred);
break; break;
case DRI_SCREEN_KOPPER: case DRI_SCREEN_KOPPER:
*driver_configs = kopper_init_screen(screen, driver_name_is_inferred); pscreen = kopper_init_screen(screen, driver_name_is_inferred);
break; break;
case DRI_SCREEN_SWRAST: case DRI_SCREEN_SWRAST:
*driver_configs = drisw_init_screen(screen, driver_name_is_inferred); pscreen = drisw_init_screen(screen, driver_name_is_inferred);
break; break;
case DRI_SCREEN_KMS_SWRAST: 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; break;
default: default:
unreachable("unknown dri screen type"); 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) { if (*driver_configs == NULL) {
dri_destroy_screen(screen); dri_destroy_screen(screen);
return NULL; return NULL;

View file

@ -622,11 +622,10 @@ drisw_create_drawable(struct dri_screen *screen, const struct gl_config * visual
return drawable; return drawable;
} }
const __DRIconfig ** struct pipe_screen *
drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{ {
const __DRIswrastLoaderExtension *loader = screen->swrast_loader; const __DRIswrastLoaderExtension *loader = screen->swrast_loader;
const __DRIconfig **configs;
struct pipe_screen *pscreen = NULL; struct pipe_screen *pscreen = NULL;
const struct drisw_loader_funcs *lf = &drisw_lf; 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) if (loader->putImageShm)
lf = &drisw_shm_lf; lf = &drisw_shm_lf;
} }
screen->create_drawable = drisw_create_drawable;
bool success = false; bool success = false;
#ifdef HAVE_DRISW_KMS #ifdef HAVE_DRISW_KMS
@ -648,19 +648,7 @@ drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
if (success) if (success)
pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred); pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred);
if (!pscreen) return 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;
} }
/* swrast copy sub buffer entrypoint. */ /* 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, kopper_create_drawable(struct dri_screen *screen, const struct gl_config *visual,
bool isPixmap, void *loaderPrivate); bool isPixmap, void *loaderPrivate);
const __DRIconfig ** struct pipe_screen *
kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{ {
const __DRIconfig **configs;
struct pipe_screen *pscreen = NULL; struct pipe_screen *pscreen = NULL;
if (!screen->kopper_loader) { 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->can_share_buffer = true;
screen->create_drawable = kopper_create_drawable;
bool success; bool success;
#ifdef HAVE_LIBDRM #ifdef HAVE_LIBDRM
@ -87,19 +87,10 @@ kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
if (!pscreen) if (!pscreen)
return NULL; return NULL;
configs = dri_init_screen(screen, pscreen);
if (!configs)
goto fail;
assert(pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY)); assert(pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY));
screen->is_sw = zink_kopper_is_cpu(pscreen); screen->is_sw = zink_kopper_is_cpu(pscreen);
screen->create_drawable = kopper_create_drawable; return pscreen;
return configs;
fail:
pipe_loader_release(&screen->dev, 1);
return NULL;
} }
// copypasta alert // copypasta alert