jboolean select_dispman_cursor(LensNativePort *lensPort) { if (load_bcm_symbols() != 0) { //this indicates an error on loading bcm libraries, thus we cannot use the dispman cursor impl return JNI_FALSE; } lensPort->platformName = platformName; lensPort->setNativeCursor = fbDispmanSetNativeCursor; lensPort->cursorInitialize = fbDispmanCursorInitialize; lensPort->cursorSetPosition = fbDispmanCursorSetPosition; lensPort->cursorClose = _fbDispmanCursorClose; lensPort->createNativeCursor = fbDispmanCreateNativeCursor; lensPort->releaseNativeCursor = fbDispmanReleaseNativeCursor; lensPort->setVisible = fbDispmanSetVisible; lensPort->robotScreenCapture = fbDispmanRobotScreenCapture; lensPort->cursorTranslucency = JNI_TRUE; return JNI_TRUE; }
int load_wrapped_gles_symbols() { if (done_loading_symbols) { return 0; } done_loading_symbols = 1; //Note that there is an order depenacy here - The PI wants GLES first. // Other platfroms needs the RTLD_GLOBAL to resolve symbols correctly. libglesv2 = dlopen("libGLESv2.so", RTLD_LAZY | RTLD_GLOBAL); if (!libglesv2) { fprintf(stderr, "Did not find libGLESv2.so %s\n", dlerror()); return 0; } libegl = dlopen("libEGL.so", RTLD_LAZY | RTLD_GLOBAL); if (!libegl) { fprintf(stderr, "Did not find libEGL.so %s\n", dlerror()); return 0; } void *libbcm = dlopen("libbcm_host.so", RTLD_LAZY); int error = 0; if (load_bcm_symbols() == 0) { // useDispman } else if (access("/dev/mxc_vpu", F_OK) == 0) { useVivanteFB = 1; error += load_vivante_symbols(libegl); } error += load_egl_symbols(libegl); return error; }
JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_monocle_dispman_DispmanAcceleratedScreen__1platformGetNativeWindow (JNIEnv *env, jobject obj, jint displayID, jint layerID) { #ifdef USE_DISPMAN EGL_DISPMANX_WINDOW_T *dispmanWindow; DISPMANX_DISPLAY_HANDLE_T display = 0; DISPMANX_ELEMENT_HANDLE_T element; DISPMANX_UPDATE_HANDLE_T update; VC_RECT_T dst = { 0, 0, 0, 0 }; VC_RECT_T src = { 0, 0, 0, 0 }; load_bcm_symbols(); (*wr_bcm_host_init)(); dispmanWindow = (EGL_DISPMANX_WINDOW_T *)calloc(sizeof(EGL_DISPMANX_WINDOW_T), 1); display = (*wr_vc_dispmanx_display_open)(displayID); if (display == 0) { fprintf(stderr, "Dispman: Cannot open display\n"); return 0; } int fbFileHandle; struct fb_var_screeninfo screenInfo; fbFileHandle = open("/dev/fb0", O_RDONLY); if (fbFileHandle < 0) { fprintf(stderr, "Cannot open framebuffer\n"); return 0; } if (ioctl(fbFileHandle, FBIOGET_VSCREENINFO, &screenInfo)) { fprintf(stderr, "Cannot get screen info\n"); return 0; } close(fbFileHandle); dst.width = screenInfo.xres; dst.height = screenInfo.yres; src.width = screenInfo.xres << 16; src.height = screenInfo.yres << 16; VC_DISPMANX_ALPHA_T alpha; alpha.flags = DISPMANX_FLAGS_ALPHA_FROM_SOURCE; alpha.opacity = 0xff; alpha.mask = (DISPMANX_RESOURCE_HANDLE_T) 0; update = (*wr_vc_dispmanx_update_start)(0); element = (*wr_vc_dispmanx_element_add)( update, display, layerID, &dst, 0 /*src*/, &src, DISPMANX_PROTECTION_NONE, &alpha, 0 /*clamp*/, 0 /*transform*/); dispmanWindow->element = element; dispmanWindow->width = screenInfo.xres; dispmanWindow->height = screenInfo.yres; (*wr_vc_dispmanx_update_submit_sync)(update); return asJLong((NativeWindowType)dispmanWindow); #else return 0l; #endif /* USE_DISPMAN */ }