Fix initialization of DRM backend with X running

This commit is contained in:
Cameron Gutman 2021-01-31 15:03:40 -06:00
parent f173b3ff09
commit 1e31f6fe77
2 changed files with 30 additions and 34 deletions

View File

@ -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) {

View File

@ -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;