[Mesa-dev] [PATCH 1/7] gallium: Refactor out vl_put_screen and vl_get_screen

Gurkirpal Singh gurkirpal204 at gmail.com
Wed Nov 29 04:02:10 UTC 2017


---
 src/gallium/auxiliary/Makefile.sources             |   2 +
 src/gallium/auxiliary/vl/vl_screen.c               | 107 +++++++++++++++++++++
 src/gallium/auxiliary/vl/vl_screen.h               |  33 +++++++
 .../state_trackers/omx_bellagio/entrypoint.c       |  83 ----------------
 .../state_trackers/omx_bellagio/entrypoint.h       |   3 -
 src/gallium/state_trackers/omx_bellagio/vid_dec.c  |   5 +-
 src/gallium/state_trackers/omx_bellagio/vid_enc.c  |   5 +-
 7 files changed, 148 insertions(+), 90 deletions(-)
 create mode 100644 src/gallium/auxiliary/vl/vl_screen.c
 create mode 100644 src/gallium/auxiliary/vl/vl_screen.h

diff --git a/src/gallium/auxiliary/Makefile.sources b/src/gallium/auxiliary/Makefile.sources
index f40c472..35e89f9 100644
--- a/src/gallium/auxiliary/Makefile.sources
+++ b/src/gallium/auxiliary/Makefile.sources
@@ -343,6 +343,8 @@ VL_SOURCES := \
 	vl/vl_mpeg12_decoder.c \
 	vl/vl_mpeg12_decoder.h \
 	vl/vl_rbsp.h \
+	vl/vl_screen.c \
+	vl/vl_screen.h \
 	vl/vl_types.h \
 	vl/vl_vertex_buffers.c \
 	vl/vl_vertex_buffers.h \
diff --git a/src/gallium/auxiliary/vl/vl_screen.c b/src/gallium/auxiliary/vl/vl_screen.c
new file mode 100644
index 0000000..7192802
--- /dev/null
+++ b/src/gallium/auxiliary/vl/vl_screen.c
@@ -0,0 +1,107 @@
+/**************************************************************************
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+#include <assert.h>
+#include <string.h>
+#include <stdbool.h>
+
+#include "os/os_thread.h"
+#include "util/u_memory.h"
+#include "loader/loader.h"
+#include "vl_screen.h"
+
+#if defined(HAVE_X11_PLATFORM)
+#include <X11/Xlib.h>
+#else
+#define XOpenDisplay(x) NULL
+#define XCloseDisplay(x)
+#define Display void
+#endif
+
+static mtx_t st_lock = _MTX_INITIALIZER_NP;
+static Display *st_display = NULL;
+static struct vl_screen *st_screen = NULL;
+static unsigned st_usecount = 0;
+static const char *st_render_node = NULL;
+static int drm_fd;
+
+struct vl_screen *vl_get_screen(const char* render_node)
+{
+   static bool first_time = true;
+   mtx_lock(&st_lock);
+
+   if (!st_screen) {
+      if (first_time) {
+         st_render_node = debug_get_option(render_node, NULL);
+         first_time = false;
+      }
+      if (st_render_node) {
+         drm_fd = loader_open_device(st_render_node);
+         if (drm_fd < 0)
+            goto error;
+
+         st_screen = vl_drm_screen_create(drm_fd);
+         if (!st_screen) {
+            close(drm_fd);
+            goto error;
+         }
+      } else {
+         st_display = XOpenDisplay(NULL);
+         if (!st_display)
+            goto error;
+
+         st_screen = vl_dri3_screen_create(st_display, 0);
+         if (!st_screen)
+            st_screen = vl_dri2_screen_create(st_display, 0);
+         if (!st_screen) {
+            XCloseDisplay(st_display);
+            goto error;
+         }
+      }
+   }
+
+   ++st_usecount;
+
+   mtx_unlock(&st_lock);
+   return st_screen;
+
+error:
+   mtx_unlock(&st_lock);
+   return NULL;
+}
+
+void vl_put_screen(void)
+{
+   mtx_lock(&st_lock);
+   if ((--st_usecount) == 0) {
+      st_screen->destroy(st_screen);
+      st_screen = NULL;
+
+      if (st_render_node)
+         close(drm_fd);
+      else
+         XCloseDisplay(st_display);
+   }
+   mtx_unlock(&st_lock);
+}
diff --git a/src/gallium/auxiliary/vl/vl_screen.h b/src/gallium/auxiliary/vl/vl_screen.h
new file mode 100644
index 0000000..1e14775
--- /dev/null
+++ b/src/gallium/auxiliary/vl/vl_screen.h
@@ -0,0 +1,33 @@
+/**************************************************************************
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+#ifndef VL_VL_SCREEN_H
+#define VL_VL_SCREEN_H
+
+#include "vl_winsys.h"
+
+struct vl_screen *vl_get_screen(const char* render_node);
+void vl_put_screen(void);
+
+#endif
diff --git a/src/gallium/state_trackers/omx_bellagio/entrypoint.c b/src/gallium/state_trackers/omx_bellagio/entrypoint.c
index 251cc7d..5c75e8d 100644
--- a/src/gallium/state_trackers/omx_bellagio/entrypoint.c
+++ b/src/gallium/state_trackers/omx_bellagio/entrypoint.c
@@ -31,33 +31,10 @@
  *
  */
 
