static __DRIimage * intel_create_image_from_names(__DRIscreen *screen, int width, int height, int fourcc, int *names, int num_names, int *strides, int *offsets, void *loaderPrivate) { struct intel_image_format *f = NULL; __DRIimage *image; int i, index; if (screen == NULL || names == NULL || num_names != 1) return NULL; f = intel_image_format_lookup(fourcc); if (f == NULL) return NULL; image = intel_create_image_from_name(screen, width, height, __DRI_IMAGE_FORMAT_NONE, names[0], strides[0], loaderPrivate); if (image == NULL) return NULL; image->planar_format = f; for (i = 0; i < f->nplanes; i++) { index = f->planes[i].buffer_index; image->offsets[index] = offsets[index]; image->strides[index] = strides[index]; } return image; }
static __DRIimage * intel_create_image_from_fds(__DRIscreen *screen, int width, int height, int fourcc, int *fds, int num_fds, int *strides, int *offsets, void *loaderPrivate) { struct intel_screen *intelScreen = screen->driverPrivate; struct intel_image_format *f; __DRIimage *image; int i, index; if (fds == NULL || num_fds != 1) return NULL; f = intel_image_format_lookup(fourcc); if (f == NULL) return NULL; if (f->nplanes == 1) image = intel_allocate_image(f->planes[0].dri_format, loaderPrivate); else image = intel_allocate_image(__DRI_IMAGE_FORMAT_NONE, loaderPrivate); 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; for (i = 0; i < f->nplanes; i++) { index = f->planes[i].buffer_index; image->offsets[index] = offsets[index]; image->strides[index] = strides[index]; } if (f->nplanes == 1) { image->offset = image->offsets[0]; intel_image_warn_if_unaligned(image, __func__); } return image; }
static __DRIimage * intel_create_image_from_fds(__DRIscreen *screen, int width, int height, int fourcc, int *fds, int num_fds, int *strides, int *offsets, void *loaderPrivate) { struct intel_screen *intelScreen = screen->driverPrivate; struct intel_image_format *f; __DRIimage *image; int i, index; if (fds == NULL || num_fds != 1) return NULL; f = intel_image_format_lookup(fourcc); if (f == NULL) return NULL; if (f->nplanes == 1) image = intel_allocate_image(f->planes[0].dri_format, loaderPrivate); else image = intel_allocate_image(__DRI_IMAGE_FORMAT_NONE, loaderPrivate); if (image == NULL) return NULL; image->region = intel_region_alloc_for_fd(intelScreen, 1, width, height, strides[0], fds[0], "image"); if (image->region == NULL) { free(image); return NULL; } image->planar_format = f; for (i = 0; i < f->nplanes; i++) { index = f->planes[i].buffer_index; image->offsets[index] = offsets[index]; image->strides[index] = strides[index]; } intel_setup_image_from_dimensions(image); return image; }
static __DRIimage * intel_create_image_from_dma_bufs(__DRIscreen *screen, int width, int height, int fourcc, int *fds, int num_fds, int *strides, int *offsets, enum __DRIYUVColorSpace yuv_color_space, enum __DRISampleRange sample_range, enum __DRIChromaSiting horizontal_siting, enum __DRIChromaSiting vertical_siting, unsigned *error, void *loaderPrivate) { __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) { *error = __DRI_IMAGE_ERROR_BAD_MATCH; return NULL; } image = intel_create_image_from_fds(screen, width, height, fourcc, fds, num_fds, strides, offsets, loaderPrivate); /* * Invalid parameters and any inconsistencies between are assumed to be * checked by the caller. Therefore besides unsupported formats one can fail * only in allocation. */ if (!image) { *error = __DRI_IMAGE_ERROR_BAD_ALLOC; return NULL; } image->dma_buf_imported = true; image->yuv_color_space = yuv_color_space; image->sample_range = sample_range; image->horizontal_siting = horizontal_siting; image->vertical_siting = vertical_siting; *error = __DRI_IMAGE_ERROR_SUCCESS; return image; }