[client] egl: use eglCreateImage and eglDestroyImage indirectly

The dmabuf path is optional, so we shouldn't require those functions to
link our program.
This commit is contained in:
Quantum 2021-09-28 21:34:42 -04:00 committed by Geoffrey McRae
parent 5c7f168370
commit 072c54977e
4 changed files with 24 additions and 10 deletions

View File

@ -38,6 +38,8 @@ struct EGLDynProcs
PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallback; PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallback;
PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR; PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR;
PFNGLBUFFERSTORAGEEXTPROC glBufferStorageEXT; PFNGLBUFFERSTORAGEEXTPROC glBufferStorageEXT;
PFNEGLCREATEIMAGEPROC eglCreateImage;
PFNEGLDESTROYIMAGEPROC eglDestroyImage;
}; };
extern struct EGLDynProcs g_egl_dynProcs; extern struct EGLDynProcs g_egl_dynProcs;

View File

@ -781,15 +781,16 @@ static bool egl_renderStartup(LG_Renderer * renderer, bool useDMA)
if (!this->hasBufferAge) if (!this->hasBufferAge)
DEBUG_WARN("GL_EXT_buffer_age is not supported, will not perform as well."); DEBUG_WARN("GL_EXT_buffer_age is not supported, will not perform as well.");
if (g_egl_dynProcs.glEGLImageTargetTexture2DOES) if (!g_egl_dynProcs.glEGLImageTargetTexture2DOES)
{
if (util_hasGLExt(client_exts, "EGL_EXT_image_dma_buf_import"))
this->dmaSupport = true;
else
DEBUG_INFO("EGL_EXT_image_dma_buf_import unavailable, DMA support disabled");
}
else
DEBUG_INFO("glEGLImageTargetTexture2DOES unavilable, DMA support disabled"); DEBUG_INFO("glEGLImageTargetTexture2DOES unavilable, DMA support disabled");
else if (!g_egl_dynProcs.eglCreateImage || !g_egl_dynProcs.eglDestroyImage)
DEBUG_INFO("eglCreateImage or eglDestroyImage unavailable, DMA support disabled");
else if (!util_hasGLExt(client_exts, "EGL_EXT_image_dma_buf_import"))
DEBUG_INFO("EGL_EXT_image_dma_buf_import unavailable, DMA support disabled");
else if ((maj < 1 || (maj == 1 && min < 5)) && !util_hasGLExt(client_exts, "EGL_KHR_image_base"))
DEBUG_INFO("Need EGL 1.5+ or EGL_KHR_image_base for eglCreateImage(KHR)");
else
this->dmaSupport = true;
if (!this->dmaSupport) if (!this->dmaSupport)
useDMA = false; useDMA = false;

View File

@ -132,7 +132,7 @@ static bool egl_texDMABUFUpdate(EGL_Texture * texture,
EGL_NONE , EGL_NONE EGL_NONE , EGL_NONE
}; };
image = eglCreateImage( image = g_egl_dynProcs.eglCreateImage(
this->display, this->display,
EGL_NO_CONTEXT, EGL_NO_CONTEXT,
EGL_LINUX_DMA_BUF_EXT, EGL_LINUX_DMA_BUF_EXT,
@ -151,7 +151,7 @@ static bool egl_texDMABUFUpdate(EGL_Texture * texture,
})) }))
{ {
DEBUG_ERROR("Failed to store EGLImage"); DEBUG_ERROR("Failed to store EGLImage");
eglDestroyImage(this->display, image); g_egl_dynProcs.eglDestroyImage(this->display, image);
return false; return false;
} }
} }

View File

@ -42,6 +42,17 @@ void egl_dynProcsInit(void)
eglGetProcAddress("glDebugMessageCallbackKHR"); eglGetProcAddress("glDebugMessageCallbackKHR");
g_egl_dynProcs.glBufferStorageEXT = (PFNGLBUFFERSTORAGEEXTPROC) g_egl_dynProcs.glBufferStorageEXT = (PFNGLBUFFERSTORAGEEXTPROC)
eglGetProcAddress("glBufferStorageEXT"); eglGetProcAddress("glBufferStorageEXT");
g_egl_dynProcs.eglCreateImage = (PFNEGLCREATEIMAGEPROC)
eglGetProcAddress("eglCreateImage");
g_egl_dynProcs.eglDestroyImage = (PFNEGLDESTROYIMAGEPROC)
eglGetProcAddress("eglDestroyImage");
if (!g_egl_dynProcs.eglCreateImage)
g_egl_dynProcs.eglCreateImage = (PFNEGLCREATEIMAGEPROC)
eglGetProcAddress("eglCreateImageKHR");
if (!g_egl_dynProcs.eglDestroyImage)
g_egl_dynProcs.eglDestroyImage = (PFNEGLDESTROYIMAGEPROC)
eglGetProcAddress("eglDestroyImageKHR");
}; };
#endif #endif