diff options
author | Kristian Høgsberg Kristensen <[email protected]> | 2016-05-01 21:25:35 -0700 |
---|---|---|
committer | Kristian Høgsberg Kristensen <[email protected]> | 2016-05-24 10:14:57 -0700 |
commit | 1be1114e6b977ef70cc8bba9485adbaace4ecde4 (patch) | |
tree | 372aa80c3192df0f16d9cb4f227e7f8d4439a95b | |
parent | 654e950cba55dabd2d9accb60db8e5f4c1495716 (diff) |
i965: Allow creating planar YUV __DRIimages
Lift the resctriction we had before and allow creation of images with
multiple planes. We still require all the planes to be within the same
bo.
Reviewed-by: Jordan Justen <[email protected]>
Reviewed-by: Chad Versace <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_screen.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index 076fa24cd6f..2a6d9d8387c 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -676,9 +676,14 @@ intel_create_image_from_fds(__DRIscreen *screen, __DRIimage *image; int i, index; - if (fds == NULL || num_fds != 1) + if (fds == NULL || num_fds < 1) return NULL; + /* We only support all planes from the same bo */ + for (i = 0; i < num_fds; i++) + if (fds[0] != fds[i]) + return NULL; + f = intel_image_format_lookup(fourcc); if (f == NULL) return NULL; @@ -691,22 +696,28 @@ intel_create_image_from_fds(__DRIscreen *screen, if (image == NULL) return NULL; - image->bo = drm_intel_bo_gem_create_from_prime(intelScreen->bufmgr, - fds[0], - height * strides[0]); - if (image->bo == NULL) { - free(image); - return NULL; - } image->width = width; image->height = height; image->pitch = strides[0]; image->planar_format = f; + int size = 0; for (i = 0; i < f->nplanes; i++) { index = f->planes[i].buffer_index; image->offsets[index] = offsets[index]; image->strides[index] = strides[index]; + + const int height = height >> f->planes[i].height_shift; + const int end = offsets[index] + height * strides[index]; + if (size < end) + size = end; + } + + image->bo = drm_intel_bo_gem_create_from_prime(intelScreen->bufmgr, + fds[0], size); + if (image->bo == NULL) { + free(image); + return NULL; } if (f->nplanes == 1) { @@ -732,8 +743,7 @@ intel_create_image_from_dma_bufs(__DRIscreen *screen, __DRIimage *image; struct intel_image_format *f = intel_image_format_lookup(fourcc); - /* For now only packed formats that have native sampling are supported. */ - if (!f || f->nplanes != 1) { + if (!f) { *error = __DRI_IMAGE_ERROR_BAD_MATCH; return NULL; } |