diff --git a/sources/grabber/linux/pipewire/PipewireHandler.cpp b/sources/grabber/linux/pipewire/PipewireHandler.cpp index 932d3f560..401a672d9 100644 --- a/sources/grabber/linux/pipewire/PipewireHandler.cpp +++ b/sources/grabber/linux/pipewire/PipewireHandler.cpp @@ -49,6 +49,8 @@ #include #include #include +#include + #include #include @@ -780,6 +782,7 @@ void PipewireHandler::captureFrame() else { QVector attribs; + std::vector> eglDrmModWorkaround; attribs << EGL_WIDTH << _frameWidth << EGL_HEIGHT << _frameHeight << EGL_LINUX_DRM_FOURCC_EXT << EGLint(_frameDrmFormat); @@ -798,8 +801,10 @@ void PipewireHandler::captureFrame() if (_frameDrmModifier != DRM_FORMAT_MOD_INVALID) { + int before = attribs.size(); attribs << EGL_DMA_BUF_PLANE_MODIFIER_LO_EXT[i] << EGLint(_frameDrmModifier & 0xffffffff) << EGL_DMA_BUF_PLANE_MODIFIER_HI_EXT[i] << EGLint(_frameDrmModifier >> 32); + eglDrmModWorkaround.push_back(std::pair(before, attribs.size() - 1)); } } @@ -807,6 +812,24 @@ void PipewireHandler::captureFrame() EGLImage eglImage = eglCreateImageKHR(displayEgl, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, (EGLClientBuffer) nullptr, attribs.data()); + if (eglImage == EGL_NO_IMAGE_KHR && eglDrmModWorkaround.size() > 0) + { + // remove drm mods + QVector attribsCopy; + for (int i = 0; i < attribs.size(); i++) + { + attribsCopy.push_back(attribs[i]); + for (const auto& check : eglDrmModWorkaround) + if (i >= check.first && i <= check.second) + { + attribsCopy.pop_back(); + break; + } + } + attribs = attribsCopy; + eglImage = eglCreateImageKHR(displayEgl, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, (EGLClientBuffer) nullptr, attribs.data()); + } + if (eglImage == EGL_NO_IMAGE_KHR) { printf("PipewireEGL: failed to create a texture (reason = '%s')\n", eglErrorToString(eglGetError()));