From e14fe41e0bf5d82c0b22eda2f8dcea058ac6e610 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Tue, 10 Oct 2017 13:58:48 +0200 Subject: [PATCH] st/dri: implement createImageFromRenderbuffer(2) Tested with dEQP-EGL.functional.image.*renderbuffer* tests. Reviewed-by: Eric Anholt --- src/gallium/state_trackers/dri/dri2.c | 8 ++- src/gallium/state_trackers/dri/dri_helpers.c | 65 ++++++++++++++++++-- src/gallium/state_trackers/dri/dri_helpers.h | 5 ++ src/mesa/state_tracker/st_cb_fbo.h | 5 ++ 4 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 86721747878..324e357c358 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -1561,7 +1561,7 @@ dri2_get_capabilities(__DRIscreen *_screen) /* The extension is modified during runtime if DRI_PRIME is detected */ static __DRIimageExtension dri2ImageExtension = { - .base = { __DRI_IMAGE, 15 }, + .base = { __DRI_IMAGE, 17 }, .createImageFromName = dri2_create_image_from_name, .createImageFromRenderbuffer = dri2_create_image_from_renderbuffer, @@ -1579,6 +1579,12 @@ static __DRIimageExtension dri2ImageExtension = { .getCapabilities = dri2_get_capabilities, .mapImage = dri2_map_image, .unmapImage = dri2_unmap_image, + .createImageWithModifiers = NULL, + .createImageFromDmaBufs2 = NULL, + .queryDmaBufFormats = NULL, + .queryDmaBufModifiers = NULL, + .queryDmaBufFormatModifierAttribs = NULL, + .createImageFromRenderbuffer2 = dri2_create_image_from_renderbuffer2, }; static const __DRIrobustnessExtension dri2Robustness = { diff --git a/src/gallium/state_trackers/dri/dri_helpers.c b/src/gallium/state_trackers/dri/dri_helpers.c index 07c4086310d..06309d8f0ce 100644 --- a/src/gallium/state_trackers/dri/dri_helpers.c +++ b/src/gallium/state_trackers/dri/dri_helpers.c @@ -25,6 +25,7 @@ #include "pipe/p_screen.h" #include "state_tracker/st_texture.h" #include "state_tracker/st_context.h" +#include "state_tracker/st_cb_fbo.h" #include "main/texobj.h" #include "dri_helpers.h" @@ -246,16 +247,68 @@ dri2_lookup_egl_image(struct dri_screen *screen, void *handle) } __DRIimage * -dri2_create_image_from_renderbuffer(__DRIcontext *context, - int renderbuffer, void *loaderPrivate) +dri2_create_image_from_renderbuffer2(__DRIcontext *context, + int renderbuffer, void *loaderPrivate, + unsigned *error) { - struct dri_context *ctx = dri_context(context); + struct gl_context *ctx = ((struct st_context *)dri_context(context)->st)->ctx; + struct gl_renderbuffer *rb; + struct pipe_resource *tex; + __DRIimage *img; + + /* Section 3.9 (EGLImage Specification and Management) of the EGL 1.5 + * specification says: + * + * "If target is EGL_GL_RENDERBUFFER and buffer is not the name of a + * renderbuffer object, or if buffer is the name of a multisampled + * renderbuffer object, the error EGL_BAD_PARAMETER is generated." + * + * "If target is EGL_GL_TEXTURE_2D , EGL_GL_TEXTURE_CUBE_MAP_*, + * EGL_GL_RENDERBUFFER or EGL_GL_TEXTURE_3D and buffer refers to the + * default GL texture object (0) for the corresponding GL target, the + * error EGL_BAD_PARAMETER is generated." + * (rely on _mesa_lookup_renderbuffer returning NULL in this case) + */ + rb = _mesa_lookup_renderbuffer(ctx, renderbuffer); + if (!rb || rb->NumSamples > 0) { + *error = __DRI_IMAGE_ERROR_BAD_PARAMETER; + return NULL; + } + + tex = st_get_renderbuffer_resource(rb); + if (!tex) { + *error = __DRI_IMAGE_ERROR_BAD_PARAMETER; + return NULL; + } + + img = CALLOC_STRUCT(__DRIimageRec); + if (!img) { + *error = __DRI_IMAGE_ERROR_BAD_ALLOC; + return NULL; + } - if (!ctx->st->get_resource_for_egl_image) + img->dri_format = driGLFormatToImageFormat(rb->Format); + img->loader_private = loaderPrivate; + + if (img->dri_format == __DRI_IMAGE_FORMAT_NONE) { + *error = __DRI_IMAGE_ERROR_BAD_PARAMETER; + free(img); return NULL; + } + + pipe_resource_reference(&img->texture, tex); + + *error = __DRI_IMAGE_ERROR_SUCCESS; + return img; +} - /* TODO */ - return NULL; +__DRIimage * +dri2_create_image_from_renderbuffer(__DRIcontext *context, + int renderbuffer, void *loaderPrivate) +{ + unsigned error; + return dri2_create_image_from_renderbuffer2(context, renderbuffer, + loaderPrivate, &error); } void diff --git a/src/gallium/state_trackers/dri/dri_helpers.h b/src/gallium/state_trackers/dri/dri_helpers.h index 59d903875d3..76f024fd67c 100644 --- a/src/gallium/state_trackers/dri/dri_helpers.h +++ b/src/gallium/state_trackers/dri/dri_helpers.h @@ -35,6 +35,11 @@ __DRIimage * dri2_create_image_from_renderbuffer(__DRIcontext *context, int renderbuffer, void *loaderPrivate); +__DRIimage * +dri2_create_image_from_renderbuffer2(__DRIcontext *context, + int renderbuffer, void *loaderPrivate, + unsigned *error); + void dri2_destroy_image(__DRIimage *img); diff --git a/src/mesa/state_tracker/st_cb_fbo.h b/src/mesa/state_tracker/st_cb_fbo.h index 239bfd95e96..ed68875639d 100644 --- a/src/mesa/state_tracker/st_cb_fbo.h +++ b/src/mesa/state_tracker/st_cb_fbo.h @@ -79,6 +79,11 @@ st_renderbuffer(struct gl_renderbuffer *rb) return (struct st_renderbuffer *) rb; } +static inline struct pipe_resource * +st_get_renderbuffer_resource(struct gl_renderbuffer *rb) +{ + return st_renderbuffer(rb)->texture; +} /** * Cast wrapper to convert a struct gl_framebuffer to an st_framebuffer. -- 2.30.2