[Mesa-dev] [PATCH 6/8] drisw: support fence externsion and image extension

Wu Zhen wuzhen at jidemail.com
Fri Jan 6 17:35:07 UTC 2017


From: WuZhen <wuzhen at jidemail.com>

adds a new type of winsys handle type that allows passing
a pointer sized handle to winsys

Change-Id: I3bf1732619206d2bc50f6aca6b27258bb026a212
Reviewed-by: Mauro Rossi <issor.oruam at gmail.com>
Reviewed-by: Chih-Wei Huang <cwhuang at linux.org.tw>
---
 include/GL/internal/dri_interface.h            | 14 ++++++-
 src/gallium/include/state_tracker/drm_driver.h | 10 ++++-
 src/gallium/state_trackers/dri/dri2.c          | 12 +++---
 src/gallium/state_trackers/dri/drisw.c         | 55 ++++++++++++++++++++++++++
 src/mesa/drivers/dri/common/dri_util.c         |  4 +-
 src/mesa/drivers/dri/common/dri_util.h         |  2 +-
 6 files changed, 85 insertions(+), 12 deletions(-)

diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index 8922356990..a84bef90a0 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -62,6 +62,7 @@ typedef struct __DRIdrawableRec		__DRIdrawable;
 typedef struct __DRIconfigRec		__DRIconfig;
 typedef struct __DRIframebufferRec	__DRIframebuffer;
 typedef struct __DRIversionRec		__DRIversion;
+typedef struct __DRIimageRec        __DRIimage;
 
 typedef struct __DRIcoreExtensionRec		__DRIcoreExtension;
 typedef struct __DRIextensionRec		__DRIextension;
