diff options
-rw-r--r-- | cmake/platform/linux/gbm.cmake | 1 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/Process/ProcessInfo.cpp | 3 | ||||
-rw-r--r-- | xbmc/windowing/gbm/DRMUtils.cpp | 91 |
3 files changed, 54 insertions, 41 deletions
diff --git a/cmake/platform/linux/gbm.cmake b/cmake/platform/linux/gbm.cmake index 5f5cb8312c..d2891665db 100644 --- a/cmake/platform/linux/gbm.cmake +++ b/cmake/platform/linux/gbm.cmake @@ -1,3 +1,4 @@ set(PLATFORM_REQUIRED_DEPS OpenGLES EGL GBM LibDRM) set(PLATFORM_OPTIONAL_DEPS VAAPI) set(APP_RENDER_SYSTEM gles) +list(APPEND PLATFORM_DEFINES -DMESA_EGL_NO_X11_HEADERS) diff --git a/xbmc/cores/VideoPlayer/Process/ProcessInfo.cpp b/xbmc/cores/VideoPlayer/Process/ProcessInfo.cpp index 5a30df02ff..7f3ea54749 100644 --- a/xbmc/cores/VideoPlayer/Process/ProcessInfo.cpp +++ b/xbmc/cores/VideoPlayer/Process/ProcessInfo.cpp @@ -75,7 +75,7 @@ void CProcessInfo::ResetVideoCodecInfo() m_videoDecoderName = "unknown"; m_videoDeintMethod = "unknown"; m_videoPixelFormat = "unknown"; - m_videoStereoMode = "mono"; + m_videoStereoMode.clear(); m_videoWidth = 0; m_videoHeight = 0; m_videoFPS = 0.0; @@ -94,6 +94,7 @@ void CProcessInfo::ResetVideoCodecInfo() m_dataCache->SetVideoFps(m_videoFPS); m_dataCache->SetVideoDAR(m_videoDAR); m_dataCache->SetStateSeeking(m_stateSeeking); + m_dataCache->SetVideoStereoMode(m_videoStereoMode); } } diff --git a/xbmc/windowing/gbm/DRMUtils.cpp b/xbmc/windowing/gbm/DRMUtils.cpp index 7d0c09a68e..09a2be1125 100644 --- a/xbmc/windowing/gbm/DRMUtils.cpp +++ b/xbmc/windowing/gbm/DRMUtils.cpp @@ -374,53 +374,60 @@ bool CDRMUtils::GetPlanes() CLog::Log(LOGDEBUG, "CDRMUtils::%s - primary plane format: %c%c%c%c", __FUNCTION__, fourcc, fourcc >> 8, fourcc >> 16, fourcc >> 24); - // overlay plane - m_overlay_plane->plane = drmModeGetPlane(m_fd, overlay_plane_id); - if (!m_overlay_plane->plane) + if (overlay_plane_id != 0) { - CLog::Log(LOGERROR, "CDRMUtils::%s - could not get overlay plane %u: %s", __FUNCTION__, overlay_plane_id, strerror(errno)); - return false; - } + // overlay plane + m_overlay_plane->plane = drmModeGetPlane(m_fd, overlay_plane_id); + if (!m_overlay_plane->plane) + { + CLog::Log(LOGERROR, "CDRMUtils::%s - could not get overlay plane %u: %s", __FUNCTION__, overlay_plane_id, strerror(errno)); + return false; + } - m_overlay_plane->props = drmModeObjectGetProperties(m_fd, overlay_plane_id, DRM_MODE_OBJECT_PLANE); - if (!m_overlay_plane->props) - { - CLog::Log(LOGERROR, "CDRMUtils::%s - could not get overlay plane %u properties: %s", __FUNCTION__, overlay_plane_id, strerror(errno)); - return false; - } + m_overlay_plane->props = drmModeObjectGetProperties(m_fd, overlay_plane_id, DRM_MODE_OBJECT_PLANE); + if (!m_overlay_plane->props) + { + CLog::Log(LOGERROR, "CDRMUtils::%s - could not get overlay plane %u properties: %s", __FUNCTION__, overlay_plane_id, strerror(errno)); + return false; + } - m_overlay_plane->props_info = new drmModePropertyPtr[m_overlay_plane->props->count_props]; - for (uint32_t i = 0; i < m_overlay_plane->props->count_props; i++) - { - m_overlay_plane->props_info[i] = drmModeGetProperty(m_fd, m_overlay_plane->props->props[i]); - } + m_overlay_plane->props_info = new drmModePropertyPtr[m_overlay_plane->props->count_props]; + for (uint32_t i = 0; i < m_overlay_plane->props->count_props; i++) + { + m_overlay_plane->props_info[i] = drmModeGetProperty(m_fd, m_overlay_plane->props->props[i]); + } - fourcc = 0; + fourcc = 0; - for (uint32_t i = 0; i < m_overlay_plane->plane->count_formats; i++) - { - /* we want an alpha layer so break if we find one */ - if (m_overlay_plane->plane->formats[i] == DRM_FORMAT_XRGB8888) + for (uint32_t i = 0; i < m_overlay_plane->plane->count_formats; i++) { - fourcc = DRM_FORMAT_XRGB8888; - m_overlay_plane->format = fourcc; + /* we want an alpha layer so break if we find one */ + if (m_overlay_plane->plane->formats[i] == DRM_FORMAT_XRGB8888) + { + fourcc = DRM_FORMAT_XRGB8888; + m_overlay_plane->format = fourcc; + } + else if(m_overlay_plane->plane->formats[i] == DRM_FORMAT_ARGB8888) + { + fourcc = DRM_FORMAT_ARGB8888; + m_overlay_plane->format = fourcc; + break; + } } - else if(m_overlay_plane->plane->formats[i] == DRM_FORMAT_ARGB8888) + + if (fourcc == 0) { - fourcc = DRM_FORMAT_ARGB8888; - m_overlay_plane->format = fourcc; - break; + CLog::Log(LOGERROR, "CDRMUtils::%s - could not find a suitable overlay plane format", __FUNCTION__); + return false; } - } - if (fourcc == 0) + CLog::Log(LOGDEBUG, "CDRMUtils::%s - overlay plane format: %c%c%c%c", __FUNCTION__, fourcc, fourcc >> 8, fourcc >> 16, fourcc >> 24); + } + else { - CLog::Log(LOGERROR, "CDRMUtils::%s - could not find a suitable overlay plane format", __FUNCTION__); - return false; + delete m_overlay_plane; + m_overlay_plane = m_primary_plane; } - - CLog::Log(LOGDEBUG, "CDRMUtils::%s - overlay plane format: %c%c%c%c", __FUNCTION__, fourcc, fourcc >> 8, fourcc >> 16, fourcc >> 24); - return true; } @@ -439,6 +446,7 @@ bool CDRMUtils::OpenDrm() "vc4", "virtio_gpu", "sun4i-drm", + "meson" }; for(int i = 0; i < 10; ++i) @@ -605,13 +613,16 @@ void CDRMUtils::DestroyDrm() drmModeFreeObjectProperties(m_primary_plane->props); delete [] m_primary_plane->props_info; delete m_primary_plane; - m_primary_plane = nullptr; - drmModeFreePlane(m_overlay_plane->plane); - drmModeFreeObjectProperties(m_overlay_plane->props); - delete [] m_overlay_plane->props_info; - delete m_overlay_plane; + if (m_overlay_plane != m_primary_plane) + { + drmModeFreePlane(m_overlay_plane->plane); + drmModeFreeObjectProperties(m_overlay_plane->props); + delete [] m_overlay_plane->props_info; + delete m_overlay_plane; + } m_overlay_plane = nullptr; + m_primary_plane = nullptr; } bool CDRMUtils::GetModes(std::vector<RESOLUTION_INFO> &resolutions) |