-#include <assert.h>
-#include <string.h>
-#include <stdbool.h>
-
-#if defined(HAVE_X11_PLATFORM)
-#include <X11/Xlib.h>
-#else
-#define XOpenDisplay(x) NULL
-#define XCloseDisplay(x)
-#define Display void
-#endif
-
-#include "os/os_thread.h"
-#include "util/u_memory.h"
-#include "loader/loader.h"
-
 #include "entrypoint.h"
 #include "vid_dec.h"
 #include "vid_enc.h"
 
-static mtx_t omx_lock = _MTX_INITIALIZER_NP;
-static Display *omx_display = NULL;
-static struct vl_screen *omx_screen = NULL;
-static unsigned omx_usecount = 0;
-static const char *omx_render_node = NULL;
-static int drm_fd;
-
 int omx_component_library_Setup(stLoaderComponentType **stComponents)
 {
    OMX_ERRORTYPE r;
@@ -78,66 +55,6 @@ int omx_component_library_Setup(stLoaderComponentType **stComponents)
    return 2;
 }
 
-struct vl_screen *omx_get_screen(void)
-{
-   static bool first_time = true;
-   mtx_lock(&omx_lock);
-
-   if (!omx_screen) {
-      if (first_time) {
-         omx_render_node = debug_get_option("OMX_RENDER_NODE", NULL);
-         first_time = false;
-      }
-      if (omx_render_node) {
-         drm_fd = loader_open_device(omx_render_node);
-         if (drm_fd < 0)
-            goto error;
-
-         omx_screen = vl_drm_screen_create(drm_fd);
-         if (!omx_screen) {
-            close(drm_fd);
-            goto error;
-         }
-      } else {
-         omx_display = XOpenDisplay(NULL);
-         if (!omx_display)
-            goto error;
-
-         omx_screen = vl_dri3_screen_create(omx_display, 0);
-         if (!omx_screen)
-            omx_screen = vl_dri2_screen_create(omx_display, 0);
-         if (!omx_screen) {
-            XCloseDisplay(omx_display);
-            goto error;
-         }
-      }
-   }
-
-   ++omx_usecount;
-
-   mtx_unlock(&omx_lock);
-   return omx_screen;
-
-error:
-   mtx_unlock(&omx_lock);
-   return NULL;
-}
-
-void omx_put_screen(void)
-{
-   mtx_lock(&omx_lock);
-   if ((--omx_usecount) == 0) {
-      omx_screen->destroy(omx_screen);
-      omx_screen = NULL;
-
-      if (omx_render_node)
-         close(drm_fd);
-      else
-         XCloseDisplay(omx_display);
-   }
-   mtx_unlock(&omx_lock);
-}
-
 OMX_ERRORTYPE omx_workaround_Destructor(OMX_COMPONENTTYPE *comp)
 {
    omx_base_component_PrivateType* priv = (omx_base_component_PrivateType*)comp->pComponentPrivate;
diff --git a/src/gallium/state_trackers/omx_bellagio/entrypoint.h b/src/gallium/state_trackers/omx_bellagio/entrypoint.h
index 7625d7a..d566d1e 100644
--- a/src/gallium/state_trackers/omx_bellagio/entrypoint.h
+++ b/src/gallium/state_trackers/omx_bellagio/entrypoint.h
@@ -40,9 +40,6 @@
 
 PUBLIC extern int omx_component_library_Setup(stLoaderComponentType **stComponents);
 
-struct vl_screen *omx_get_screen(void);
-void omx_put_screen(void);
-
 OMX_ERRORTYPE omx_workaround_Destructor(OMX_COMPONENTTYPE *comp);
 
 #endif
diff --git a/src/gallium/state_trackers/omx_bellagio/vid_dec.c b/src/gallium/state_trackers/omx_bellagio/vid_dec.c
index f9fe19f..b62c705 100644
--- a/src/gallium/state_trackers/omx_bellagio/vid_dec.c
+++ b/src/gallium/state_trackers/omx_bellagio/vid_dec.c
@@ -50,6 +50,7 @@
 #include "util/u_surface.h"
 #include "vl/vl_video_buffer.h"
 #include "vl/vl_vlc.h"
+#include "vl/vl_screen.h"
 
 #include "entrypoint.h"
 #include "vid_dec.h"
@@ -173,7 +174,7 @@ static OMX_ERRORTYPE vid_dec_Constructor(OMX_COMPONENTTYPE *comp, OMX_STRING nam
    comp->SetParameter = vid_dec_SetParameter;
    comp->GetParameter = vid_dec_GetParameter;
 
-   priv->screen = omx_get_screen();
+   priv->screen = vl_get_screen("OMX_RENDER_NODE");
    if (!priv->screen)
       return OMX_ErrorInsufficientResources;
 
@@ -253,7 +254,7 @@ static OMX_ERRORTYPE vid_dec_Destructor(OMX_COMPONENTTYPE *comp)
    }
 
    if (priv->screen)
-      omx_put_screen();
+      vl_put_screen();
 
    return omx_workaround_Destructor(comp);
 }