@@ -861,8 +862,9 @@ struct __DRIlegacyExtensionRec {
  * conjunction with the core extension.
  */
 #define __DRI_SWRAST "DRI_SWRast"
-#define __DRI_SWRAST_VERSION 4
+#define __DRI_SWRAST_VERSION 5
 
+struct winsys_handle;
 struct __DRIswrastExtensionRec {
     __DRIextension base;
 
@@ -909,6 +911,15 @@ struct __DRIswrastExtensionRec {
                                     const __DRIconfig ***driver_configs,
                                     void *loaderPrivate);
 
+   /**
+    * create a dri image from native window system handle
+    *
+    * \since version 5
+    */
+   __DRIimage *(*createImageFromWinsys)(__DRIscreen *_screen,
+                                        int width, int height, int format,
+                                        int num_handles, struct winsys_handle *whandle,
+                                        void *loaderPrivate);
 };
 
 /** Common DRI function definitions, shared among DRI2 and Image extensions
@@ -1308,7 +1319,6 @@ enum __DRIChromaSiting {
 #define __BLIT_FLAG_FLUSH		0x0001
 #define __BLIT_FLAG_FINISH		0x0002
 
-typedef struct __DRIimageRec          __DRIimage;
 typedef struct __DRIimageExtensionRec __DRIimageExtension;
 struct __DRIimageExtensionRec {
     __DRIextension base;
diff --git a/src/gallium/include/state_tracker/drm_driver.h b/src/gallium/include/state_tracker/drm_driver.h
index c80fb09dbc..e4d8f17ceb 100644
--- a/src/gallium/include/state_tracker/drm_driver.h
+++ b/src/gallium/include/state_tracker/drm_driver.h
@@ -11,6 +11,7 @@ struct pipe_resource;
 #define DRM_API_HANDLE_TYPE_SHARED 0
 #define DRM_API_HANDLE_TYPE_KMS    1
 #define DRM_API_HANDLE_TYPE_FD     2
+#define DRM_API_HANDLE_TYPE_BUFFER 3
 
 
 /**
@@ -20,7 +21,7 @@ struct winsys_handle
 {
    /**
     * Input for texture_from_handle, valid values are
-    * DRM_API_HANDLE_TYPE_SHARED or DRM_API_HANDLE_TYPE_FD.
+    * DRM_API_HANDLE_TYPE_SHARED or DRM_API_HANDLE_TYPE_FD or DRM_API_HANDLE_TYPE_BUFFER.
     * Input to texture_get_handle,
     * to select handle for kms, flink, or prime.
     */
@@ -30,6 +31,13 @@ struct winsys_handle
     * of a specific layer of an array texture.
     */
    unsigned layer;
+
+   /**
+    * Input to texture_from_handle.
+    * Output for texture_get_handle.
+    */
+   void* external_buffer;
+
    /**
     * Input to texture_from_handle.
     * Output for texture_get_handle.
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index 77523e98ff..b9d7bca711 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -111,7 +111,7 @@ static int convert_fourcc(int format, int *dri_components_p)
  * only needed for exporting dmabuf's, so I think I won't loose much
  * sleep over it.
  */
-static int convert_to_fourcc(int format)
+int convert_to_fourcc(int format)
 {
    switch(format) {
    case __DRI_IMAGE_FORMAT_RGB565:
@@ -765,7 +765,7 @@ dri2_update_tex_buffer(struct dri_drawable *drawable,
    /* no-op */
 }
 
-static __DRIimage *
+__DRIimage *
 dri2_lookup_egl_image(struct dri_screen *screen, void *handle)
 {
    const __DRIimageLookupExtension *loader = screen->sPriv->dri2.image;
@@ -780,7 +780,7 @@ dri2_lookup_egl_image(struct dri_screen *screen, void *handle)
    return img;
 }
 
-static __DRIimage *
+__DRIimage *
 dri2_create_image_from_winsys(__DRIscreen *_screen,
                               int width, int height, int format,
                               int num_handles, struct winsys_handle *whandle,
@@ -1173,7 +1173,7 @@ dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate)
    return img;
 }
 
-static __DRIimage *
+__DRIimage *
 dri2_create_from_texture(__DRIcontext *context, int target, unsigned texture,
                          int depth, int level, unsigned *error,
                          void *loaderPrivate)
@@ -1374,7 +1374,7 @@ dri2_unmap_image(__DRIcontext *context, __DRIimage *image, void *data)
    pipe_transfer_unmap(pipe, (struct pipe_transfer *)data);
 }
 
-static void
+void
 dri2_destroy_image(__DRIimage *img)
 {
    pipe_resource_reference(&img->texture, NULL);
@@ -1600,7 +1600,7 @@ dri2_server_wait_sync(__DRIcontext *_ctx, void *_fence, unsigned flags)
       ctx->fence_server_sync(ctx, fence->pipe_fence);
 }
 
-static __DRI2fenceExtension dri2FenceExtension = {
+__DRI2fenceExtension dri2FenceExtension = {
    .base = { __DRI2_FENCE, 2 },
 
    .create_fence = dri2_create_fence,
diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c
index b85a73c57d..1360765b99 100644
--- a/src/gallium/state_trackers/dri/drisw.c
+++ b/src/gallium/state_trackers/dri/drisw.c
@@ -361,14 +361,66 @@ drisw_update_tex_buffer(struct dri_drawable *drawable,
    pipe_transfer_unmap(pipe, transfer);
 }
 
+extern __DRIimage *dri2_create_from_texture(__DRIcontext *context, int target, unsigned texture,
+                                            int depth, int level, unsigned *error,
+                                            void *loaderPrivate);
+extern __DRIimage *dri2_lookup_egl_image(struct dri_screen *screen, void *handle);
+extern void dri2_destroy_image(__DRIimage *img);
+extern int convert_to_fourcc(int format);
+extern __DRIimage *dri2_create_image_from_winsys(__DRIscreen *_screen,
+                                                 int width, int height, int format,
+                                                 int num_handles, struct winsys_handle *whandle,
+                                                 void *loaderPrivate);
+extern __DRI2fenceExtension dri2FenceExtension;
+
+
+static GLboolean
+drisw_query_image(__DRIimage *image, int attrib, int *value)
+{
+   switch (attrib) {
+   case __DRI_IMAGE_ATTRIB_FORMAT:
+      *value = image->dri_format;
+      return GL_TRUE;
+   case __DRI_IMAGE_ATTRIB_WIDTH:
+      *value = image->texture->width0;
+      return GL_TRUE;
+   case __DRI_IMAGE_ATTRIB_HEIGHT:
+      *value = image->texture->height0;
+      return GL_TRUE;
+   case __DRI_IMAGE_ATTRIB_COMPONENTS:
+      if (image->dri_components == 0)
+         return GL_FALSE;
+      *value = image->dri_components;
+      return GL_TRUE;
+   case __DRI_IMAGE_ATTRIB_NUM_PLANES:
+      *value = 1;
+      return GL_TRUE;
+   case __DRI_IMAGE_ATTRIB_FOURCC:
+      *value = convert_to_fourcc(image->dri_format);
+      return GL_TRUE;
+   default:
+      return GL_FALSE;
+   }
+}
+
 /*
  * Backend function for init_screen.
  */
 
+static const __DRIimageExtension driswImageExtension = {
+    .base = { __DRI_IMAGE, 11 },
+
+    .createImageFromTexture       = dri2_create_from_texture,
+    .destroyImage                 = dri2_destroy_image,
+    .queryImage                   = drisw_query_image,
+};
+
 static const __DRIextension *drisw_screen_extensions[] = {
    &driTexBufferExtension.base,
    &dri2RendererQueryExtension.base,
    &dri2ConfigQueryExtension.base,
+   &driswImageExtension.base,
+   &dri2FenceExtension.base,
    NULL
 };
 
@@ -407,6 +459,9 @@ drisw_init_screen(__DRIscreen * sPriv)
    if (!configs)
       goto fail;
 
+   screen->lookup_egl_image = dri2_lookup_egl_image;
+   driSWRastExtension.createImageFromWinsys = dri2_create_image_from_winsys;
+
    return configs;
 fail:
    dri_destroy_screen_helper(screen);
diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index 209a42ab24..c03744ab9a 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -781,8 +781,8 @@ const __DRIdri2Extension driDRI2Extension = {
     .createNewScreen2           = driCreateNewScreen2,
 };
 
-const __DRIswrastExtension driSWRastExtension = {
-    .base = { __DRI_SWRAST, 4 },
+__DRIswrastExtension driSWRastExtension = {
+    .base = { __DRI_SWRAST, 5 },
 
     .createNewScreen            = driSWRastCreateNewScreen,
     .createNewDrawable          = driCreateNewDrawable,
diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
index 6987f555e6..79148fadb2 100644
--- a/src/mesa/drivers/dri/common/dri_util.h
+++ b/src/mesa/drivers/dri/common/dri_util.h
@@ -63,7 +63,7 @@
  * Extensions.
  */
 extern const __DRIcoreExtension driCoreExtension;
-extern const __DRIswrastExtension driSWRastExtension;
+extern __DRIswrastExtension driSWRastExtension;
 extern const __DRIdri2Extension driDRI2Extension;
 extern const __DRI2configQueryExtension dri2ConfigQueryExtension;
 extern const __DRIcopySubBufferExtension driCopySubBufferExtension;
-- 
2.11.0



More information about the mesa-dev mailing list