gallium/dri2: Support images with multiple planes for modifiers

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Acked-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Jordan Justen 2019-06-24 10:39:03 -07:00
parent 6e749a6b2b
commit 2decad495f
No known key found for this signature in database
GPG key ID: 37F99F68CAF992EB
2 changed files with 33 additions and 3 deletions

View file

@ -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;
}

View file

@ -105,6 +105,7 @@ struct __DRIimageRec {
uint32_t dri_fourcc;
uint32_t dri_components;
unsigned use;
unsigned plane;
void *loader_private;