From b1febba24edc1261345025ed53b02869ed19386f Mon Sep 17 00:00:00 2001 From: Bastien Date: Sat, 22 Sep 2018 14:54:39 +0200 Subject: [PATCH] Fix texture sharing between GPUs --- examples/opengl/context.inl | 4 ++-- examples/opengl/gl.c | 9 +++++++-- examples/opengl/gl.h | 2 +- examples/opengl/main.c | 23 +++++++++++++++++++---- examples/opengl/vr_context.c | 2 +- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/examples/opengl/context.inl b/examples/opengl/context.inl index 5fa3316..b26de11 100644 --- a/examples/opengl/context.inl +++ b/examples/opengl/context.inl @@ -1,11 +1,11 @@ #include #include -static inline bool create_context(EGLNativeDisplayType nativeDisplay, EGLNativeWindowType nativeWindow, const EGLint * config_attribs, const EGLint * context_attribs, const EGLint * surface_attribs, EGLDisplay * outDisplay, EGLContext * outContext, EGLSurface * outSurface) +static inline bool create_context(EGLenum platform, EGLNativeDisplayType nativeDisplay, EGLNativeWindowType nativeWindow, const EGLint * config_attribs, const EGLint * context_attribs, const EGLint * surface_attribs, EGLDisplay * outDisplay, EGLContext * outContext, EGLSurface * outSurface) { // // get an EGL display connection - EGLDisplay display = eglGetDisplay(nativeDisplay); + EGLDisplay display = eglGetPlatformDisplay(platform, nativeDisplay, (EGLAttrib*)0); if (EGL_NO_DISPLAY == display) { diff --git a/examples/opengl/gl.c b/examples/opengl/gl.c index 076ef65..497df10 100644 --- a/examples/opengl/gl.c +++ b/examples/opengl/gl.c @@ -143,7 +143,7 @@ void init_gl(gl_ctx* ctx, int w, int h) ctx->h = h; ctx->is_fullscreen = 0; - bool bContextCreated = create_context(EGL_DEFAULT_DISPLAY, ctx->x_window, egl_config_attribs, egl_context_attribs, egl_surface_attribs, &ctx->egl_display, &ctx->egl_context, &ctx->egl_surface); + bool bContextCreated = create_context(EGL_PLATFORM_X11_KHR, EGL_DEFAULT_DISPLAY, ctx->x_window, egl_config_attribs, egl_context_attribs, egl_surface_attribs, &ctx->egl_display, &ctx->egl_context, &ctx->egl_surface); if(!bContextCreated || ctx->egl_context == EGL_NO_CONTEXT) { @@ -289,14 +289,19 @@ GLuint compile_shader(const char* vertex, const char* fragment) return programShader; } -void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint* color_tex, GLuint* depth_tex) +void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint* color_tex, GLuint* depth_tex, EGLImage image) { glGenTextures(1, color_tex); glGenTextures(1, depth_tex); glGenFramebuffers(1, fbo); glBindTexture(GL_TEXTURE_2D, *color_tex); +#if 0 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, eye_width, eye_height, 0, GL_RGBA, GL_UNSIGNED_INT, NULL); +#else + PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) eglGetProcAddress ("glEGLImageTargetTexture2DOES"); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image); +#endif // 0 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); diff --git a/examples/opengl/gl.h b/examples/opengl/gl.h index 10c19b5..cc0ba85 100644 --- a/examples/opengl/gl.h +++ b/examples/opengl/gl.h @@ -37,7 +37,7 @@ void perspective(gl_ctx* ctx); void init_gl(gl_ctx* ctx, int w, int h); void draw_cube(); GLuint compile_shader(const char* vertex, const char* fragment); -void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint* color_tex, GLuint* depth_tex); +void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint* color_tex, GLuint* depth_tex, EGLImage image); #endif diff --git a/examples/opengl/main.c b/examples/opengl/main.c index 97ac870..3f64189 100644 --- a/examples/opengl/main.c +++ b/examples/opengl/main.c @@ -171,19 +171,34 @@ int main(int argc, char** argv) GLuint list = gen_cubes(); + int eye_w = hmd_w/2*OVERSAMPLE_SCALE; int eye_h = hmd_h*OVERSAMPLE_SCALE; + + EGLint imageAttribs[] = { + EGL_WIDTH, eye_w, + EGL_HEIGHT, eye_h, + EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA, + EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SHARE_MESA, + EGL_NONE + }; + + PFNEGLCREATEDRMIMAGEMESAPROC eglCreateDRMImage = (PFNEGLCREATEDRMIMAGEMESAPROC) eglGetProcAddress("eglCreateDRMImageMESA"); + + EGLImage left_image = eglCreateDRMImage(gl.egl_display, imageAttribs); + EGLImage right_image = eglCreateDRMImage(gl.egl_display, imageAttribs); + GLuint left_color_tex = 0, left_depth_tex = 0, left_fbo = 0; - create_fbo(eye_w, eye_h, &left_fbo, &left_color_tex, &left_depth_tex); + create_fbo(eye_w, eye_h, &left_fbo, &left_color_tex, &left_depth_tex, left_image); GLuint right_color_tex = 0, right_depth_tex = 0, right_fbo = 0; - create_fbo(eye_w, eye_h, &right_fbo, &right_color_tex, &right_depth_tex); + create_fbo(eye_w, eye_h, &right_fbo, &right_color_tex, &right_depth_tex, right_image); PFNEGLEXPORTDMABUFIMAGEMESAPROC eglExportDMABUFImage = (PFNEGLEXPORTDMABUFIMAGEMESAPROC) eglGetProcAddress("eglExportDMABUFImageMESA"); PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC eglExportDMABUFImageQuery = (PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) eglGetProcAddress("eglExportDMABUFImageQueryMESA"); #if 1 - EGLImage left_image = eglCreateImage(gl.egl_display, gl.egl_context, EGL_GL_TEXTURE_2D, (EGLClientBuffer)(left_color_tex), NULL); + //EGLImage left_image = eglCreateImage(gl.egl_display, gl.egl_context, EGL_GL_TEXTURE_2D, (EGLClientBuffer)(left_color_tex), NULL); dma_texture_params left_texture_params; left_texture_params.width = eye_w; @@ -193,7 +208,7 @@ int main(int argc, char** argv) #endif // 0 #if 1 - EGLImage right_image = eglCreateImage(gl.egl_display, gl.egl_context, EGL_GL_TEXTURE_2D, (EGLClientBuffer)(right_color_tex), NULL); + //EGLImage right_image = eglCreateImage(gl.egl_display, gl.egl_context, EGL_GL_TEXTURE_2D, (EGLClientBuffer)(right_color_tex), NULL); dma_texture_params right_texture_params; right_texture_params.width = eye_w; diff --git a/examples/opengl/vr_context.c b/examples/opengl/vr_context.c index a5571c0..7a7d896 100644 --- a/examples/opengl/vr_context.c +++ b/examples/opengl/vr_context.c @@ -67,7 +67,7 @@ void init_vr_context(struct lvrcInstance * compositor, dma_texture_params * left exit(-1); } - bool bContextCreated = create_context(nativeDisplay, nativeWindow, attribs, context_attributes, NULL, &display, &context, &surface); + bool bContextCreated = create_context(EGL_PLATFORM_GBM_KHR, nativeDisplay, nativeWindow, attribs, context_attributes, NULL, &display, &context, &surface); if (!bContextCreated) {