1/************************************************************************** 2 * 3 * Copyright 2013 Advanced Micro Devices, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28#include <assert.h> 29#include <string.h> 30#include <stdbool.h> 31 32#if defined(HAVE_X11_PLATFORM) 33#include <X11/Xlib.h> 34#else 35#define XOpenDisplay(x) NULL 36#define XCloseDisplay(x) 37#define Display void 38#endif 39 40#include "os/os_thread.h" 41#include "util/u_memory.h" 42#include "loader/loader.h" 43 44#include "vid_omx_common.h" 45 46static mtx_t omx_lock = _MTX_INITIALIZER_NP; 47static Display *omx_display = NULL; 48static struct vl_screen *omx_screen = NULL; 49static unsigned omx_usecount = 0; 50static const char *omx_render_node = NULL; 51static int drm_fd; 52 53struct vl_screen *omx_get_screen(void) 54{ 55 static bool first_time = true; 56 mtx_lock(&omx_lock); 57 58 if (!omx_screen) { 59 if (first_time) { 60 omx_render_node = debug_get_option("OMX_RENDER_NODE", NULL); 61 first_time = false; 62 } 63 if (omx_render_node) { 64 drm_fd = loader_open_device(omx_render_node); 65 if (drm_fd < 0) 66 goto error; 67 68 omx_screen = vl_drm_screen_create(drm_fd); 69 if (!omx_screen) { 70 close(drm_fd); 71 goto error; 72 } 73 } else { 74 omx_display = XOpenDisplay(NULL); 75 if (!omx_display) 76 goto error; 77 78 omx_screen = vl_dri3_screen_create(omx_display, 0); 79 if (!omx_screen) 80 omx_screen = vl_dri2_screen_create(omx_display, 0); 81 if (!omx_screen) { 82 XCloseDisplay(omx_display); 83 goto error; 84 } 85 } 86 } 87 88 ++omx_usecount; 89 90 mtx_unlock(&omx_lock); 91 return omx_screen; 92 93error: 94 mtx_unlock(&omx_lock); 95 return NULL; 96} 97 98void omx_put_screen(void) 99{ 100 mtx_lock(&omx_lock); 101 if ((--omx_usecount) == 0) { 102 omx_screen->destroy(omx_screen); 103 omx_screen = NULL; 104 105 if (omx_render_node) 106 close(drm_fd); 107 else 108 XCloseDisplay(omx_display); 109 } 110 mtx_unlock(&omx_lock); 111} 112