drm/renderer: use the duped fd for gl

This commit is contained in:
Vaxry 2024-07-12 23:23:39 +02:00
parent 5199868794
commit 8d73016db8
4 changed files with 12 additions and 58 deletions

View File

@ -64,5 +64,6 @@ namespace Aquamarine {
std::string drmName = ""; std::string drmName = "";
friend class CGBMBuffer; friend class CGBMBuffer;
friend class CDRMRenderer;
}; };
}; };

View File

@ -475,14 +475,15 @@ bool Aquamarine::CDRMBackend::initMgpu() {
if (!primary) if (!primary)
return true; return true;
mgpu.allocator = CGBMAllocator::create(backend->reopenDRMNode(gpu->fd), backend); auto newAllocator = CGBMAllocator::create(backend->reopenDRMNode(gpu->fd), backend);
mgpu.allocator = newAllocator;
if (!mgpu.allocator) { if (!mgpu.allocator) {
backend->log(AQ_LOG_ERROR, "drm: initMgpu: no allocator"); backend->log(AQ_LOG_ERROR, "drm: initMgpu: no allocator");
return false; return false;
} }
mgpu.renderer = CDRMRenderer::attempt(gpu->fd, backend.lock()); mgpu.renderer = CDRMRenderer::attempt(newAllocator, backend.lock());
if (!mgpu.renderer) { if (!mgpu.renderer) {
backend->log(AQ_LOG_ERROR, "drm: initMgpu: no renderer"); backend->log(AQ_LOG_ERROR, "drm: initMgpu: no renderer");

View File

@ -7,6 +7,7 @@
#include "Shared.hpp" #include "Shared.hpp"
#include "FormatUtils.hpp" #include "FormatUtils.hpp"
#include <xf86drm.h> #include <xf86drm.h>
#include <aquamarine/allocator/GBM.hpp>
using namespace Aquamarine; using namespace Aquamarine;
using namespace Hyprutils::Memory; using namespace Hyprutils::Memory;
@ -93,39 +94,6 @@ void main() {
gl_FragColor = texture2D(texture0, v_texcoord); gl_FragColor = texture2D(texture0, v_texcoord);
})#"; })#";
// ------------------- gbm stuff
static int openRenderNode(int drmFd) {
auto renderName = drmGetRenderDeviceNameFromFd(drmFd);
if (!renderName) {
// This can happen on split render/display platforms, fallback to
// primary node
renderName = drmGetPrimaryDeviceNameFromFd(drmFd);
if (!renderName) {
gBackend->log(AQ_LOG_ERROR, "drmRenderer: drmGetPrimaryDeviceNameFromFd failed");
return -1;
}
gBackend->log(AQ_LOG_WARNING, std::format("DRM dev {} has no render node, falling back to primary", renderName));
drmVersion* render_version = drmGetVersion(drmFd);
if (render_version && render_version->name) {
if (strcmp(render_version->name, "evdi") == 0) {
free(renderName);
renderName = (char*)malloc(sizeof(char) * 15);
strcpy(renderName, "/dev/dri/card0");
}
drmFreeVersion(render_version);
}
}
int renderFD = open(renderName, O_RDWR | O_CLOEXEC);
if (renderFD < 0)
gBackend->log(AQ_LOG_ERROR, std::format("openRenderNode failed to open drm device {}", renderName));
free(renderName);
return renderFD;
}
// ------------------- egl stuff // ------------------- egl stuff
inline void loadGLProc(void* pProc, const char* name) { inline void loadGLProc(void* pProc, const char* name) {
@ -228,9 +196,9 @@ bool CDRMRenderer::initDRMFormats() {
return true; return true;
} }
SP<CDRMRenderer> CDRMRenderer::attempt(int drmfd, SP<CBackend> backend_) { SP<CDRMRenderer> CDRMRenderer::attempt(Hyprutils::Memory::CSharedPointer<CGBMAllocator> allocator_, SP<CBackend> backend_) {
SP<CDRMRenderer> renderer = SP<CDRMRenderer>(new CDRMRenderer()); SP<CDRMRenderer> renderer = SP<CDRMRenderer>(new CDRMRenderer());
renderer->drmFD = drmfd; renderer->drmFD = allocator_->drmFD();
renderer->backend = backend_; renderer->backend = backend_;
gBackend = backend_; gBackend = backend_;
@ -241,20 +209,6 @@ SP<CDRMRenderer> CDRMRenderer::attempt(int drmfd, SP<CBackend> backend_) {
return nullptr; return nullptr;
} }
// init gbm stuff
renderer->gbm.fd = openRenderNode(drmfd);
if (!renderer->gbm.fd) {
backend_->log(AQ_LOG_ERROR, "CDRMRenderer: fail, no gbm fd");
return nullptr;
}
renderer->gbm.device = gbm_create_device(renderer->gbm.fd);
if (!renderer->gbm.device) {
backend_->log(AQ_LOG_ERROR, "CDRMRenderer: fail, no gbm device");
return nullptr;
}
// init egl // init egl
if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE) { if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE) {
@ -291,7 +245,7 @@ SP<CDRMRenderer> CDRMRenderer::attempt(int drmfd, SP<CBackend> backend_) {
} }
std::vector<EGLint> attrs = {EGL_NONE}; std::vector<EGLint> attrs = {EGL_NONE};
renderer->egl.display = renderer->egl.eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_KHR, renderer->gbm.device, attrs.data()); renderer->egl.display = renderer->egl.eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_KHR, allocator_->gbmDevice, attrs.data());
if (renderer->egl.display == EGL_NO_DISPLAY) { if (renderer->egl.display == EGL_NO_DISPLAY) {
backend_->log(AQ_LOG_ERROR, "CDRMRenderer: fail, eglGetPlatformDisplayEXT failed"); backend_->log(AQ_LOG_ERROR, "CDRMRenderer: fail, eglGetPlatformDisplayEXT failed");
return nullptr; return nullptr;

View File

@ -12,6 +12,8 @@
namespace Aquamarine { namespace Aquamarine {
class CGBMAllocator;
struct SGLTex { struct SGLTex {
EGLImage image = nullptr; EGLImage image = nullptr;
GLuint texid = 0; GLuint texid = 0;
@ -38,7 +40,8 @@ namespace Aquamarine {
class CDRMRenderer { class CDRMRenderer {
public: public:
static Hyprutils::Memory::CSharedPointer<CDRMRenderer> attempt(int drmfd, Hyprutils::Memory::CSharedPointer<CBackend> backend_); static Hyprutils::Memory::CSharedPointer<CDRMRenderer> attempt(Hyprutils::Memory::CSharedPointer<CGBMAllocator> allocator_,
Hyprutils::Memory::CSharedPointer<CBackend> backend_);
int drmFD = -1; int drmFD = -1;
@ -56,11 +59,6 @@ namespace Aquamarine {
} shader, shaderExt; } shader, shaderExt;
} gl; } gl;
struct {
int fd = -1;
gbm_device* device = nullptr;
} gbm;
struct { struct {
EGLDisplay display = nullptr; EGLDisplay display = nullptr;
EGLContext context = nullptr; EGLContext context = nullptr;