[Mesa-dev] [PATCH 5/5] egl: differentiate external vs non-external eglImages

Rob Clark robdclark at gmail.com
Sun Sep 21 10:46:30 PDT 2014


From: Rob Clark <robclark at freedesktop.org>

External images do not need to be render targets.

Signed-off-by: Rob Clark <robclark at freedesktop.org>
---
We would need this if we manage to teach gallium about external egl
images.  I may instead cop-out and just use vl_compositor to blit
imported YUV buffers into an RGB texture.  All the same, this seems
more correct.

 src/gallium/state_trackers/dri/dri2.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index decba94..ce7c077 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -689,7 +689,8 @@ dri2_lookup_egl_image(struct dri_screen *screen, void *handle)
 static __DRIimage *
 dri2_create_image_from_winsys(__DRIscreen *_screen,
                               int width, int height, int format,
-                              struct winsys_handle *whandle, int pitch,
+                              struct winsys_handle *whandle,
+                              int pitch, GLboolean external,
                               void *loaderPrivate)
 {
    struct dri_screen *screen = dri_screen(_screen);
@@ -698,7 +699,9 @@ dri2_create_image_from_winsys(__DRIscreen *_screen,
    unsigned tex_usage;
    enum pipe_format pf;
 
-   tex_usage = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
+   tex_usage = PIPE_BIND_SAMPLER_VIEW;
+   if (external == GL_FALSE)
+      tex_usage |= PIPE_BIND_RENDER_TARGET;
 
    switch (format) {
    case __DRI_IMAGE_FORMAT_RGB565:
@@ -763,7 +766,8 @@ dri2_create_image_from_name(__DRIscreen *_screen,
    whandle.handle = name;
 
    return dri2_create_image_from_winsys(_screen, width, height, format,
-                                        &whandle, pitch, loaderPrivate);
+                                        &whandle, pitch, GL_FALSE,
+                                        loaderPrivate);
 }
 
 static __DRIimage *
@@ -771,7 +775,8 @@ dri2_create_image_from_fd(__DRIscreen *_screen,
                           int width, int height, int fourcc,
                           int *fds, int num_fds, int *strides,
                           int *offsets, unsigned *error,
-                          int *dri_components, void *loaderPrivate)
+                          int *dri_components, GLboolean external,
+                          void *loaderPrivate)
 {
    static __DRIimage *img;
    struct winsys_handle whandle;
@@ -801,7 +806,8 @@ dri2_create_image_from_fd(__DRIscreen *_screen,
    whandle.offset = offsets[0];
 
    img = dri2_create_image_from_winsys(_screen, width, height, format,
-                                       &whandle, pitch, loaderPrivate);
+                                       &whandle, pitch, external,
+                                       loaderPrivate);
    if (img == NULL)
       *error = __DRI_IMAGE_ERROR_BAD_ALLOC;
 
@@ -1105,7 +1111,8 @@ dri2_from_fds(__DRIscreen *screen, int width, int height, int fourcc,
 
    img = dri2_create_image_from_fd(screen, width, height, fourcc,
                                    fds, num_fds, strides, offsets,
-                                   &error, &dri_components, loaderPrivate);
+                                   &error, &dri_components, GL_FALSE,
+                                   loaderPrivate);
    if (img == NULL)
       return NULL;
 
@@ -1130,7 +1137,8 @@ dri2_from_dma_bufs(__DRIscreen *screen,
 
    img = dri2_create_image_from_fd(screen, width, height, fourcc,
                                    fds, num_fds, strides, offsets,
-                                   error, &dri_components, loaderPrivate);
+                                   error, &dri_components, GL_TRUE,
+                                   loaderPrivate);
    if (img == NULL)
       return NULL;
 
-- 
1.9.3



More information about the mesa-dev mailing list