diff options
author | Jordan Justen <[email protected]> | 2019-06-24 10:39:03 -0700 |
---|---|---|
committer | Jordan Justen <[email protected]> | 2019-08-13 01:12:29 -0700 |
commit | 2decad495f36c0d9c952e47ff672c14a0dab8df1 (patch) | |
tree | bcb6125488d78caf0d3f79499557f8183ad50a6d /src/gallium/state_trackers | |
parent | 6e749a6b2b9c45829963553cedda64b4a73afe14 (diff) |
gallium/dri2: Support images with multiple planes for modifiers
Signed-off-by: Jordan Justen <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Acked-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/dri/dri2.c | 35 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_screen.h | 1 |
2 files changed, 33 insertions, 3 deletions
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index ac842ddf756..4b4ab3196c2 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -907,6 +907,7 @@ dri2_create_image_from_fd(__DRIscreen *_screen, whandles[i].stride = (unsigned)strides[index]; whandles[i].offset = (unsigned)offsets[index]; whandles[i].modifier = modifier; + whandles[i].plane = i; } img = dri2_create_image_from_winsys(_screen, width, height, map, @@ -1063,6 +1064,7 @@ dri2_query_image_by_resource_handle(__DRIimage *image, int attrib, int *value) struct winsys_handle whandle; unsigned usage; memset(&whandle, 0, sizeof(whandle)); + whandle.plane = image->plane; switch (attrib) { case __DRI_IMAGE_ATTRIB_STRIDE: @@ -1124,6 +1126,18 @@ dri2_query_image_by_resource_handle(__DRIimage *image, int attrib, int *value) } } +static bool +dri2_resource_get_param(__DRIimage *image, enum pipe_resource_param param, + uint64_t *value) +{ + struct pipe_screen *pscreen = image->texture->screen; + if (!pscreen->resource_get_param) + return false; + + return pscreen->resource_get_param(pscreen, image->texture, image->plane, + param, value); +} + static GLboolean dri2_query_image(__DRIimage *image, int attrib, int *value) { @@ -1223,11 +1237,25 @@ dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate) { __DRIimage *img; - if (plane != 0) + if (plane < 0) { return NULL; + } else if (plane > 0) { + uint64_t planes; + if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_NPLANES, + &planes) || + plane >= planes) { + return NULL; + } + } - if (image->dri_components == 0) - return NULL; + if (image->dri_components == 0) { + uint64_t modifier; + if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_MODIFIER, + &modifier) || + modifier == DRM_FORMAT_MOD_INVALID) { + return NULL; + } + } img = dri2_dup_image(image, loaderPrivate); if (img == NULL) @@ -1239,6 +1267,7 @@ dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate) /* set this to 0 for sub images. */ img->dri_components = 0; + img->plane = plane; return img; } diff --git a/src/gallium/state_trackers/dri/dri_screen.h b/src/gallium/state_trackers/dri/dri_screen.h index 85372cb97c8..f16715dee56 100644 --- a/src/gallium/state_trackers/dri/dri_screen.h +++ b/src/gallium/state_trackers/dri/dri_screen.h @@ -105,6 +105,7 @@ struct __DRIimageRec { uint32_t dri_fourcc; uint32_t dri_components; unsigned use; + unsigned plane; void *loader_private; |