intel: restrict dma-buf-import images to external sampling only
authorTopi Pohjolainen <topi.pohjolainen@intel.com>
Tue, 18 Jun 2013 10:47:43 +0000 (13:47 +0300)
committerTopi Pohjolainen <topi.pohjolainen@intel.com>
Fri, 2 Aug 2013 05:56:03 +0000 (08:56 +0300)
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.

v2 (Chad): document using full extension names, fix the comment
           style itself and emit description of error

Signed-off-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
src/mesa/drivers/dri/i965/intel_fbo.c
src/mesa/drivers/dri/i965/intel_regions.h
src/mesa/drivers/dri/i965/intel_screen.c
src/mesa/drivers/dri/i965/intel_tex_image.c

index 059b3eac492d0ded9d55cfb9d35bca81b3752591..45409046c5c4d1d738fb64f253f0a55c95298043 100644 (file)
@@ -268,6 +268,13 @@ intel_image_target_renderbuffer_storage(struct gl_context *ctx,
       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:
index ebb54886ac2c992b238a992f9b2d1454cc88fa1e..f08a113c9368f3d38f221fd936530fa38c25c16a 100644 (file)
@@ -150,7 +150,14 @@ struct __DRIimageRec {
    GLuint tile_y;
    bool has_depthstencil;
 
-   /* Provided by EGL_EXT_image_dma_buf_import */
+   /**
+    * Provided by EGL_EXT_image_dma_buf_import.
+    * 
+    * 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;
index 12a96c03f73e12eef42f5629f63e4d16f037a696..4ee86026574765ef47c2923cbbc57f71824eae03 100644 (file)
@@ -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;
index 4b551b7c5d030dbc7211cb56cc94669d490dda01..178541d89bd0456369e64e7bcfd48f2ae399a3d1 100644 (file)
@@ -368,6 +368,17 @@ intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
    if (image == NULL)
       return;
 
+   /**
+    * Images originating via EGL_EXT_image_dma_buf_import can be used only
+    * with GL_OES_EGL_image_external only.
+    */
+   if (image->dma_buf_imported && target != GL_TEXTURE_EXTERNAL_OES) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+            "glEGLImageTargetTexture2DOES(dma buffers can be used with "
+               "GL_OES_EGL_image_external only");
+      return;
+   }
+
    /* Disallow depth/stencil textures: we don't have a way to pass the
     * separate stencil miptree of a GL_DEPTH_STENCIL texture through.
     */