0001-Buildsystem-Add-guards-for-not-building-with-KMSDRM-support-if-EGL.patch 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. From 2fc987c28f14668a9ce360331f591e32e20c3906 Mon Sep 17 00:00:00 2001
  2. From: Manuel Alfayate Corchete <redwindwanderer@gmail.com>
  3. Date: Tue, 22 Dec 2020 14:15:33 +0100
  4. Subject: [PATCH] [Buildsystem] Add guards for not building with KMSDRM support
  5. if EGL is not available.
  6. Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
  7. [Retrieved from:
  8. https://github.com/libsdl-org/SDL/commit/2fc987c28f14668a9ce360331f591e32e20c3906]
  9. ---
  10. configure.ac | 29 ++++++++++++++++++-
  11. src/video/kmsdrm/SDL_kmsdrmopengles.c | 4 +--
  12. src/video/kmsdrm/SDL_kmsdrmopengles.h | 4 +--
  13. src/video/kmsdrm/SDL_kmsdrmvideo.c | 22 +++++---------
  14. src/video/kmsdrm/SDL_kmsdrmvideo.h | 8 -----
  15. .../SDL_kmsdrm_legacy_opengles.c | 4 +--
  16. .../SDL_kmsdrm_legacy_opengles.h | 4 +--
  17. .../kmsdrm_legacy/SDL_kmsdrm_legacy_video.c | 20 ++-----------
  18. .../kmsdrm_legacy/SDL_kmsdrm_legacy_video.h | 6 ++--
  19. 9 files changed, 47 insertions(+), 54 deletions(-)
  20. diff --git a/configure.ac b/configure.ac
  21. index b7e519b8f..acff858ba 100644
  22. --- a/configure.ac
  23. +++ b/configure.ac
  24. @@ -2236,7 +2236,10 @@ CheckKMSDRM()
  25. AS_HELP_STRING([--enable-video-kmsdrm], [use KMSDRM video driver [[default=no]]]),
  26. , enable_video_kmsdrm=no)
  27. - if test x$enable_video = xyes -a x$enable_video_kmsdrm = xyes; then
  28. + if test x$enable_video = xyes && \
  29. + test x$enable_video_kmsdrm = xyes && \
  30. + test x$video_opengl_egl = xyes; then
  31. +
  32. video_kmsdrm=no
  33. PKG_CHECK_MODULES([LIBDRM], [libdrm >= 1.4.82], libdrm_avail=yes, libdrm_avail=no)
  34. @@ -2418,6 +2421,28 @@ CheckOpenGLESX11()
  35. fi
  36. }
  37. +dnl Find EGL
  38. +CheckEGLKMSDRM()
  39. +{
  40. + AC_MSG_CHECKING(for EGL support)
  41. + video_opengl_egl=no
  42. + AC_TRY_COMPILE([
  43. + #define LINUX
  44. + #define EGL_API_FB
  45. + #define MESA_EGL_NO_X11_HEADERS
  46. + #define EGL_NO_X11
  47. + #include <EGL/egl.h>
  48. + #include <EGL/eglext.h>
  49. + ],[
  50. + ],[
  51. + video_opengl_egl=yes
  52. + ])
  53. + AC_MSG_RESULT($video_opengl_egl)
  54. + if test x$video_opengl_egl = xyes; then
  55. + AC_DEFINE(SDL_VIDEO_OPENGL_EGL, 1, [ ])
  56. + fi
  57. +}
  58. +
  59. dnl Check for Windows OpenGL
  60. CheckWINDOWSGL()
  61. {
  62. @@ -3555,6 +3580,8 @@ case "$host" in
  63. CheckRPI
  64. CheckX11
  65. CheckDirectFB
  66. + # Need to check for EGL first because KMSDRM depends on it.
  67. + CheckEGLKMSDRM
  68. CheckKMSDRM
  69. CheckOpenGLX11
  70. CheckOpenGLESX11
  71. diff --git a/src/video/kmsdrm/SDL_kmsdrmopengles.c b/src/video/kmsdrm/SDL_kmsdrmopengles.c
  72. index c9ec554b4..664621d2b 100644
  73. --- a/src/video/kmsdrm/SDL_kmsdrmopengles.c
  74. +++ b/src/video/kmsdrm/SDL_kmsdrmopengles.c
  75. @@ -22,7 +22,7 @@
  76. #include "../../SDL_internal.h"
  77. -#if SDL_VIDEO_DRIVER_KMSDRM && SDL_VIDEO_OPENGL_EGL
  78. +#if SDL_VIDEO_DRIVER_KMSDRM
  79. #include "SDL_kmsdrmvideo.h"
  80. #include "SDL_kmsdrmopengles.h"
  81. @@ -376,6 +376,6 @@ KMSDRM_GLES_SwapWindow(_THIS, SDL_Window * window)
  82. SDL_EGL_MakeCurrent_impl(KMSDRM)
  83. -#endif /* SDL_VIDEO_DRIVER_KMSDRM && SDL_VIDEO_OPENGL_EGL */
  84. +#endif /* SDL_VIDEO_DRIVER_KMSDRM */
  85. /* vi: set ts=4 sw=4 expandtab: */
  86. diff --git a/src/video/kmsdrm/SDL_kmsdrmopengles.h b/src/video/kmsdrm/SDL_kmsdrmopengles.h
  87. index f81b0c3dc..c8db7da86 100644
  88. --- a/src/video/kmsdrm/SDL_kmsdrmopengles.h
  89. +++ b/src/video/kmsdrm/SDL_kmsdrmopengles.h
  90. @@ -24,7 +24,7 @@
  91. #ifndef SDL_kmsdrmopengles_h_
  92. #define SDL_kmsdrmopengles_h_
  93. -#if SDL_VIDEO_DRIVER_KMSDRM && SDL_VIDEO_OPENGL_EGL
  94. +#if SDL_VIDEO_DRIVER_KMSDRM
  95. #include "../SDL_sysvideo.h"
  96. #include "../SDL_egl_c.h"
  97. @@ -42,7 +42,7 @@ extern SDL_GLContext KMSDRM_GLES_CreateContext(_THIS, SDL_Window * window);
  98. extern int KMSDRM_GLES_SwapWindow(_THIS, SDL_Window * window);
  99. extern int KMSDRM_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context);
  100. -#endif /* SDL_VIDEO_DRIVER_KMSDRM && SDL_VIDEO_OPENGL_EGL */
  101. +#endif /* SDL_VIDEO_DRIVER_KMSDRM */
  102. #endif /* SDL_kmsdrmopengles_h_ */
  103. diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c
  104. index e84bd5ebc..663bc2170 100644
  105. --- a/src/video/kmsdrm/SDL_kmsdrmvideo.c
  106. +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c
  107. @@ -846,7 +846,6 @@ KMSDRM_CreateDevice(int devindex)
  108. device->SetWindowGrab = KMSDRM_SetWindowGrab;
  109. device->DestroyWindow = KMSDRM_DestroyWindow;
  110. device->GetWindowWMInfo = KMSDRM_GetWindowWMInfo;
  111. -#if SDL_VIDEO_OPENGL_EGL
  112. device->GL_DefaultProfileConfig = KMSDRM_GLES_DefaultProfileConfig;
  113. device->GL_LoadLibrary = KMSDRM_GLES_LoadLibrary;
  114. device->GL_GetProcAddress = KMSDRM_GLES_GetProcAddress;
  115. @@ -857,9 +856,7 @@ KMSDRM_CreateDevice(int devindex)
  116. device->GL_GetSwapInterval = KMSDRM_GLES_GetSwapInterval;
  117. device->GL_SwapWindow = KMSDRM_GLES_SwapWindow;
  118. device->GL_DeleteContext = KMSDRM_GLES_DeleteContext;
  119. -#endif
  120. - device->PumpEvents = KMSDRM_PumpEvents;
  121. - device->free = KMSDRM_DeleteDevice;
  122. +
  123. #if SDL_VIDEO_VULKAN
  124. device->Vulkan_LoadLibrary = KMSDRM_Vulkan_LoadLibrary;
  125. device->Vulkan_UnloadLibrary = KMSDRM_Vulkan_UnloadLibrary;
  126. @@ -867,6 +864,10 @@ KMSDRM_CreateDevice(int devindex)
  127. device->Vulkan_CreateSurface = KMSDRM_Vulkan_CreateSurface;
  128. device->Vulkan_GetDrawableSize = KMSDRM_Vulkan_GetDrawableSize;
  129. #endif
  130. +
  131. + device->PumpEvents = KMSDRM_PumpEvents;
  132. + device->free = KMSDRM_DeleteDevice;
  133. +
  134. return device;
  135. cleanup:
  136. @@ -1327,9 +1328,7 @@ KMSDRM_DestroySurfaces(_THIS, SDL_Window *window)
  137. SDL_DisplayData *dispdata = (SDL_DisplayData *)SDL_GetDisplayDriverData(0);
  138. KMSDRM_PlaneInfo plane_info = {0};
  139. -#if SDL_VIDEO_OPENGL_EGL
  140. EGLContext egl_context;
  141. -#endif
  142. /********************************************************************/
  143. /* BLOCK 1: protect the PRIMARY PLANE before destroying the buffers */
  144. @@ -1380,7 +1379,6 @@ KMSDRM_DestroySurfaces(_THIS, SDL_Window *window)
  145. /* will get wrong info and we will be in trouble. */
  146. /***************************************************************************/
  147. -#if SDL_VIDEO_OPENGL_EGL
  148. egl_context = (EGLContext)SDL_GL_GetCurrentContext();
  149. SDL_EGL_MakeCurrent(_this, EGL_NO_SURFACE, egl_context);
  150. @@ -1388,7 +1386,6 @@ KMSDRM_DestroySurfaces(_THIS, SDL_Window *window)
  151. SDL_EGL_DestroySurface(_this, windata->egl_surface);
  152. windata->egl_surface = EGL_NO_SURFACE;
  153. }
  154. -#endif
  155. if (windata->gs) {
  156. KMSDRM_gbm_surface_destroy(windata->gs);
  157. @@ -1431,7 +1428,6 @@ KMSDRM_CreateSurfaces(_THIS, SDL_Window * window)
  158. return SDL_SetError("Could not create GBM surface");
  159. }
  160. -#if SDL_VIDEO_OPENGL_EGL
  161. /* We can't get the EGL context yet because SDL_CreateRenderer has not been called,
  162. but we need an EGL surface NOW, or GL won't be able to render into any surface
  163. and we won't see the first frame. */
  164. @@ -1448,8 +1444,6 @@ KMSDRM_CreateSurfaces(_THIS, SDL_Window * window)
  165. egl_context = (EGLContext)SDL_GL_GetCurrentContext();
  166. ret = SDL_EGL_MakeCurrent(_this, windata->egl_surface, egl_context);
  167. -#endif
  168. -
  169. cleanup:
  170. if (ret) {
  171. @@ -1478,11 +1472,11 @@ KMSDRM_DestroyWindow(_THIS, SDL_Window *window)
  172. if (!is_vulkan) {
  173. KMSDRM_DestroySurfaces(_this, window);
  174. -#if SDL_VIDEO_OPENGL_EGL
  175. +
  176. if (_this->egl_data) {
  177. SDL_EGL_UnloadLibrary(_this);
  178. }
  179. -#endif
  180. +
  181. if (dispdata->gbm_init) {
  182. KMSDRM_DeinitMouse(_this);
  183. KMSDRM_GBMDeinit(_this, dispdata);
  184. @@ -1754,7 +1748,6 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window)
  185. goto cleanup;
  186. }
  187. -#if SDL_VIDEO_OPENGL_EGL
  188. /* Manually load the EGL library. KMSDRM_EGL_LoadLibrary() has already
  189. been called by SDL_CreateWindow() but we don't do anything there,
  190. precisely to be able to load it here.
  191. @@ -1766,7 +1759,6 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window)
  192. goto cleanup;
  193. }
  194. }
  195. -#endif
  196. /* Can't init mouse stuff sooner because cursor plane is not ready. */
  197. KMSDRM_InitMouse(_this);
  198. diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.h b/src/video/kmsdrm/SDL_kmsdrmvideo.h
  199. index 2cf34522b..e58c922a8 100644
  200. --- a/src/video/kmsdrm/SDL_kmsdrmvideo.h
  201. +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.h
  202. @@ -34,10 +34,8 @@
  203. #include <gbm.h>
  204. #include <assert.h>
  205. -#if SDL_VIDEO_OPENGL_EGL
  206. #include <EGL/egl.h>
  207. #include <EGL/eglext.h>
  208. -#endif
  209. /****************************************************************************************/
  210. /* Driverdata pointers are void struct* used to store backend-specific variables */
  211. @@ -101,10 +99,6 @@ typedef struct SDL_DisplayData
  212. EGLSyncKHR kms_fence;
  213. EGLSyncKHR gpu_fence;
  214. -#if SDL_VIDEO_OPENGL_EGL
  215. - EGLSurface old_egl_surface;
  216. -#endif
  217. -
  218. SDL_bool modeset_pending;
  219. SDL_bool gbm_init;
  220. @@ -129,9 +123,7 @@ typedef struct SDL_WindowData
  221. struct gbm_bo *bo;
  222. struct gbm_bo *next_bo;
  223. -#if SDL_VIDEO_OPENGL_EGL
  224. EGLSurface egl_surface;
  225. -#endif
  226. /* For scaling and AR correction. */
  227. int32_t src_w;
  228. diff --git a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.c b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.c
  229. index 890801891..a886eb326 100644
  230. --- a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.c
  231. +++ b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.c
  232. @@ -21,7 +21,7 @@
  233. #include "../../SDL_internal.h"
  234. -#if SDL_VIDEO_DRIVER_KMSDRM && SDL_VIDEO_OPENGL_EGL
  235. +#if SDL_VIDEO_DRIVER_KMSDRM
  236. #include "SDL_log.h"
  237. @@ -147,6 +147,6 @@ KMSDRM_LEGACY_GLES_SwapWindow(_THIS, SDL_Window * window) {
  238. SDL_EGL_MakeCurrent_impl(KMSDRM_LEGACY)
  239. -#endif /* SDL_VIDEO_DRIVER_KMSDRM && SDL_VIDEO_OPENGL_EGL */
  240. +#endif /* SDL_VIDEO_DRIVER_KMSDRM */
  241. /* vi: set ts=4 sw=4 expandtab: */
  242. diff --git a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.h b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.h
  243. index 5e5ba96dc..2926cbe58 100644
  244. --- a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.h
  245. +++ b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.h
  246. @@ -23,7 +23,7 @@
  247. #ifndef SDL_kmsdrmopengles_h_
  248. #define SDL_kmsdrmopengles_h_
  249. -#if SDL_VIDEO_DRIVER_KMSDRM && SDL_VIDEO_OPENGL_EGL
  250. +#if SDL_VIDEO_DRIVER_KMSDRM
  251. #include "../SDL_sysvideo.h"
  252. #include "../SDL_egl_c.h"
  253. @@ -41,7 +41,7 @@ extern SDL_GLContext KMSDRM_LEGACY_GLES_CreateContext(_THIS, SDL_Window * window
  254. extern int KMSDRM_LEGACY_GLES_SwapWindow(_THIS, SDL_Window * window);
  255. extern int KMSDRM_LEGACY_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context);
  256. -#endif /* SDL_VIDEO_DRIVER_KMSDRM && SDL_VIDEO_OPENGL_EGL */
  257. +#endif /* SDL_VIDEO_DRIVER_KMSDRM */
  258. #endif /* SDL_kmsdrmopengles_h_ */
  259. diff --git a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.c b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.c
  260. index 36b1899bd..acddfc29a 100644
  261. --- a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.c
  262. +++ b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.c
  263. @@ -213,7 +213,7 @@ KMSDRM_LEGACY_CreateDevice(int devindex)
  264. device->SetWindowGrab = KMSDRM_LEGACY_SetWindowGrab;
  265. device->DestroyWindow = KMSDRM_LEGACY_DestroyWindow;
  266. device->GetWindowWMInfo = KMSDRM_LEGACY_GetWindowWMInfo;
  267. -#if SDL_VIDEO_OPENGL_EGL
  268. +
  269. device->GL_LoadLibrary = KMSDRM_LEGACY_GLES_LoadLibrary;
  270. device->GL_GetProcAddress = KMSDRM_LEGACY_GLES_GetProcAddress;
  271. device->GL_UnloadLibrary = KMSDRM_LEGACY_GLES_UnloadLibrary;
  272. @@ -223,7 +223,7 @@ KMSDRM_LEGACY_CreateDevice(int devindex)
  273. device->GL_GetSwapInterval = KMSDRM_LEGACY_GLES_GetSwapInterval;
  274. device->GL_SwapWindow = KMSDRM_LEGACY_GLES_SwapWindow;
  275. device->GL_DeleteContext = KMSDRM_LEGACY_GLES_DeleteContext;
  276. -#endif
  277. +
  278. device->PumpEvents = KMSDRM_LEGACY_PumpEvents;
  279. device->free = KMSDRM_LEGACY_DeleteDevice;
  280. @@ -369,14 +369,12 @@ KMSDRM_LEGACY_DestroySurfaces(_THIS, SDL_Window * window)
  281. windata->next_bo = NULL;
  282. }
  283. -#if SDL_VIDEO_OPENGL_EGL
  284. SDL_EGL_MakeCurrent(_this, EGL_NO_SURFACE, EGL_NO_CONTEXT);
  285. if (windata->egl_surface != EGL_NO_SURFACE) {
  286. SDL_EGL_DestroySurface(_this, windata->egl_surface);
  287. windata->egl_surface = EGL_NO_SURFACE;
  288. }
  289. -#endif
  290. if (windata->gs) {
  291. KMSDRM_LEGACY_gbm_surface_destroy(windata->gs);
  292. @@ -394,18 +392,14 @@ KMSDRM_LEGACY_CreateSurfaces(_THIS, SDL_Window * window)
  293. Uint32 height = dispdata->mode.vdisplay;
  294. Uint32 surface_fmt = GBM_FORMAT_XRGB8888;
  295. Uint32 surface_flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING;
  296. -#if SDL_VIDEO_OPENGL_EGL
  297. EGLContext egl_context;
  298. -#endif
  299. if (!KMSDRM_LEGACY_gbm_device_is_format_supported(viddata->gbm, surface_fmt, surface_flags)) {
  300. SDL_LogWarn(SDL_LOG_CATEGORY_VIDEO, "GBM surface format not supported. Trying anyway.");
  301. }
  302. -#if SDL_VIDEO_OPENGL_EGL
  303. SDL_EGL_SetRequiredVisualId(_this, surface_fmt);
  304. egl_context = (EGLContext)SDL_GL_GetCurrentContext();
  305. -#endif
  306. KMSDRM_LEGACY_DestroySurfaces(_this, window);
  307. @@ -415,7 +409,6 @@ KMSDRM_LEGACY_CreateSurfaces(_THIS, SDL_Window * window)
  308. return SDL_SetError("Could not create GBM surface");
  309. }
  310. -#if SDL_VIDEO_OPENGL_EGL
  311. windata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType)windata->gs);
  312. if (windata->egl_surface == EGL_NO_SURFACE) {
  313. @@ -425,7 +418,6 @@ KMSDRM_LEGACY_CreateSurfaces(_THIS, SDL_Window * window)
  314. SDL_EGL_MakeCurrent(_this, windata->egl_surface, egl_context);
  315. windata->egl_surface_dirty = 0;
  316. -#endif
  317. return 0;
  318. }
  319. @@ -734,15 +726,9 @@ KMSDRM_LEGACY_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode
  320. SDL_Window *window = viddata->windows[i];
  321. SDL_WindowData *windata = (SDL_WindowData *)window->driverdata;
  322. -#if SDL_VIDEO_OPENGL_EGL
  323. /* Can't recreate EGL surfaces right now, need to wait until SwapWindow
  324. so the correct thread-local surface and context state are available */
  325. windata->egl_surface_dirty = 1;
  326. -#else
  327. - if (KMSDRM_LEGACY_CreateSurfaces(_this, window)) {
  328. - return -1;
  329. - }
  330. -#endif
  331. /* Tell app about the resize */
  332. SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, mode->w, mode->h);
  333. @@ -758,13 +744,11 @@ KMSDRM_LEGACY_CreateWindow(_THIS, SDL_Window * window)
  334. SDL_WindowData *windata;
  335. SDL_VideoDisplay *display;
  336. -#if SDL_VIDEO_OPENGL_EGL
  337. if (!_this->egl_data) {
  338. if (SDL_GL_LoadLibrary(NULL) < 0) {
  339. goto error;
  340. }
  341. }
  342. -#endif
  343. /* Allocate window internal data */
  344. windata = (SDL_WindowData *)SDL_calloc(1, sizeof(SDL_WindowData));
  345. diff --git a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.h b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.h
  346. index 28e1bc4fe..9df2bcfa3 100644
  347. --- a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.h
  348. +++ b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.h
  349. @@ -31,9 +31,7 @@
  350. #include <xf86drm.h>
  351. #include <xf86drmMode.h>
  352. #include <gbm.h>
  353. -#if SDL_VIDEO_OPENGL_EGL
  354. #include <EGL/egl.h>
  355. -#endif
  356. typedef struct SDL_VideoData
  357. {
  358. @@ -71,10 +69,10 @@ typedef struct SDL_WindowData
  359. struct gbm_bo *crtc_bo;
  360. SDL_bool waiting_for_flip;
  361. SDL_bool double_buffer;
  362. -#if SDL_VIDEO_OPENGL_EGL
  363. +
  364. int egl_surface_dirty;
  365. EGLSurface egl_surface;
  366. -#endif
  367. +
  368. } SDL_WindowData;
  369. typedef struct KMSDRM_LEGACY_FBInfo