From: Ander Conselvan de Oliveira <ander.conselvan.de.olive...@intel.com>
The native handle is a pointer to drm_intel_bo for the i965 driver. --- include/GL/internal/dri_interface.h | 13 +++++++- src/mesa/drivers/dri/i965/intel_regions.c | 50 ++++++++++++++++++------------- src/mesa/drivers/dri/i965/intel_regions.h | 6 ++++ src/mesa/drivers/dri/i965/intel_screen.c | 37 +++++++++++++++++++++-- 4 files changed, 82 insertions(+), 24 deletions(-) diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index 6c2312a..552dd2a 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -1005,7 +1005,7 @@ struct __DRIdri2ExtensionRec { * extensions. */ #define __DRI_IMAGE "DRI_IMAGE" -#define __DRI_IMAGE_VERSION 8 +#define __DRI_IMAGE_VERSION 9 /** * These formats correspond to the similarly named MESA_FORMAT_* @@ -1239,6 +1239,17 @@ struct __DRIimageExtensionRec { enum __DRIChromaSiting vert_siting, unsigned *error, void *loaderPrivate); + /** + * Create image from a driver-dependent handle. Depends on the shared + * bufmgr extension. + * + * \since 9 ? + */ + __DRIimage *(*createImageFromHandle)(__DRIscreen *screen, + int width, int height, int format, + void *handle, int pitch, + void *loaderPrivate); + }; diff --git a/src/mesa/drivers/dri/i965/intel_regions.c b/src/mesa/drivers/dri/i965/intel_regions.c index d891e09..745bfe6 100644 --- a/src/mesa/drivers/dri/i965/intel_regions.c +++ b/src/mesa/drivers/dri/i965/intel_regions.c @@ -172,30 +172,47 @@ intel_region_flink(struct intel_region *region, uint32_t *name) } struct intel_region * -intel_region_alloc_for_handle(struct intel_screen *screen, +intel_region_alloc_for_buffer(struct intel_screen *screen, GLuint cpp, GLuint width, GLuint height, GLuint pitch, - GLuint handle, const char *name) + drm_intel_bo *buffer, const char *name) { struct intel_region *region; - drm_intel_bo *buffer; int ret; uint32_t bit_6_swizzle, tiling; - buffer = intel_bo_gem_create_from_name(screen->bufmgr, name, handle); - if (buffer == NULL) - return NULL; ret = drm_intel_bo_get_tiling(buffer, &tiling, &bit_6_swizzle); if (ret != 0) { - fprintf(stderr, "Couldn't get tiling of buffer %d (%s): %s\n", - handle, name, strerror(-ret)); - drm_intel_bo_unreference(buffer); + fprintf(stderr, "Couldn't get tiling of buffer (%s): %s\n", + name, strerror(-ret)); return NULL; } region = intel_region_alloc_internal(screen, cpp, width, height, pitch, tiling, buffer); - if (region == NULL) { + if (region == NULL) + return NULL; + + return region; +} + +struct intel_region * +intel_region_alloc_for_handle(struct intel_screen *screen, + GLuint cpp, + GLuint width, GLuint height, GLuint pitch, + GLuint handle, const char *name) +{ + struct intel_region *region; + drm_intel_bo *buffer; + + buffer = intel_bo_gem_create_from_name(screen->bufmgr, name, handle); + if (buffer == NULL) + return NULL; + + region = intel_region_alloc_for_buffer(screen, cpp, width, height, pitch, + buffer, name); + + if (!region) { drm_intel_bo_unreference(buffer); return NULL; } @@ -214,22 +231,13 @@ intel_region_alloc_for_fd(struct intel_screen *screen, { struct intel_region *region; drm_intel_bo *buffer; - int ret; - uint32_t bit_6_swizzle, tiling; buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr, fd, size); if (buffer == NULL) return NULL; - ret = drm_intel_bo_get_tiling(buffer, &tiling, &bit_6_swizzle); - if (ret != 0) { - fprintf(stderr, "Couldn't get tiling of buffer (%s): %s\n", - name, strerror(-ret)); - drm_intel_bo_unreference(buffer); - return NULL; - } - region = intel_region_alloc_internal(screen, cpp, - width, height, pitch, tiling, buffer); + region = intel_region_alloc_for_buffer(screen, cpp, width, height, pitch, + buffer, name); if (region == NULL) { drm_intel_bo_unreference(buffer); return NULL; diff --git a/src/mesa/drivers/dri/i965/intel_regions.h b/src/mesa/drivers/dri/i965/intel_regions.h index eb2123e..a35eae8 100644 --- a/src/mesa/drivers/dri/i965/intel_regions.h +++ b/src/mesa/drivers/dri/i965/intel_regions.h @@ -83,6 +83,12 @@ struct intel_region *intel_region_alloc(struct intel_screen *screen, bool expect_accelerated_upload); struct intel_region * +intel_region_alloc_for_buffer(struct intel_screen *screen, + GLuint cpp, + GLuint width, GLuint height, GLuint pitch, + drm_intel_bo *buffer, const char *name); + +struct intel_region * intel_region_alloc_for_handle(struct intel_screen *screen, GLuint cpp, GLuint width, GLuint height, GLuint pitch, diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index cbbef8f..5be81d8 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -786,8 +786,40 @@ intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate) return image; } +static __DRIimage * +intel_create_image_from_handle(__DRIscreen *screen, + int width, int height, int format, + void *handle, int pitch, void *loaderPrivate) +{ + struct intel_screen *intelScreen = screen->driverPrivate; + __DRIimage *image; + int cpp; + + image = intel_allocate_image(format, loaderPrivate); + if (image == NULL) + return NULL; + + if (image->format == MESA_FORMAT_NONE) + cpp = 1; + else + cpp = _mesa_get_format_bytes(image->format); + image->region = intel_region_alloc_for_buffer(intelScreen, + cpp, width, height, + pitch * cpp, handle, "image"); + if (image->region == NULL) { + free(image); + return NULL; + } + + drm_intel_bo_reference(handle); + + intel_setup_image_from_dimensions(image); + + return image; +} + static struct __DRIimageExtensionRec intelImageExtension = { - .base = { __DRI_IMAGE, 8 }, + .base = { __DRI_IMAGE, 9 }, .createImageFromName = intel_create_image_from_name, .createImageFromRenderbuffer = intel_create_image_from_renderbuffer, @@ -800,7 +832,8 @@ static struct __DRIimageExtensionRec intelImageExtension = { .fromPlanar = intel_from_planar, .createImageFromTexture = intel_create_image_from_texture, .createImageFromFds = intel_create_image_from_fds, - .createImageFromDmaBufs = intel_create_image_from_dma_bufs + .createImageFromDmaBufs = intel_create_image_from_dma_bufs, + .createImageFromHandle = intel_create_image_from_handle }; static int -- 1.8.3.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev