summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/omx
diff options
context:
space:
mode:
authorEmil Velikov <[email protected]>2015-11-09 11:03:01 +0000
committerEmil Velikov <[email protected]>2015-11-20 10:56:10 +0000
commita8f45e0161c13fbda6f3b846219a3eb1d44b25de (patch)
tree7d73dea08f1eb3181551687d975c808d865890e9 /src/gallium/state_trackers/omx
parent7157085140a502a182ff0e23d30bd8e421212c42 (diff)
st/omx: straighten get/put_screen
The current code is busted in a number of ways. - initially checks for omx_display (rather than omx_screen), which may or may not be around. - blindly feeds the empty env variable string to loader_open_device() - reads the env variable every time get_screen is called - the latter manifests into memory leaks, and other issues as one sets the variable between two get_screen calls. Additionally it cleans up a couple of extra bits - drops unneeded set/check of omx_display. - make the teardown (put_screen) order was not symmetrical to the setup (get_screen) v2: Drop the "is empty string" check (Leo) Signed-off-by: Emil Velikov <[email protected]> Reviewed-by: Leo Liu <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers/omx')
-rw-r--r--src/gallium/state_trackers/omx/entrypoint.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/src/gallium/state_trackers/omx/entrypoint.c b/src/gallium/state_trackers/omx/entrypoint.c
index 7df90b16a84..4716333015b 100644
--- a/src/gallium/state_trackers/omx/entrypoint.c
+++ b/src/gallium/state_trackers/omx/entrypoint.c
@@ -33,6 +33,7 @@
#include <assert.h>
#include <string.h>
+#include <stdbool.h>
#include <X11/Xlib.h>
@@ -73,28 +74,29 @@ int omx_component_library_Setup(stLoaderComponentType **stComponents)
struct vl_screen *omx_get_screen(void)
{
+ static bool first_time = true;
pipe_mutex_lock(omx_lock);
- if (!omx_display) {
- omx_render_node = debug_get_option("OMX_RENDER_NODE", NULL);
- if (!omx_render_node) {
- omx_display = XOpenDisplay(NULL);
- if (!omx_display)
- goto error;
- }
- }
-
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_screen_create(omx_display, 0);
if (!omx_screen) {
XCloseDisplay(omx_display);
@@ -117,16 +119,14 @@ void omx_put_screen(void)
{
pipe_mutex_lock(omx_lock);
if ((--omx_usecount) == 0) {
- if (!omx_render_node) {
- vl_screen_destroy(omx_screen);
- if (omx_display)
- XCloseDisplay(omx_display);
- } else {
- close(drm_fd);
+ if (omx_render_node) {
vl_drm_screen_destroy(omx_screen);
+ close(drm_fd);
+ } else {
+ vl_screen_destroy(omx_screen);
+ XCloseDisplay(omx_display);
}
omx_screen = NULL;
- omx_display = NULL;
}
pipe_mutex_unlock(omx_lock);
}