mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2025-07-18 10:32:38 +00:00
Fix initialization of DRM backend with X running
This commit is contained in:
parent
f173b3ff09
commit
1e31f6fe77
@ -20,13 +20,10 @@ extern "C" {
|
|||||||
|
|
||||||
#include <SDL_syswm.h>
|
#include <SDL_syswm.h>
|
||||||
|
|
||||||
#ifndef SDL_VIDEO_DRIVER_KMSDRM
|
|
||||||
#error DRM renderer requires SDL built with --enable-video-kmsdrm
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DrmRenderer::DrmRenderer()
|
DrmRenderer::DrmRenderer()
|
||||||
: m_HwContext(nullptr),
|
: m_HwContext(nullptr),
|
||||||
m_DrmFd(-1),
|
m_DrmFd(-1),
|
||||||
|
m_SdlOwnsDrmFd(false),
|
||||||
m_CrtcId(0),
|
m_CrtcId(0),
|
||||||
m_PlaneId(0),
|
m_PlaneId(0),
|
||||||
m_CurrentFbId(0)
|
m_CurrentFbId(0)
|
||||||
@ -43,12 +40,9 @@ DrmRenderer::~DrmRenderer()
|
|||||||
av_buffer_unref(&m_HwContext);
|
av_buffer_unref(&m_HwContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !SDL_VERSION_ATLEAST(2, 0, 15)
|
if (!m_SdlOwnsDrmFd && m_DrmFd != -1) {
|
||||||
// This is owned by us on SDL 2.0.14 and earlier
|
|
||||||
if (m_DrmFd != -1) {
|
|
||||||
close(m_DrmFd);
|
close(m_DrmFd);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DrmRenderer::prepareDecoderContext(AVCodecContext* context, AVDictionary**)
|
bool DrmRenderer::prepareDecoderContext(AVCodecContext* context, AVDictionary**)
|
||||||
@ -77,34 +71,35 @@ bool DrmRenderer::initialize(PDECODER_PARAMETERS params)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info.subsystem != SDL_SYSWM_KMSDRM) {
|
if (info.subsystem == SDL_SYSWM_KMSDRM) {
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
"Unexpected subsystem in DRM renderer: %d",
|
"Sharing DRM FD with SDL");
|
||||||
info.subsystem);
|
|
||||||
return false;
|
SDL_assert(info.info.kmsdrm.drm_fd >= 0);
|
||||||
}
|
m_DrmFd = info.info.kmsdrm.drm_fd;
|
||||||
|
m_SdlOwnsDrmFd = true;
|
||||||
SDL_assert(info.info.kmsdrm.drm_fd >= 0);
|
|
||||||
m_DrmFd = info.info.kmsdrm.drm_fd;
|
|
||||||
#else
|
|
||||||
const char* device = SDL_getenv("DRM_DEV");
|
|
||||||
|
|
||||||
if (device == nullptr) {
|
|
||||||
device = "/dev/dri/card0";
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
|
||||||
"Opening DRM device: %s",
|
|
||||||
device);
|
|
||||||
|
|
||||||
m_DrmFd = open(device, O_RDWR | O_CLOEXEC);
|
|
||||||
if (m_DrmFd < 0) {
|
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
|
||||||
"Failed to open DRM device: %d",
|
|
||||||
errno);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
#endif
|
#endif
|
||||||
|
{
|
||||||
|
const char* device = SDL_getenv("DRM_DEV");
|
||||||
|
|
||||||
|
if (device == nullptr) {
|
||||||
|
device = "/dev/dri/card0";
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
|
"Opening DRM device: %s",
|
||||||
|
device);
|
||||||
|
|
||||||
|
m_DrmFd = open(device, O_RDWR | O_CLOEXEC);
|
||||||
|
if (m_DrmFd < 0) {
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
|
"Failed to open DRM device: %d",
|
||||||
|
errno);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
drmModeRes* resources = drmModeGetResources(m_DrmFd);
|
drmModeRes* resources = drmModeGetResources(m_DrmFd);
|
||||||
if (resources == nullptr) {
|
if (resources == nullptr) {
|
||||||
|
@ -24,6 +24,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
AVBufferRef* m_HwContext;
|
AVBufferRef* m_HwContext;
|
||||||
int m_DrmFd;
|
int m_DrmFd;
|
||||||
|
bool m_SdlOwnsDrmFd;
|
||||||
uint32_t m_CrtcId;
|
uint32_t m_CrtcId;
|
||||||
uint32_t m_PlaneId;
|
uint32_t m_PlaneId;
|
||||||
uint32_t m_CurrentFbId;
|
uint32_t m_CurrentFbId;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user