gallium/dri: Factor out DRI extension setup code
Share the DRI extension setup code between dri2_init_screen and dri_kms_init_screen. There's currently very little difference, and the sharing will make a subsequent change to refactor this code to use per-screen extension lists easier. Signed-off-by: James Jones <jajones@nvidia.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Eric Anholt <eric@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7175>
This commit is contained in:
@@ -2160,6 +2160,51 @@ static const __DRIextension *dri_robust_screen_extensions[] = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the DRI extension list for this screen based on its underlying
|
||||||
|
* gallium screen's capabilities.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
dri2_init_screen_extensions(struct dri_screen *screen,
|
||||||
|
struct pipe_screen *pscreen,
|
||||||
|
bool is_kms_screen)
|
||||||
|
{
|
||||||
|
if (pscreen->resource_create_with_modifiers)
|
||||||
|
dri2ImageExtension.createImageWithModifiers =
|
||||||
|
dri2_create_image_with_modifiers;
|
||||||
|
|
||||||
|
if (pscreen->get_param(pscreen, PIPE_CAP_DMABUF)) {
|
||||||
|
uint64_t cap;
|
||||||
|
|
||||||
|
if (drmGetCap(screen->sPriv->fd, DRM_CAP_PRIME, &cap) == 0 &&
|
||||||
|
(cap & DRM_PRIME_CAP_IMPORT)) {
|
||||||
|
dri2ImageExtension.createImageFromFds = dri2_from_fds;
|
||||||
|
dri2ImageExtension.createImageFromDmaBufs = dri2_from_dma_bufs;
|
||||||
|
dri2ImageExtension.createImageFromDmaBufs2 = dri2_from_dma_bufs2;
|
||||||
|
dri2ImageExtension.createImageFromDmaBufs3 = dri2_from_dma_bufs3;
|
||||||
|
dri2ImageExtension.queryDmaBufFormats = dri2_query_dma_buf_formats;
|
||||||
|
dri2ImageExtension.queryDmaBufModifiers =
|
||||||
|
dri2_query_dma_buf_modifiers;
|
||||||
|
if (!is_kms_screen) {
|
||||||
|
dri2ImageExtension.queryDmaBufFormatModifierAttribs =
|
||||||
|
dri2_query_dma_buf_format_modifier_attribs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
screen->sPriv->extensions = dri_screen_extensions;
|
||||||
|
|
||||||
|
if (!is_kms_screen) {
|
||||||
|
if (pscreen->set_damage_region)
|
||||||
|
dri2BufferDamageExtension.set_damage_region = dri2_set_damage_region;
|
||||||
|
|
||||||
|
if (pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY)) {
|
||||||
|
screen->sPriv->extensions = dri_robust_screen_extensions;
|
||||||
|
screen->has_reset_status_query = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the driver specific part of the createNewScreen entry point.
|
* This is the driver specific part of the createNewScreen entry point.
|
||||||
*
|
*
|
||||||
@@ -2193,36 +2238,7 @@ dri2_init_screen(__DRIscreen * sPriv)
|
|||||||
|
|
||||||
screen->throttle = pscreen->get_param(pscreen, PIPE_CAP_THROTTLE);
|
screen->throttle = pscreen->get_param(pscreen, PIPE_CAP_THROTTLE);
|
||||||
|
|
||||||
if (pscreen->resource_create_with_modifiers)
|
dri2_init_screen_extensions(screen, pscreen, false);
|
||||||
dri2ImageExtension.createImageWithModifiers =
|
|
||||||
dri2_create_image_with_modifiers;
|
|
||||||
|
|
||||||
if (pscreen->get_param(pscreen, PIPE_CAP_DMABUF)) {
|
|
||||||
uint64_t cap;
|
|
||||||
|
|
||||||
if (drmGetCap(sPriv->fd, DRM_CAP_PRIME, &cap) == 0 &&
|
|
||||||
(cap & DRM_PRIME_CAP_IMPORT)) {
|
|
||||||
dri2ImageExtension.createImageFromFds = dri2_from_fds;
|
|
||||||
dri2ImageExtension.createImageFromDmaBufs = dri2_from_dma_bufs;
|
|
||||||
dri2ImageExtension.createImageFromDmaBufs2 = dri2_from_dma_bufs2;
|
|
||||||
dri2ImageExtension.createImageFromDmaBufs3 = dri2_from_dma_bufs3;
|
|
||||||
dri2ImageExtension.queryDmaBufFormats = dri2_query_dma_buf_formats;
|
|
||||||
dri2ImageExtension.queryDmaBufModifiers =
|
|
||||||
dri2_query_dma_buf_modifiers;
|
|
||||||
dri2ImageExtension.queryDmaBufFormatModifierAttribs =
|
|
||||||
dri2_query_dma_buf_format_modifier_attribs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pscreen->set_damage_region)
|
|
||||||
dri2BufferDamageExtension.set_damage_region = dri2_set_damage_region;
|
|
||||||
|
|
||||||
if (pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY)) {
|
|
||||||
sPriv->extensions = dri_robust_screen_extensions;
|
|
||||||
screen->has_reset_status_query = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sPriv->extensions = dri_screen_extensions;
|
|
||||||
|
|
||||||
configs = dri_init_screen_helper(screen, pscreen);
|
configs = dri_init_screen_helper(screen, pscreen);
|
||||||
if (!configs)
|
if (!configs)
|
||||||
@@ -2258,7 +2274,6 @@ dri_kms_init_screen(__DRIscreen * sPriv)
|
|||||||
const __DRIconfig **configs;
|
const __DRIconfig **configs;
|
||||||
struct dri_screen *screen;
|
struct dri_screen *screen;
|
||||||
struct pipe_screen *pscreen = NULL;
|
struct pipe_screen *pscreen = NULL;
|
||||||
uint64_t cap;
|
|
||||||
|
|
||||||
screen = CALLOC_STRUCT(dri_screen);
|
screen = CALLOC_STRUCT(dri_screen);
|
||||||
if (!screen)
|
if (!screen)
|
||||||
@@ -2277,21 +2292,7 @@ dri_kms_init_screen(__DRIscreen * sPriv)
|
|||||||
if (!pscreen)
|
if (!pscreen)
|
||||||
goto release_pipe;
|
goto release_pipe;
|
||||||
|
|
||||||
if (pscreen->resource_create_with_modifiers)
|
dri2_init_screen_extensions(screen, pscreen, true);
|
||||||
dri2ImageExtension.createImageWithModifiers =
|
|
||||||
dri2_create_image_with_modifiers;
|
|
||||||
|
|
||||||
if (drmGetCap(sPriv->fd, DRM_CAP_PRIME, &cap) == 0 &&
|
|
||||||
(cap & DRM_PRIME_CAP_IMPORT)) {
|
|
||||||
dri2ImageExtension.createImageFromFds = dri2_from_fds;
|
|
||||||
dri2ImageExtension.createImageFromDmaBufs = dri2_from_dma_bufs;
|
|
||||||
dri2ImageExtension.createImageFromDmaBufs2 = dri2_from_dma_bufs2;
|
|
||||||
dri2ImageExtension.createImageFromDmaBufs3 = dri2_from_dma_bufs3;
|
|
||||||
dri2ImageExtension.queryDmaBufFormats = dri2_query_dma_buf_formats;
|
|
||||||
dri2ImageExtension.queryDmaBufModifiers = dri2_query_dma_buf_modifiers;
|
|
||||||
}
|
|
||||||
|
|
||||||
sPriv->extensions = dri_screen_extensions;
|
|
||||||
|
|
||||||
configs = dri_init_screen_helper(screen, pscreen);
|
configs = dri_init_screen_helper(screen, pscreen);
|
||||||
if (!configs)
|
if (!configs)
|
||||||
|
Reference in New Issue
Block a user