summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2017-10-10 13:58:48 +0200
committerNicolai Hähnle <[email protected]>2017-10-10 13:58:48 +0200
commite14fe41e0bf5d82c0b22eda2f8dcea058ac6e610 (patch)
tree88978c7dc63ba4248b506817266762761cee37d2 /src/gallium/state_trackers
parent4ec2ac11bd277a7eaa7cc506fd88228d05a22cd9 (diff)
st/dri: implement createImageFromRenderbuffer(2)
Tested with dEQP-EGL.functional.image.*renderbuffer* tests. Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r--src/gallium/state_trackers/dri/dri2.c8
-rw-r--r--src/gallium/state_trackers/dri/dri_helpers.c65
-rw-r--r--src/gallium/state_trackers/dri/dri_helpers.h5
3 files changed, 71 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);