diff --git a/src/gallium/state_trackers/omx_bellagio/vid_enc.c b/src/gallium/state_trackers/omx_bellagio/vid_enc.c
index 1a4fb62..40e7a0f 100644
--- a/src/gallium/state_trackers/omx_bellagio/vid_enc.c
+++ b/src/gallium/state_trackers/omx_bellagio/vid_enc.c
@@ -50,6 +50,7 @@
 #include "pipe/p_video_codec.h"
 #include "util/u_memory.h"
 #include "vl/vl_video_buffer.h"
+#include "vl/vl_screen.h"
 
 #include "entrypoint.h"
 #include "vid_enc.h"
@@ -170,7 +171,7 @@ static OMX_ERRORTYPE vid_enc_Constructor(OMX_COMPONENTTYPE *comp, OMX_STRING nam
    comp->GetConfig = vid_enc_GetConfig;
    comp->SetConfig = vid_enc_SetConfig;
 
-   priv->screen = omx_get_screen();
+   priv->screen = vl_get_screen("OMX_RENDER_NODE");
    if (!priv->screen)
       return OMX_ErrorInsufficientResources;
 
@@ -296,7 +297,7 @@ static OMX_ERRORTYPE vid_enc_Destructor(OMX_COMPONENTTYPE *comp)
       priv->t_pipe->destroy(priv->t_pipe);
 
    if (priv->screen)
-      omx_put_screen();
+      vl_put_screen();
 
    return omx_workaround_Destructor(comp);
 }
-- 
2.7.4



More information about the mesa-dev mailing list