Memory originating outside mesa stack is meant to be for reading
only. In addition, the restrictions imposed by the image external
extension should apply. For example, users shouldn't be allowed
to generare mip-trees based on these images.

Signed-off-by: Topi Pohjolainen <topi.pohjolai...@intel.com>
---
 src/mesa/drivers/dri/i965/intel_fbo.c       | 7 +++++++
 src/mesa/drivers/dri/i965/intel_regions.h   | 8 +++++++-
 src/mesa/drivers/dri/i965/intel_screen.c    | 1 +
 src/mesa/drivers/dri/i965/intel_tex_image.c | 9 +++++++++
 4 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/mesa/drivers/dri/i965/intel_fbo.c 
b/src/mesa/drivers/dri/i965/intel_fbo.c
index 25024fb..15f6130 100644
--- a/src/mesa/drivers/dri/i965/intel_fbo.c
+++ b/src/mesa/drivers/dri/i965/intel_fbo.c
@@ -265,6 +265,13 @@ intel_image_target_renderbuffer_storage(struct gl_context 
*ctx,
    if (image->planar_format && image->planar_format->nplanes > 1)
       return;
 
+   /* Buffers originating from outside are for read-only. */
+   if (image->dma_buf_imported) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+            "glEGLImageTargetRenderbufferStorage(dma buffers are read-only)");
+      return;
+   }
+
    /* __DRIimage is opaque to the core so it has to be checked here */
    switch (image->format) {
    case MESA_FORMAT_RGBA8888_REV:
diff --git a/src/mesa/drivers/dri/i965/intel_regions.h 
b/src/mesa/drivers/dri/i965/intel_regions.h
index 385d4b2..13e9e80 100644
--- a/src/mesa/drivers/dri/i965/intel_regions.h
+++ b/src/mesa/drivers/dri/i965/intel_regions.h
@@ -150,7 +150,13 @@ struct __DRIimageRec {
    GLuint tile_y;
    bool has_depthstencil;
 
-   /* Provided by dma_buf import extension */
+   /*
+    * Provided by dma_buf import extension. The flag is set in order to
+    * restrict the use of the image later on.
+    *
+    * See intel_image_target_texture_2d()
+    */
+   bool dma_buf_imported;
    enum __DRIYUVColorSpace yuv_color_space;
    enum __DRISampleRange sample_range;
    enum __DRIChromaSiting horizontal_siting;
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c 
b/src/mesa/drivers/dri/i965/intel_screen.c
index 2cec04f..ceeae3f 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -719,6 +719,7 @@ intel_create_image_from_dma_bufs(__DRIscreen *screen,
       return NULL;
    }
 
+   image->dma_buf_imported = true;
    image->yuv_color_space = yuv_color_space;
    image->sample_range = sample_range;
    image->horizontal_siting = horizontal_siting;
diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c 
b/src/mesa/drivers/dri/i965/intel_tex_image.c
index 9c5d234..c2912b6 100644
--- a/src/mesa/drivers/dri/i965/intel_tex_image.c
+++ b/src/mesa/drivers/dri/i965/intel_tex_image.c
@@ -367,6 +367,15 @@ intel_image_target_texture_2d(struct gl_context *ctx, 
GLenum target,
    if (image == NULL)
       return;
 
+   /*
+    * Images originating via the dma-buffer-import extension can be used only
+    * with the image-external extension.
+    */
+   if (image->dma_buf_imported && target != GL_TEXTURE_EXTERNAL_OES) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, __func__);
+      return;
+   }
+
    /* Disallow depth/stencil textures: we don't have a way to pass the
     * separate stencil miptree of a GL_DEPTH_STENCIL texture through.
     */
-- 
1.8.1.2

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to