Lingfeng Yang | a2a3b0f | 2020-11-04 11:50:46 -0800 | [diff] [blame] | 1 | #include "X11Support.h" |
| 2 | |
Joshua Duong | ef2bbc2 | 2022-10-05 11:59:15 -0700 | [diff] [blame] | 3 | #include "aemu/base/SharedLibrary.h" |
Lingfeng Yang | a2a3b0f | 2020-11-04 11:50:46 -0800 | [diff] [blame] | 4 | |
| 5 | #define DEFINE_DUMMY_IMPL(rettype, funcname, args) \ |
| 6 | static rettype dummy_##funcname args { \ |
| 7 | return (rettype)0; \ |
| 8 | } \ |
| 9 | |
| 10 | LIST_XLIB_FUNCTYPES(DEFINE_DUMMY_IMPL) |
| 11 | LIST_GLX_FUNCTYPES(DEFINE_DUMMY_IMPL) |
| 12 | |
| 13 | class X11FunctionGetter { |
| 14 | public: |
| 15 | X11FunctionGetter() : |
Yahan Zhou | c38135f | 2023-02-02 14:02:24 -0800 | [diff] [blame] | 16 | mX11Lib(android::base::SharedLibrary::open("libX11")) { |
Bo Hu | f58fdca | 2023-05-01 06:59:23 -0700 | [diff] [blame] | 17 | if (!mX11Lib) { |
| 18 | fprintf(stderr, "WARNING: could not open libX11.so, try libX11.so.6\n"); |
| 19 | mX11Lib = (android::base::SharedLibrary::open("libX11.so.6")); |
| 20 | if (!mX11Lib) { |
| 21 | fprintf(stderr, "ERROR: could not open libX11.so.6, give up\n"); |
| 22 | return; |
| 23 | } |
| 24 | } |
Lingfeng Yang | a2a3b0f | 2020-11-04 11:50:46 -0800 | [diff] [blame] | 25 | |
| 26 | #define X11_ASSIGN_DUMMY_IMPL(funcname) mApi.funcname = dummy_##funcname; |
| 27 | |
| 28 | LIST_XLIB_FUNCS(X11_ASSIGN_DUMMY_IMPL) |
| 29 | |
| 30 | if (!mX11Lib) return; |
Lingfeng Yang | a2a3b0f | 2020-11-04 11:50:46 -0800 | [diff] [blame] | 31 | |
| 32 | #define X11_GET_FUNC(funcname) \ |
| 33 | { \ |
| 34 | auto f = mX11Lib->findSymbol(#funcname); \ |
| 35 | if (f) mApi.funcname = (funcname##_t)f; \ |
| 36 | } \ |
Yahan Zhou | c38135f | 2023-02-02 14:02:24 -0800 | [diff] [blame] | 37 | |
Lingfeng Yang | a2a3b0f | 2020-11-04 11:50:46 -0800 | [diff] [blame] | 38 | LIST_XLIB_FUNCS(X11_GET_FUNC); |
| 39 | |
| 40 | } |
| 41 | |
| 42 | X11Api* getApi() { return &mApi; } |
| 43 | private: |
| 44 | android::base::SharedLibrary* mX11Lib; |
Lingfeng Yang | a2a3b0f | 2020-11-04 11:50:46 -0800 | [diff] [blame] | 45 | |
| 46 | X11Api mApi; |
| 47 | }; |
| 48 | |
| 49 | class GlxFunctionGetter { |
| 50 | public: |
Yahan Zhou | b4f524d | 2023-01-24 10:27:21 -0800 | [diff] [blame] | 51 | // Important: Use libGL.so.1 explicitly, because it will always link to |
| 52 | // the vendor-specific version of the library. libGL.so might in some |
| 53 | // cases, depending on bad ldconfig configurations, link to the wrapper |
| 54 | // lib that doesn't behave the same. |
Lingfeng Yang | a2a3b0f | 2020-11-04 11:50:46 -0800 | [diff] [blame] | 55 | GlxFunctionGetter() : |
Yahan Zhou | b4f524d | 2023-01-24 10:27:21 -0800 | [diff] [blame] | 56 | mGlxLib(android::base::SharedLibrary::open("libGL.so.1")) { |
Lingfeng Yang | a2a3b0f | 2020-11-04 11:50:46 -0800 | [diff] [blame] | 57 | |
| 58 | #define GLX_ASSIGN_DUMMY_IMPL(funcname) mApi.funcname = dummy_##funcname; |
| 59 | |
| 60 | LIST_GLX_FUNCS(GLX_ASSIGN_DUMMY_IMPL) |
| 61 | |
| 62 | if (!mGlxLib) return; |
| 63 | |
| 64 | #define GLX_GET_FUNC(funcname) \ |
| 65 | { \ |
| 66 | auto f = mGlxLib->findSymbol(#funcname); \ |
| 67 | if (f) mApi.funcname = (funcname##_t)f; \ |
| 68 | } \ |
| 69 | |
| 70 | LIST_GLX_FUNCS(GLX_GET_FUNC); |
| 71 | |
| 72 | } |
| 73 | |
| 74 | GlxApi* getApi() { return &mApi; } |
| 75 | |
| 76 | private: |
| 77 | android::base::SharedLibrary* mGlxLib; |
| 78 | |
| 79 | GlxApi mApi; |
| 80 | }; |
| 81 | |
Lingfeng Yang | f64ede5 | 2020-11-04 16:26:28 -0800 | [diff] [blame] | 82 | AEMU_EXPORT struct X11Api* getX11Api() { |
Lingfeng Yang | a2a3b0f | 2020-11-04 11:50:46 -0800 | [diff] [blame] | 83 | static X11FunctionGetter* g = new X11FunctionGetter; |
| 84 | return g->getApi(); |
| 85 | } |
| 86 | |
Lingfeng Yang | f64ede5 | 2020-11-04 16:26:28 -0800 | [diff] [blame] | 87 | AEMU_EXPORT struct GlxApi* getGlxApi() { |
Lingfeng Yang | a2a3b0f | 2020-11-04 11:50:46 -0800 | [diff] [blame] | 88 | static GlxFunctionGetter* g = new GlxFunctionGetter; |
| 89 | return g->getApi(); |
| 90 | } |