egl: Use the Mesa surfaceless platform instead of GBM

Mesa surfaceless platform appears to be a better fit for the use-case at hand:
1. Like GBM it is Mesa specific, so no change in supported setups is
   expected. If ever required, a fallback to the generic device platform
   could be added on top.
2. It leaves the complexity of selecting a renderer device to the
   driver, reducing code and dependencies.
3. It allows to use llvmpipe / software drivers without dri device,
   which can be useful on CI or debugging (with LIBGL_ALWAYS_SOFTWARE=1).

Signed-off-by: Robert Mader <robert.mader@collabora.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # sm8250/rb5, x1e/Dell Insprion14p
Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
Tested-by: Milan Zamazal <mzamazal@redhat.com> # TI AM69
Tested-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> # ThinkPad X1 Yoga Gen 7 + ov2740
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Robert Mader
2026-01-21 10:08:52 +01:00
committed by Kieran Bingham
parent 4a5ebcf675
commit 0c2ed9ebf9
4 changed files with 11 additions and 17 deletions

View File

@@ -16,8 +16,6 @@
#include <libcamera/base/span.h>
#include <libcamera/base/utils.h>
#include "libcamera/internal/gbm.h"
#define EGL_EGLEXT_PROTOTYPES
#include <EGL/egl.h>
#include <EGL/eglext.h>
@@ -96,7 +94,7 @@ public:
eGL();
~eGL();
int initEGLContext(GBM *gbmContext);
int initEGLContext();
int createInputDMABufTexture2D(eGLImage &eglImage, int fd);
int createOutputDMABufTexture2D(eGLImage &eglImage, int fd);

View File

@@ -256,24 +256,22 @@ void eGL::createTexture2D(eGLImage &eglImage, GLint format, uint32_t width, uint
/**
* \brief Initialise the EGL context
* \param[in] gbmContext Pointer to initialised GBM context
*
* Sets up the EGL display from the GBM device, creates an OpenGL ES 2.0
* context, and retrieves function pointers for required extensions
* including:
* Sets up the EGL display, creates an OpenGL ES 2.0 context, and retrieves
* function pointers for required extensions including:
* - eglCreateImageKHR / eglDestroyImageKHR
* - glEGLImageTargetTexture2DOES
*
* \return 0 on success, or -ENODEV on failure
*/
int eGL::initEGLContext(GBM *gbmContext)
int eGL::initEGLContext()
{
EGLint configAttribs[] = {
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, 8,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE
};
@@ -291,7 +289,9 @@ int eGL::initEGLContext(GBM *gbmContext)
goto fail;
}
display_ = eglGetDisplay(gbmContext->device());
display_ = eglGetPlatformDisplay(EGL_PLATFORM_SURFACELESS_MESA,
EGL_DEFAULT_DISPLAY,
nullptr);
if (display_ == EGL_NO_DISPLAY) {
LOG(eGL, Error) << "Unable to get EGL display";
goto fail;

View File

@@ -141,8 +141,8 @@ int DebayerEGL::initBayerShaders(PixelFormat inputFormat, PixelFormat outputForm
egl_.pushEnv(shaderEnv, "#extension GL_OES_EGL_image_external: enable");
/*
* Tell shaders how to re-order output taking account of how the
* pixels are actually stored by GBM
* Tell shaders how to re-order output taking account of how the pixels
* are actually stored by EGL.
*/
switch (outputFormat) {
case formats::ARGB8888:
@@ -586,10 +586,7 @@ int DebayerEGL::start()
{
GLint maxTextureImageUnits;
if (gbmSurface_.createDevice())
return -ENODEV;
if (egl_.initEGLContext(&gbmSurface_))
if (egl_.initEGLContext())
return -ENODEV;
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureImageUnits);

View File

@@ -113,7 +113,6 @@ private:
Rectangle window_;
std::unique_ptr<SwStatsCpu> stats_;
eGL egl_;
GBM gbmSurface_;
uint32_t width_;
uint32_t height_;
GLint glFormat_;