summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/dri/dri2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/dri/dri2.c')
-rw-r--r--src/gallium/state_trackers/dri/dri2.c35
1 files changed, 32 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;
}