mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 22:30:12 +01:00
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:
parent
af6d3fdf6e
commit
764e17eb03
5 changed files with 32 additions and 76 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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. */
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue