mirror of
https://github.com/AngelAuraMC/Amethyst-Android.git
synced 2025-09-17 00:29:50 -04:00
WIP: changes for VirGL
This commit is contained in:
parent
21f6b166ae
commit
df7d78d916
@ -623,8 +623,10 @@ EGLint (*eglGetError_p) (void);
|
|||||||
EGLContext (*eglCreateContext_p) (EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list);
|
EGLContext (*eglCreateContext_p) (EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list);
|
||||||
EGLBoolean (*eglSwapInterval_p) (EGLDisplay dpy, EGLint interval);
|
EGLBoolean (*eglSwapInterval_p) (EGLDisplay dpy, EGLint interval);
|
||||||
EGLSurface (*eglGetCurrentSurface_p) (EGLint readdraw);
|
EGLSurface (*eglGetCurrentSurface_p) (EGLint readdraw);
|
||||||
|
int (*virgl_main_p) ();
|
||||||
#define RENDERER_GL4ES 1
|
#define RENDERER_GL4ES 1
|
||||||
#define RENDERER_VK_ZINK 2
|
#define RENDERER_VK_ZINK 2
|
||||||
|
#define RENDERER_VIRGL 3
|
||||||
|
|
||||||
int config_renderer;
|
int config_renderer;
|
||||||
|
|
||||||
@ -672,6 +674,39 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglGetCurrentContext(JNIE
|
|||||||
default: return (jlong) 0;
|
default: return (jlong) 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dlsym_EGL(void* dl_handle) {
|
||||||
|
eglBindAPI_p = dlsym(dl_handle,"eglBindAPI");
|
||||||
|
eglChooseConfig_p = dlsym(dl_handle, "eglChooseConfig");
|
||||||
|
eglCreateContext_p = dlsym(dl_handle, "eglCreateContext");
|
||||||
|
eglCreateWindowSurface_p = dlsym(dl_handle, "eglCreateWindowSurface");
|
||||||
|
eglDestroyContext_p = dlsym(dl_handle, "eglDestroyContext");
|
||||||
|
eglDestroySurface_p = dlsym(dl_handle, "eglDestroySurface");
|
||||||
|
eglGetConfigAttrib_p = dlsym(dl_handle, "eglGetConfigAttrib");
|
||||||
|
eglGetCurrentContext_p = dlsym(dl_handle, "eglGetCurrentContext");
|
||||||
|
eglGetDisplay_p = dlsym(dl_handle, "eglGetDisplay");
|
||||||
|
eglGetError_p = dlsym(dl_handle, "eglGetError");
|
||||||
|
eglInitialize_p = dlsym(dl_handle, "eglInitialize");
|
||||||
|
eglMakeCurrent_p = dlsym(dl_handle, "eglMakeCurrent");
|
||||||
|
eglSwapBuffers_p = dlsym(dl_handle, "eglSwapBuffers");
|
||||||
|
eglReleaseThread_p = dlsym(dl_handle, "eglReleaseThread");
|
||||||
|
eglSwapInterval_p = dlsym(dl_handle, "eglSwapInterval");
|
||||||
|
eglTerminate_p = dlsym(dl_handle, "eglTerminate");
|
||||||
|
eglGetCurrentSurface_p = dlsym(dl_handle,"eglGetCurrentSurface");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dlsym_OSMesa(void* dl_handle) {
|
||||||
|
OSMesaMakeCurrent_p = dlsym(dl_handle,"OSMesaMakeCurrent");
|
||||||
|
OSMesaGetCurrentContext_p = dlsym(dl_handle,"OSMesaGetCurrentContext");
|
||||||
|
OSMesaCreateContext_p = dlsym(dl_handle, "OSMesaCreateContext");
|
||||||
|
OSMesaDestroyContext_p = dlsym(dl_handle, "OSMesaDestroyContext");
|
||||||
|
OSMesaPixelStore_p = dlsym(dl_handle,"OSMesaPixelStore");
|
||||||
|
glGetString_p = dlsym(dl_handle,"glGetString");
|
||||||
|
glClearColor_p = dlsym(dl_handle, "glClearColor");
|
||||||
|
glClear_p = dlsym(dl_handle,"glClear");
|
||||||
|
glFinish_p = dlsym(dl_handle,"glFinish");
|
||||||
|
}
|
||||||
|
|
||||||
bool loadSymbols() {
|
bool loadSymbols() {
|
||||||
char* fileName;
|
char* fileName;
|
||||||
char* fileNameExt;
|
char* fileNameExt;
|
||||||
@ -706,47 +741,53 @@ bool loadSymbols() {
|
|||||||
}
|
}
|
||||||
switch(config_renderer) {
|
switch(config_renderer) {
|
||||||
case RENDERER_VK_ZINK:
|
case RENDERER_VK_ZINK:
|
||||||
OSMesaMakeCurrent_p = dlsym(dl_handle,"OSMesaMakeCurrent");
|
dlsym_OSMesa(dl_handle);
|
||||||
OSMesaGetCurrentContext_p = dlsym(dl_handle,"OSMesaGetCurrentContext");
|
|
||||||
OSMesaCreateContext_p = dlsym(dl_handle, "OSMesaCreateContext");
|
|
||||||
OSMesaDestroyContext_p = dlsym(dl_handle, "OSMesaDestroyContext");
|
|
||||||
OSMesaPixelStore_p = dlsym(dl_handle,"OSMesaPixelStore");
|
|
||||||
glGetString_p = dlsym(dl_handle,"glGetString");
|
|
||||||
glClearColor_p = dlsym(dl_handle, "glClearColor");
|
|
||||||
glClear_p = dlsym(dl_handle,"glClear");
|
|
||||||
glFinish_p = dlsym(dl_handle,"glFinish");
|
|
||||||
break;
|
break;
|
||||||
case RENDERER_GL4ES:
|
case RENDERER_GL4ES:
|
||||||
eglBindAPI_p = dlsym(dl_handle,"eglBindAPI");
|
dlsym_EGL(dl_handle);
|
||||||
eglChooseConfig_p = dlsym(dl_handle, "eglChooseConfig");
|
|
||||||
eglCreateContext_p = dlsym(dl_handle, "eglCreateContext");
|
|
||||||
eglCreateWindowSurface_p = dlsym(dl_handle, "eglCreateWindowSurface");
|
|
||||||
eglDestroyContext_p = dlsym(dl_handle, "eglDestroyContext");
|
|
||||||
eglDestroySurface_p = dlsym(dl_handle, "eglDestroySurface");
|
|
||||||
eglGetConfigAttrib_p = dlsym(dl_handle, "eglGetConfigAttrib");
|
|
||||||
eglGetCurrentContext_p = dlsym(dl_handle, "eglGetCurrentContext");
|
|
||||||
eglGetDisplay_p = dlsym(dl_handle, "eglGetDisplay");
|
|
||||||
eglGetError_p = dlsym(dl_handle, "eglGetError");
|
|
||||||
eglInitialize_p = dlsym(dl_handle, "eglInitialize");
|
|
||||||
eglMakeCurrent_p = dlsym(dl_handle, "eglMakeCurrent");
|
|
||||||
eglSwapBuffers_p = dlsym(dl_handle, "eglSwapBuffers");
|
|
||||||
eglReleaseThread_p = dlsym(dl_handle, "eglReleaseThread");
|
|
||||||
eglSwapInterval_p = dlsym(dl_handle, "eglSwapInterval");
|
|
||||||
eglTerminate_p = dlsym(dl_handle, "eglTerminate");
|
|
||||||
eglGetCurrentSurface_p = dlsym(dl_handle,"eglGetCurrentSurface");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool loadSymbolsVirGL() {
|
||||||
|
char *fileName = "libEGL.so";
|
||||||
|
void* dl_handle = dlopen(fileName,RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE);
|
||||||
|
if (!dl_handle) {
|
||||||
|
dl_handle = dlopen(fileName,RTLD_NOW|RTLD_GLOBAL);
|
||||||
|
}
|
||||||
|
dlsym_EGL(dl_handle);
|
||||||
|
|
||||||
|
fileName = "libOSMesa_8.so";
|
||||||
|
void* dl_handle2 = dlopen(fileName,RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE);
|
||||||
|
if (!dl_handle2) {
|
||||||
|
dl_handle2 = dlopen(fileName,RTLD_NOW|RTLD_GLOBAL);
|
||||||
|
}
|
||||||
|
dlsym_OSMesa(dl_handle2);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglInit(JNIEnv* env, jclass clazz) {
|
JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglInit(JNIEnv* env, jclass clazz) {
|
||||||
ANativeWindow_acquire(potatoBridge.androidWindow);
|
ANativeWindow_acquire(potatoBridge.androidWindow);
|
||||||
savedWidth = ANativeWindow_getWidth(potatoBridge.androidWindow);
|
savedWidth = ANativeWindow_getWidth(potatoBridge.androidWindow);
|
||||||
savedHeight = ANativeWindow_getHeight(potatoBridge.androidWindow);
|
savedHeight = ANativeWindow_getHeight(potatoBridge.androidWindow);
|
||||||
ANativeWindow_setBuffersGeometry(potatoBridge.androidWindow,savedWidth,savedHeight,AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM);
|
ANativeWindow_setBuffersGeometry(potatoBridge.androidWindow,savedWidth,savedHeight,AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM);
|
||||||
|
|
||||||
const char *renderer = getenv("POJAV_RENDERER");
|
// NOTE: Override for now.
|
||||||
if (strncmp("opengles", renderer, 8) == 0) {
|
const char *renderer = "opengles3_virgl";
|
||||||
|
//getenv("POJAV_RENDERER");
|
||||||
|
if (strncmp("opengles3_virgl", renderer, 15) == 0) {
|
||||||
|
config_renderer = RENDERER_VIRGL;
|
||||||
|
setenv("GALLIUM_DRIVER","virpipe",1);
|
||||||
|
setenv("VTEST_USE_GLES","1",1);
|
||||||
|
loadSymbolsVirGL();
|
||||||
|
} else if (strncmp("opengles", renderer, 8) == 0) {
|
||||||
config_renderer = RENDERER_GL4ES;
|
config_renderer = RENDERER_GL4ES;
|
||||||
loadSymbols();
|
loadSymbols();
|
||||||
|
} else if (strcmp(renderer, "vulkan_zink") == 0) {
|
||||||
|
config_renderer = RENDERER_VK_ZINK;
|
||||||
|
setenv("GALLIUM_DRIVER","zink",1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config_renderer == RENDERER_GL4ES || config_renderer == RENDERER_VIRGL) {
|
||||||
if (potatoBridge.eglDisplay == NULL || potatoBridge.eglDisplay == EGL_NO_DISPLAY) {
|
if (potatoBridge.eglDisplay == NULL || potatoBridge.eglDisplay == EGL_NO_DISPLAY) {
|
||||||
potatoBridge.eglDisplay = eglGetDisplay_p(EGL_DEFAULT_DISPLAY);
|
potatoBridge.eglDisplay = eglGetDisplay_p(EGL_DEFAULT_DISPLAY);
|
||||||
if (potatoBridge.eglDisplay == EGL_NO_DISPLAY) {
|
if (potatoBridge.eglDisplay == EGL_NO_DISPLAY) {
|
||||||
@ -817,10 +858,8 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglInit(JNIEnv* env, j
|
|||||||
potatoBridge.eglSurface
|
potatoBridge.eglSurface
|
||||||
);
|
);
|
||||||
return JNI_TRUE;
|
return JNI_TRUE;
|
||||||
} else if (strcmp(renderer, "vulkan_zink") == 0) {
|
}
|
||||||
config_renderer = RENDERER_VK_ZINK;
|
if (config_renderer == RENDERER_VK_ZINK || config_renderer == RENDERER_VIRGL) {
|
||||||
|
|
||||||
setenv("GALLIUM_DRIVER","zink",1);
|
|
||||||
loadSymbols();
|
loadSymbols();
|
||||||
if(OSMesaCreateContext_p == NULL) {
|
if(OSMesaCreateContext_p == NULL) {
|
||||||
printf("OSMDroid: %s\n",dlerror());
|
printf("OSMDroid: %s\n",dlerror());
|
||||||
@ -846,7 +885,8 @@ int32_t stride;
|
|||||||
bool stopSwapBuffers;
|
bool stopSwapBuffers;
|
||||||
void flipFrame() {
|
void flipFrame() {
|
||||||
switch (config_renderer) {
|
switch (config_renderer) {
|
||||||
case RENDERER_GL4ES: {
|
case RENDERER_GL4ES:
|
||||||
|
case RENDERER_VIRGL: {
|
||||||
if (!eglSwapBuffers_p(potatoBridge.eglDisplay, eglGetCurrentSurface_p(EGL_DRAW))) {
|
if (!eglSwapBuffers_p(potatoBridge.eglDisplay, eglGetCurrentSurface_p(EGL_DRAW))) {
|
||||||
if (eglGetError_p() == EGL_BAD_SURFACE) {
|
if (eglGetError_p() == EGL_BAD_SURFACE) {
|
||||||
stopSwapBuffers = true;
|
stopSwapBuffers = true;
|
||||||
@ -874,6 +914,30 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglSwapBuffers(JNIEnv
|
|||||||
return JNI_TRUE;
|
return JNI_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* egl_make_current(void* window) {
|
||||||
|
EGLBoolean success = eglMakeCurrent_p(
|
||||||
|
potatoBridge.eglDisplay,
|
||||||
|
window==0 ? (EGLSurface *) 0 : potatoBridge.eglSurface,
|
||||||
|
window==0 ? (EGLSurface *) 0 : potatoBridge.eglSurface,
|
||||||
|
/* window==0 ? EGL_NO_CONTEXT : */ (EGLContext *) window
|
||||||
|
);
|
||||||
|
|
||||||
|
if (success == EGL_FALSE) {
|
||||||
|
printf("EGLBridge: Error: eglMakeCurrent() failed: %p\n", eglGetError_p());
|
||||||
|
} else {
|
||||||
|
printf("EGLBridge: eglMakeCurrent() succeed!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config_renderer == RENDERER_VIRGL) {
|
||||||
|
void *virgl = dlopen("libvirgl_vtest_server.so", RTLD_GLOBAL);
|
||||||
|
if (virgl) {
|
||||||
|
virgl_main_p = dlsym(virgl, "vtest_main");
|
||||||
|
printf("virgl_main_p %p\n", virgl_main_p);
|
||||||
|
virgl_main_p();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool locked = false;
|
bool locked = false;
|
||||||
JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglMakeCurrent(JNIEnv* env, jclass clazz, jlong window) {
|
JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglMakeCurrent(JNIEnv* env, jclass clazz, jlong window) {
|
||||||
//if(OSMesaGetCurrentContext_p() != NULL) {
|
//if(OSMesaGetCurrentContext_p() != NULL) {
|
||||||
@ -881,8 +945,7 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglMakeCurrent(JNIEnv*
|
|||||||
// return JNI_TRUE;
|
// return JNI_TRUE;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
switch (config_renderer) {
|
if (config_renderer == RENDERER_GL4ES || config_renderer == RENDERER_VIRGL) {
|
||||||
case RENDERER_GL4ES: {
|
|
||||||
EGLContext *currCtx = eglGetCurrentContext_p();
|
EGLContext *currCtx = eglGetCurrentContext_p();
|
||||||
printf("EGLBridge: Comparing: thr=%d, this=%p, curr=%p\n", gettid(), window, currCtx);
|
printf("EGLBridge: Comparing: thr=%d, this=%p, curr=%p\n", gettid(), window, currCtx);
|
||||||
if (currCtx == NULL || window == 0) {
|
if (currCtx == NULL || window == 0) {
|
||||||
@ -903,16 +966,15 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglMakeCurrent(JNIEnv*
|
|||||||
//potatoBridge.eglContextOld = (void *) window;
|
//potatoBridge.eglContextOld = (void *) window;
|
||||||
// eglMakeCurrent(potatoBridge.eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
// eglMakeCurrent(potatoBridge.eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
printf("EGLBridge: Making current on window %p on thread %d\n", window, gettid());
|
printf("EGLBridge: Making current on window %p on thread %d\n", window, gettid());
|
||||||
EGLBoolean success = eglMakeCurrent_p(
|
if (config_renderer != RENDERER_VIRGL) {
|
||||||
potatoBridge.eglDisplay,
|
egl_make_current((void *)window);
|
||||||
window==0 ? (EGLSurface *) 0 : potatoBridge.eglSurface,
|
|
||||||
window==0 ? (EGLSurface *) 0 : potatoBridge.eglSurface,
|
|
||||||
/* window==0 ? EGL_NO_CONTEXT : */ (EGLContext *) window
|
|
||||||
);
|
|
||||||
if (success == EGL_FALSE) {
|
|
||||||
printf("EGLBridge: Error: eglMakeCurrent() failed: %p\n", eglGetError_p());
|
|
||||||
} else {
|
} else {
|
||||||
printf("EGLBridge: eglMakeCurrent() succeed!\n");
|
pthread_t t;
|
||||||
|
pthread_create(&t, NULL, egl_make_current, (void *)window);
|
||||||
|
pthread_join(t, NULL);
|
||||||
|
|
||||||
|
// make sure to have enough time for vtest server to init
|
||||||
|
usleep(100*1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test
|
// Test
|
||||||
@ -924,29 +986,21 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglMakeCurrent(JNIEnv*
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// idk this should convert or just `return success;`...
|
// idk this should convert or just `return success;`...
|
||||||
return success == EGL_TRUE ? JNI_TRUE : JNI_FALSE;
|
return JNI_TRUE; //success == EGL_TRUE ? JNI_TRUE : JNI_FALSE;
|
||||||
} else {
|
} else {
|
||||||
// (*env)->ThrowNew(env,(*env)->FindClass(env,"java/lang/Exception"),"Trace exception");
|
// (*env)->ThrowNew(env,(*env)->FindClass(env,"java/lang/Exception"),"Trace exception");
|
||||||
return JNI_FALSE;
|
return JNI_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case RENDERER_VK_ZINK: {
|
if (config_renderer == RENDERER_VK_ZINK || config_renderer == RENDERER_VIRGL) {
|
||||||
printf("OSMDroid: making current\n");
|
printf("OSMDroid: making current\n");
|
||||||
OSMesaMakeCurrent_p((OSMesaContext)window,gbuffer,GL_UNSIGNED_BYTE,savedWidth,savedHeight);
|
OSMesaMakeCurrent_p((OSMesaContext)window,gbuffer,GL_UNSIGNED_BYTE,savedWidth,savedHeight);
|
||||||
|
if (config_renderer == RENDERER_VK_ZINK) {
|
||||||
ANativeWindow_lock(potatoBridge.androidWindow,&buf,NULL);
|
ANativeWindow_lock(potatoBridge.androidWindow,&buf,NULL);
|
||||||
OSMesaPixelStore_p(OSMESA_ROW_LENGTH,buf.stride);
|
OSMesaPixelStore_p(OSMESA_ROW_LENGTH,buf.stride);
|
||||||
stride = buf.stride;
|
stride = buf.stride;
|
||||||
//ANativeWindow_unlockAndPost(potatoBridge.androidWindow);
|
//ANativeWindow_unlockAndPost(potatoBridge.androidWindow);
|
||||||
|
|
||||||
if (getenv("ZINK_FORCEGL") == "1") {
|
|
||||||
printf("OSMDroid: Forcing enable Vulkan extensions for Zink\n");
|
|
||||||
struct zink_screen *zscreen = ((struct st_manager*)((OSMesaContext)window)->stctx->st_context_private)->screen;
|
|
||||||
|
|
||||||
// OpenGL 3.0
|
|
||||||
zscreen->info.have_EXT_transform_feedback = true;
|
|
||||||
zscreen->info.have_EXT_conditional_rendering = true;
|
|
||||||
// zscreen->info.feats.features.independentBlend = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OSMesaPixelStore_p(OSMESA_Y_UP,0);
|
OSMesaPixelStore_p(OSMESA_Y_UP,0);
|
||||||
@ -958,14 +1012,14 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglMakeCurrent(JNIEnv*
|
|||||||
return JNI_TRUE;
|
return JNI_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_org_lwjgl_glfw_GLFW_nativeEglDetachOnCurrentThread(JNIEnv *env, jclass clazz) {
|
Java_org_lwjgl_glfw_GLFW_nativeEglDetachOnCurrentThread(JNIEnv *env, jclass clazz) {
|
||||||
//Obstruct the context on the current thread
|
//Obstruct the context on the current thread
|
||||||
|
|
||||||
switch (config_renderer) {
|
switch (config_renderer) {
|
||||||
case RENDERER_GL4ES: {
|
case RENDERER_GL4ES:
|
||||||
|
case RENDERER_VIRGL: {
|
||||||
eglMakeCurrent_p(potatoBridge.eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
eglMakeCurrent_p(potatoBridge.eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@ -977,10 +1031,9 @@ Java_org_lwjgl_glfw_GLFW_nativeEglDetachOnCurrentThread(JNIEnv *env, jclass claz
|
|||||||
|
|
||||||
JNIEXPORT jlong JNICALL
|
JNIEXPORT jlong JNICALL
|
||||||
Java_org_lwjgl_glfw_GLFW_nativeEglCreateContext(JNIEnv *env, jclass clazz, jlong contextSrc) {
|
Java_org_lwjgl_glfw_GLFW_nativeEglCreateContext(JNIEnv *env, jclass clazz, jlong contextSrc) {
|
||||||
switch (config_renderer) {
|
if (config_renderer == RENDERER_GL4ES || config_renderer == RENDERER_VIRGL) {
|
||||||
case RENDERER_GL4ES: {
|
|
||||||
const EGLint ctx_attribs[] = {
|
const EGLint ctx_attribs[] = {
|
||||||
EGL_CONTEXT_CLIENT_VERSION, atoi(getenv("LIBGL_ES")),
|
EGL_CONTEXT_CLIENT_VERSION, (config_renderer == RENDERER_VIRGL ? 3 : atoi(getenv("LIBGL_ES"))),
|
||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
EGLContext* ctx = eglCreateContext_p(potatoBridge.eglDisplay, config, (void*)contextSrc, ctx_attribs);
|
EGLContext* ctx = eglCreateContext_p(potatoBridge.eglDisplay, config, (void*)contextSrc, ctx_attribs);
|
||||||
@ -992,14 +1045,13 @@ Java_org_lwjgl_glfw_GLFW_nativeEglCreateContext(JNIEnv *env, jclass clazz, jlong
|
|||||||
return (long)ctx;
|
return (long)ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
case RENDERER_VK_ZINK: {
|
if (config_renderer == RENDERER_VK_ZINK || config_renderer == RENDERER_VIRGL) {
|
||||||
printf("OSMDroid: generating context\n");
|
printf("OSMDroid: generating context\n");
|
||||||
void* ctx = OSMesaCreateContext_p(OSMESA_RGBA,contextSrc);
|
void* ctx = OSMesaCreateContext_p(OSMESA_RGBA,contextSrc);
|
||||||
printf("OSMDroid: context=%p",ctx);
|
printf("OSMDroid: context=%p",ctx);
|
||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglTerminate(JNIEnv* env, jclass clazz) {
|
JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglTerminate(JNIEnv* env, jclass clazz) {
|
||||||
terminateEgl();
|
terminateEgl();
|
||||||
@ -1028,7 +1080,8 @@ Java_org_lwjgl_opengl_GL_getNativeWidthHeight(JNIEnv *env, jobject thiz) {
|
|||||||
}
|
}
|
||||||
JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglSwapInterval(JNIEnv *env, jclass clazz, jint interval) {
|
JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglSwapInterval(JNIEnv *env, jclass clazz, jint interval) {
|
||||||
switch (config_renderer) {
|
switch (config_renderer) {
|
||||||
case RENDERER_GL4ES: {
|
case RENDERER_GL4ES:
|
||||||
|
case RENDERER_VIRGL: {
|
||||||
return eglSwapInterval_p(potatoBridge.eglDisplay, interval);
|
return eglSwapInterval_p(potatoBridge.eglDisplay, interval);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user